From abffb37ead4f4dec159e91742e4380a36cefdf10 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Mon, 30 Sep 2024 11:33:36 +0200 Subject: [PATCH 001/107] [ES|QL][Lens] Fixes the filter out legend action (#194374) ## Summary Closes https://github.com/elastic/kibana/issues/194373 Fixes the filter out legend action ### Checklist - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../create_filters_from_value_click.test.ts | 18 ++++++++++++++++++ .../filters/create_filters_from_value_click.ts | 9 ++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts index 10d773c61533c..cc228374271ea 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts @@ -172,5 +172,23 @@ describe('createFiltersFromClickEvent', () => { expect(queryString).toEqual(`from meow | WHERE \`columnA\`=="2048"`); }); + + test('should return the update query string for negated action', async () => { + dataPoints[0].table.columns[0] = { + name: 'columnA', + id: 'columnA', + meta: { + type: 'string', + }, + }; + const queryString = await appendFilterToESQLQueryFromValueClickAction({ + data: dataPoints, + query: { esql: 'from meow' }, + negate: true, + }); + + expect(queryString).toEqual(`from meow +| WHERE \`columnA\`!="2048"`); + }); }); }); diff --git a/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts index b949bb051631c..201eefac7d528 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts @@ -162,6 +162,7 @@ export const createFiltersFromValueClickAction = async ({ export const appendFilterToESQLQueryFromValueClickAction = ({ data, query, + negate, }: ValueClickDataContext) => { if (!query) { return; @@ -183,6 +184,12 @@ export const appendFilterToESQLQueryFromValueClickAction = ({ if (value == null) { return; } - return appendWhereClauseToESQLQuery(query.esql, column.name, value, '+', column.meta?.type); + return appendWhereClauseToESQLQuery( + query.esql, + column.name, + value, + negate ? '-' : '+', + column.meta?.type + ); } }; From 10c337387485d77fd264c11888b2c28131ee515a Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 30 Sep 2024 10:41:22 +0100 Subject: [PATCH 002/107] [FTR] Merge Alerting Apis from `x-pack/test_serverless/shared` into `x-pack/test/api_integration/deployment_agnostic` (#193975) ## Summary Follow up of [this pr](https://github.com/elastic/kibana/pull/192216), per [this discussion](https://github.com/elastic/kibana/pull/192216#discussion_r1760894369). Also, switch from `svlCommonApi` to `samlAuth` for internal headers. --------- Co-authored-by: Elastic Machine Co-authored-by: Dzmitry Lemechko --- .../observability/alerting/burn_rate_rule.ts | 2 +- .../services/alerting_api.ts | 899 +++++++++++++- .../custom_threshold_rule/avg_pct_fired.ts | 2 +- .../custom_threshold_rule/avg_pct_no_data.ts | 2 +- .../custom_eq_avg_bytes_fired.ts | 2 +- .../documents_count_fired.ts | 2 +- .../custom_threshold_rule/group_by_fired.ts | 2 +- .../custom_threshold_rule/p99_pct_fired.ts | 2 +- .../es_query_rule/es_query_rule.ts | 2 +- .../shared/services/alerting_api.ts | 1072 ----------------- .../services/deployment_agnostic_services.ts | 8 +- 11 files changed, 910 insertions(+), 1085 deletions(-) delete mode 100644 x-pack/test_serverless/shared/services/alerting_api.ts diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/burn_rate_rule.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/burn_rate_rule.ts index 22a70ad439851..e556db2e09a28 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/burn_rate_rule.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/alerting/burn_rate_rule.ts @@ -306,7 +306,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(ruleId, adminRoleAuthc); + const match = await alertingApi.findInRules(adminRoleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be(expectedConsumer); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts b/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts index 430fd51efdc32..2956ee412a478 100644 --- a/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts +++ b/x-pack/test/api_integration/deployment_agnostic/services/alerting_api.ts @@ -12,6 +12,10 @@ import type { import { MetricThresholdParams } from '@kbn/infra-plugin/common/alerting/metrics'; import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; import { RoleCredentials } from '@kbn/ftr-common-functional-services'; +import type { Client } from '@elastic/elasticsearch'; +import type { TryWithRetriesOptions } from '@kbn/ftr-common-functional-services'; +import { v4 as uuidv4 } from 'uuid'; +import moment from 'moment'; import { DeploymentAgnosticFtrProviderContext } from '../ftr_provider_context'; export interface SloBurnRateRuleParams { @@ -41,6 +45,29 @@ interface Duration { unit: DurationUnit; } +interface CreateEsQueryRuleParams { + size: number; + thresholdComparator: string; + threshold: number[]; + timeWindowSize?: number; + timeWindowUnit?: string; + esQuery?: string; + timeField?: string; + searchConfiguration?: unknown; + indexName?: string; + excludeHitsFromPreviousRun?: boolean; + aggType?: string; + aggField?: string; + groupBy?: string; + termField?: string; + termSize?: number; + index?: string[]; +} + +const RETRY_COUNT = 10; +const RETRY_DELAY = 1000; +const generateUniqueKey = () => uuidv4().replace(/-/g, ''); + export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProviderContext) { const samlAuth = getService('samlAuth'); const supertestWithoutAuth = getService('supertestWithoutAuth'); @@ -51,7 +78,877 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide const retryTimeout = config.get('timeouts.try'); const requestTimeout = 30 * 1000; + const helpers = { + async waitForAlertInIndex({ + esClient, + filter, + indexName, + ruleId, + num = 1, + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + filter: Date; + indexName: string; + ruleId: string; + num: number; + retryOptions?: TryWithRetriesOptions; + }): Promise>> { + return await retry.tryWithRetries( + `Alerting API - waitForAlertInIndex, retryOptions: ${JSON.stringify(retryOptions)}`, + async () => { + const response = await esClient.search({ + index: indexName, + body: { + query: { + bool: { + must: [ + { + term: { + 'kibana.alert.rule.uuid': ruleId, + }, + }, + { + range: { + '@timestamp': { + gte: filter.getTime().toString(), + }, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length < num) + throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); + + return response; + }, + retryOptions + ); + }, + + async waitForDocumentInIndexForTime({ + esClient, + indexName, + ruleId, + num = 1, + sort = 'desc', + timeout = 1000, + }: { + esClient: Client; + indexName: string; + ruleId: string; + num?: number; + sort?: 'asc' | 'desc'; + timeout?: number; + }): Promise { + return await retry.tryForTime(timeout, async () => { + const response = await esClient.search({ + index: indexName, + sort: `date:${sort}`, + body: { + query: { + bool: { + must: [ + { + term: { + 'ruleId.keyword': ruleId, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length < num) { + throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); + } + return response; + }); + }, + + async waitForDocumentInIndex({ + esClient, + indexName, + ruleId, + num = 1, + sort = 'desc', + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + indexName: string; + ruleId: string; + num?: number; + sort?: 'asc' | 'desc'; + retryOptions?: TryWithRetriesOptions; + }): Promise { + return await retry.tryWithRetries( + `Alerting API - waitForDocumentInIndex, retryOptions: ${JSON.stringify(retryOptions)}`, + async () => { + const response = await esClient.search({ + index: indexName, + sort: `date:${sort}`, + body: { + query: { + bool: { + must: [ + { + term: { + 'ruleId.keyword': ruleId, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length < num) { + throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); + } + return response; + }, + retryOptions + ); + }, + + async createIndexConnector({ + roleAuthc, + name, + indexName, + }: { + roleAuthc: RoleCredentials; + name: string; + indexName: string; + }) { + const { body } = await supertestWithoutAuth + .post(`/api/actions/connector`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + name, + config: { + index: indexName, + refresh: true, + }, + connector_type_id: '.index', + }) + .expect(200); + return body; + }, + + async createSlackConnector({ roleAuthc, name }: { roleAuthc: RoleCredentials; name: string }) { + const { body } = await supertestWithoutAuth + .post(`/api/actions/connector`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + name, + config: {}, + secrets: { + webhookUrl: 'http://test', + }, + connector_type_id: '.slack', + }) + .expect(200); + return body; + }, + + async createEsQueryRule({ + roleAuthc, + name, + ruleTypeId, + params, + actions = [], + tags = [], + schedule, + consumer, + notifyWhen, + enabled = true, + }: { + roleAuthc: RoleCredentials; + ruleTypeId: string; + name: string; + params: CreateEsQueryRuleParams; + consumer: string; + actions?: any[]; + tags?: any[]; + schedule?: { interval: string }; + notifyWhen?: string; + enabled?: boolean; + }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + enabled, + params, + consumer, + schedule: schedule || { + interval: '1h', + }, + tags, + name, + rule_type_id: ruleTypeId, + actions, + ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), + }) + .expect(200); + return body; + }, + + async createAnomalyRule({ + roleAuthc, + name = generateUniqueKey(), + actions = [], + tags = ['foo', 'bar'], + schedule, + consumer = 'alerts', + notifyWhen, + enabled = true, + ruleTypeId = 'apm.anomaly', + params, + }: { + roleAuthc: RoleCredentials; + name?: string; + consumer?: string; + actions?: any[]; + tags?: any[]; + schedule?: { interval: string }; + notifyWhen?: string; + enabled?: boolean; + ruleTypeId?: string; + params?: any; + }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + enabled, + params: params || { + anomalySeverityType: 'critical', + anomalyDetectorTypes: ['txLatency'], + environment: 'ENVIRONMENT_ALL', + windowSize: 30, + windowUnit: 'm', + }, + consumer, + schedule: schedule || { + interval: '1m', + }, + tags, + name, + rule_type_id: ruleTypeId, + actions, + ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), + }) + .expect(200); + return body; + }, + + async createLatencyThresholdRule({ + roleAuthc, + name = generateUniqueKey(), + actions = [], + tags = ['foo', 'bar'], + schedule, + consumer = 'apm', + notifyWhen, + enabled = true, + ruleTypeId = 'apm.transaction_duration', + params, + }: { + roleAuthc: RoleCredentials; + name?: string; + consumer?: string; + actions?: any[]; + tags?: any[]; + schedule?: { interval: string }; + notifyWhen?: string; + enabled?: boolean; + ruleTypeId?: string; + params?: any; + }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + enabled, + params: params || { + aggregationType: 'avg', + environment: 'ENVIRONMENT_ALL', + threshold: 1500, + windowSize: 5, + windowUnit: 'm', + }, + consumer, + schedule: schedule || { + interval: '1m', + }, + tags, + name, + rule_type_id: ruleTypeId, + actions, + ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), + }); + return body; + }, + + async createInventoryRule({ + roleAuthc, + name = generateUniqueKey(), + actions = [], + tags = ['foo', 'bar'], + schedule, + consumer = 'alerts', + notifyWhen, + enabled = true, + ruleTypeId = 'metrics.alert.inventory.threshold', + params, + }: { + roleAuthc: RoleCredentials; + name?: string; + consumer?: string; + actions?: any[]; + tags?: any[]; + schedule?: { interval: string }; + notifyWhen?: string; + enabled?: boolean; + ruleTypeId?: string; + params?: any; + }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + enabled, + params: params || { + nodeType: 'host', + criteria: [ + { + metric: 'cpu', + comparator: '>', + threshold: [5], + timeSize: 1, + timeUnit: 'm', + customMetric: { + type: 'custom', + id: 'alert-custom-metric', + field: '', + aggregation: 'avg', + }, + }, + ], + sourceId: 'default', + }, + consumer, + schedule: schedule || { + interval: '1m', + }, + tags, + name, + rule_type_id: ruleTypeId, + actions, + ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), + }) + .expect(200); + return body; + }, + + async disableRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule/${ruleId}/_disable`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(204); + return body; + }, + + async updateEsQueryRule({ + roleAuthc, + ruleId, + updates, + }: { + roleAuthc: RoleCredentials; + ruleId: string; + updates: any; + }) { + const { body: r } = await supertestWithoutAuth + .get(`/api/alerting/rule/${ruleId}`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(200); + const body = await supertestWithoutAuth + .put(`/api/alerting/rule/${ruleId}`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + ...{ + name: r.name, + schedule: r.schedule, + throttle: r.throttle, + tags: r.tags, + params: r.params, + notify_when: r.notifyWhen, + actions: r.actions.map((action: any) => ({ + group: action.group, + params: action.params, + id: action.id, + frequency: action.frequency, + })), + }, + ...updates, + }) + .expect(200); + return body; + }, + + async runRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { + const response = await supertestWithoutAuth + .post(`/internal/alerting/rule/${ruleId}/_run_soon`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(204); + return response; + }, + + async waitForNumRuleRuns({ + roleAuthc, + numOfRuns, + ruleId, + esClient, + testStart, + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + roleAuthc: RoleCredentials; + numOfRuns: number; + ruleId: string; + esClient: Client; + testStart: Date; + retryOptions?: TryWithRetriesOptions; + }) { + for (let i = 0; i < numOfRuns; i++) { + await retry.tryWithRetries( + `Alerting API - waitForNumRuleRuns, retryOptions: ${JSON.stringify(retryOptions)}`, + async () => { + await this.runRule({ roleAuthc, ruleId }); + await this.waiting.waitForExecutionEventLog({ + esClient, + filter: testStart, + ruleId, + num: i + 1, + }); + await this.waiting.waitForAllTasksIdle({ esClient, filter: testStart }); + }, + retryOptions + ); + } + }, + + async muteRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule/${ruleId}/_mute_all`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(204); + return body; + }, + + async enableRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule/${ruleId}/_enable`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(204); + return body; + }, + + async muteAlert({ + roleAuthc, + ruleId, + alertId, + }: { + roleAuthc: RoleCredentials; + ruleId: string; + alertId: string; + }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule/${ruleId}/alert/${alertId}/_mute`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(204); + return body; + }, + + async unmuteRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { + const { body } = await supertestWithoutAuth + .post(`/api/alerting/rule/${ruleId}/_unmute_all`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .expect(204); + return body; + }, + + async snoozeRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { + const { body } = await supertestWithoutAuth + .post(`/internal/alerting/rule/${ruleId}/_snooze`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) + .send({ + snooze_schedule: { + duration: 100000000, + rRule: { + count: 1, + dtstart: moment().format(), + tzid: 'UTC', + }, + }, + }) + .expect(204); + return body; + }, + + async findRuleById(roleAuthc: RoleCredentials, ruleId: string) { + if (!ruleId) { + throw new Error(`'ruleId' is undefined`); + } + const response = await supertestWithoutAuth + .get(`/api/alerting/rule/${ruleId}`) + .set(samlAuth.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader); + return response.body || {}; + }, + + waiting: { + async waitForDocumentInIndex({ + esClient, + indexName, + ruleId, + num = 1, + sort = 'desc', + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + indexName: string; + ruleId: string; + num?: number; + sort?: 'asc' | 'desc'; + retryOptions?: TryWithRetriesOptions; + }): Promise { + return await retry.tryWithRetries( + `Alerting API - waiting.waitForDocumentInIndex, retryOptions: ${JSON.stringify( + retryOptions + )}`, + async () => { + const response = await esClient.search({ + index: indexName, + sort: `date:${sort}`, + body: { + query: { + bool: { + must: [ + { + term: { + 'ruleId.keyword': ruleId, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length < num) { + throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); + } + return response; + }, + retryOptions + ); + }, + + async getDocumentsInIndex({ + esClient, + indexName, + ruleId, + }: { + esClient: Client; + indexName: string; + ruleId: string; + }): Promise { + return await esClient.search({ + index: indexName, + body: { + query: { + bool: { + must: [ + { + term: { + 'ruleId.keyword': ruleId, + }, + }, + ], + }, + }, + }, + }); + }, + + async waitForAllTasksIdle({ + esClient, + filter, + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + filter: Date; + retryOptions?: TryWithRetriesOptions; + }): Promise { + return await retry.tryWithRetries( + `Alerting API - waiting.waitForAllTasksIdle, retryOptions: ${JSON.stringify( + retryOptions + )}`, + async () => { + const response = await esClient.search({ + index: '.kibana_task_manager', + body: { + query: { + bool: { + must: [ + { + terms: { + 'task.scope': ['actions', 'alerting'], + }, + }, + { + range: { + 'task.scheduledAt': { + gte: filter.getTime().toString(), + }, + }, + }, + ], + must_not: [ + { + term: { + 'task.status': 'idle', + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length !== 0) { + throw new Error(`Expected 0 hits but received ${response.hits.hits.length}`); + } + return response; + }, + retryOptions + ); + }, + + async waitForExecutionEventLog({ + esClient, + filter, + ruleId, + num = 1, + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + filter: Date; + ruleId: string; + num?: number; + retryOptions?: TryWithRetriesOptions; + }): Promise { + return await retry.tryWithRetries( + `Alerting API - waiting.waitForExecutionEventLog, retryOptions: ${JSON.stringify( + retryOptions + )}`, + async () => { + const response = await esClient.search({ + index: '.kibana-event-log*', + body: { + query: { + bool: { + filter: [ + { + term: { + 'rule.id': { + value: ruleId, + }, + }, + }, + { + term: { + 'event.provider': { + value: 'alerting', + }, + }, + }, + { + term: { + 'event.action': 'execute', + }, + }, + { + range: { + '@timestamp': { + gte: filter.getTime().toString(), + }, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length < num) { + throw new Error('No hits found'); + } + return response; + }, + retryOptions + ); + }, + + async createIndex({ esClient, indexName }: { esClient: Client; indexName: string }) { + return await esClient.indices.create( + { + index: indexName, + body: {}, + }, + { meta: true } + ); + }, + + async waitForAllTasks({ + esClient, + filter, + taskType, + attempts, + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + filter: Date; + taskType: string; + attempts: number; + retryOptions?: TryWithRetriesOptions; + }): Promise { + return await retry.tryWithRetries( + `Alerting API - waiting.waitForAllTasks, retryOptions: ${JSON.stringify(retryOptions)}`, + async () => { + const response = await esClient.search({ + index: '.kibana_task_manager', + body: { + query: { + bool: { + must: [ + { + term: { + 'task.status': 'idle', + }, + }, + { + term: { + 'task.attempts': attempts, + }, + }, + { + terms: { + 'task.scope': ['actions', 'alerting'], + }, + }, + { + term: { + 'task.taskType': taskType, + }, + }, + { + range: { + 'task.scheduledAt': { + gte: filter.getTime().toString(), + }, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length === 0) { + throw new Error('No hits found'); + } + return response; + }, + retryOptions + ); + }, + + async waitForDisabled({ + esClient, + ruleId, + filter, + retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, + }: { + esClient: Client; + ruleId: string; + filter: Date; + retryOptions?: TryWithRetriesOptions; + }): Promise { + return await retry.tryWithRetries( + `Alerting API - waiting.waitForDisabled, retryOptions: ${JSON.stringify(retryOptions)}`, + async () => { + const response = await esClient.search({ + index: '.kibana_task_manager', + body: { + query: { + bool: { + must: [ + { + term: { + 'task.id': `task:${ruleId}`, + }, + }, + { + terms: { + 'task.scope': ['actions', 'alerting'], + }, + }, + { + range: { + 'task.scheduledAt': { + gte: filter.getTime().toString(), + }, + }, + }, + { + term: { + 'task.enabled': true, + }, + }, + ], + }, + }, + }, + }); + if (response.hits.hits.length !== 0) { + throw new Error(`Expected 0 hits but received ${response.hits.hits.length}`); + } + return response; + }, + retryOptions + ); + }, + }, + }; + return { + helpers, + async waitForRuleStatus({ ruleId, expectedStatus, @@ -192,7 +1089,7 @@ export function AlertingApiProvider({ getService }: DeploymentAgnosticFtrProvide return body; }, - async findRule(ruleId: string, roleAuthc: RoleCredentials) { + async findInRules(roleAuthc: RoleCredentials, ruleId: string) { const response = await supertestWithoutAuth .get('/api/alerting/rules/_find') .set(roleAuthc.apiKeyHeader) diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts index 707d4742fd3b4..358fabd7956ef 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts @@ -169,7 +169,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts index c95482f2c2a74..4928e69a939c1 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts @@ -142,7 +142,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts index 489f495fc169f..f2f98fe1ff2de 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts @@ -172,7 +172,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts index d7c87ffce0588..ac0e034279cbe 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts @@ -170,7 +170,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts index cd7eecb1ab290..3b38eed6b6166 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts @@ -177,7 +177,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts index c233ecbe39f1a..291db4defac47 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts @@ -170,7 +170,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts b/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts index 8d627413ecbc0..caaecd9f3332a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts @@ -112,7 +112,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should find the created rule with correct information about the consumer', async () => { - const match = await alertingApi.findRule(roleAuthc, ruleId); + const match = await alertingApi.findInRules(roleAuthc, ruleId); expect(match).not.to.be(undefined); expect(match.consumer).to.be('observability'); }); diff --git a/x-pack/test_serverless/shared/services/alerting_api.ts b/x-pack/test_serverless/shared/services/alerting_api.ts deleted file mode 100644 index 86fcad5060cc6..0000000000000 --- a/x-pack/test_serverless/shared/services/alerting_api.ts +++ /dev/null @@ -1,1072 +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 moment from 'moment'; -import type { - AggregationsAggregate, - SearchResponse, -} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { Client } from '@elastic/elasticsearch'; -import { MetricThresholdParams } from '@kbn/infra-plugin/common/alerting/metrics'; -import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; -import { v4 as uuidv4 } from 'uuid'; -import type { TryWithRetriesOptions } from '@kbn/ftr-common-functional-services'; -import { RoleCredentials } from '.'; -import type { SloBurnRateRuleParams } from '../../api_integration/services/slo_api'; -import { FtrProviderContext } from '../../functional/ftr_provider_context'; - -interface CreateEsQueryRuleParams { - size: number; - thresholdComparator: string; - threshold: number[]; - timeWindowSize?: number; - timeWindowUnit?: string; - esQuery?: string; - timeField?: string; - searchConfiguration?: unknown; - indexName?: string; - excludeHitsFromPreviousRun?: boolean; - aggType?: string; - aggField?: string; - groupBy?: string; - termField?: string; - termSize?: number; - index?: string[]; -} -const RETRY_COUNT = 10; -const RETRY_DELAY = 1000; - -export function AlertingApiProvider({ getService }: FtrProviderContext) { - const retry = getService('retry'); - const es = getService('es'); - const requestTimeout = 30 * 1000; - const retryTimeout = 120 * 1000; - const logger = getService('log'); - const svlCommonApi = getService('svlCommonApi'); - const supertestWithoutAuth = getService('supertestWithoutAuth'); - - const generateUniqueKey = () => uuidv4().replace(/-/g, ''); - - const helpers = { - async waitForAlertInIndex({ - esClient, - filter, - indexName, - ruleId, - num = 1, - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - filter: Date; - indexName: string; - ruleId: string; - num: number; - retryOptions?: TryWithRetriesOptions; - }): Promise>> { - return await retry.tryWithRetries( - `Alerting API - waitForAlertInIndex, retryOptions: ${JSON.stringify(retryOptions)}`, - async () => { - const response = await esClient.search({ - index: indexName, - body: { - query: { - bool: { - must: [ - { - term: { - 'kibana.alert.rule.uuid': ruleId, - }, - }, - { - range: { - '@timestamp': { - gte: filter.getTime().toString(), - }, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length < num) - throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); - - return response; - }, - retryOptions - ); - }, - - async waitForDocumentInIndexForTime({ - esClient, - indexName, - ruleId, - num = 1, - sort = 'desc', - timeout = 1000, - }: { - esClient: Client; - indexName: string; - ruleId: string; - num?: number; - sort?: 'asc' | 'desc'; - timeout?: number; - }): Promise { - return await retry.tryForTime(timeout, async () => { - const response = await esClient.search({ - index: indexName, - sort: `date:${sort}`, - body: { - query: { - bool: { - must: [ - { - term: { - 'ruleId.keyword': ruleId, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length < num) { - throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); - } - return response; - }); - }, - - async waitForDocumentInIndex({ - esClient, - indexName, - ruleId, - num = 1, - sort = 'desc', - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - indexName: string; - ruleId: string; - num?: number; - sort?: 'asc' | 'desc'; - retryOptions?: TryWithRetriesOptions; - }): Promise { - return await retry.tryWithRetries( - `Alerting API - waitForDocumentInIndex, retryOptions: ${JSON.stringify(retryOptions)}`, - async () => { - const response = await esClient.search({ - index: indexName, - sort: `date:${sort}`, - body: { - query: { - bool: { - must: [ - { - term: { - 'ruleId.keyword': ruleId, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length < num) { - throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); - } - return response; - }, - retryOptions - ); - }, - - async createIndexConnector({ - roleAuthc, - name, - indexName, - }: { - roleAuthc: RoleCredentials; - name: string; - indexName: string; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/actions/connector`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - name, - config: { - index: indexName, - refresh: true, - }, - connector_type_id: '.index', - }) - .expect(200); - return body; - }, - - async createSlackConnector({ roleAuthc, name }: { roleAuthc: RoleCredentials; name: string }) { - const { body } = await supertestWithoutAuth - .post(`/api/actions/connector`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - name, - config: {}, - secrets: { - webhookUrl: 'http://test', - }, - connector_type_id: '.slack', - }) - .expect(200); - return body; - }, - - async createEsQueryRule({ - roleAuthc, - name, - ruleTypeId, - params, - actions = [], - tags = [], - schedule, - consumer, - notifyWhen, - enabled = true, - }: { - roleAuthc: RoleCredentials; - ruleTypeId: string; - name: string; - params: CreateEsQueryRuleParams; - consumer: string; - actions?: any[]; - tags?: any[]; - schedule?: { interval: string }; - notifyWhen?: string; - enabled?: boolean; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - enabled, - params, - consumer, - schedule: schedule || { - interval: '1h', - }, - tags, - name, - rule_type_id: ruleTypeId, - actions, - ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), - }) - .expect(200); - return body; - }, - - async createAnomalyRule({ - roleAuthc, - name = generateUniqueKey(), - actions = [], - tags = ['foo', 'bar'], - schedule, - consumer = 'alerts', - notifyWhen, - enabled = true, - ruleTypeId = 'apm.anomaly', - params, - }: { - roleAuthc: RoleCredentials; - name?: string; - consumer?: string; - actions?: any[]; - tags?: any[]; - schedule?: { interval: string }; - notifyWhen?: string; - enabled?: boolean; - ruleTypeId?: string; - params?: any; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - enabled, - params: params || { - anomalySeverityType: 'critical', - anomalyDetectorTypes: ['txLatency'], - environment: 'ENVIRONMENT_ALL', - windowSize: 30, - windowUnit: 'm', - }, - consumer, - schedule: schedule || { - interval: '1m', - }, - tags, - name, - rule_type_id: ruleTypeId, - actions, - ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), - }) - .expect(200); - return body; - }, - - async createLatencyThresholdRule({ - roleAuthc, - name = generateUniqueKey(), - actions = [], - tags = ['foo', 'bar'], - schedule, - consumer = 'apm', - notifyWhen, - enabled = true, - ruleTypeId = 'apm.transaction_duration', - params, - }: { - roleAuthc: RoleCredentials; - name?: string; - consumer?: string; - actions?: any[]; - tags?: any[]; - schedule?: { interval: string }; - notifyWhen?: string; - enabled?: boolean; - ruleTypeId?: string; - params?: any; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - enabled, - params: params || { - aggregationType: 'avg', - environment: 'ENVIRONMENT_ALL', - threshold: 1500, - windowSize: 5, - windowUnit: 'm', - }, - consumer, - schedule: schedule || { - interval: '1m', - }, - tags, - name, - rule_type_id: ruleTypeId, - actions, - ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), - }); - return body; - }, - - async createInventoryRule({ - roleAuthc, - name = generateUniqueKey(), - actions = [], - tags = ['foo', 'bar'], - schedule, - consumer = 'alerts', - notifyWhen, - enabled = true, - ruleTypeId = 'metrics.alert.inventory.threshold', - params, - }: { - roleAuthc: RoleCredentials; - name?: string; - consumer?: string; - actions?: any[]; - tags?: any[]; - schedule?: { interval: string }; - notifyWhen?: string; - enabled?: boolean; - ruleTypeId?: string; - params?: any; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - enabled, - params: params || { - nodeType: 'host', - criteria: [ - { - metric: 'cpu', - comparator: '>', - threshold: [5], - timeSize: 1, - timeUnit: 'm', - customMetric: { - type: 'custom', - id: 'alert-custom-metric', - field: '', - aggregation: 'avg', - }, - }, - ], - sourceId: 'default', - }, - consumer, - schedule: schedule || { - interval: '1m', - }, - tags, - name, - rule_type_id: ruleTypeId, - actions, - ...(notifyWhen ? { notify_when: notifyWhen, throttle: '5m' } : {}), - }) - .expect(200); - return body; - }, - - async disableRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule/${ruleId}/_disable`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(204); - return body; - }, - - async updateEsQueryRule({ - roleAuthc, - ruleId, - updates, - }: { - roleAuthc: RoleCredentials; - ruleId: string; - updates: any; - }) { - const { body: r } = await supertestWithoutAuth - .get(`/api/alerting/rule/${ruleId}`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(200); - const body = await supertestWithoutAuth - .put(`/api/alerting/rule/${ruleId}`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - ...{ - name: r.name, - schedule: r.schedule, - throttle: r.throttle, - tags: r.tags, - params: r.params, - notify_when: r.notifyWhen, - actions: r.actions.map((action: any) => ({ - group: action.group, - params: action.params, - id: action.id, - frequency: action.frequency, - })), - }, - ...updates, - }) - .expect(200); - return body; - }, - - async runRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - const response = await supertestWithoutAuth - .post(`/internal/alerting/rule/${ruleId}/_run_soon`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(204); - return response; - }, - - async waitForNumRuleRuns({ - roleAuthc, - numOfRuns, - ruleId, - esClient, - testStart, - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - roleAuthc: RoleCredentials; - numOfRuns: number; - ruleId: string; - esClient: Client; - testStart: Date; - retryOptions?: TryWithRetriesOptions; - }) { - for (let i = 0; i < numOfRuns; i++) { - await retry.tryWithRetries( - `Alerting API - waitForNumRuleRuns, retryOptions: ${JSON.stringify(retryOptions)}`, - async () => { - await this.runRule({ roleAuthc, ruleId }); - await this.waiting.waitForExecutionEventLog({ - esClient, - filter: testStart, - ruleId, - num: i + 1, - }); - await this.waiting.waitForAllTasksIdle({ esClient, filter: testStart }); - }, - retryOptions - ); - } - }, - - async muteRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule/${ruleId}/_mute_all`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(204); - return body; - }, - - async enableRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule/${ruleId}/_enable`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(204); - return body; - }, - - async muteAlert({ - roleAuthc, - ruleId, - alertId, - }: { - roleAuthc: RoleCredentials; - ruleId: string; - alertId: string; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule/${ruleId}/alert/${alertId}/_mute`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(204); - return body; - }, - - async unmuteRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule/${ruleId}/_unmute_all`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .expect(204); - return body; - }, - - async snoozeRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - const { body } = await supertestWithoutAuth - .post(`/internal/alerting/rule/${ruleId}/_snooze`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - snooze_schedule: { - duration: 100000000, - rRule: { - count: 1, - dtstart: moment().format(), - tzid: 'UTC', - }, - }, - }) - .expect(204); - return body; - }, - - async findRule({ roleAuthc, ruleId }: { roleAuthc: RoleCredentials; ruleId: string }) { - if (!ruleId) { - throw new Error(`'ruleId' is undefined`); - } - const response = await supertestWithoutAuth - .get(`/api/alerting/rule/${ruleId}`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader); - return response.body || {}; - }, - - waiting: { - async waitForDocumentInIndex({ - esClient, - indexName, - ruleId, - num = 1, - sort = 'desc', - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - indexName: string; - ruleId: string; - num?: number; - sort?: 'asc' | 'desc'; - retryOptions?: TryWithRetriesOptions; - }): Promise { - return await retry.tryWithRetries( - `Alerting API - waiting.waitForDocumentInIndex, retryOptions: ${JSON.stringify( - retryOptions - )}`, - async () => { - const response = await esClient.search({ - index: indexName, - sort: `date:${sort}`, - body: { - query: { - bool: { - must: [ - { - term: { - 'ruleId.keyword': ruleId, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length < num) { - throw new Error(`Only found ${response.hits.hits.length} / ${num} documents`); - } - return response; - }, - retryOptions - ); - }, - - async getDocumentsInIndex({ - esClient, - indexName, - ruleId, - }: { - esClient: Client; - indexName: string; - ruleId: string; - }): Promise { - return await esClient.search({ - index: indexName, - body: { - query: { - bool: { - must: [ - { - term: { - 'ruleId.keyword': ruleId, - }, - }, - ], - }, - }, - }, - }); - }, - - async waitForAllTasksIdle({ - esClient, - filter, - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - filter: Date; - retryOptions?: TryWithRetriesOptions; - }): Promise { - return await retry.tryWithRetries( - `Alerting API - waiting.waitForAllTasksIdle, retryOptions: ${JSON.stringify( - retryOptions - )}`, - async () => { - const response = await esClient.search({ - index: '.kibana_task_manager', - body: { - query: { - bool: { - must: [ - { - terms: { - 'task.scope': ['actions', 'alerting'], - }, - }, - { - range: { - 'task.scheduledAt': { - gte: filter.getTime().toString(), - }, - }, - }, - ], - must_not: [ - { - term: { - 'task.status': 'idle', - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length !== 0) { - throw new Error(`Expected 0 hits but received ${response.hits.hits.length}`); - } - return response; - }, - retryOptions - ); - }, - - async waitForExecutionEventLog({ - esClient, - filter, - ruleId, - num = 1, - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - filter: Date; - ruleId: string; - num?: number; - retryOptions?: TryWithRetriesOptions; - }): Promise { - return await retry.tryWithRetries( - `Alerting API - waiting.waitForExecutionEventLog, retryOptions: ${JSON.stringify( - retryOptions - )}`, - async () => { - const response = await esClient.search({ - index: '.kibana-event-log*', - body: { - query: { - bool: { - filter: [ - { - term: { - 'rule.id': { - value: ruleId, - }, - }, - }, - { - term: { - 'event.provider': { - value: 'alerting', - }, - }, - }, - { - term: { - 'event.action': 'execute', - }, - }, - { - range: { - '@timestamp': { - gte: filter.getTime().toString(), - }, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length < num) { - throw new Error('No hits found'); - } - return response; - }, - retryOptions - ); - }, - - async createIndex({ esClient, indexName }: { esClient: Client; indexName: string }) { - return await esClient.indices.create( - { - index: indexName, - body: {}, - }, - { meta: true } - ); - }, - - async waitForAllTasks({ - esClient, - filter, - taskType, - attempts, - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - filter: Date; - taskType: string; - attempts: number; - retryOptions?: TryWithRetriesOptions; - }): Promise { - return await retry.tryWithRetries( - `Alerting API - waiting.waitForAllTasks, retryOptions: ${JSON.stringify(retryOptions)}`, - async () => { - const response = await esClient.search({ - index: '.kibana_task_manager', - body: { - query: { - bool: { - must: [ - { - term: { - 'task.status': 'idle', - }, - }, - { - term: { - 'task.attempts': attempts, - }, - }, - { - terms: { - 'task.scope': ['actions', 'alerting'], - }, - }, - { - term: { - 'task.taskType': taskType, - }, - }, - { - range: { - 'task.scheduledAt': { - gte: filter.getTime().toString(), - }, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length === 0) { - throw new Error('No hits found'); - } - return response; - }, - retryOptions - ); - }, - - async waitForDisabled({ - esClient, - ruleId, - filter, - retryOptions = { retryCount: RETRY_COUNT, retryDelay: RETRY_DELAY }, - }: { - esClient: Client; - ruleId: string; - filter: Date; - retryOptions?: TryWithRetriesOptions; - }): Promise { - return await retry.tryWithRetries( - `Alerting API - waiting.waitForDisabled, retryOptions: ${JSON.stringify(retryOptions)}`, - async () => { - const response = await esClient.search({ - index: '.kibana_task_manager', - body: { - query: { - bool: { - must: [ - { - term: { - 'task.id': `task:${ruleId}`, - }, - }, - { - terms: { - 'task.scope': ['actions', 'alerting'], - }, - }, - { - range: { - 'task.scheduledAt': { - gte: filter.getTime().toString(), - }, - }, - }, - { - term: { - 'task.enabled': true, - }, - }, - ], - }, - }, - }, - }); - if (response.hits.hits.length !== 0) { - throw new Error(`Expected 0 hits but received ${response.hits.hits.length}`); - } - return response; - }, - retryOptions - ); - }, - }, - }; - - return { - helpers, - - async waitForRuleStatus({ - roleAuthc, - ruleId, - expectedStatus, - }: { - roleAuthc: RoleCredentials; - ruleId: string; - expectedStatus: string; - }) { - if (!ruleId) { - throw new Error(`'ruleId' is undefined`); - } - return await retry.tryForTime(retryTimeout, async () => { - const response = await supertestWithoutAuth - .get(`/api/alerting/rule/${ruleId}`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .timeout(requestTimeout); - const { execution_status: executionStatus } = response.body || {}; - const { status } = executionStatus || {}; - if (status !== expectedStatus) { - throw new Error(`waitForStatus(${expectedStatus}): got ${status}`); - } - return executionStatus?.status; - }); - }, - - async waitForDocumentInIndex({ - indexName, - docCountTarget = 1, - }: { - indexName: string; - docCountTarget?: number; - }): Promise>> { - return await retry.tryForTime(retryTimeout, async () => { - const response = await es.search({ - index: indexName, - rest_total_hits_as_int: true, - }); - logger.debug(`Found ${response.hits.total} docs, looking for at least ${docCountTarget}.`); - if (!response.hits.total || (response.hits.total as number) < docCountTarget) { - throw new Error('No hits found'); - } - return response; - }); - }, - - async waitForAlertInIndex({ - indexName, - ruleId, - }: { - indexName: string; - ruleId: string; - }): Promise>> { - if (!ruleId) { - throw new Error(`'ruleId' is undefined`); - } - return await retry.tryForTime(retryTimeout, async () => { - const response = await es.search({ - index: indexName, - body: { - query: { - term: { - 'kibana.alert.rule.uuid': ruleId, - }, - }, - }, - }); - if (response.hits.hits.length === 0) { - throw new Error('No hits found'); - } - return response; - }); - }, - - async createIndexConnector({ - roleAuthc, - name, - indexName, - }: { - roleAuthc: RoleCredentials; - name: string; - indexName: string; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/actions/connector`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - name, - config: { - index: indexName, - refresh: true, - }, - connector_type_id: '.index', - }); - return body.id as string; - }, - - async createRule({ - roleAuthc, - name, - ruleTypeId, - params, - actions = [], - tags = [], - schedule, - consumer, - }: { - roleAuthc: RoleCredentials; - ruleTypeId: string; - name: string; - params: MetricThresholdParams | ThresholdParams | SloBurnRateRuleParams; - actions?: any[]; - tags?: any[]; - schedule?: { interval: string }; - consumer: string; - }) { - const { body } = await supertestWithoutAuth - .post(`/api/alerting/rule`) - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader) - .send({ - params, - consumer, - schedule: schedule || { - interval: '5m', - }, - tags, - name, - rule_type_id: ruleTypeId, - actions, - }); - return body; - }, - - async findRule(roleAuthc: RoleCredentials, ruleId: string) { - if (!ruleId) { - throw new Error(`'ruleId' is undefined`); - } - const response = await supertestWithoutAuth - .get('/api/alerting/rules/_find') - .set(svlCommonApi.getInternalRequestHeader()) - .set(roleAuthc.apiKeyHeader); - return response.body.data.find((obj: any) => obj.id === ruleId); - }, - }; -} diff --git a/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts b/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts index 2272890e52eb4..fa9a1671871a8 100644 --- a/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts +++ b/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts @@ -8,12 +8,12 @@ import _ from 'lodash'; import { services as apiIntegrationServices } from '@kbn/test-suites-xpack/api_integration/services'; -import { AlertingApiProvider } from './alerting_api'; +import { services as apiIntegrationDeploymentAgnosticServices } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services'; /* * Some FTR services from api integration stateful tests are compatible with serverless environment * While adding a new one, make sure to verify that it works on both Kibana CI and MKI */ -const deploymentAgnosticApiIntegrationServices = _.pick(apiIntegrationServices, [ +const pickedServices = _.pick(apiIntegrationServices, [ 'deployment', 'es', 'esArchiver', @@ -34,6 +34,6 @@ const deploymentAgnosticApiIntegrationServices = _.pick(apiIntegrationServices, export const services = { // deployment agnostic FTR services - ...deploymentAgnosticApiIntegrationServices, - alertingApi: AlertingApiProvider, + ...pickedServices, + alertingApi: apiIntegrationDeploymentAgnosticServices.alertingApi, }; From 65014d1b6aba514ae29bb66f9ff2f869f8526d0a Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Mon, 30 Sep 2024 11:53:04 +0200 Subject: [PATCH 003/107] Revert "[Spaces] Filtering out features that do not have space scope" (#194329) Reverts elastic/kibana#194157 --- .../create_space/create_space_page.test.tsx | 58 ------------------- .../create_space/create_space_page.tsx | 11 +--- 2 files changed, 2 insertions(+), 67 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx b/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx index 757e882bf741c..4c8617ff007b8 100644 --- a/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx @@ -14,7 +14,6 @@ import { act } from 'react-dom/test-utils'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; import { notificationServiceMock, scopedHistoryMock } from '@kbn/core/public/mocks'; -import { KibanaFeatureScope } from '@kbn/features-plugin/common'; import { KibanaFeature } from '@kbn/features-plugin/public'; import { featuresPluginMock } from '@kbn/features-plugin/public/mocks'; import { findTestSubject, mountWithIntl } from '@kbn/test-jest-helpers'; @@ -49,15 +48,6 @@ featuresStart.getFeatures.mockResolvedValue([ app: [], category: DEFAULT_APP_CATEGORIES.kibana, privileges: null, - scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], - }), - new KibanaFeature({ - id: 'feature-2', - name: 'feature 2', - app: [], - category: DEFAULT_APP_CATEGORIES.kibana, - privileges: null, - scope: [KibanaFeatureScope.Security], }), ]); @@ -651,54 +641,6 @@ describe('ManageSpacePage', () => { expect(spacesManager.updateSpace).toHaveBeenCalledTimes(1); }); - - it('shows only features with space scope', async () => { - const spacesManager = spacesManagerMock.create(); - spacesManager.getSpace = jest.fn().mockResolvedValue({ - id: 'my-space', - name: 'Existing Space', - description: 'hey an existing space', - color: '#aabbcc', - initials: 'AB', - disabledFeatures: [], - }); - spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); - - const wrapper = mountWithIntl( - - ); - - await waitFor(() => { - wrapper.update(); - expect(spacesManager.getSpace).toHaveBeenCalledWith('my-space'); - }); - - expect(wrapper.state('features')).toEqual([ - new KibanaFeature({ - id: 'feature-1', - name: 'feature 1', - app: [], - category: DEFAULT_APP_CATEGORIES.kibana, - privileges: null, - scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], - }), - ]); - }); }); function updateSpace( diff --git a/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx b/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx index ed0e52edd6c4b..e8204a53fe345 100644 --- a/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx +++ b/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx @@ -22,7 +22,6 @@ import React, { Component } from 'react'; import type { Capabilities, NotificationsStart, ScopedHistory } from '@kbn/core/public'; import { SectionLoading } from '@kbn/es-ui-shared-plugin/public'; -import { KibanaFeatureScope } from '@kbn/features-plugin/common'; import type { FeaturesPluginStart, KibanaFeature } from '@kbn/features-plugin/public'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -92,10 +91,6 @@ export class CreateSpacePage extends Component { }; } - private filterSpaceFeatures = (features: KibanaFeature[]) => { - return features.filter((feature) => feature.scope?.includes(KibanaFeatureScope.Spaces)); - }; - public async componentDidMount() { if (!this.props.capabilities.spaces.manage) { return; @@ -108,8 +103,7 @@ export class CreateSpacePage extends Component { await this.loadSpace(spaceId, getFeatures()); } else { const features = await getFeatures(); - - this.setState({ isLoading: false, features: this.filterSpaceFeatures(features) }); + this.setState({ isLoading: false, features }); } } catch (e) { notifications.toasts.addError(e, { @@ -416,7 +410,6 @@ export class CreateSpacePage extends Component { spacesManager.getSpace(spaceId), featuresPromise, ]); - if (space) { if (onLoadSpace) { onLoadSpace(space); @@ -433,7 +426,7 @@ export class CreateSpacePage extends Component { !!space.initials && getSpaceInitials({ name: space.name }) !== space.initials, customAvatarColor: !!space.color && getSpaceColor({ name: space.name }) !== space.color, }, - features: this.filterSpaceFeatures(features), + features, originalSpace: space, isLoading: false, }); From 23effbedd4f88219b71088b34d8e9221527e7a91 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 30 Sep 2024 12:24:09 +0200 Subject: [PATCH 004/107] [TableListView] Fix letters are skipped when typing fast (#194009) --- .../src/table_list_view.test.tsx | 122 ++++++++---------- .../src/table_list_view_table.tsx | 22 ++-- .../src/use_url_state.ts | 28 ++-- 3 files changed, 76 insertions(+), 96 deletions(-) diff --git a/packages/content-management/table_list_view_table/src/table_list_view.test.tsx b/packages/content-management/table_list_view_table/src/table_list_view.test.tsx index 50c8cdfdfde3b..a4e06fbb1e4a4 100644 --- a/packages/content-management/table_list_view_table/src/table_list_view.test.tsx +++ b/packages/content-management/table_list_view_table/src/table_list_view.test.tsx @@ -1222,37 +1222,41 @@ describe('TableListView', () => { describe('url state', () => { let router: Router | undefined; - const setupTagFiltering = registerTestBed( - WithServices(TableListViewTable, { - getTagList: () => [ - { - id: 'id-tag-1', - name: 'tag-1', - type: 'tag', - description: '', - color: '', - managed: false, - }, - { - id: 'id-tag-2', - name: 'tag-2', - type: 'tag', - description: '', - color: '', - managed: false, - }, - ], - }), - { - defaultProps: { ...requiredProps, urlStateEnabled: true }, - memoryRouter: { - wrapComponent: true, - onRouter: (_router: Router) => { - router = _router; + const setupInitialUrl = (initialSearchQuery: string = '') => + registerTestBed( + WithServices(TableListViewTable, { + getTagList: () => [ + { + id: 'id-tag-1', + name: 'tag-1', + type: 'tag', + description: '', + color: '', + managed: false, + }, + { + id: 'id-tag-2', + name: 'tag-2', + type: 'tag', + description: '', + color: '', + managed: false, + }, + ], + }), + { + defaultProps: { ...requiredProps, urlStateEnabled: true }, + memoryRouter: { + wrapComponent: true, + initialEntries: [{ search: initialSearchQuery }], + onRouter: (_router: Router) => { + router = _router; + }, }, - }, - } - ); + } + ); + + const setupTagFiltering = setupInitialUrl(); const hits: UserContentCommonSchema[] = [ { @@ -1277,13 +1281,13 @@ describe('TableListView', () => { }, ]; - test('should read search term from URL', async () => { + test('should read the initial search term from URL', async () => { let testBed: TestBed; const findItems = jest.fn().mockResolvedValue({ total: hits.length, hits: [...hits] }); await act(async () => { - testBed = await setupTagFiltering({ + testBed = await setupInitialUrl('?s=hello')({ findItems, }); }); @@ -1294,22 +1298,23 @@ describe('TableListView', () => { const getSearchBoxValue = () => find('tableListSearchBox').props().defaultValue; // Start with empty search box - expect(getSearchBoxValue()).toBe(''); - expect(router?.history.location?.search).toBe(''); + expect(getSearchBoxValue()).toBe('hello'); + expect(router?.history.location?.search).toBe('?s=hello'); // Change the URL await act(async () => { if (router?.history.push) { router.history.push({ - search: `?${queryString.stringify({ s: 'hello' }, { encode: false })}`, + search: `?${queryString.stringify({ s: '' }, { encode: false })}`, }); } }); + component.update(); - // Search box is updated + // Search box is not updated expect(getSearchBoxValue()).toBe('hello'); - expect(router?.history.location?.search).toBe('?s=hello'); + expect(router?.history.location?.search).toBe('?s='); }); test('should update the URL when changing the search term', async () => { @@ -1338,13 +1343,15 @@ describe('TableListView', () => { expect(router?.history.location?.search).toBe('?s=search-changed'); }); - test('should filter by tag from the URL', async () => { + test('should filter by initial tag from the URL', async () => { let testBed: TestBed; const findItems = jest.fn().mockResolvedValue({ total: hits.length, hits: [...hits] }); await act(async () => { - testBed = await setupTagFiltering({ + testBed = await setupInitialUrl( + `?${queryString.stringify({ s: 'tag:(tag-2)' }, { encode: false })}` + )({ findItems, }); }); @@ -1357,7 +1364,7 @@ describe('TableListView', () => { const getSearchBoxValue = () => find('tableListSearchBox').props().defaultValue; - let expected = ''; + let expected = 'tag:(tag-2)'; let [searchTerm] = getLastCallArgsFromFindItems(); expect(getSearchBoxValue()).toBe(expected); expect(searchTerm).toBe(expected); @@ -1366,13 +1373,13 @@ describe('TableListView', () => { await act(async () => { if (router?.history.push) { router.history.push({ - search: `?${queryString.stringify({ s: 'tag:(tag-2)' }, { encode: false })}`, + search: `?${queryString.stringify({ s: '' }, { encode: false })}`, }); } }); component.update(); - // The search bar should be updated + // The search bar shouldn't be updated expected = 'tag:(tag-2)'; [searchTerm] = getLastCallArgsFromFindItems(); expect(getSearchBoxValue()).toBe(expected); @@ -1413,13 +1420,15 @@ describe('TableListView', () => { expect(router?.history.location?.search).toBe('?s=tag:(tag-2)'); }); - test('should set sort column and direction from URL', async () => { + test('should set initial sort column and direction from URL', async () => { let testBed: TestBed; const findItems = jest.fn().mockResolvedValue({ total: hits.length, hits: [...hits] }); await act(async () => { - testBed = await setupTagFiltering({ + testBed = await setupInitialUrl( + `?${queryString.stringify({ sort: 'updatedAt', sortdir: 'asc' })}` + )({ findItems, }); }); @@ -1427,37 +1436,18 @@ describe('TableListView', () => { const { component, table } = testBed!; component.update(); - // Start with empty search box - expect(router?.history.location?.search).toBe(''); - let { tableCellsValues } = table.getMetaData('itemsInMemTable'); expect(tableCellsValues).toEqual([ - ['Item 1tag-1', yesterdayToString], ['Item 2tag-2', twoDaysAgoToString], - ]); - - // Change the URL - await act(async () => { - if (router?.history.push) { - router.history.push({ - search: `?${queryString.stringify({ sort: 'updatedAt', sortdir: 'asc' })}`, - }); - } - }); - component.update(); - - ({ tableCellsValues } = table.getMetaData('itemsInMemTable')); - - expect(tableCellsValues).toEqual([ - ['Item 2tag-2', twoDaysAgoToString], // Sort got inverted ['Item 1tag-1', yesterdayToString], ]); + // Change the URL await act(async () => { if (router?.history.push) { router.history.push({ - search: `?${queryString.stringify({ sort: 'title' })}`, // if dir not specified, asc by default + search: `?${queryString.stringify({ sort: 'updatedAt', sortdir: 'desc' })}`, }); } }); @@ -1466,8 +1456,8 @@ describe('TableListView', () => { ({ tableCellsValues } = table.getMetaData('itemsInMemTable')); expect(tableCellsValues).toEqual([ - ['Item 1tag-1', yesterdayToString], ['Item 2tag-2', twoDaysAgoToString], + ['Item 1tag-1', yesterdayToString], // Sort stayed the same ]); }); diff --git a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx index 504440d27406e..0f6df7c81533b 100644 --- a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx +++ b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx @@ -384,7 +384,7 @@ function TableListViewTableComp({ ); } - const [urlState, setUrlState] = useUrlState({ + const [initialUrlState, setUrlState] = useUrlState({ queryParamsDeserializer: urlStateDeserializer, queryParamsSerializer: urlStateSerializer, }); @@ -495,7 +495,6 @@ function TableListViewTableComp({ (query: Query) => { if (urlStateEnabled) { setUrlState({ s: query.text }); - return; } dispatch({ @@ -849,12 +848,10 @@ function TableListViewTableComp({ }); } - if (data.page || !urlStateEnabled) { - dispatch({ - type: 'onTableChange', - data, - }); - } + dispatch({ + type: 'onTableChange', + data, + }); }, [setUrlState, urlStateEnabled] ); @@ -1024,6 +1021,7 @@ function TableListViewTableComp({ // ------------ useDebounce(fetchItems, 300, [fetchItems, refreshListBouncer]); + // set the initial state from the URL useEffect(() => { if (!urlStateEnabled) { return; @@ -1075,10 +1073,10 @@ function TableListViewTableComp({ }); }; - updateQueryFromURL(urlState.s); - updateSortFromURL(urlState.sort); - updateFilterFromURL(urlState.filter); - }, [urlState, buildQueryFromText, urlStateEnabled]); + updateQueryFromURL(initialUrlState.s); + updateSortFromURL(initialUrlState.sort); + updateFilterFromURL(initialUrlState.filter); + }, [initialUrlState, buildQueryFromText, urlStateEnabled]); useEffect(() => { isMounted.current = true; diff --git a/packages/content-management/table_list_view_table/src/use_url_state.ts b/packages/content-management/table_list_view_table/src/use_url_state.ts index 466fdd6ece09a..8b06a7cd98a2c 100644 --- a/packages/content-management/table_list_view_table/src/use_url_state.ts +++ b/packages/content-management/table_list_view_table/src/use_url_state.ts @@ -8,8 +8,8 @@ */ import queryString from 'query-string'; -import { useCallback, useMemo, useState, useEffect } from 'react'; -import { useLocation, useHistory } from 'react-router-dom'; +import { useCallback, useState } from 'react'; +import { useHistory, useLocation } from 'react-router-dom'; export function useInRouterContext() { try { @@ -20,11 +20,6 @@ export function useInRouterContext() { } } -function useQuery = {}>() { - const { search } = useLocation(); - return useMemo(() => queryString.parse(search) as T, [search]); -} - export function useUrlState< T extends Record = {}, Q extends Record = {} @@ -36,15 +31,17 @@ export function useUrlState< queryParamsSerializer: (params: Record) => Partial; }): [T, (updated: Record) => void] { const history = useHistory(); - const params = useQuery(); - const [urlState, setUrlState] = useState({} as T); - const updateQuerParams = useCallback( + const [initialUrlState] = useState(() => + queryParamsDeserializer(queryString.parse(history.location.search) as Q) + ); + + const updateQueryParams = useCallback( (updated: Record) => { const updatedQuery = queryParamsSerializer(updated); const queryParams = { - ...params, + ...queryString.parse(history.location.search), ...updatedQuery, }; @@ -52,13 +49,8 @@ export function useUrlState< search: `?${queryString.stringify(queryParams, { encode: false })}`, }); }, - [history, params, queryParamsSerializer] + [history, queryParamsSerializer] ); - useEffect(() => { - const updatedState = queryParamsDeserializer(params); - setUrlState(updatedState); - }, [params, queryParamsDeserializer]); - - return [urlState, updateQuerParams]; + return [initialUrlState, updateQueryParams]; } From 26f5e1482b23548d1b06bec9e5fedf7dfa93a620 Mon Sep 17 00:00:00 2001 From: Irene Blanco Date: Mon, 30 Sep 2024 12:37:37 +0200 Subject: [PATCH 005/107] [Inventory] Use observability:entitycentricexperience to enable + side nav adjustments (#193533) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Closes https://github.com/elastic/kibana/issues/192323 and https://github.com/elastic/kibana/issues/193393. ### Plugin enablement The enablement of the new Inventory plugin was previously managed via the `xpack.inventory.enabled` setting in kibana.yml. With this PR, we transition to enabling it through the `observability:entitycentricexperience` advanced setting. ### Position in side nav Additionally, this PR includes adjustments to the placement of the new Inventory page within the side navigation and the addition of the "Tech Preview" badge in the navigation where it was supported. |Navigation|Screenshot| |-|-| |Stateful classic (first nav)|![Screenshot 2024-09-25 at 11 25 46](https://github.com/user-attachments/assets/54e92632-9931-4f5b-8648-8a32afcd0caf)| |Stateful classic (O11y)|![Screenshot 2024-09-25 at 11 25 56](https://github.com/user-attachments/assets/ae644eb2-2559-4be0-8659-ef709399a871)| |Stateful new O11y|![Screenshot 2024-09-25 at 11 27 52](https://github.com/user-attachments/assets/c404232c-2630-4220-9bb8-315b0f0fc55f)| |Serverless|![Screenshot 2024-09-25 at 11 23 07](https://github.com/user-attachments/assets/7f7e6c79-7f0f-4f7d-8fed-260d73ad4d3f)| ### Global search A modification was made to the global search to prevent a duplicate result from appearing during searches by removing the deeplinks when registering the plugin. The UI changes are shown below. >[!WARNING] If this modification causes any other issues, please let me know in a comment. |With deeplink (before)|Without deeplink (after)| |-|-| |![global_search_with_deeplink](https://github.com/user-attachments/assets/3ef5641c-3add-4892-af2f-46f72ff1722e)|![global_search_without_deeplink](https://github.com/user-attachments/assets/8ad92f27-13a2-4b85-8958-588e597f94d9)| ### Services rename to Service Inventory Another needed change was to rename the nav item Services to Service Inventory >[!NOTE] Screenshots were taken before the navigation sorting was agreed with product, so the "Inventory" item does not appear in the right position. |Navigation|Screenshot| |-|-| |Stateful classic (O11y)|![services_stateful_classic](https://github.com/user-attachments/assets/25ed1294-40fe-47be-9319-fe294acce8f8)| |Stateful new O11y|![services_stateful_new](https://github.com/user-attachments/assets/4ae9495c-56bc-4327-b2f6-b6ac9f68bd21)| |Serverless|![services_serverless](https://github.com/user-attachments/assets/81ff51f4-3b0e-41fd-b7c6-79e8aa44e575)| >[!NOTE] The rename of infra Inventory to Infrastructure Inventory is being tracked separately in https://github.com/elastic/kibana/issues/192324. ### Tech preview badge in page Lastly, the "Technical Preview" badge has been added to the page title. >[!NOTE] The screenshot was taken before the navigation sorting was agreed with product, so the "Inventory" item does not appear in the right position. ![inventory_title_badge](https://github.com/user-attachments/assets/172c5b8e-258e-4127-b792-40910e9dede0) ### Plugin registration in server To make the Inventory available in the spaces and privileges configuration the plugin has been registered in the features service. >[!WARNING] I lack detailed context in this area, so I’ve added default empty configurations for most attributes. If any adjustments or improvements are needed, please let me know. |Space config|Privileges| |-|-| |![Screenshot 2024-09-23 at 10 57 35](https://github.com/user-attachments/assets/1c3a45b6-fd67-4706-8fc4-ee42a9206787)|![Screenshot 2024-09-23 at 10 57 14](https://github.com/user-attachments/assets/a852c15d-133c-459d-be77-2d73e662ffdb)| --------- Co-authored-by: Kate Patticha Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../collectors/application_usage/schema.ts | 1 + src/plugins/telemetry/schema/oss_plugins.json | 131 ++++++++++++++++++ .../apm/ftr_e2e/cypress/e2e/deep_links.cy.ts | 4 +- .../apm/public/plugin.ts | 2 +- .../inventory/kibana.jsonc | 6 +- .../inventory_page_template/index.tsx | 31 +++-- .../inventory/public/plugin.ts | 73 +++++----- .../inventory/server/config.ts | 2 +- .../inventory/server/feature.ts | 64 +++++++++ .../inventory/server/plugin.ts | 4 + .../inventory/server/types.ts | 2 + .../inventory/tsconfig.json | 5 +- .../observability/public/navigation_tree.ts | 7 +- .../public/navigation_tree.ts | 1 + .../apis/features/features/features.ts | 2 + .../apis/security/privileges.ts | 1 + .../apis/security/privileges_basic.ts | 2 + .../spaces_only/telemetry/telemetry.ts | 1 + 18 files changed, 282 insertions(+), 57 deletions(-) create mode 100644 x-pack/plugins/observability_solution/inventory/server/feature.ts diff --git a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts index 87318e6c95fe8..06866afc65caa 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts @@ -152,6 +152,7 @@ export const applicationUsageSchema = { fleet: commonSchema, integrations: commonSchema, ingestManager: commonSchema, + inventory: commonSchema, lens: commonSchema, maps: commonSchema, ml: commonSchema, diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 37507c50e832c..82e7666018782 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -4194,6 +4194,137 @@ } } }, + "inventory": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "Always `main`" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 90 days" + } + }, + "views": { + "type": "array", + "items": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "The application view being tracked" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application sub view since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application sub view is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" + } + } + } + } + } + } + }, "lens": { "properties": { "appId": { diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/deep_links.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/deep_links.cy.ts index e7c75652c7d03..32ff06d1b3c6b 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/deep_links.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/deep_links.cy.ts @@ -16,7 +16,7 @@ describe('APM deep links', () => { .type('APM', { force: true, delay: 100 }) .focus(); cy.contains('APM'); - cy.contains('APM / Services'); + cy.contains('APM / Service Inventory'); cy.contains('APM / Service groups'); cy.contains('APM / Traces'); cy.contains('APM / Service Map'); @@ -33,7 +33,7 @@ describe('APM deep links', () => { .should('be.visible') .type('APM', { force: true, delay: 100 }); // navigates to services page - cy.contains('APM / Services').click({ force: true }); + cy.contains('APM / Service Inventory').click({ force: true }); cy.url().should('include', '/apm/services'); cy.getByTestSubj('nav-search-input') diff --git a/x-pack/plugins/observability_solution/apm/public/plugin.ts b/x-pack/plugins/observability_solution/apm/public/plugin.ts index c429fdaeb9ec5..f58b9d6d40969 100644 --- a/x-pack/plugins/observability_solution/apm/public/plugin.ts +++ b/x-pack/plugins/observability_solution/apm/public/plugin.ts @@ -156,7 +156,7 @@ const applicationsTitle = i18n.translate('xpack.apm.navigation.rootTitle', { }); const servicesTitle = i18n.translate('xpack.apm.navigation.servicesTitle', { - defaultMessage: 'Services', + defaultMessage: 'Service Inventory', }); const serviceGroupsTitle = i18n.translate('xpack.apm.navigation.serviceGroupsTitle', { diff --git a/x-pack/plugins/observability_solution/inventory/kibana.jsonc b/x-pack/plugins/observability_solution/inventory/kibana.jsonc index 524b59d37cc34..f60cf36183b24 100644 --- a/x-pack/plugins/observability_solution/inventory/kibana.jsonc +++ b/x-pack/plugins/observability_solution/inventory/kibana.jsonc @@ -12,13 +12,13 @@ "entityManager", "inference", "dataViews", + "share", + "features", "unifiedSearch", "data", "share" ], - "requiredBundles": [ - "kibanaReact" - ], + "requiredBundles": ["kibanaReact"], "optionalPlugins": [], "extraPublicDirs": [] } diff --git a/x-pack/plugins/observability_solution/inventory/public/components/inventory_page_template/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/inventory_page_template/index.tsx index c2734d6643553..29a6ac31348b4 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/inventory_page_template/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/inventory_page_template/index.tsx @@ -4,10 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { EuiEmptyPrompt, EuiLoadingLogo } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiEmptyPrompt, EuiLoadingLogo } from '@elastic/eui'; +import { TechnicalPreviewBadge } from '@kbn/observability-shared-plugin/public'; import { useKibana } from '../../hooks/use_kibana'; import { SearchBar } from '../search_bar'; import { getEntityManagerEnablement } from './no_data_config'; @@ -16,11 +16,18 @@ import { Welcome } from '../entity_enablement/welcome_modal'; import { useInventoryAbortableAsync } from '../../hooks/use_inventory_abortable_async'; import { EmptyState } from '../empty_states/empty_state'; -const pageTitle = { - pageTitle: i18n.translate('xpack.inventory.inventoryPageHeaderLabel', { - defaultMessage: 'Inventory', - }), -}; +const pageTitle = ( + + + {i18n.translate('xpack.inventory.inventoryPageHeaderLabel', { + defaultMessage: 'Inventory', + })} + + + + + +); export function InventoryPageTemplate({ children }: { children: React.ReactNode }) { const { @@ -52,7 +59,11 @@ export function InventoryPageTemplate({ children }: { children: React.ReactNode if (isEnablementLoading || hasDataLoading) { return ( - + } /> ); @@ -60,12 +71,14 @@ export function InventoryPageTemplate({ children }: { children: React.ReactNode return ( {value.hasData ? ( diff --git a/x-pack/plugins/observability_solution/inventory/public/plugin.ts b/x-pack/plugins/observability_solution/inventory/public/plugin.ts index 6f05d4594d152..c02a57b45f691 100644 --- a/x-pack/plugins/observability_solution/inventory/public/plugin.ts +++ b/x-pack/plugins/observability_solution/inventory/public/plugin.ts @@ -12,6 +12,7 @@ import { DEFAULT_APP_CATEGORIES, Plugin, PluginInitializerContext, + AppStatus, } from '@kbn/core/public'; import { INVENTORY_APP_ID } from '@kbn/deeplinks-observability/constants'; import { i18n } from '@kbn/i18n'; @@ -49,33 +50,39 @@ export class InventoryPlugin pluginsSetup: InventorySetupDependencies ): InventoryPublicSetup { const inventoryAPIClient = createCallInventoryAPI(coreSetup); - this.telemetry.setup({ analytics: coreSetup.analytics }); - - pluginsSetup.observabilityShared.navigation.registerSections( - from(coreSetup.getStartServices()).pipe( - map(([coreStart, pluginsStart]) => { - return [ - { - label: '', - sortKey: 101, - entries: [ - { - label: i18n.translate('xpack.inventory.inventoryLinkTitle', { - defaultMessage: 'Inventory', - }), - app: INVENTORY_APP_ID, - path: '/', - matchPath(currentPath: string) { - return ['/', ''].some((testPath) => currentPath.startsWith(testPath)); - }, - }, - ], - }, - ]; - }) - ) + const isEntityCentricExperienceSettingEnabled = coreSetup.uiSettings.get( + 'observability:entityCentricExperience', + true ); + if (isEntityCentricExperienceSettingEnabled) { + pluginsSetup.observabilityShared.navigation.registerSections( + from(coreSetup.getStartServices()).pipe( + map(([coreStart, pluginsStart]) => { + return [ + { + label: '', + sortKey: 300, + entries: [ + { + label: i18n.translate('xpack.inventory.inventoryLinkTitle', { + defaultMessage: 'Inventory', + }), + app: INVENTORY_APP_ID, + path: '/', + matchPath(currentPath: string) { + return ['/', ''].some((testPath) => currentPath.startsWith(testPath)); + }, + isTechnicalPreview: true, + }, + ], + }, + ]; + }) + ) + ); + } + this.telemetry.setup({ analytics: coreSetup.analytics }); const telemetry = this.telemetry.start(); coreSetup.application.register({ @@ -86,17 +93,11 @@ export class InventoryPlugin euiIconType: 'logoObservability', appRoute: '/app/observability/inventory', category: DEFAULT_APP_CATEGORIES.observability, - visibleIn: ['sideNav'], - order: 8001, - deepLinks: [ - { - id: 'inventory', - title: i18n.translate('xpack.inventory.inventoryDeepLinkTitle', { - defaultMessage: 'Inventory', - }), - path: '/', - }, - ], + visibleIn: ['sideNav', 'globalSearch'], + order: 8200, + status: isEntityCentricExperienceSettingEnabled + ? AppStatus.accessible + : AppStatus.inaccessible, mount: async (appMountParameters: AppMountParameters) => { // Load application bundle and Get start services const [{ renderApp }, [coreStart, pluginsStart]] = await Promise.all([ diff --git a/x-pack/plugins/observability_solution/inventory/server/config.ts b/x-pack/plugins/observability_solution/inventory/server/config.ts index 2d6d7604b40e1..36f19bd6579a7 100644 --- a/x-pack/plugins/observability_solution/inventory/server/config.ts +++ b/x-pack/plugins/observability_solution/inventory/server/config.ts @@ -8,7 +8,7 @@ import { schema, type TypeOf } from '@kbn/config-schema'; export const config = schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), }); export type InventoryConfig = TypeOf; diff --git a/x-pack/plugins/observability_solution/inventory/server/feature.ts b/x-pack/plugins/observability_solution/inventory/server/feature.ts new file mode 100644 index 0000000000000..2b3f2e92a44de --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/server/feature.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; +import { KibanaFeatureScope } from '@kbn/features-plugin/common'; + +const INVENTORY_SERVER_FEATURE_ID = 'inventory'; + +export const INVENTORY_SERVER_FEATURE = { + id: INVENTORY_SERVER_FEATURE_ID, + name: i18n.translate('xpack.inventory.featureRegistry.inventoryFeatureName', { + defaultMessage: 'Inventory', + }), + order: 1000, + category: DEFAULT_APP_CATEGORIES.observability, + scope: [KibanaFeatureScope.Spaces, KibanaFeatureScope.Security], + app: [INVENTORY_SERVER_FEATURE_ID], + catalogue: [INVENTORY_SERVER_FEATURE_ID], + alerting: [], + // see x-pack/plugins/features/common/feature_kibana_privileges.ts + privileges: { + all: { + app: [INVENTORY_SERVER_FEATURE_ID], + api: [INVENTORY_SERVER_FEATURE_ID], + catalogue: [INVENTORY_SERVER_FEATURE_ID], + savedObject: { + all: [], + read: [], + }, + alerting: { + alert: { + all: [], + }, + rule: { + all: [], + }, + }, + ui: ['show', 'save'], + }, + read: { + app: [INVENTORY_SERVER_FEATURE_ID], + api: [INVENTORY_SERVER_FEATURE_ID], + catalogue: [INVENTORY_SERVER_FEATURE_ID], + savedObject: { + all: [], + read: [], + }, + alerting: { + alert: { + read: [], + }, + rule: { + read: [], + }, + }, + ui: ['show'], + }, + }, +}; diff --git a/x-pack/plugins/observability_solution/inventory/server/plugin.ts b/x-pack/plugins/observability_solution/inventory/server/plugin.ts index 1ac928b72cdb2..642dd12769fb4 100644 --- a/x-pack/plugins/observability_solution/inventory/server/plugin.ts +++ b/x-pack/plugins/observability_solution/inventory/server/plugin.ts @@ -17,6 +17,7 @@ import type { InventorySetupDependencies, InventoryStartDependencies, } from './types'; +import { INVENTORY_SERVER_FEATURE } from './feature'; export class InventoryPlugin implements @@ -55,6 +56,9 @@ export class InventoryPlugin }) as unknown as InventoryRouteHandlerResources['plugins'], }, }); + + pluginsSetup.features.registerKibanaFeature(INVENTORY_SERVER_FEATURE); + return {}; } diff --git a/x-pack/plugins/observability_solution/inventory/server/types.ts b/x-pack/plugins/observability_solution/inventory/server/types.ts index a58bd62fe57a9..05f75561674c6 100644 --- a/x-pack/plugins/observability_solution/inventory/server/types.ts +++ b/x-pack/plugins/observability_solution/inventory/server/types.ts @@ -13,6 +13,7 @@ import type { DataViewsServerPluginSetup, DataViewsServerPluginStart, } from '@kbn/data-views-plugin/server'; +import { FeaturesPluginSetup } from '@kbn/features-plugin/server'; /* eslint-disable @typescript-eslint/no-empty-interface*/ export interface ConfigSchema {} @@ -21,6 +22,7 @@ export interface InventorySetupDependencies { entityManager: EntityManagerServerPluginSetup; inference: InferenceServerSetup; dataViews: DataViewsServerPluginSetup; + features: FeaturesPluginSetup; } export interface InventoryStartDependencies { diff --git a/x-pack/plugins/observability_solution/inventory/tsconfig.json b/x-pack/plugins/observability_solution/inventory/tsconfig.json index c4b6b55d41f4c..163e87108bf75 100644 --- a/x-pack/plugins/observability_solution/inventory/tsconfig.json +++ b/x-pack/plugins/observability_solution/inventory/tsconfig.json @@ -16,7 +16,6 @@ "kbn_references": [ "@kbn/core", "@kbn/logging", - "@kbn/config-schema", "@kbn/observability-shared-plugin", "@kbn/server-route-repository", "@kbn/shared-ux-link-redirect-app", @@ -40,7 +39,9 @@ "@kbn/data-plugin", "@kbn/core-analytics-browser", "@kbn/core-http-browser", + "@kbn/shared-svg", + "@kbn/features-plugin", "@kbn/es-query", - "@kbn/shared-svg" + "@kbn/config-schema" ] } 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 309d2f2264300..353f1258fc7b8 100644 --- a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts +++ b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts @@ -67,9 +67,6 @@ export function createNavTree(pluginsStart: ObservabilityPublicPluginsStart) { { link: 'slo', }, - { - link: 'inventory', - }, { id: 'aiMl', title: i18n.translate('xpack.observability.obltNav.ml.aiAndMlGroupTitle', { @@ -132,6 +129,10 @@ export function createNavTree(pluginsStart: ObservabilityPublicPluginsStart) { }, ], }, + { + link: 'inventory', + spaceBefore: 'm', + }, { id: 'apm', title: i18n.translate('xpack.observability.obltNav.applications', { diff --git a/x-pack/plugins/serverless_observability/public/navigation_tree.ts b/x-pack/plugins/serverless_observability/public/navigation_tree.ts index 135c687655e2e..e3c61ec0b29e3 100644 --- a/x-pack/plugins/serverless_observability/public/navigation_tree.ts +++ b/x-pack/plugins/serverless_observability/public/navigation_tree.ts @@ -121,6 +121,7 @@ export const navigationTree: NavigationTreeDefinition = { }, ], }, + { link: 'inventory', spaceBefore: 'm' }, { id: 'apm', title: i18n.translate('xpack.serverlessObservability.nav.applications', { diff --git a/x-pack/test/api_integration/apis/features/features/features.ts b/x-pack/test/api_integration/apis/features/features/features.ts index d6602c0ce8cbb..895bfcb851bdd 100644 --- a/x-pack/test/api_integration/apis/features/features/features.ts +++ b/x-pack/test/api_integration/apis/features/features/features.ts @@ -120,6 +120,7 @@ export default function ({ getService }: FtrProviderContext) { 'canvas', 'generalCases', 'infrastructure', + 'inventory', 'logs', 'maintenanceWindow', 'maps', @@ -168,6 +169,7 @@ export default function ({ getService }: FtrProviderContext) { 'canvas', 'generalCases', 'infrastructure', + 'inventory', 'logs', 'maintenanceWindow', 'maps', diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts index a809d0837abc9..8db8c08b16728 100644 --- a/x-pack/test/api_integration/apis/security/privileges.ts +++ b/x-pack/test/api_integration/apis/security/privileges.ts @@ -140,6 +140,7 @@ export default function ({ getService }: FtrProviderContext) { maintenanceWindow: ['all', 'read', 'minimal_all', 'minimal_read'], guidedOnboardingFeature: ['all', 'read', 'minimal_all', 'minimal_read'], aiAssistantManagementSelection: ['all', 'read', 'minimal_all', 'minimal_read'], + inventory: ['all', 'read', 'minimal_all', 'minimal_read'], }, reserved: ['fleet-setup', 'ml_user', 'ml_admin', 'ml_apm_user', 'monitoring'], }; diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts index 59829c673e408..a82ecc2aa4fd6 100644 --- a/x-pack/test/api_integration/apis/security/privileges_basic.ts +++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts @@ -58,6 +58,7 @@ export default function ({ getService }: FtrProviderContext) { maintenanceWindow: ['all', 'read', 'minimal_all', 'minimal_read'], guidedOnboardingFeature: ['all', 'read', 'minimal_all', 'minimal_read'], aiAssistantManagementSelection: ['all', 'read', 'minimal_all', 'minimal_read'], + inventory: ['all', 'read', 'minimal_all', 'minimal_read'], }, global: ['all', 'read'], space: ['all', 'read'], @@ -226,6 +227,7 @@ export default function ({ getService }: FtrProviderContext) { maintenanceWindow: ['all', 'read', 'minimal_all', 'minimal_read'], guidedOnboardingFeature: ['all', 'read', 'minimal_all', 'minimal_read'], aiAssistantManagementSelection: ['all', 'read', 'minimal_all', 'minimal_read'], + inventory: ['all', 'read', 'minimal_all', 'minimal_read'], }, reserved: ['fleet-setup', 'ml_user', 'ml_admin', 'ml_apm_user', 'monitoring'], }; diff --git a/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts b/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts index d39c58bd2b6e7..98b3c88354593 100644 --- a/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts +++ b/x-pack/test/spaces_api_integration/spaces_only/telemetry/telemetry.ts @@ -75,6 +75,7 @@ export default function ({ getService }: FtrProviderContext) { uptime: 0, slo: 0, infrastructure: 0, + inventory: 0, logs: 0, monitoring: 0, apm: 0, From 1abd3473f56d89da4bb87cb409f0b11cb26c327a Mon Sep 17 00:00:00 2001 From: Ido Cohen <90558359+CohenIdo@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:04:33 +0300 Subject: [PATCH 006/107] [Cloud Security] Fix data view's flaky FTR --- .../data_views/data_views.ts | 281 +++++++++++------- 1 file changed, 168 insertions(+), 113 deletions(-) diff --git a/x-pack/test/cloud_security_posture_functional/data_views/data_views.ts b/x-pack/test/cloud_security_posture_functional/data_views/data_views.ts index 4d3e1585ec5bb..d3e68d11d7694 100644 --- a/x-pack/test/cloud_security_posture_functional/data_views/data_views.ts +++ b/x-pack/test/cloud_security_posture_functional/data_views/data_views.ts @@ -8,11 +8,17 @@ import expect from '@kbn/expect'; import { DataViewAttributes } from '@kbn/data-views-plugin/common'; import { CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX } from '@kbn/cloud-security-posture-common'; +import { CDR_VULNERABILITIES_DATA_VIEW_ID_PREFIX } from '@kbn/cloud-security-posture-plugin/common/constants'; import { KbnClientSavedObjects } from '@kbn/test/src/kbn_client/kbn_client_saved_objects'; import { FtrProviderContext } from '../ftr_provider_context'; const TEST_SPACE = 'space-1'; +const DATA_VIEW_PREFIXES = [ + CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, + CDR_VULNERABILITIES_DATA_VIEW_ID_PREFIX, +]; + const getDataViewSafe = async ( soClient: KbnClientSavedObjects, dataViewId: string, @@ -33,6 +39,7 @@ const getDataViewSafe = async ( export default ({ getService, getPageObjects }: FtrProviderContext) => { const kibanaServer = getService('kibanaServer'); const spacesService = getService('spaces'); + const retry = getService('retry'); const pageObjects = getPageObjects([ 'common', @@ -41,15 +48,17 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { 'header', 'spaceSelector', 'cspSecurity', + 'security', ]); - // FLAKY: https://github.com/elastic/kibana/issues/189854 - describe.skip('Data Views', async function () { + describe('Data Views', async function () { this.tags(['cloud_security_posture_data_views', 'cloud_security_posture_spaces']); let cspSecurity = pageObjects.cspSecurity; let findings: typeof pageObjects.findings; before(async () => { + await spacesService.delete(TEST_SPACE); + cspSecurity = pageObjects.cspSecurity; findings = pageObjects.findings; await cspSecurity.createRoles(); @@ -67,127 +76,173 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { }); await spacesService.delete(TEST_SPACE); + await pageObjects.security.forceLogout(); }); - it('Verify data view is created once user reach the findings page - default space', async () => { - const expectedDataViewId = `${CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX}-default`; - const idDataViewExists = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - 'default' - ); - expect(idDataViewExists).to.be(false); - - await findings.navigateToLatestVulnerabilitiesPage(); - await pageObjects.header.waitUntilLoadingHasFinished(); - - const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - 'default' - ); - expect(idDataViewExistsPostFindingsNavigation).to.be(true); + DATA_VIEW_PREFIXES.forEach((dataViewPrefix) => { + it('Verify data view is created once user reach the findings page - default space', async () => { + const expectedDataViewId = `${dataViewPrefix}-default`; + + if (await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, 'default')) { + await kibanaServer.savedObjects.delete({ + type: 'index-pattern', + id: expectedDataViewId, + space: 'default', + }); + + await retry.try(async () => { + expect( + await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, 'default') + ).to.be(false); + }); + } + + await findings.navigateToLatestVulnerabilitiesPage(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( + kibanaServer.savedObjects, + expectedDataViewId, + 'default' + ); + expect(idDataViewExistsPostFindingsNavigation).to.be(true); + }); }); - it('Verify data view is created once user reach the dashboard page - default space', async () => { - const expectedDataViewId = `${CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX}-default`; - const idDataViewExists = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - 'default' - ); - expect(idDataViewExists).to.be(false); - - const cspDashboard = pageObjects.cloudPostureDashboard; - await cspDashboard.navigateToComplianceDashboardPage(); - await pageObjects.header.waitUntilLoadingHasFinished(); - - const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - 'default' - ); - expect(idDataViewExistsPostFindingsNavigation).to.be(true); + DATA_VIEW_PREFIXES.forEach((dataViewPrefix) => { + it('Verify data view is created once user reach the dashboard page - default space', async () => { + const expectedDataViewId = `${dataViewPrefix}-default`; + + if (await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, 'default')) { + await kibanaServer.savedObjects.delete({ + type: 'index-pattern', + id: expectedDataViewId, + space: 'default', + }); + + await retry.try(async () => { + expect( + await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, 'default') + ).to.be(false); + }); + } + + const cspDashboard = pageObjects.cloudPostureDashboard; + await cspDashboard.navigateToComplianceDashboardPage(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( + kibanaServer.savedObjects, + expectedDataViewId, + 'default' + ); + expect(idDataViewExistsPostFindingsNavigation).to.be(true); + }); }); - it('Verify data view is created once user reach the findings page - non default space', async () => { - await pageObjects.common.navigateToApp('home'); - await spacesService.create({ id: TEST_SPACE, name: 'space_one', disabledFeatures: [] }); - await pageObjects.spaceSelector.openSpacesNav(); - await pageObjects.spaceSelector.clickSpaceAvatar(TEST_SPACE); - await pageObjects.spaceSelector.expectHomePage(TEST_SPACE); - - const expectedDataViewId = `${CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX}-${TEST_SPACE}`; - const idDataViewExists = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - TEST_SPACE - ); - - expect(idDataViewExists).to.be(false); - - await findings.navigateToLatestFindingsPage(TEST_SPACE); - await pageObjects.header.waitUntilLoadingHasFinished(); - const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - TEST_SPACE - ); - - expect(idDataViewExistsPostFindingsNavigation).to.be(true); + DATA_VIEW_PREFIXES.forEach((dataViewPrefix) => { + it('Verify data view is created once user reach the findings page - non default space', async () => { + await pageObjects.common.navigateToApp('home'); + await spacesService.create({ id: TEST_SPACE, name: 'space_one', disabledFeatures: [] }); + await pageObjects.spaceSelector.openSpacesNav(); + await pageObjects.spaceSelector.clickSpaceAvatar(TEST_SPACE); + await pageObjects.spaceSelector.expectHomePage(TEST_SPACE); + + const expectedDataViewId = `${dataViewPrefix}-${TEST_SPACE}`; + if (await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, TEST_SPACE)) { + await kibanaServer.savedObjects.delete({ + type: 'index-pattern', + id: expectedDataViewId, + space: TEST_SPACE, + }); + + await retry.try(async () => { + expect( + await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, TEST_SPACE) + ).to.be(false); + }); + } + + await findings.navigateToLatestFindingsPage(TEST_SPACE); + await pageObjects.header.waitUntilLoadingHasFinished(); + const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( + kibanaServer.savedObjects, + expectedDataViewId, + TEST_SPACE + ); + + expect(idDataViewExistsPostFindingsNavigation).to.be(true); + }); }); - it('Verify data view is created once user reach the dashboard page - non default space', async () => { - // await pageObjects.header.waitUntilLoadingHasFinished(); - await pageObjects.common.navigateToApp('home'); - await spacesService.create({ id: TEST_SPACE, name: 'space_one', disabledFeatures: [] }); - await pageObjects.spaceSelector.openSpacesNav(); - await pageObjects.spaceSelector.clickSpaceAvatar(TEST_SPACE); - await pageObjects.spaceSelector.expectHomePage(TEST_SPACE); - const expectedDataViewId = `${CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX}-${TEST_SPACE}`; - const idDataViewExists = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - TEST_SPACE - ); - - expect(idDataViewExists).to.be(false); - - const cspDashboard = pageObjects.cloudPostureDashboard; - await cspDashboard.navigateToComplianceDashboardPage(TEST_SPACE); - await pageObjects.header.waitUntilLoadingHasFinished(); - const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - TEST_SPACE - ); - - expect(idDataViewExistsPostFindingsNavigation).to.be(true); + DATA_VIEW_PREFIXES.forEach((dataViewPrefix) => { + it('Verify data view is created once user reach the dashboard page - non default space', async () => { + await pageObjects.common.navigateToApp('home'); + await spacesService.create({ id: TEST_SPACE, name: 'space_one', disabledFeatures: [] }); + await pageObjects.spaceSelector.openSpacesNav(); + await pageObjects.spaceSelector.clickSpaceAvatar(TEST_SPACE); + await pageObjects.spaceSelector.expectHomePage(TEST_SPACE); + const expectedDataViewId = `${dataViewPrefix}-${TEST_SPACE}`; + + if (await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, TEST_SPACE)) { + await kibanaServer.savedObjects.delete({ + type: 'index-pattern', + id: expectedDataViewId, + space: TEST_SPACE, + }); + + await retry.try(async () => { + expect( + await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, TEST_SPACE) + ).to.be(false); + }); + } + + const cspDashboard = pageObjects.cloudPostureDashboard; + await cspDashboard.navigateToComplianceDashboardPage(TEST_SPACE); + await pageObjects.header.waitUntilLoadingHasFinished(); + const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( + kibanaServer.savedObjects, + expectedDataViewId, + TEST_SPACE + ); + + expect(idDataViewExistsPostFindingsNavigation).to.be(true); + }); }); - it('Verify data view is created once user with read permissions reach the dashboard page', async () => { - await pageObjects.common.navigateToApp('home'); - await cspSecurity.logout(); - await cspSecurity.login('csp_read_user'); - const expectedDataViewId = `${CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX}-default`; - const idDataViewExists = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - 'default' - ); - - expect(idDataViewExists).to.be(false); - - const cspDashboard = pageObjects.cloudPostureDashboard; - await cspDashboard.navigateToComplianceDashboardPage(); - await pageObjects.header.waitUntilLoadingHasFinished(); - const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( - kibanaServer.savedObjects, - expectedDataViewId, - 'default' - ); - - expect(idDataViewExistsPostFindingsNavigation).to.be(true); + DATA_VIEW_PREFIXES.forEach((dataViewPrefix) => { + it('Verify data view is created once user with read permissions reach the dashboard page', async () => { + await pageObjects.common.navigateToApp('home'); + await cspSecurity.logout(); + await cspSecurity.login('csp_read_user'); + const expectedDataViewId = `${CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX}-default`; + + if (await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, 'default')) { + await kibanaServer.savedObjects.delete({ + type: 'index-pattern', + id: expectedDataViewId, + space: 'default', + }); + + await retry.try(async () => { + expect( + await getDataViewSafe(kibanaServer.savedObjects, expectedDataViewId, 'default') + ).to.be(false); + }); + } + + const cspDashboard = pageObjects.cloudPostureDashboard; + await cspDashboard.navigateToComplianceDashboardPage(); + await pageObjects.header.waitUntilLoadingHasFinished(); + const idDataViewExistsPostFindingsNavigation = await getDataViewSafe( + kibanaServer.savedObjects, + expectedDataViewId, + 'default' + ); + + expect(idDataViewExistsPostFindingsNavigation).to.be(true); + }); }); }); }; From 9a7e9124cf86d8a7a7ce25732bf11163ec7df52d Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:13:26 +0200 Subject: [PATCH 007/107] [Authz] Added support for security route configuration option (#191973) ## Summary Extended `KibanaRouteOptions` to include security configuration at the route definition level. ## Security Config To facilitate iterative development security config is marked as optional for now. - `authz` supports both simple configuration (e.g., single privilege requirements) and more complex configurations that involve anyRequired and allRequired privilege sets. - `authc` property has been added and is expected to replace the existing `authRequired` option. This transition will be part of an upcoming deprecation process in scope of https://github.com/elastic/kibana/issues/191711 - For versioned routes, the `authc` and `authz` configurations can be applied independently for each version, enabling version-specific security configuration. If none provided for the specific version it will fall back to the route root security option. - Validation logic has been added that ensures only supported configurations are specified. - Existing `registerOnPostAuth` hook has been modified to incorporate checks based on the new `authz` property in the security configuration. - Comprehensive documentation will be added in the separate PR before sunsetting new security configuration and deprecating old one. ## How to Test You can modify any existing route or use the example routes below ### Routes
Route 1: /api/security/authz_examples/authz_disabled ```javascript router.get( { path: '/api/security/authz_examples/authz_disabled', security: { authz: { enabled: false, reason: 'This route is opted out from authorization', }, }, validate: false, }, createLicensedRouteHandler(async (context, request, response) => { try { return response.ok({ body: { message: 'This route is opted out from authorization', }, }); } catch (error) { return response.customError(wrapIntoCustomErrorResponse(error)); } }) ); ```
Route 2: /api/security/authz_examples/simple_privileges_1 ```javascript router.get( { path: '/api/security/authz_examples/simple_privileges_1', security: { authz: { requiredPrivileges: ['manageSpaces', 'taskManager'], }, }, validate: false, }, createLicensedRouteHandler(async (context, request, response) => { try { return response.ok({ body: { authzResult: request.authzResult, }, }); } catch (error) { return response.customError(wrapIntoCustomErrorResponse(error)); } }) ); ```
Route 3: /api/security/authz_examples/simple_privileges_2 ```javascript router.get( { path: '/api/security/authz_examples/simple_privileges_2', security: { authz: { requiredPrivileges: [ 'manageSpaces', { anyRequired: ['taskManager', 'features'], }, ], }, }, validate: false, }, createLicensedRouteHandler(async (context, request, response) => { try { return response.ok({ body: { authzResult: request.authzResult, }, }); } catch (error) { return response.customError(wrapIntoCustomErrorResponse(error)); } }) ); ```
Versioned Route: /internal/security/authz_versioned_examples/simple_privileges_1 ```javascript router.versioned .get({ path: '/internal/security/authz_versioned_examples/simple_privileges_1', access: 'internal', enableQueryVersion: true, }) .addVersion( { version: '1', validate: false, security: { authz: { requiredPrivileges: ['manageSpaces', 'taskManager'], }, authc: { enabled: 'optional', }, }, }, (context, request, response) => { return response.ok({ body: { authzResult: request.authzResult, version: '1', }, }); } ) .addVersion( { version: '2', validate: false, security: { authz: { requiredPrivileges: ['manageSpaces'], }, authc: { enabled: true, }, }, }, (context, request, response) => { return response.ok({ body: { authzResult: request.authzResult, version: '2', }, }); } ); ```
### 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 __Closes: https://github.com/elastic/kibana/issues/191710__ __Related: https://github.com/elastic/kibana/issues/191712, https://github.com/elastic/kibana/issues/191713__ ### Release Note Extended `KibanaRouteOptions` to include security configuration at the route definition level. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../src/request.test.ts | 149 +++++++++- .../src/request.ts | 27 ++ .../src/route.ts | 11 +- .../src/router.test.ts | 41 +++ .../src/router.ts | 31 +- .../security_route_config_validator.test.ts | 279 ++++++++++++++++++ .../src/security_route_config_validator.ts | 116 ++++++++ .../src/util.ts | 6 +- .../core_versioned_route.test.ts | 196 ++++++++++++ .../versioned_router/core_versioned_route.ts | 34 ++- .../versioned_router/route_version_utils.ts | 9 +- .../src/versioned_router/util.test.ts | 93 ++++++ .../src/versioned_router/util.ts | 26 +- .../src/http_server.ts | 1 + .../src/lifecycle/on_post_auth.ts | 21 ++ .../src/lifecycle_handlers.test.ts | 1 + .../src/http_server.mocks.ts | 1 + .../src/http_service.mock.ts | 1 + packages/core/http/core-http-server/index.ts | 12 + .../core-http-server/src/lifecycle/index.ts | 1 + .../src/lifecycle/on_post_auth.ts | 12 +- .../http/core-http-server/src/router/index.ts | 12 + .../core-http-server/src/router/request.ts | 16 +- .../http/core-http-server/src/router/route.ts | 87 ++++++ .../core-http-server/src/router/router.ts | 2 + .../core-http-server/src/versioning/types.ts | 6 +- src/core/server/index.ts | 11 +- .../http/request_representation.test.ts | 4 +- x-pack/plugins/security/common/constants.ts | 5 + .../authorization/api_authorization.test.ts | 276 +++++++++++++++++ .../server/authorization/api_authorization.ts | 89 +++++- .../product_features_service.test.ts | 2 +- 32 files changed, 1540 insertions(+), 38 deletions(-) create mode 100644 packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts create mode 100644 packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts diff --git a/packages/core/http/core-http-router-server-internal/src/request.test.ts b/packages/core/http/core-http-router-server-internal/src/request.test.ts index ec1465ac049b7..1f607a58961ab 100644 --- a/packages/core/http/core-http-router-server-internal/src/request.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/request.test.ts @@ -13,7 +13,7 @@ jest.mock('uuid', () => ({ import { RouteOptions } from '@hapi/hapi'; import { hapiMocks } from '@kbn/hapi-mocks'; -import type { FakeRawRequest } from '@kbn/core-http-server'; +import type { FakeRawRequest, RouteSecurity } from '@kbn/core-http-server'; import { CoreKibanaRequest } from './request'; import { schema } from '@kbn/config-schema'; import { @@ -352,6 +352,153 @@ describe('CoreKibanaRequest', () => { }); }); + describe('route.options.security property', () => { + it('handles required authc: undefined', () => { + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security: { authc: undefined }, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.authRequired).toBe(true); + }); + + it('handles required authc: { enabled: undefined }', () => { + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security: { authc: { enabled: undefined } }, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.authRequired).toBe(true); + }); + + it('handles required authc: { enabled: true }', () => { + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security: { authc: { enabled: true } }, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.authRequired).toBe(true); + }); + it('handles required authc: { enabled: false }', () => { + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security: { authc: { enabled: false } }, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.authRequired).toBe(false); + }); + + it(`handles required authc: { enabled: 'optional' }`, () => { + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security: { authc: { enabled: 'optional' } }, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.authRequired).toBe('optional'); + }); + + it('handles required authz simple config', () => { + const security: RouteSecurity = { + authz: { + requiredPrivileges: ['privilege1'], + }, + }; + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.security).toEqual(security); + }); + + it('handles required authz complex config', () => { + const security: RouteSecurity = { + authz: { + requiredPrivileges: [ + { + allRequired: ['privilege1'], + anyRequired: ['privilege2', 'privilege3'], + }, + ], + }, + }; + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + security, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.security).toEqual(security); + }); + + it('handles required authz config for the route with RouteSecurityGetter', () => { + const security: RouteSecurity = { + authz: { + requiredPrivileges: [ + { + allRequired: ['privilege1'], + anyRequired: ['privilege2', 'privilege3'], + }, + ], + }, + }; + const request = hapiMocks.createRequest({ + route: { + settings: { + app: { + // security is a getter function only for the versioned routes + security: () => security, + }, + }, + }, + }); + const kibanaRequest = CoreKibanaRequest.from(request); + + expect(kibanaRequest.route.options.security).toEqual(security); + }); + }); + describe('RouteSchema type inferring', () => { it('should work with config-schema', () => { const body = Buffer.from('body!'); diff --git a/packages/core/http/core-http-router-server-internal/src/request.ts b/packages/core/http/core-http-router-server-internal/src/request.ts index b7b23186def88..286b900fc24f5 100644 --- a/packages/core/http/core-http-router-server-internal/src/request.ts +++ b/packages/core/http/core-http-router-server-internal/src/request.ts @@ -31,6 +31,8 @@ import { RawRequest, FakeRawRequest, HttpProtocol, + RouteSecurityGetter, + RouteSecurity, } from '@kbn/core-http-server'; import { ELASTIC_INTERNAL_ORIGIN_QUERY_PARAM, @@ -46,6 +48,12 @@ patchRequest(); const requestSymbol = Symbol('request'); +const isRouteSecurityGetter = ( + security?: RouteSecurityGetter | RecursiveReadonly +): security is RouteSecurityGetter => { + return typeof security === 'function'; +}; + /** * Core internal implementation of {@link KibanaRequest} * @internal @@ -137,6 +145,8 @@ export class CoreKibanaRequest< public readonly httpVersion: string; /** {@inheritDoc KibanaRequest.protocol} */ public readonly protocol: HttpProtocol; + /** {@inheritDoc KibanaRequest.authzResult} */ + public readonly authzResult?: Record; /** @internal */ protected readonly [requestSymbol]!: Request; @@ -159,6 +169,7 @@ export class CoreKibanaRequest< this.id = appState?.requestId ?? uuidv4(); this.uuid = appState?.requestUuid ?? uuidv4(); this.rewrittenUrl = appState?.rewrittenUrl; + this.authzResult = appState?.authzResult; this.url = request.url ?? new URL('https://fake-request/url'); this.headers = isRealReq ? deepFreeze({ ...request.headers }) : request.headers; @@ -204,6 +215,7 @@ export class CoreKibanaRequest< isAuthenticated: this.auth.isAuthenticated, }, route: this.route, + authzResult: this.authzResult, }; } @@ -256,6 +268,7 @@ export class CoreKibanaRequest< true, // some places in LP call KibanaRequest.from(request) manually. remove fallback to true before v8 access: this.getAccess(request), tags: request.route?.settings?.tags || [], + security: this.getSecurity(request), timeout: { payload: payloadTimeout, idleSocket: socketTimeout === 0 ? undefined : socketTimeout, @@ -277,6 +290,13 @@ export class CoreKibanaRequest< }; } + private getSecurity(request: RawRequest): RouteSecurity | undefined { + const securityConfig = ((request.route?.settings as RouteOptions)?.app as KibanaRouteOptions) + ?.security; + + return isRouteSecurityGetter(securityConfig) ? securityConfig(request) : securityConfig; + } + /** set route access to internal if not declared */ private getAccess(request: RawRequest): 'internal' | 'public' { return ( @@ -289,6 +309,12 @@ export class CoreKibanaRequest< return true; } + const security = this.getSecurity(request); + + if (security?.authc !== undefined) { + return security.authc?.enabled ?? true; + } + const authOptions = request.route.settings.auth; if (typeof authOptions === 'object') { // 'try' is used in the legacy platform @@ -368,6 +394,7 @@ function isCompleted(request: Request) { */ function sanitizeRequest(req: Request): { query: unknown; params: unknown; body: unknown } { const { [ELASTIC_INTERNAL_ORIGIN_QUERY_PARAM]: __, ...query } = req.query ?? {}; + return { query, params: req.params, diff --git a/packages/core/http/core-http-router-server-internal/src/route.ts b/packages/core/http/core-http-router-server-internal/src/route.ts index e494dfb66b7aa..6faae2c1816b9 100644 --- a/packages/core/http/core-http-router-server-internal/src/route.ts +++ b/packages/core/http/core-http-router-server-internal/src/route.ts @@ -7,8 +7,17 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { RouteMethod, SafeRouteMethod } from '@kbn/core-http-server'; +import type { RouteMethod, SafeRouteMethod, RouteConfig } from '@kbn/core-http-server'; +import type { RouteSecurityGetter, RouteSecurity } from '@kbn/core-http-server'; export function isSafeMethod(method: RouteMethod): method is SafeRouteMethod { return method === 'get' || method === 'options'; } + +/** @interval */ +export type InternalRouteConfig = Omit< + RouteConfig, + 'security' +> & { + security?: RouteSecurityGetter | RouteSecurity; +}; diff --git a/packages/core/http/core-http-router-server-internal/src/router.test.ts b/packages/core/http/core-http-router-server-internal/src/router.test.ts index 18589d5d39d52..65f5b41f91fba 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.test.ts @@ -232,6 +232,47 @@ describe('Router', () => { ); }); + it('throws if enabled security config is not valid', () => { + const router = new Router('', logger, enhanceWithContext, routerOptions); + expect(() => + router.get( + { + path: '/', + validate: false, + security: { + authz: { + requiredPrivileges: [], + }, + }, + }, + (context, req, res) => res.ok({}) + ) + ).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: array size is [0], but cannot be smaller than [1]"` + ); + }); + + it('throws if disabled security config does not provide opt-out reason', () => { + const router = new Router('', logger, enhanceWithContext, routerOptions); + expect(() => + router.get( + { + path: '/', + validate: false, + security: { + // @ts-expect-error + authz: { + enabled: false, + }, + }, + }, + (context, req, res) => res.ok({}) + ) + ).toThrowErrorMatchingInlineSnapshot( + `"[authz.reason]: expected value of type [string] but got [undefined]"` + ); + }); + it('should default `output: "stream" and parse: false` when no body validation is required but not a GET', () => { const router = new Router('', logger, enhanceWithContext, routerOptions); router.post({ path: '/', validate: {} }, (context, req, res) => res.ok({})); diff --git a/packages/core/http/core-http-router-server-internal/src/router.ts b/packages/core/http/core-http-router-server-internal/src/router.ts index a6f2ccc35f56b..ddfa8980cb8f2 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.ts @@ -26,9 +26,12 @@ import type { RequestHandler, VersionedRouter, RouteRegistrar, + RouteSecurity, } from '@kbn/core-http-server'; import { isZod } from '@kbn/zod'; import { validBodyOutput, getRequestValidation } from '@kbn/core-http-server'; +import type { RouteSecurityGetter } from '@kbn/core-http-server'; +import type { DeepPartial } from '@kbn/utility-types'; import { RouteValidator } from './validator'; import { CoreVersionedRouter } from './versioned_router'; import { CoreKibanaRequest } from './request'; @@ -38,6 +41,8 @@ import { wrapErrors } from './error_wrapper'; import { Method } from './versioned_router/types'; import { prepareRouteConfigValidation } from './util'; import { stripIllegalHttp2Headers } from './strip_illegal_http2_headers'; +import { validRouteSecurity } from './security_route_config_validator'; +import { InternalRouteConfig } from './route'; export type ContextEnhancer< P, @@ -61,7 +66,7 @@ function getRouteFullPath(routerPath: string, routePath: string) { * undefined. */ function routeSchemasFromRouteConfig( - route: RouteConfig, + route: InternalRouteConfig, routeMethod: RouteMethod ) { // The type doesn't allow `validate` to be undefined, but it can still @@ -93,7 +98,7 @@ function routeSchemasFromRouteConfig( */ function validOptions( method: RouteMethod, - routeConfig: RouteConfig + routeConfig: InternalRouteConfig ) { const shouldNotHavePayload = ['head', 'get'].includes(method); const { options = {}, validate } = routeConfig; @@ -144,10 +149,17 @@ export interface RouterOptions { export interface InternalRegistrarOptions { isVersioned: boolean; } +/** @internal */ +export type VersionedRouteConfig = Omit< + RouteConfig, + 'security' +> & { + security?: RouteSecurityGetter; +}; /** @internal */ export type InternalRegistrar = ( - route: RouteConfig, + route: InternalRouteConfig, handler: RequestHandler, internalOpts?: InternalRegistrarOptions ) => ReturnType>; @@ -186,7 +198,7 @@ export class Router(method: Method) => ( - route: RouteConfig, + route: InternalRouteConfig, handler: RequestHandler, internalOptions: { isVersioned: boolean } = { isVersioned: false } ) => { @@ -204,6 +216,10 @@ export class Router, route.options), /** Below is added for introspection */ validationSchemas: route.validate, isVersioned: internalOptions.isVersioned, @@ -260,7 +276,12 @@ export class Router; const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit); try { - kibanaRequest = CoreKibanaRequest.from(request, routeSchemas); + kibanaRequest = CoreKibanaRequest.from(request, routeSchemas) as KibanaRequest< + P, + Q, + B, + typeof request.method + >; } catch (error) { this.logError('400 Bad Request', 400, { request, error }); return hapiResponseAdapter.toBadRequest(error.message); diff --git a/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts new file mode 100644 index 0000000000000..d130bfdce9fb5 --- /dev/null +++ b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts @@ -0,0 +1,279 @@ +/* + * Copyright 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 { validRouteSecurity } from './security_route_config_validator'; + +describe('RouteSecurity validation', () => { + it('should pass validation for valid route security with authz enabled and valid required privileges', () => { + expect(() => + validRouteSecurity({ + authz: { + requiredPrivileges: ['read', { anyRequired: ['write', 'admin'] }], + }, + authc: { + enabled: 'optional', + }, + }) + ).not.toThrow(); + }); + + it('should pass validation for valid route security with authz disabled', () => { + expect(() => + validRouteSecurity({ + authz: { + enabled: false, + reason: 'Authorization is disabled', + }, + authc: { + enabled: true, + }, + }) + ).not.toThrow(); + }); + + it('should fail validation when authz is empty', () => { + const routeSecurity = { + authz: {}, + authc: { + enabled: true, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: expected value of type [array] but got [undefined]"` + ); + }); + + it('should fail when requiredPrivileges include an empty privilege set', () => { + const routeSecurity = { + authz: { + requiredPrivileges: [{}], + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot(` + "[authz.requiredPrivileges.0]: types that failed validation: + - [authz.requiredPrivileges.0.0]: either anyRequired or allRequired must be specified + - [authz.requiredPrivileges.0.1]: expected value of type [string] but got [Object]" + `); + }); + + it('should fail validation when requiredPrivileges array is empty', () => { + const routeSecurity = { + authz: { + requiredPrivileges: [], + }, + authc: { + enabled: true, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: array size is [0], but cannot be smaller than [1]"` + ); + }); + + it('should fail validation when anyRequired array is empty', () => { + const routeSecurity = { + authz: { + requiredPrivileges: [{ anyRequired: [] }], + }, + authc: { + enabled: true, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot(` + "[authz.requiredPrivileges.0]: types that failed validation: + - [authz.requiredPrivileges.0.0.anyRequired]: array size is [0], but cannot be smaller than [2] + - [authz.requiredPrivileges.0.1]: expected value of type [string] but got [Object]" + `); + }); + + it('should fail validation when anyRequired array is of size 1', () => { + const routeSecurity = { + authz: { + requiredPrivileges: [{ anyRequired: ['privilege-1'], allRequired: ['privilege-2'] }], + }, + authc: { + enabled: true, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot(` + "[authz.requiredPrivileges.0]: types that failed validation: + - [authz.requiredPrivileges.0.0.anyRequired]: array size is [1], but cannot be smaller than [2] + - [authz.requiredPrivileges.0.1]: expected value of type [string] but got [Object]" + `); + }); + + it('should fail validation when allRequired array is empty', () => { + const routeSecurity = { + authz: { + requiredPrivileges: [{ allRequired: [] }], + }, + authc: { + enabled: true, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot(` + "[authz.requiredPrivileges.0]: types that failed validation: + - [authz.requiredPrivileges.0.0.allRequired]: array size is [0], but cannot be smaller than [1] + - [authz.requiredPrivileges.0.1]: expected value of type [string] but got [Object]" + `); + }); + + it('should pass validation with valid privileges in both anyRequired and allRequired', () => { + const routeSecurity = { + authz: { + requiredPrivileges: [ + { anyRequired: ['privilege1', 'privilege2'], allRequired: ['privilege3', 'privilege4'] }, + ], + }, + authc: { + enabled: true, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).not.toThrow(); + }); + + it('should fail validation when authz is disabled but reason is missing', () => { + expect(() => + validRouteSecurity({ + authz: { + enabled: false, + }, + authc: { + enabled: true, + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[authz.reason]: expected value of type [string] but got [undefined]"` + ); + }); + + it('should fail validation when authc is disabled but reason is missing', () => { + const routeSecurity = { + authz: { + requiredPrivileges: ['read'], + }, + authc: { + enabled: false, + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authc.reason]: expected value of type [string] but got [undefined]"` + ); + }); + + it('should fail validation when authc is provided in multiple configs', () => { + const routeSecurity = { + authz: { + requiredPrivileges: ['read'], + }, + authc: { + enabled: false, + }, + }; + + expect(() => + validRouteSecurity(routeSecurity, { authRequired: false }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot specify both security.authc and options.authRequired"` + ); + }); + + it('should pass validation when authc is optional', () => { + expect(() => + validRouteSecurity({ + authz: { + requiredPrivileges: ['read'], + }, + authc: { + enabled: 'optional', + }, + }) + ).not.toThrow(); + }); + + it('should pass validation when authc is disabled', () => { + const routeSecurity = { + authz: { + requiredPrivileges: ['read'], + }, + authc: { + enabled: false, + reason: 'Authentication is disabled', + }, + }; + + expect(() => validRouteSecurity(routeSecurity)).not.toThrow(); + }); + + it('should fail validation when anyRequired and allRequired have the same values', () => { + const invalidRouteSecurity = { + authz: { + requiredPrivileges: [ + { anyRequired: ['privilege1', 'privilege2'], allRequired: ['privilege1'] }, + ], + }, + }; + + expect(() => validRouteSecurity(invalidRouteSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: anyRequired and allRequired cannot have the same values: [privilege1]"` + ); + }); + + it('should fail validation when anyRequired and allRequired have the same values in multiple entries', () => { + const invalidRouteSecurity = { + authz: { + requiredPrivileges: [ + { anyRequired: ['privilege1', 'privilege2'], allRequired: ['privilege4'] }, + { anyRequired: ['privilege3', 'privilege5'], allRequired: ['privilege2'] }, + ], + }, + }; + + expect(() => validRouteSecurity(invalidRouteSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: anyRequired and allRequired cannot have the same values: [privilege2]"` + ); + }); + + it('should fail validation when anyRequired has duplicate entries', () => { + const invalidRouteSecurity = { + authz: { + requiredPrivileges: [ + { anyRequired: ['privilege1', 'privilege1'], allRequired: ['privilege4'] }, + ], + }, + }; + + expect(() => validRouteSecurity(invalidRouteSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: anyRequired privileges must contain unique values"` + ); + }); + + it('should fail validation when anyRequired has duplicates in multiple privilege entries', () => { + const invalidRouteSecurity = { + authz: { + requiredPrivileges: [ + { anyRequired: ['privilege1', 'privilege1'], allRequired: ['privilege4'] }, + { anyRequired: ['privilege1', 'privilege1'] }, + ], + }, + }; + + expect(() => validRouteSecurity(invalidRouteSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: anyRequired privileges must contain unique values"` + ); + }); +}); diff --git a/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts new file mode 100644 index 0000000000000..d74f41d3157b4 --- /dev/null +++ b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts @@ -0,0 +1,116 @@ +/* + * Copyright 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 type { RouteSecurity, RouteConfigOptions } from '@kbn/core-http-server'; +import type { DeepPartial } from '@kbn/utility-types'; + +const privilegeSetSchema = schema.object( + { + anyRequired: schema.maybe(schema.arrayOf(schema.string(), { minSize: 2 })), + allRequired: schema.maybe(schema.arrayOf(schema.string(), { minSize: 1 })), + }, + { + validate: (value) => { + if (!value.anyRequired && !value.allRequired) { + return 'either anyRequired or allRequired must be specified'; + } + }, + } +); + +const requiredPrivilegesSchema = schema.arrayOf( + schema.oneOf([privilegeSetSchema, schema.string()]), + { + validate: (value) => { + const anyRequired: string[] = []; + const allRequired: string[] = []; + + if (!Array.isArray(value)) { + return undefined; + } + + value.forEach((privilege) => { + if (typeof privilege === 'string') { + allRequired.push(privilege); + } else { + if (privilege.anyRequired) { + anyRequired.push(...privilege.anyRequired); + } + if (privilege.allRequired) { + allRequired.push(...privilege.allRequired); + } + } + }); + + if (anyRequired.length && allRequired.length) { + for (const privilege of anyRequired) { + if (allRequired.includes(privilege)) { + return `anyRequired and allRequired cannot have the same values: [${privilege}]`; + } + } + } + + if (anyRequired.length) { + const uniquePrivileges = new Set([...anyRequired]); + + if (anyRequired.length !== uniquePrivileges.size) { + return 'anyRequired privileges must contain unique values'; + } + } + }, + minSize: 1, + } +); + +const authzSchema = schema.object({ + enabled: schema.maybe(schema.literal(false)), + requiredPrivileges: schema.conditional( + schema.siblingRef('enabled'), + schema.never(), + requiredPrivilegesSchema, + schema.never() + ), + reason: schema.conditional( + schema.siblingRef('enabled'), + schema.never(), + schema.never(), + schema.string() + ), +}); + +const authcSchema = schema.object({ + enabled: schema.oneOf([schema.literal(true), schema.literal('optional'), schema.literal(false)]), + reason: schema.conditional( + schema.siblingRef('enabled'), + schema.literal(false), + schema.string(), + schema.never() + ), +}); + +const routeSecuritySchema = schema.object({ + authz: authzSchema, + authc: schema.maybe(authcSchema), +}); + +export const validRouteSecurity = ( + routeSecurity?: DeepPartial, + options?: DeepPartial> +) => { + if (!routeSecurity) { + return routeSecurity; + } + + if (routeSecurity?.authc !== undefined && options?.authRequired !== undefined) { + throw new Error('Cannot specify both security.authc and options.authRequired'); + } + + return routeSecuritySchema.validate(routeSecurity); +}; diff --git a/packages/core/http/core-http-router-server-internal/src/util.ts b/packages/core/http/core-http-router-server-internal/src/util.ts index 1a0d9976bbd42..0d1c8abb0e103 100644 --- a/packages/core/http/core-http-router-server-internal/src/util.ts +++ b/packages/core/http/core-http-router-server-internal/src/util.ts @@ -11,10 +11,10 @@ import { once } from 'lodash'; import { isFullValidatorContainer, type RouteValidatorFullConfigResponse, - type RouteConfig, type RouteMethod, type RouteValidator, } from '@kbn/core-http-server'; +import type { InternalRouteConfig } from './route'; function isStatusCode(key: string) { return !isNaN(parseInt(key, 10)); @@ -45,8 +45,8 @@ function prepareValidation(validator: RouteValidator) { // Integration tested in ./routes.test.ts export function prepareRouteConfigValidation( - config: RouteConfig -): RouteConfig { + config: InternalRouteConfig +): InternalRouteConfig { // Calculating schema validation can be expensive so when it is provided lazily // we only want to instantiate it once. This also provides idempotency guarantees if (typeof config.validate === 'function') { diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts index efa5cf5ae23d8..314c25c5a2a1e 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts @@ -13,6 +13,7 @@ import type { RequestHandler, RouteConfig, VersionedRouteValidation, + RouteSecurity, } from '@kbn/core-http-server'; import { Router } from '../router'; import { createFooValidation } from '../router.test.util'; @@ -22,6 +23,7 @@ import { passThroughValidation } from './core_versioned_route'; import { Method } from './types'; import { createRequest } from './core_versioned_route.test.util'; import { isConfigSchema } from '@kbn/config-schema'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; describe('Versioned route', () => { let router: Router; @@ -429,4 +431,198 @@ describe('Versioned route', () => { expect(doNotBypassResponse2.status).toBe(400); expect(doNotBypassResponse2.payload).toMatch('Please specify a version'); }); + + it('can register multiple handlers with different security configurations', () => { + const versionedRouter = CoreVersionedRouter.from({ router }); + const securityConfig1: RouteSecurity = { + authz: { + requiredPrivileges: ['foo'], + }, + authc: { + enabled: 'optional', + }, + }; + const securityConfig2: RouteSecurity = { + authz: { + requiredPrivileges: ['foo', 'bar'], + }, + authc: { + enabled: true, + }, + }; + const securityConfig3: RouteSecurity = { + authz: { + requiredPrivileges: ['foo', 'bar', 'baz'], + }, + }; + versionedRouter + .get({ path: '/test/{id}', access: 'internal' }) + .addVersion( + { + version: '1', + validate: false, + security: securityConfig1, + }, + handlerFn + ) + .addVersion( + { + version: '2', + validate: false, + security: securityConfig2, + }, + handlerFn + ) + .addVersion( + { + version: '3', + validate: false, + security: securityConfig3, + }, + handlerFn + ); + const routes = versionedRouter.getRoutes(); + expect(routes).toHaveLength(1); + const [route] = routes; + expect(route.handlers).toHaveLength(3); + + expect(route.handlers[0].options.security).toStrictEqual(securityConfig1); + expect(route.handlers[1].options.security).toStrictEqual(securityConfig2); + expect(route.handlers[2].options.security).toStrictEqual(securityConfig3); + expect(router.get).toHaveBeenCalledTimes(1); + }); + + it('falls back to default security configuration if it is not specified for specific version', () => { + const versionedRouter = CoreVersionedRouter.from({ router }); + const securityConfigDefault: RouteSecurity = { + authz: { + requiredPrivileges: ['foo', 'bar', 'baz'], + }, + }; + const securityConfig1: RouteSecurity = { + authz: { + requiredPrivileges: ['foo'], + }, + authc: { + enabled: 'optional', + }, + }; + const securityConfig2: RouteSecurity = { + authz: { + requiredPrivileges: ['foo', 'bar'], + }, + authc: { + enabled: true, + }, + }; + const versionedRoute = versionedRouter + .get({ path: '/test/{id}', access: 'internal', security: securityConfigDefault }) + .addVersion( + { + version: '1', + validate: false, + security: securityConfig1, + }, + handlerFn + ) + .addVersion( + { + version: '2', + validate: false, + security: securityConfig2, + }, + handlerFn + ) + .addVersion( + { + version: '3', + validate: false, + }, + handlerFn + ); + const routes = versionedRouter.getRoutes(); + expect(routes).toHaveLength(1); + const [route] = routes; + expect(route.handlers).toHaveLength(3); + + expect( + // @ts-expect-error + versionedRoute.getSecurity({ + headers: {}, + }) + ).toStrictEqual(securityConfigDefault); + + expect( + // @ts-expect-error + versionedRoute.getSecurity({ + headers: { [ELASTIC_HTTP_VERSION_HEADER]: '1' }, + }) + ).toStrictEqual(securityConfig1); + + expect( + // @ts-expect-error + versionedRoute.getSecurity({ + headers: { [ELASTIC_HTTP_VERSION_HEADER]: '2' }, + }) + ).toStrictEqual(securityConfig2); + + expect( + // @ts-expect-error + versionedRoute.getSecurity({ + headers: {}, + }) + ).toStrictEqual(securityConfigDefault); + expect(router.get).toHaveBeenCalledTimes(1); + }); + + it('validates security configuration', () => { + const versionedRouter = CoreVersionedRouter.from({ router }); + const validSecurityConfig: RouteSecurity = { + authz: { + requiredPrivileges: ['foo'], + }, + authc: { + enabled: 'optional', + }, + }; + + expect(() => + versionedRouter.get({ + path: '/test/{id}', + access: 'internal', + security: { + authz: { + requiredPrivileges: [], + }, + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: array size is [0], but cannot be smaller than [1]"` + ); + + const route = versionedRouter.get({ + path: '/test/{id}', + access: 'internal', + security: validSecurityConfig, + }); + + expect(() => + route.addVersion( + { + version: '1', + validate: false, + security: { + authz: { + requiredPrivileges: [{ allRequired: ['foo'], anyRequired: ['bar'] }], + }, + }, + }, + handlerFn + ) + ).toThrowErrorMatchingInlineSnapshot(` + "[authz.requiredPrivileges.0]: types that failed validation: + - [authz.requiredPrivileges.0.0.anyRequired]: array size is [1], but cannot be smaller than [2] + - [authz.requiredPrivileges.0.1]: expected value of type [string] but got [Object]" + `); + }); }); diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts index 510f713ac6ac4..3ab9af61af628 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts @@ -23,6 +23,8 @@ import type { VersionedRouteConfig, IKibanaResponse, RouteConfigOptions, + RouteSecurityGetter, + RouteSecurity, } from '@kbn/core-http-server'; import type { Mutable } from 'utility-types'; import type { Method, VersionedRouterRoute } from './types'; @@ -37,9 +39,11 @@ import { removeQueryVersion, } from './route_version_utils'; import { injectResponseHeaders } from './inject_response_headers'; +import { validRouteSecurity } from '../security_route_config_validator'; import { resolvers } from './handler_resolvers'; import { prepareVersionedRouteValidation, unwrapVersionedResponseBodyValidation } from './util'; +import type { RequestLike } from './route_version_utils'; type Options = AddVersionOpts; @@ -82,6 +86,7 @@ export class CoreVersionedRoute implements VersionedRoute { private useDefaultStrategyForPath: boolean; private isPublic: boolean; private enableQueryVersion: boolean; + private defaultSecurityConfig: RouteSecurity | undefined; private constructor( private readonly router: CoreVersionedRouter, public readonly method: Method, @@ -91,12 +96,14 @@ export class CoreVersionedRoute implements VersionedRoute { this.useDefaultStrategyForPath = router.useVersionResolutionStrategyForInternalPaths.has(path); this.isPublic = this.options.access === 'public'; this.enableQueryVersion = this.options.enableQueryVersion === true; + this.defaultSecurityConfig = validRouteSecurity(this.options.security, this.options.options); this.router.router[this.method]( { path: this.path, validate: passThroughValidation, // @ts-expect-error upgrade typescript v5.1.6 options: this.getRouteConfigOptions(), + security: this.getSecurity, }, this.requestHandler, { isVersioned: true } @@ -122,6 +129,18 @@ export class CoreVersionedRoute implements VersionedRoute { return this.handlers.size ? '[' + [...this.handlers.keys()].join(', ') + ']' : ''; } + private getVersion(req: RequestLike): ApiVersion | undefined { + let version; + const maybeVersion = readVersion(req, this.enableQueryVersion); + if (!maybeVersion && (this.isPublic || this.useDefaultStrategyForPath)) { + version = this.getDefaultVersion(); + } else { + version = maybeVersion; + } + + return version; + } + private requestHandler = async ( ctx: RequestHandlerContextBase, originalReq: KibanaRequest, @@ -134,14 +153,8 @@ export class CoreVersionedRoute implements VersionedRoute { }); } const req = originalReq as Mutable; - let version: undefined | ApiVersion; + const version = this.getVersion(req); - const maybeVersion = readVersion(req, this.enableQueryVersion); - if (!maybeVersion && (this.isPublic || this.useDefaultStrategyForPath)) { - version = this.getDefaultVersion(); - } else { - version = maybeVersion; - } if (!version) { return res.badRequest({ body: `Please specify a version via ${ELASTIC_HTTP_VERSION_HEADER} header. Available versions: ${this.versionsToString()}`, @@ -247,6 +260,7 @@ export class CoreVersionedRoute implements VersionedRoute { public addVersion(options: Options, handler: RequestHandler): VersionedRoute { this.validateVersion(options.version); options = prepareVersionedRouteValidation(options); + this.handlers.set(options.version, { fn: handler, options, @@ -257,4 +271,10 @@ export class CoreVersionedRoute implements VersionedRoute { public getHandlers(): Array<{ fn: RequestHandler; options: Options }> { return [...this.handlers.values()]; } + + public getSecurity: RouteSecurityGetter = (req: RequestLike) => { + const version = this.getVersion(req)!; + + return this.handlers.get(version)?.options.security ?? this.defaultSecurityConfig; + }; } diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/route_version_utils.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/route_version_utils.ts index f8645f947beaf..a6e7c3e31f45f 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/route_version_utils.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/route_version_utils.ts @@ -54,6 +54,11 @@ type KibanaRequestWithQueryVersion = KibanaRequest< { [ELASTIC_HTTP_VERSION_QUERY_PARAM]: unknown } >; +export interface RequestLike { + headers: KibanaRequest['headers']; + query?: KibanaRequest['query']; +} + export function hasQueryVersion( request: Mutable ): request is Mutable { @@ -63,13 +68,13 @@ export function removeQueryVersion(request: Mutable { }, }); }); + + describe('validates security config', () => { + it('throws error if requiredPrivileges are not provided with enabled authz', () => { + expect(() => + prepareVersionedRouteValidation({ + version: '1', + validate: false, + security: { + authz: { + requiredPrivileges: [], + }, + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: array size is [0], but cannot be smaller than [1]"` + ); + }); + + it('throws error if reason is not provided with disabled authz', () => { + expect(() => + prepareVersionedRouteValidation({ + version: '1', + validate: false, + security: { + // @ts-expect-error + authz: { + enabled: false, + }, + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[authz.reason]: expected value of type [string] but got [undefined]"` + ); + }); + + it('passes through valid security configuration with enabled authz', () => { + expect( + prepareVersionedRouteValidation({ + version: '1', + validate: false, + security: { + authz: { + requiredPrivileges: ['privilege-1', { anyRequired: ['privilege-2', 'privilege-3'] }], + }, + }, + }) + ).toMatchInlineSnapshot(` + Object { + "security": Object { + "authz": Object { + "requiredPrivileges": Array [ + "privilege-1", + Object { + "anyRequired": Array [ + "privilege-2", + "privilege-3", + ], + }, + ], + }, + }, + "validate": false, + "version": "1", + } + `); + }); + + it('passes through valid security configuration with disabled authz', () => { + expect( + prepareVersionedRouteValidation({ + version: '1', + validate: false, + security: { + authz: { + enabled: false, + reason: 'Authorization is disabled', + }, + }, + }) + ).toMatchInlineSnapshot(` + Object { + "security": Object { + "authz": Object { + "enabled": false, + "reason": "Authorization is disabled", + }, + }, + "validate": false, + "version": "1", + } + `); + }); + }); }); test('unwrapVersionedResponseBodyValidation', () => { diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/util.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/util.ts index a5286d70593c4..475f69899d861 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/util.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/util.ts @@ -16,6 +16,7 @@ import type { VersionedRouteResponseValidation, VersionedRouteValidation, } from '@kbn/core-http-server'; +import { validRouteSecurity } from '../security_route_config_validator'; export function isCustomValidation( v: VersionedRouteCustomResponseBodyValidation | VersionedResponseBodyValidation @@ -70,17 +71,18 @@ function prepareValidation(validation: VersionedRouteValidation ): AddVersionOpts { - if (typeof options.validate === 'function') { - const validate = options.validate; - return { - ...options, - validate: once(() => prepareValidation(validate())), - }; - } else if (typeof options.validate === 'object' && options.validate !== null) { - return { - ...options, - validate: prepareValidation(options.validate), - }; + const { validate: originalValidate, security, ...rest } = options; + let validate = originalValidate; + + if (typeof originalValidate === 'function') { + validate = once(() => prepareValidation(originalValidate())); + } else if (typeof validate === 'object' && validate !== null) { + validate = prepareValidation(validate); } - return options; + + return { + security: validRouteSecurity(security), + validate, + ...rest, + }; } diff --git a/packages/core/http/core-http-server-internal/src/http_server.ts b/packages/core/http/core-http-server-internal/src/http_server.ts index 8c6f745f052c7..4f3c96518cefc 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.ts @@ -700,6 +700,7 @@ export class HttpServer { const kibanaRouteOptions: KibanaRouteOptions = { xsrfRequired: route.options.xsrfRequired ?? !isSafeMethod(route.method), access: route.options.access ?? 'internal', + security: route.security, }; // Log HTTP API target consumer. optionsLogger.debug( diff --git a/packages/core/http/core-http-server-internal/src/lifecycle/on_post_auth.ts b/packages/core/http/core-http-server-internal/src/lifecycle/on_post_auth.ts index ff1dde1c059a0..25424d29b090c 100644 --- a/packages/core/http/core-http-server-internal/src/lifecycle/on_post_auth.ts +++ b/packages/core/http/core-http-server-internal/src/lifecycle/on_post_auth.ts @@ -11,6 +11,7 @@ import { Lifecycle, Request, ResponseToolkit as HapiResponseToolkit } from '@hap import type { Logger } from '@kbn/logging'; import type { OnPostAuthNextResult, + OnPostAuthAuthzResult, OnPostAuthToolkit, OnPostAuthResult, OnPostAuthHandler, @@ -22,6 +23,7 @@ import { CoreKibanaRequest, lifecycleResponseFactory, } from '@kbn/core-http-router-server-internal'; +import { deepFreeze } from '@kbn/std'; const postAuthResult = { next(): OnPostAuthResult { @@ -30,10 +32,16 @@ const postAuthResult = { isNext(result: OnPostAuthResult): result is OnPostAuthNextResult { return result && result.type === OnPostAuthResultType.next; }, + isAuthzResult(result: OnPostAuthResult): result is OnPostAuthAuthzResult { + return result && result.type === OnPostAuthResultType.authzResult; + }, }; const toolkit: OnPostAuthToolkit = { next: postAuthResult.next, + authzResultNext: (authzResult: Record) => { + return { type: OnPostAuthResultType.authzResult, authzResult }; + }, }; /** @@ -49,13 +57,26 @@ export function adoptToHapiOnPostAuthFormat(fn: OnPostAuthHandler, log: Logger) const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit); try { const result = await fn(CoreKibanaRequest.from(request), lifecycleResponseFactory, toolkit); + if (isKibanaResponse(result)) { return hapiResponseAdapter.handle(result); } + if (postAuthResult.isNext(result)) { return responseToolkit.continue; } + if (postAuthResult.isAuthzResult(result)) { + Object.defineProperty(request.app, 'authzResult', { + value: deepFreeze(result.authzResult), + configurable: false, + writable: false, + enumerable: false, + }); + + return responseToolkit.continue; + } + throw new Error( `Unexpected result from OnPostAuth. Expected OnPostAuthResult or KibanaResponse, but given: ${result}.` ); diff --git a/packages/core/http/core-http-server-internal/src/lifecycle_handlers.test.ts b/packages/core/http/core-http-server-internal/src/lifecycle_handlers.test.ts index f0a1813656a88..bfb132aff32d2 100644 --- a/packages/core/http/core-http-server-internal/src/lifecycle_handlers.test.ts +++ b/packages/core/http/core-http-server-internal/src/lifecycle_handlers.test.ts @@ -40,6 +40,7 @@ const createToolkit = (): ToolkitMock => { render: jest.fn(), next: jest.fn(), rewriteUrl: jest.fn(), + authzResultNext: jest.fn(), }; }; diff --git a/packages/core/http/core-http-server-mocks/src/http_server.mocks.ts b/packages/core/http/core-http-server-mocks/src/http_server.mocks.ts index 760090b39714a..ced67ed273d8e 100644 --- a/packages/core/http/core-http-server-mocks/src/http_server.mocks.ts +++ b/packages/core/http/core-http-server-mocks/src/http_server.mocks.ts @@ -34,6 +34,7 @@ const createToolkitMock = (): ToolkitMock => { render: jest.fn(), next: jest.fn(), rewriteUrl: jest.fn(), + authzResultNext: jest.fn(), }; }; diff --git a/packages/core/http/core-http-server-mocks/src/http_service.mock.ts b/packages/core/http/core-http-server-mocks/src/http_service.mock.ts index 8c71ac7939fbe..4e803ee5f86a8 100644 --- a/packages/core/http/core-http-server-mocks/src/http_service.mock.ts +++ b/packages/core/http/core-http-server-mocks/src/http_service.mock.ts @@ -276,6 +276,7 @@ const createOnPreAuthToolkitMock = (): jest.Mocked => ({ const createOnPostAuthToolkitMock = (): jest.Mocked => ({ next: jest.fn(), + authzResultNext: jest.fn(), }); const createOnPreRoutingToolkitMock = (): jest.Mocked => ({ diff --git a/packages/core/http/core-http-server/index.ts b/packages/core/http/core-http-server/index.ts index 64387e5ca36d7..4ba653fbd534c 100644 --- a/packages/core/http/core-http-server/index.ts +++ b/packages/core/http/core-http-server/index.ts @@ -27,6 +27,7 @@ export type { AuthToolkit, OnPostAuthHandler, OnPostAuthNextResult, + OnPostAuthAuthzResult, OnPostAuthToolkit, OnPostAuthResult, OnPreAuthHandler, @@ -107,6 +108,17 @@ export type { RouteValidatorFullConfigResponse, LazyValidator, RouteAccess, + AuthzDisabled, + AuthzEnabled, + RouteAuthz, + RouteAuthc, + AuthcDisabled, + AuthcEnabled, + Privilege, + PrivilegeSet, + RouteSecurity, + RouteSecurityGetter, + InternalRouteSecurity, } from './src/router'; export { validBodyOutput, diff --git a/packages/core/http/core-http-server/src/lifecycle/index.ts b/packages/core/http/core-http-server/src/lifecycle/index.ts index ac3b28a1469ed..f999d9daa0042 100644 --- a/packages/core/http/core-http-server/src/lifecycle/index.ts +++ b/packages/core/http/core-http-server/src/lifecycle/index.ts @@ -25,6 +25,7 @@ export type { OnPostAuthNextResult, OnPostAuthToolkit, OnPostAuthResult, + OnPostAuthAuthzResult, } from './on_post_auth'; export { OnPostAuthResultType } from './on_post_auth'; diff --git a/packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts b/packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts index 7f5d3b1a81cb3..2881893906e64 100644 --- a/packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts +++ b/packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts @@ -14,6 +14,7 @@ import type { IKibanaResponse, KibanaRequest, LifecycleResponseFactory } from '. */ export enum OnPostAuthResultType { next = 'next', + authzResult = 'authzResult', } /** @@ -26,7 +27,15 @@ export interface OnPostAuthNextResult { /** * @public */ -export type OnPostAuthResult = OnPostAuthNextResult; +export interface OnPostAuthAuthzResult { + type: OnPostAuthResultType.authzResult; + authzResult: Record; +} + +/** + * @public + */ +export type OnPostAuthResult = OnPostAuthNextResult | OnPostAuthAuthzResult; /** * @public @@ -35,6 +44,7 @@ export type OnPostAuthResult = OnPostAuthNextResult; export interface OnPostAuthToolkit { /** To pass request to the next handler */ next: () => OnPostAuthResult; + authzResultNext: (authzResult: Record) => OnPostAuthAuthzResult; } /** diff --git a/packages/core/http/core-http-server/src/router/index.ts b/packages/core/http/core-http-server/src/router/index.ts index 89e9a345179b6..c26212fa0de81 100644 --- a/packages/core/http/core-http-server/src/router/index.ts +++ b/packages/core/http/core-http-server/src/router/index.ts @@ -29,6 +29,8 @@ export type { KibanaRequestRouteOptions, KibanaRequestState, KibanaRouteOptions, + RouteSecurityGetter, + InternalRouteSecurity, } from './request'; export type { RequestHandlerWrapper, RequestHandler } from './request_handler'; export type { RequestHandlerContextBase } from './request_handler_context'; @@ -53,7 +55,17 @@ export type { RouteContentType, SafeRouteMethod, RouteAccess, + AuthzDisabled, + AuthzEnabled, + RouteAuthz, + RouteAuthc, + AuthcDisabled, + AuthcEnabled, + RouteSecurity, + Privilege, + PrivilegeSet, } from './route'; + export { validBodyOutput } from './route'; export type { RouteValidationFunction, diff --git a/packages/core/http/core-http-server/src/router/request.ts b/packages/core/http/core-http-server/src/router/request.ts index 9080c1be48c8c..5cb84a21be0c3 100644 --- a/packages/core/http/core-http-server/src/router/request.ts +++ b/packages/core/http/core-http-server/src/router/request.ts @@ -13,15 +13,22 @@ import type { Observable } from 'rxjs'; import type { RecursiveReadonly } from '@kbn/utility-types'; import type { HttpProtocol } from '../http_contract'; import type { IKibanaSocket } from './socket'; -import type { RouteMethod, RouteConfigOptions } from './route'; +import type { RouteMethod, RouteConfigOptions, RouteSecurity } from './route'; import type { Headers } from './headers'; +export type RouteSecurityGetter = (request: { + headers: KibanaRequest['headers']; + query?: KibanaRequest['query']; +}) => RouteSecurity | undefined; +export type InternalRouteSecurity = RouteSecurity | RouteSecurityGetter; + /** * @public */ export interface KibanaRouteOptions extends RouteOptionsApp { xsrfRequired: boolean; access: 'internal' | 'public'; + security?: InternalRouteSecurity; } /** @@ -32,6 +39,7 @@ export interface KibanaRequestState extends RequestApplicationState { requestUuid: string; rewrittenUrl?: URL; traceId?: string; + authzResult?: Record; measureElu?: () => void; } @@ -137,6 +145,12 @@ export interface KibanaRequest< */ readonly isFakeRequest: boolean; + /** + * Authorization check result, passed to the route handler. + * Indicates whether the specific privilege was granted or denied. + */ + readonly authzResult?: Record; + /** * An internal request has access to internal routes. * @note See the {@link KibanaRequestRouteOptions#access} route option. diff --git a/packages/core/http/core-http-server/src/router/route.ts b/packages/core/http/core-http-server/src/router/route.ts index c47688b60d3cd..bdf4f9f03c784 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -111,6 +111,82 @@ export interface RouteConfigOptionsBody { */ export type RouteAccess = 'public' | 'internal'; +export type Privilege = string; + +/** + * A set of privileges that can be used to define complex authorization requirements. + * + * - `anyRequired`: An array of privileges where at least one must be satisfied to meet the authorization requirement. + * - `allRequired`: An array of privileges where all listed privileges must be satisfied to meet the authorization requirement. + */ +export interface PrivilegeSet { + anyRequired?: Privilege[]; + allRequired?: Privilege[]; +} + +/** + * An array representing a combination of simple privileges or complex privilege sets. + */ +type Privileges = Array; + +/** + * Describes the authorization requirements when authorization is enabled. + * + * - `requiredPrivileges`: An array of privileges or privilege sets that are required for the route. + */ +export interface AuthzEnabled { + requiredPrivileges: Privileges; +} + +/** + * Describes the state when authorization is disabled. + * + * - `enabled`: A boolean indicating that authorization is not enabled (`false`). + * - `reason`: A string explaining why authorization is disabled. + */ +export interface AuthzDisabled { + enabled: false; + reason: string; +} + +/** + * Describes the authentication status when authentication is enabled. + * + * - `enabled`: A boolean or string indicating the authentication status. Can be `true` (authentication required) or `'optional'` (authentication is optional). + */ +export interface AuthcEnabled { + enabled: true | 'optional'; +} + +/** + * Describes the state when authentication is disabled. + * + * - `enabled`: A boolean indicating that authentication is not enabled (`false`). + * - `reason`: A string explaining why authentication is disabled. + */ +export interface AuthcDisabled { + enabled: false; + reason: string; +} + +/** + * Represents the authentication status for a route. It can either be enabled (`AuthcEnabled`) or disabled (`AuthcDisabled`). + */ +export type RouteAuthc = AuthcEnabled | AuthcDisabled; + +/** + * Represents the authorization status for a route. It can either be enabled (`AuthzEnabled`) or disabled (`AuthzDisabled`). + */ +export type RouteAuthz = AuthzEnabled | AuthzDisabled; + +/** + * Describes the security requirements for a route, including authorization and authentication. + */ +export interface RouteSecurity { + authz: RouteAuthz; + authc?: RouteAuthc; +} + /** * Additional route options. * @public @@ -216,6 +292,12 @@ export interface RouteConfigOptions { * @example 9.0.0 */ discontinued?: string; + /** + * Defines the security requirements for a route, including authorization and authentication. + * + * @remarks This will be surfaced in OAS documentation. + */ + security?: RouteSecurity; } /** @@ -296,6 +378,11 @@ export interface RouteConfig { */ validate: RouteValidator | (() => RouteValidator) | false; + /** + * Defines the security requirements for a route, including authorization and authentication. + */ + security?: RouteSecurity; + /** * Additional route options {@link RouteConfigOptions}. */ diff --git a/packages/core/http/core-http-server/src/router/router.ts b/packages/core/http/core-http-server/src/router/router.ts index e948bb3e26ae6..ba2b5eb906a93 100644 --- a/packages/core/http/core-http-server/src/router/router.ts +++ b/packages/core/http/core-http-server/src/router/router.ts @@ -15,6 +15,7 @@ import type { RequestHandler, RequestHandlerWrapper } from './request_handler'; import type { RequestHandlerContextBase } from './request_handler_context'; import type { RouteConfigOptions } from './route'; import { RouteValidator } from './route_validator'; +import { InternalRouteSecurity } from './request'; /** * Route handler common definition @@ -125,6 +126,7 @@ export interface RouterRoute { method: RouteMethod; path: string; options: RouteConfigOptions; + security?: InternalRouteSecurity; /** * @note if providing a function to lazily load your validation schemas assume * that the function will only be called once. diff --git a/packages/core/http/core-http-server/src/versioning/types.ts b/packages/core/http/core-http-server/src/versioning/types.ts index c552abd251a1f..60cbca014e683 100644 --- a/packages/core/http/core-http-server/src/versioning/types.ts +++ b/packages/core/http/core-http-server/src/versioning/types.ts @@ -35,10 +35,12 @@ export type VersionedRouteConfig = Omit< > & { options?: Omit< RouteConfigOptions, - 'access' | 'description' | 'deprecated' | 'discontinued' + 'access' | 'description' | 'deprecated' | 'discontinued' | 'security' >; /** See {@link RouteConfigOptions['access']} */ access: Exclude['access'], undefined>; + /** See {@link RouteConfigOptions['security']} */ + security?: Exclude['security'], undefined>; /** * When enabled, the router will also check for the presence of an `apiVersion` * query parameter to determine the route version to resolve to: @@ -337,6 +339,8 @@ export interface AddVersionOpts { * @public */ validate: false | VersionedRouteValidation | (() => VersionedRouteValidation); // Provide a way to lazily load validation schemas + + security?: Exclude['security'], undefined>; } /** diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 5282f2048dd06..f4852bdc97fe3 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -242,7 +242,7 @@ export type { } from '@kbn/core-http-server'; export type { IExternalUrlPolicy } from '@kbn/core-http-common'; -export { validBodyOutput } from '@kbn/core-http-server'; +export { validBodyOutput, OnPostAuthResultType } from '@kbn/core-http-server'; export type { HttpResourcesRenderOptions, @@ -605,3 +605,12 @@ export type { }; export type { CustomBrandingSetup } from '@kbn/core-custom-branding-server'; +export type { + AuthzDisabled, + AuthzEnabled, + RouteAuthz, + RouteSecurity, + RouteSecurityGetter, + Privilege, + PrivilegeSet, +} from '@kbn/core-http-server'; diff --git a/src/core/server/integration_tests/http/request_representation.test.ts b/src/core/server/integration_tests/http/request_representation.test.ts index 0688a858799e4..f180a3a49ce0f 100644 --- a/src/core/server/integration_tests/http/request_representation.test.ts +++ b/src/core/server/integration_tests/http/request_representation.test.ts @@ -122,10 +122,12 @@ describe('request logging', () => { xsrfRequired: false, access: 'internal', tags: [], + security: undefined, timeout: [Object], body: undefined } - } + }, + authzResult: undefined }" `); }); diff --git a/x-pack/plugins/security/common/constants.ts b/x-pack/plugins/security/common/constants.ts index 60644c5c6d21a..8d0237916bb5a 100644 --- a/x-pack/plugins/security/common/constants.ts +++ b/x-pack/plugins/security/common/constants.ts @@ -111,3 +111,8 @@ export const SESSION_ROUTE = '/internal/security/session'; * Allowed image file types for uploading an image as avatar */ export const IMAGE_FILE_TYPES = ['image/svg+xml', 'image/jpeg', 'image/png', 'image/gif']; + +/** + * Prefix for API actions. + */ +export const API_OPERATION_PREFIX = 'api:'; diff --git a/x-pack/plugins/security/server/authorization/api_authorization.test.ts b/x-pack/plugins/security/server/authorization/api_authorization.test.ts index 762a9a617498a..e928d73220274 100644 --- a/x-pack/plugins/security/server/authorization/api_authorization.test.ts +++ b/x-pack/plugins/security/server/authorization/api_authorization.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { RouteSecurity } from '@kbn/core/server'; import { coreMock, httpServerMock, @@ -137,4 +138,279 @@ describe('initAPIAuthorization', () => { }); expect(mockAuthz.mode.useRbacForRequest).toHaveBeenCalledWith(mockRequest); }); + + describe('security config', () => { + const testSecurityConfig = ( + description: string, + { + security, + kibanaPrivilegesResponse, + kibanaPrivilegesRequestActions, + asserts, + }: { + security?: RouteSecurity; + kibanaPrivilegesResponse?: Array<{ privilege: string; authorized: boolean }>; + kibanaPrivilegesRequestActions?: string[]; + asserts: { + forbidden?: boolean; + authzResult?: Record; + authzDisabled?: boolean; + }; + } + ) => { + test(description, async () => { + const mockHTTPSetup = coreMock.createSetup().http; + const mockAuthz = authorizationMock.create({ version: '1.0.0-zeta1' }); + initAPIAuthorization(mockHTTPSetup, mockAuthz, loggingSystemMock.create().get()); + + const [[postAuthHandler]] = mockHTTPSetup.registerOnPostAuth.mock.calls; + + const headers = { authorization: 'foo' }; + + const mockRequest = httpServerMock.createKibanaRequest({ + method: 'get', + path: '/foo/bar', + headers, + kibanaRouteOptions: { + xsrfRequired: true, + access: 'internal', + security, + }, + }); + const mockResponse = httpServerMock.createResponseFactory(); + const mockPostAuthToolkit = httpServiceMock.createOnPostAuthToolkit(); + + const mockCheckPrivileges = jest.fn().mockReturnValue({ + privileges: { + kibana: kibanaPrivilegesResponse, + }, + }); + mockAuthz.mode.useRbacForRequest.mockReturnValue(true); + mockAuthz.checkPrivilegesDynamicallyWithRequest.mockImplementation((request) => { + // hapi conceals the actual "request" from us, so we make sure that the headers are passed to + // "checkPrivilegesDynamicallyWithRequest" because this is what we're really concerned with + expect(request.headers).toMatchObject(headers); + + return mockCheckPrivileges; + }); + + await postAuthHandler(mockRequest, mockResponse, mockPostAuthToolkit); + + expect(mockAuthz.mode.useRbacForRequest).toHaveBeenCalledWith(mockRequest); + + if (asserts.authzDisabled) { + expect(mockResponse.forbidden).not.toHaveBeenCalled(); + expect(mockPostAuthToolkit.authzResultNext).not.toHaveBeenCalled(); + expect(mockPostAuthToolkit.next).toHaveBeenCalled(); + expect(mockCheckPrivileges).not.toHaveBeenCalled(); + + return; + } + + expect(mockCheckPrivileges).toHaveBeenCalledWith({ + kibana: kibanaPrivilegesRequestActions!.map((action: string) => + mockAuthz.actions.api.get(action) + ), + }); + + if (asserts.forbidden) { + expect(mockResponse.forbidden).toHaveBeenCalled(); + expect(mockPostAuthToolkit.authzResultNext).not.toHaveBeenCalled(); + } + + if (asserts.authzResult) { + expect(mockResponse.forbidden).not.toHaveBeenCalled(); + expect(mockPostAuthToolkit.authzResultNext).toHaveBeenCalledTimes(1); + expect(mockPostAuthToolkit.authzResultNext).toHaveBeenCalledWith(asserts.authzResult); + } + }); + }; + + testSecurityConfig( + `protected route returns "authzResult" if user has allRequired AND anyRequired privileges requested`, + { + security: { + authz: { + requiredPrivileges: [ + { + allRequired: ['privilege1'], + anyRequired: ['privilege2', 'privilege3'], + }, + ], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: true }, + { privilege: 'api:privilege3', authorized: false }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3'], + asserts: { + authzResult: { + privilege1: true, + privilege2: true, + privilege3: false, + }, + }, + } + ); + + testSecurityConfig( + `protected route returns "authzResult" if user has all required privileges requested as complex config`, + { + security: { + authz: { + requiredPrivileges: [ + { + allRequired: ['privilege1', 'privilege2'], + }, + ], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: true }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2'], + asserts: { + authzResult: { + privilege1: true, + privilege2: true, + }, + }, + } + ); + + testSecurityConfig( + `protected route returns "authzResult" if user has at least one of anyRequired privileges requested`, + { + security: { + authz: { + requiredPrivileges: [ + { + anyRequired: ['privilege1', 'privilege2', 'privilege3'], + }, + ], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: false }, + { privilege: 'api:privilege2', authorized: true }, + { privilege: 'api:privilege3', authorized: false }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3'], + asserts: { + authzResult: { + privilege1: false, + privilege2: true, + privilege3: false, + }, + }, + } + ); + + testSecurityConfig( + `protected route returns "authzResult" if user has all required privileges requested as simple config`, + { + security: { + authz: { + requiredPrivileges: ['privilege1', 'privilege2'], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: true }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2'], + asserts: { + authzResult: { + privilege1: true, + privilege2: true, + }, + }, + } + ); + + testSecurityConfig( + `protected route returns forbidden if user has allRequired AND NONE of anyRequired privileges requested`, + { + security: { + authz: { + requiredPrivileges: [ + { + allRequired: ['privilege1'], + anyRequired: ['privilege2', 'privilege3'], + }, + ], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: false }, + { privilege: 'api:privilege3', authorized: false }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3'], + asserts: { + forbidden: true, + }, + } + ); + + testSecurityConfig( + `protected route returns forbidden if user doesn't have at least one from allRequired privileges requested`, + { + security: { + authz: { + requiredPrivileges: [ + { + allRequired: ['privilege1', 'privilege2'], + anyRequired: ['privilege3', 'privilege4'], + }, + ], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: false }, + { privilege: 'api:privilege3', authorized: false }, + { privilege: 'api:privilege4', authorized: true }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3', 'privilege4'], + asserts: { + forbidden: true, + }, + } + ); + + testSecurityConfig( + `protected route returns forbidden if user doesn't have at least one from required privileges requested as simple config`, + { + security: { + authz: { + requiredPrivileges: ['privilege1', 'privilege2'], + }, + }, + kibanaPrivilegesResponse: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: false }, + ], + kibanaPrivilegesRequestActions: ['privilege1', 'privilege2'], + asserts: { + forbidden: true, + }, + } + ); + + testSecurityConfig(`route returns next if route has authz disabled`, { + security: { + authz: { + enabled: false, + reason: 'authz is disabled', + }, + }, + asserts: { + authzDisabled: true, + }, + }); + }); }); diff --git a/x-pack/plugins/security/server/authorization/api_authorization.ts b/x-pack/plugins/security/server/authorization/api_authorization.ts index 6956a91d81265..ba38d9ca0aa20 100644 --- a/x-pack/plugins/security/server/authorization/api_authorization.ts +++ b/x-pack/plugins/security/server/authorization/api_authorization.ts @@ -5,8 +5,23 @@ * 2.0. */ -import type { HttpServiceSetup, Logger } from '@kbn/core/server'; +import type { + AuthzDisabled, + AuthzEnabled, + HttpServiceSetup, + Logger, + Privilege, + PrivilegeSet, + RouteAuthz, +} from '@kbn/core/server'; import type { AuthorizationServiceSetup } from '@kbn/security-plugin-types-server'; +import type { RecursiveReadonly } from '@kbn/utility-types'; + +import { API_OPERATION_PREFIX } from '../../common/constants'; + +const isAuthzDisabled = (authz?: RecursiveReadonly): authz is AuthzDisabled => { + return (authz as AuthzDisabled)?.enabled === false; +}; export function initAPIAuthorization( http: HttpServiceSetup, @@ -19,6 +34,78 @@ export function initAPIAuthorization( return toolkit.next(); } + const security = request.route.options.security; + + if (security) { + if (isAuthzDisabled(security.authz)) { + logger.warn( + `Route authz is disabled for ${request.url.pathname}${request.url.search}": ${security.authz.reason}` + ); + + return toolkit.next(); + } + + const authz = security.authz as AuthzEnabled; + + const requestedPrivileges = authz.requiredPrivileges.flatMap((privilegeEntry) => { + if (typeof privilegeEntry === 'object') { + return [...(privilegeEntry.allRequired ?? []), ...(privilegeEntry.anyRequired ?? [])]; + } + + return privilegeEntry; + }); + + const apiActions = requestedPrivileges.map((permission) => actions.api.get(permission)); + const checkPrivileges = checkPrivilegesDynamicallyWithRequest(request); + const checkPrivilegesResponse = await checkPrivileges({ kibana: apiActions }); + + const privilegeToApiOperation = (privilege: string) => + privilege.replace(API_OPERATION_PREFIX, ''); + const kibanaPrivileges: Record = {}; + + for (const kbPrivilege of checkPrivilegesResponse.privileges.kibana) { + kibanaPrivileges[privilegeToApiOperation(kbPrivilege.privilege)] = kbPrivilege.authorized; + } + + const hasRequestedPrivilege = (kbPrivilege: Privilege | PrivilegeSet) => { + if (typeof kbPrivilege === 'object') { + const allRequired = kbPrivilege.allRequired ?? []; + const anyRequired = kbPrivilege.anyRequired ?? []; + + return ( + allRequired.every((privilege: string) => kibanaPrivileges[privilege]) && + (!anyRequired.length || + anyRequired.some((privilege: string) => kibanaPrivileges[privilege])) + ); + } + + return kibanaPrivileges[kbPrivilege]; + }; + + for (const requiredPrivilege of authz.requiredPrivileges) { + if (!hasRequestedPrivilege(requiredPrivilege)) { + const missingPrivileges = Object.keys(kibanaPrivileges).filter( + (key) => !kibanaPrivileges[key] + ); + logger.warn( + `User not authorized for "${request.url.pathname}${ + request.url.search + }", responding with 403: missing privileges: ${missingPrivileges.join(', ')}` + ); + + return response.forbidden({ + body: { + message: `User not authorized for ${request.url.pathname}${ + request.url.search + }, missing privileges: ${missingPrivileges.join(', ')}`, + }, + }); + } + } + + return toolkit.authzResultNext(kibanaPrivileges); + } + const tags = request.route.options.tags; const tagPrefix = 'access:'; const actionTags = tags.filter((tag) => tag.startsWith(tagPrefix)); diff --git a/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts b/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts index 27205a30be785..a1b71a9c4f04f 100644 --- a/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts +++ b/x-pack/plugins/security_solution/server/lib/product_features_service/product_features_service.test.ts @@ -187,7 +187,7 @@ describe('ProductFeaturesService', () => { url: { pathname: '', search: '' }, } as unknown as KibanaRequest); const res = { notFound: jest.fn() } as unknown as LifecycleResponseFactory; - const toolkit = { next: jest.fn() }; + const toolkit = httpServiceMock.createOnPostAuthToolkit(); beforeEach(() => { jest.clearAllMocks(); From 32144fc0244566db557646ff35cc82c29734df72 Mon Sep 17 00:00:00 2001 From: Robert Jaszczurek <92210485+rbrtj@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:17:29 +0200 Subject: [PATCH 008/107] [ML] Anomaly explorer: Show Data Gaps and Connect Anomalous Points on Single Metric Charts (#194119) ## Summary Fix for [#193885](https://github.com/elastic/kibana/issues/193885) Single metric viewer: ![Screenshot 2024-09-26 at 13 31 35](https://github.com/user-attachments/assets/3576758e-9cb1-4c55-bd84-40f2095cc54f) Anomaly explorer: | Before | After | | ------------- | ------------- | | ![image](https://github.com/user-attachments/assets/89f48abd-26ac-4dd4-ab10-b1c8198f50ff) | ![Screenshot 2024-09-26 at 13 32 05](https://github.com/user-attachments/assets/e3a6e1e3-6238-4c01-a372-fa0c25475fbd) | --- .../explorer_chart_single_metric.js | 22 +++++++++++++--- .../models/results_service/anomaly_charts.ts | 26 +++++++++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js index e358c381288d3..1b746647ef38d 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js @@ -368,6 +368,7 @@ export class ExplorerChartSingleMetric extends React.Component { // These are used for displaying tooltips on mouseover. // Don't render dots where value=null (data gaps, with no anomalies) // or for multi-bucket anomalies. + // Except for scheduled events. const dots = lineChartGroup .append('g') .attr('class', 'chart-markers') @@ -375,7 +376,9 @@ export class ExplorerChartSingleMetric extends React.Component { .data( data.filter( (d) => - (d.value !== null || typeof d.anomalyScore === 'number') && + (d.value !== null || + typeof d.anomalyScore === 'number' || + d.scheduledEvents !== undefined) && !showMultiBucketAnomalyMarker(d) ) ); @@ -407,7 +410,11 @@ export class ExplorerChartSingleMetric extends React.Component { // Update all dots to new positions. dots .attr('cx', (d) => lineChartXScale(d.date)) - .attr('cy', (d) => lineChartYScale(d.value)) + // Fallback with domain's min value if value is null + // To ensure event markers are rendered properly at the bottom of the chart + .attr('cy', (d) => + lineChartYScale(d.value !== null ? d.value : lineChartYScale.domain()[0]) + ) .attr('class', (d) => { let markerClass = 'metric-value'; if (isAnomalyVisible(d)) { @@ -470,7 +477,14 @@ export class ExplorerChartSingleMetric extends React.Component { // Update all markers to new positions. scheduledEventMarkers .attr('x', (d) => lineChartXScale(d.date) - LINE_CHART_ANOMALY_RADIUS) - .attr('y', (d) => lineChartYScale(d.value) - SCHEDULED_EVENT_SYMBOL_HEIGHT / 2); + .attr( + 'y', + (d) => + // Fallback with domain's min value if value is null + // To ensure event markers are rendered properly at the bottom of the chart + lineChartYScale(d.value !== null ? d.value : lineChartYScale.domain()[0]) - + SCHEDULED_EVENT_SYMBOL_HEIGHT / 2 + ); } function showAnomalyPopover(marker, circle) { @@ -596,7 +610,7 @@ export class ExplorerChartSingleMetric extends React.Component { }); } } - } else { + } else if (marker.value !== null) { tooltipData.push({ label: i18n.translate( 'xpack.ml.explorer.singleMetricChart.valueWithoutAnomalyScoreLabel', diff --git a/x-pack/plugins/ml/server/models/results_service/anomaly_charts.ts b/x-pack/plugins/ml/server/models/results_service/anomaly_charts.ts index 1690e2db74164..771e40fc13336 100644 --- a/x-pack/plugins/ml/server/models/results_service/anomaly_charts.ts +++ b/x-pack/plugins/ml/server/models/results_service/anomaly_charts.ts @@ -1055,9 +1055,11 @@ export function anomalyChartsDataProvider(mlClient: MlClient, client: IScopedClu // differently because of how the source data is structured. // For rare chart values we are only interested wether a value is either `0` or not, // `0` acts like a flag in the chart whether to display the dot/marker. - // All other charts (single metric, population) are metric based and with + // For single metric chart, we need to pass null values to display data gaps. + // All other charts are distribution based and with // those a value of `null` acts as the flag to hide a data point. if ( + chartType === CHART_TYPE.SINGLE_METRIC || (chartType === CHART_TYPE.EVENT_DISTRIBUTION && value > 0) || (chartType !== CHART_TYPE.EVENT_DISTRIBUTION && value !== null) ) { @@ -1079,6 +1081,7 @@ export function anomalyChartsDataProvider(mlClient: MlClient, client: IScopedClu // Iterate through the anomaly records, adding anomalyScore properties // to the chartData entries for anomalous buckets. const chartDataForPointSearch = getChartDataForPointSearch(chartData, records[0], chartType); + let shouldSortChartData = false; each(records, (record) => { // Look for a chart point with the same time as the record. // If none found, insert a point for anomalies due to a gap in the data. @@ -1087,10 +1090,17 @@ export function anomalyChartsDataProvider(mlClient: MlClient, client: IScopedClu if (chartPoint === undefined) { chartPoint = { date: recordTime, value: null }; chartData.push(chartPoint); + shouldSortChartData = true; } if (chartPoint !== undefined) { chartPoint.anomalyScore = record.record_score; + // If it is an empty chart point, set the value to the actual value + // To properly display the anomaly marker on the chart + if (chartPoint.value === null) { + chartPoint.value = Array.isArray(record.actual) ? record.actual[0] : record.actual; + } + if (record.actual !== undefined) { chartPoint.actual = record.actual; chartPoint.typical = record.typical; @@ -1119,6 +1129,12 @@ export function anomalyChartsDataProvider(mlClient: MlClient, client: IScopedClu } }); + // Chart data is sorted by default, but if we added points for anomalies, + // we need to sort again to ensure the points are in the correct order. + if (shouldSortChartData) { + chartData.sort((a, b) => a.date - b.date); + } + // Add a scheduledEvents property to any points in the chart data set // which correspond to times of scheduled events for the job. if (scheduledEvents !== undefined) { @@ -1126,14 +1142,14 @@ export function anomalyChartsDataProvider(mlClient: MlClient, client: IScopedClu const chartPoint = findChartPointForTime(chartDataForPointSearch, Number(time)); if (chartPoint !== undefined) { chartPoint.scheduledEvents = events; - // We do not want to create additional points for single metric charts - // as it could break the chart. - } else if (chartType !== CHART_TYPE.SINGLE_METRIC) { + } else { // If there's no underlying metric data point for the scheduled event, // create a new chart point with a value of 0. + // Except for Single Metric Charts, where we want to create a point at the bottom of the chart. + // Which is not always `0`. const eventChartPoint: ChartPoint = { date: Number(time), - value: 0, + value: chartType === CHART_TYPE.SINGLE_METRIC ? null : 0, entity: SCHEDULE_EVENT_MARKER_ENTITY, scheduledEvents: events, }; From 49661a35744adea396d6a80039d1a5f9976c957e Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:19:56 +0100 Subject: [PATCH 009/107] [Security Solution][Detection Engine] fixes empty item_id in exception item update request schema (#194175) ## Summary - fixes schema for `updateExceptionListItemSchema` , that led to [error in 8.15](https://github.com/elastic/kibana/issues/191315) 8.15 is fixed in https://github.com/elastic/kibana/pull/194172, in separate PR, since 8.16+ error in not reproducible. But schema still is not correct. So this PR just fixes schema --- .../src/request/update_exception_list_item_schema/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts index 8b7941c8ea936..b0190d8fa3883 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts @@ -21,6 +21,7 @@ import { description } from '../../common/description'; import { name } from '../../common/name'; import { _version } from '../../common/underscore_version'; import { id } from '../../common/id'; +import { item_id } from '../../common/item_id'; import { meta } from '../../common/meta'; import { namespace_type } from '../../common/namespace_type'; import { ExpireTimeOrUndefined, expireTimeOrUndefined } from '../../common'; @@ -40,7 +41,7 @@ export const updateExceptionListItemSchema = t.intersection([ comments: DefaultUpdateCommentsArray, // defaults to empty array if not set during decode expire_time: expireTimeOrUndefined, id, // defaults to undefined if not set during decode - item_id: t.union([t.string, t.undefined]), + item_id, meta, // defaults to undefined if not set during decode namespace_type, // defaults to 'single' if not set during decode os_types: osTypeArrayOrUndefined, // defaults to empty array if not set during decode From b005ea907b7173b2aa7ab0974f9a2fcfef08de0d Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:15:24 +0100 Subject: [PATCH 010/107] [Security Solution][Detection Engine] removes field_caps call for all fields in index during rule execution (#193869) ## Summary - addresses https://github.com/elastic/kibana/issues/187059 ### 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> --- .../create_security_rule_type_wrapper.ts | 21 ----- .../create_indicator_match_alert_type.ts | 2 - .../indicator_match/indicator_match.ts | 5 +- .../threat_mapping/create_event_signal.ts | 1 + .../threat_mapping/create_threat_signal.ts | 1 + .../threat_mapping/create_threat_signals.ts | 20 ++-- .../indicator_match/threat_mapping/types.ts | 1 - .../new_terms/create_new_terms_alert_type.ts | 3 +- .../rule_types/query/query.ts | 1 - .../threshold/create_threshold_alert_type.ts | 2 - .../rule_types/threshold/threshold.test.ts | 4 +- .../rule_types/threshold/threshold.ts | 6 +- .../lib/detection_engine/rule_types/types.ts | 3 +- .../utils/get_fields_for_wildcard.test.ts | 94 ------------------- .../utils/get_fields_for_wildcard.ts | 39 -------- .../rule_types/utils/get_query_fields.ts | 28 ++++++ 16 files changed, 50 insertions(+), 181 deletions(-) delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_fields.ts diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts index f25a8429089b6..ac56d2c41a8fe 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts @@ -11,7 +11,6 @@ import agent from 'elastic-apm-node'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { TIMESTAMP } from '@kbn/rule-data-utils'; import { createPersistenceRuleTypeWrapper } from '@kbn/rule-registry-plugin/server'; -import type { DataViewFieldBase } from '@kbn/es-query'; import { buildExceptionFilter } from '@kbn/lists-plugin/server/services/exception_lists'; import { technicalRuleFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/technical_rule_field_map'; import type { FieldMap } from '@kbn/alerts-as-data-utils'; @@ -26,8 +25,6 @@ import { hasTimestampFields, isMachineLearningParams, isEsqlParams, - isQueryParams, - isEqlParams, getDisabledActionsWarningText, } from './utils/utils'; import { DEFAULT_MAX_SIGNALS, DEFAULT_SEARCH_AFTER_PAGE_SIZE } from '../../../../common/constants'; @@ -47,7 +44,6 @@ import { withSecuritySpan } from '../../../utils/with_security_span'; import { getInputIndex, DataViewError } from './utils/get_input_output_index'; import { TIMESTAMP_RUNTIME_FIELD } from './constants'; import { buildTimestampRuntimeMapping } from './utils/build_timestamp_runtime_mapping'; -import { getFieldsForWildcard } from './utils/get_fields_for_wildcard'; import { alertsFieldMap, rulesFieldMap } from '../../../../common/field_maps'; import { sendAlertSuppressionTelemetryEvent } from './utils/telemetry/send_alert_suppression_telemetry_event'; @@ -139,7 +135,6 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = } = options; let runState = state; let inputIndex: string[] = []; - let inputIndexFields: DataViewFieldBase[] = []; let runtimeMappings: estypes.MappingRuntimeFields | undefined; const { from, maxSignals, timestampOverride, timestampOverrideFallbackDisabled, to } = params; @@ -337,21 +332,6 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = }); } - if ( - !isMachineLearningParams(params) && - !isEsqlParams(params) && - !isQueryParams(params) && - !isEqlParams(params) - ) { - const dataViews = await services.getDataViews(); - inputIndexFields = await getFieldsForWildcard({ - index: inputIndex, - dataViews, - language: params.language, - ruleExecutionLogger, - }); - } - try { const { listClient, exceptionsClient } = getListClient({ esClient: services.scopedClusterClient.asCurrentUser, @@ -426,7 +406,6 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = inputIndex, exceptionFilter, unprocessedExceptions, - inputIndexFields, runtimeMappings: { ...runtimeMappings, ...timestampRuntimeMappings, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.ts index 3ad9925f7f053..d7f3e96d9a43d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.ts @@ -76,7 +76,6 @@ export const createIndicatorMatchAlertType = ( secondaryTimestamp, exceptionFilter, unprocessedExceptions, - inputIndexFields, }, services, spaceId, @@ -119,7 +118,6 @@ export const createIndicatorMatchAlertType = ( secondaryTimestamp, exceptionFilter, unprocessedExceptions, - inputIndexFields, wrapSuppressedHits, runOpts, licensing, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/indicator_match.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/indicator_match.ts index 4f004f0bdc628..b8392a82bb6c0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/indicator_match.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/indicator_match.ts @@ -15,7 +15,7 @@ import type { RuleExecutorServices, } from '@kbn/alerting-plugin/server'; import type { ListClient } from '@kbn/lists-plugin/server'; -import type { Filter, DataViewFieldBase } from '@kbn/es-query'; +import type { Filter } from '@kbn/es-query'; import type { RuleRangeTuple, BulkCreate, WrapHits, WrapSuppressedHits, RunOpts } from '../types'; import type { ITelemetryEventsSender } from '../../../telemetry/sender'; import { createThreatSignals } from './threat_mapping/create_threat_signals'; @@ -43,7 +43,6 @@ export const indicatorMatchExecutor = async ({ secondaryTimestamp, exceptionFilter, unprocessedExceptions, - inputIndexFields, wrapSuppressedHits, runOpts, licensing, @@ -65,7 +64,6 @@ export const indicatorMatchExecutor = async ({ secondaryTimestamp?: string; exceptionFilter: Filter | undefined; unprocessedExceptions: ExceptionListItemSchema[]; - inputIndexFields: DataViewFieldBase[]; wrapSuppressedHits: WrapSuppressedHits; runOpts: RunOpts; licensing: LicensingPluginSetup; @@ -106,7 +104,6 @@ export const indicatorMatchExecutor = async ({ secondaryTimestamp, exceptionFilter, unprocessedExceptions, - inputIndexFields, runOpts, licensing, experimentalFeatures, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_event_signal.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_event_signal.ts index e6bd194504fd6..59d20b9dcf0a3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_event_signal.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_event_signal.ts @@ -144,6 +144,7 @@ export const createEventSignal = async ({ index: inputIndex, exceptionFilter, fields: inputIndexFields, + loadFields: true, }); ruleExecutionLogger.debug(`${ids?.length} matched signals found`); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signal.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signal.ts index 318f8ddfbb759..8d726fb17e901 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signal.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signal.ts @@ -81,6 +81,7 @@ export const createThreatSignal = async ({ index: inputIndex, exceptionFilter, fields: inputIndexFields, + loadFields: true, }); ruleExecutionLogger.debug( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts index 46e5ce84e808c..4d477d53604a4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts @@ -36,8 +36,8 @@ import { getEventCount, getEventList } from './get_event_count'; import { getMappingFilters } from './get_mapping_filters'; import { THREAT_PIT_KEEP_ALIVE } from '../../../../../../common/cti/constants'; import { getMaxSignalsWarning, getSafeSortIds } from '../../utils/utils'; -import { getFieldsForWildcard } from '../../utils/get_fields_for_wildcard'; import { getDataTierFilter } from '../../utils/get_data_tier_filter'; +import { getQueryFields } from '../../utils/get_query_fields'; export const createThreatSignals = async ({ alertId, @@ -72,7 +72,6 @@ export const createThreatSignals = async ({ secondaryTimestamp, exceptionFilter, unprocessedExceptions, - inputIndexFields, licensing, experimentalFeatures, }: CreateThreatSignalsOptions): Promise => { @@ -115,6 +114,14 @@ export const createThreatSignals = async ({ const allEventFilters = [...filters, eventMappingFilter, ...dataTiersFilters]; const allThreatFilters = [...threatFilters, indicatorMappingFilter, ...dataTiersFilters]; + const dataViews = await services.getDataViews(); + const inputIndexFields = await getQueryFields({ + dataViews, + index: inputIndex, + query, + language, + }); + const eventCount = await getEventCount({ esClient: services.scopedClusterClient.asCurrentUser, index: inputIndex, @@ -140,12 +147,11 @@ export const createThreatSignals = async ({ if (newPitId) threatPitId = newPitId; }; - const dataViews = await services.getDataViews(); - const threatIndexFields = await getFieldsForWildcard({ - index: threatIndex, - language: threatLanguage ?? 'kuery', + const threatIndexFields = await getQueryFields({ dataViews, - ruleExecutionLogger, + index: threatIndex, + query: threatQuery, + language: threatLanguage, }); const threatListCount = await getThreatListCount({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/types.ts index e1072f873917a..37bc9d1810137 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/types.ts @@ -77,7 +77,6 @@ export interface CreateThreatSignalsOptions { secondaryTimestamp?: string; exceptionFilter: Filter | undefined; unprocessedExceptions: ExceptionListItemSchema[]; - inputIndexFields: DataViewFieldBase[]; runOpts: RunOpts; licensing: LicensingPluginSetup; experimentalFeatures: ExperimentalFeatures; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts index e33f580388f98..fc0c4b31426df 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts @@ -110,7 +110,6 @@ export const createNewTermsAlertType = ( unprocessedExceptions, alertTimestampOverride, publicBaseUrl, - inputIndexFields, alertWithSuppression, }, services, @@ -135,7 +134,7 @@ export const createNewTermsAlertType = ( type: params.type, query: params.query, exceptionFilter, - fields: inputIndexFields, + loadFields: true, }; const esFilter = await getFilter(filterArgs); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts index 5915447e5a541..edf7ece7cc84b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts @@ -58,7 +58,6 @@ export const queryExecutor = async ({ services, index: runOpts.inputIndex, exceptionFilter: runOpts.exceptionFilter, - fields: runOpts.inputIndexFields, loadFields: true, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/create_threshold_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/create_threshold_alert_type.ts index 84f3a52af95e2..f48cea676b953 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/create_threshold_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/create_threshold_alert_type.ts @@ -74,7 +74,6 @@ export const createThresholdAlertType = ( aggregatableTimestampField, exceptionFilter, unprocessedExceptions, - inputIndexFields, }, services, startedAt, @@ -99,7 +98,6 @@ export const createThresholdAlertType = ( aggregatableTimestampField, exceptionFilter, unprocessedExceptions, - inputIndexFields, spaceId, runOpts: execOptions.runOpts, licensing, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.test.ts index 50a315a58ef4d..8c790596b99ba 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.test.ts @@ -22,6 +22,8 @@ import { ruleExecutionLogMock } from '../../rule_monitoring/mocks'; import type { RunOpts } from '../types'; import type { ExperimentalFeatures } from '../../../../../common'; +jest.mock('../utils/get_filter', () => ({ getFilter: jest.fn() })); + describe('threshold_executor', () => { let alertServices: RuleExecutorServicesMock; let ruleExecutionLogger: ReturnType; @@ -107,7 +109,6 @@ describe('threshold_executor', () => { aggregatableTimestampField: TIMESTAMP, exceptionFilter: undefined, unprocessedExceptions: [], - inputIndexFields: [], spaceId: 'default', runOpts: {} as RunOpts, licensing, @@ -173,7 +174,6 @@ describe('threshold_executor', () => { aggregatableTimestampField: TIMESTAMP, exceptionFilter: undefined, unprocessedExceptions: [getExceptionListItemSchemaMock()], - inputIndexFields: [], spaceId: 'default', runOpts: {} as RunOpts, licensing, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts index ee0e80f03df15..06a0ff89ccc40 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts @@ -18,7 +18,7 @@ import type { RuleExecutorServices, } from '@kbn/alerting-plugin/server'; import type { IRuleDataClient } from '@kbn/rule-registry-plugin/server'; -import type { Filter, DataViewFieldBase } from '@kbn/es-query'; +import type { Filter } from '@kbn/es-query'; import type { CompleteRule, ThresholdRuleParams } from '../../rule_schema'; import { getFilter } from '../utils/get_filter'; import { bulkCreateThresholdSignals } from './bulk_create_threshold_signals'; @@ -64,7 +64,6 @@ export const thresholdExecutor = async ({ aggregatableTimestampField, exceptionFilter, unprocessedExceptions, - inputIndexFields, spaceId, runOpts, licensing, @@ -87,7 +86,6 @@ export const thresholdExecutor = async ({ aggregatableTimestampField: string; exceptionFilter: Filter | undefined; unprocessedExceptions: ExceptionListItemSchema[]; - inputIndexFields: DataViewFieldBase[]; spaceId: string; runOpts: RunOpts; licensing: LicensingPluginSetup; @@ -135,7 +133,7 @@ export const thresholdExecutor = async ({ services, index: inputIndex, exceptionFilter, - fields: inputIndexFields, + loadFields: true, }); // Look for new events over threshold diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts index 78c0a729be10e..6e2999ae5e3b2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts @@ -32,7 +32,7 @@ import type { } from '@kbn/rule-registry-plugin/server'; import type { EcsFieldMap } from '@kbn/rule-registry-plugin/common/assets/field_maps/ecs_field_map'; import type { TypeOfFieldMap } from '@kbn/rule-registry-plugin/common/field_map'; -import type { Filter, DataViewFieldBase } from '@kbn/es-query'; +import type { Filter } from '@kbn/es-query'; import type { LicensingPluginSetup } from '@kbn/licensing-plugin/server'; import type { RulePreviewLoggedRequest } from '../../../../common/api/detection_engine/rule_preview/rule_preview.gen'; @@ -104,7 +104,6 @@ export interface RunOpts { alertWithSuppression: SuppressedAlertService; refreshOnIndexingAlerts: RefreshTypes; publicBaseUrl: string | undefined; - inputIndexFields: DataViewFieldBase[]; experimentalFeatures?: ExperimentalFeatures; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.test.ts deleted file mode 100644 index 709adb63ad9a0..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.test.ts +++ /dev/null @@ -1,94 +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 { DataViewsContract } from '@kbn/data-views-plugin/common'; - -import { getFieldsForWildcard } from './get_fields_for_wildcard'; -import { ruleExecutionLogMock } from '../../rule_monitoring/mocks'; - -const mockFields = [ - { - name: 'agent.id', - type: 'string', - esTypes: ['keyword'], - }, - { - name: 'agent.name', - type: 'string', - esTypes: ['keyword'], - }, -]; - -const dataViewsMock = { - getFieldsForWildcard: jest.fn().mockResolvedValue(mockFields), -} as unknown as DataViewsContract; - -const ruleExecutionLogger = ruleExecutionLogMock.forExecutors.create(); - -describe('getFieldsForWildcard', () => { - it('should return empty array and not call dataViews API for eql language', async () => { - const fields = await getFieldsForWildcard({ - index: ['auditbeat-*'], - language: 'eql', - dataViews: dataViewsMock, - ruleExecutionLogger, - }); - - expect(fields).toEqual([]); - expect(dataViewsMock.getFieldsForWildcard).not.toHaveBeenCalled(); - }); - it('should return empty array and not call dataViews API for lucene language', async () => { - const fields = await getFieldsForWildcard({ - index: ['auditbeat-*'], - language: 'lucene', - dataViews: dataViewsMock, - ruleExecutionLogger, - }); - - expect(fields).toEqual([]); - expect(dataViewsMock.getFieldsForWildcard).not.toHaveBeenCalled(); - }); - it('should return empty array and not call dataViews API for non existing index', async () => { - const fields = await getFieldsForWildcard({ - index: undefined, - language: 'kuery', - dataViews: dataViewsMock, - ruleExecutionLogger, - }); - - expect(fields).toEqual([]); - expect(dataViewsMock.getFieldsForWildcard).not.toHaveBeenCalled(); - }); - it('should return fields and call dataViews API for kuery language', async () => { - const fields = await getFieldsForWildcard({ - index: ['auditbeat-*', 'filebeat-*'], - language: 'kuery', - dataViews: dataViewsMock, - ruleExecutionLogger, - }); - - expect(fields).toEqual(mockFields); - expect(dataViewsMock.getFieldsForWildcard).toHaveBeenCalledWith({ - pattern: 'auditbeat-*,filebeat-*', - allowNoIndex: true, - }); - }); - it('should return empty array on dataViews API error', async () => { - (dataViewsMock.getFieldsForWildcard as jest.Mock).mockRejectedValue(Error('some test error')); - const fields = await getFieldsForWildcard({ - index: ['auditbeat-*', 'filebeat-*'], - language: 'kuery', - dataViews: dataViewsMock, - ruleExecutionLogger, - }); - - expect(fields).toEqual([]); - expect(ruleExecutionLogger.error).toHaveBeenCalledWith( - expect.stringMatching('some test error') - ); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.ts deleted file mode 100644 index e1111c37604b5..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_fields_for_wildcard.ts +++ /dev/null @@ -1,39 +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 { DataViewsContract, FieldSpec } from '@kbn/data-views-plugin/common'; -import type { LanguageOrUndefined } from '@kbn/securitysolution-io-ts-alerting-types'; - -import type { IRuleExecutionLogForExecutors } from '../../rule_monitoring'; - -export const getFieldsForWildcard = async ({ - index, - dataViews, - language, - ruleExecutionLogger, -}: { - index: string[] | undefined; - language: LanguageOrUndefined; - dataViews: DataViewsContract; - ruleExecutionLogger: IRuleExecutionLogForExecutors; -}): Promise => { - if (!index || language !== 'kuery') { - return []; - } - - try { - const fields = await dataViews.getFieldsForWildcard({ - pattern: index.join(), - allowNoIndex: true, - }); - - return fields; - } catch (e) { - ruleExecutionLogger.error(`Failed to fetch index fields: ${e?.message}`); - return []; - } -}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_fields.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_fields.ts new file mode 100644 index 0000000000000..3cef5dc280c85 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_fields.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { DataViewsContract } from '@kbn/data-views-plugin/common'; +import { queryToFields } from '@kbn/data-plugin/common'; +import type { LanguageOrUndefined } from '@kbn/securitysolution-io-ts-alerting-types'; + +interface GetQueryFieldsArgs { + dataViews: DataViewsContract; + index: string[]; + query: string; + language: LanguageOrUndefined; +} + +export const getQueryFields = async ({ dataViews, index, query, language }: GetQueryFieldsArgs) => { + const dataViewLazy = await dataViews.createDataViewLazy({ + title: index.join(), + }); + return Object.values( + await queryToFields({ + dataView: dataViewLazy, + request: { query: [{ query, language: language || 'kuery' }] }, + }) + ); +}; From 31447b19e5ef7eb0c1d2a6315507ec6cfff40735 Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Mon, 30 Sep 2024 15:25:29 +0200 Subject: [PATCH 011/107] [EDR Workflows] Unskip metering cypress (#194404) Closes https://github.com/elastic/kibana/issues/187083 Moved the `login()` to `beforeEach` because placing it in `before` caused the session to remain unauthorized during test execution. --- .../management/cypress/e2e/serverless/metering.cy.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/metering.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/metering.cy.ts index e4ee27faed26e..d354531affd35 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/metering.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/metering.cy.ts @@ -8,6 +8,7 @@ import { recurse } from 'cypress-recurse'; import type { UsageRecord } from '@kbn/security-solution-serverless/server/types'; import { METERING_SERVICE_BATCH_SIZE } from '@kbn/security-solution-serverless/server/constants'; +import { login, ROLE } from '../../tasks/login'; import { getInterceptedRequestsFromTransparentApiProxy, startTransparentApiProxy, @@ -15,10 +16,8 @@ import { } from '../../tasks/transparent_api_proxy'; import type { ReturnTypeFromChainable } from '../../types'; import { indexEndpointHeartbeats } from '../../tasks/index_endpoint_heartbeats'; -import { login, ROLE } from '../../tasks/login'; -// Failing: See https://github.com/elastic/kibana/issues/187083 -describe.skip( +describe( 'Metering', { tags: ['@serverless', '@skipInServerlessMKI'], @@ -39,7 +38,6 @@ describe.skip( let endpointData: ReturnTypeFromChainable | undefined; before(() => { - login(ROLE.system_indices_superuser); startTransparentApiProxy({ port: 3623 }); indexEndpointHeartbeats({ count: HEARTBEAT_COUNT, @@ -49,6 +47,10 @@ describe.skip( }); }); + beforeEach(() => { + login(ROLE.system_indices_superuser); + }); + after(() => { if (endpointData) { endpointData.cleanup(); From b79855d0e96c444b06537a98c371c3c808c4ceac Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 30 Sep 2024 14:38:06 +0100 Subject: [PATCH 012/107] [FTR][Ownership] Assign Ownership to canvas/logstash_lens ES Archives (#194412) ## Summary Modify code owner declarations for `x-pack/test/functional/es_archives/canvas/logstash_lens` in .github/CODEOWNERS ### For reviewers To verify this pr, you can use the `scripts/get_owners_for_file.js` script E.g: ``` node scripts/get_owners_for_file.js --file x-pack/test/functional/es_archives/canvas/logstash_lens # Or any other file ``` #### Notes All of these are a best guess effort. The more help from the dev teams, the more accurate this will be for reporting in the future. Contributes to: https://github.com/elastic/kibana/issues/192979 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7f8f48e638148..0988c59ab7d23 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1239,6 +1239,7 @@ x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant /x-pack/test/functional/apps/canvas/ @elastic/kibana-presentation /x-pack/test_serverless/functional/test_suites/search/dashboards/ @elastic/kibana-presentation /test/plugin_functional/test_suites/panel_actions @elastic/kibana-presentation +/x-pack/test/functional/es_archives/canvas/logstash_lens @elastic/kibana-presentation #CC# /src/plugins/kibana_react/public/code_editor/ @elastic/kibana-presentation # Machine Learning From 396931f5056600e633dba64dab81a66096d05f72 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Mon, 30 Sep 2024 17:11:00 +0300 Subject: [PATCH 013/107] [ResponseOps][Alerts] Fix authorization issues with `discover` as consumers (#192321) ## Summary Alerts use its own RBAC model. The RBAC relies on a property called `consumer`. The consumer is tight coupled with the feature ID. It denotes the user's access to the rule and the alerts. For example, a user with access to the "Logs" feature has access only to alerts and rules with the `consumer` set as `logs`. Users can create an ES Query rule from Discover. When the feature was [implemented](https://github.com/elastic/kibana/pull/124534) (v8.3.0) the consumer was set to `discover`. Then it [changed](https://github.com/elastic/kibana/pull/166032) (v8.11.0) to `stackAlerts` (visible only on the stack management page) and then [to](https://github.com/elastic/kibana/pull/171364) (v8.12.0) `alerts` so it can be visible in Observability. Users who created rules that generated alerts with the `discover` consumer cannot see the alerts generated by the rule when they upgrade Kibana to 8.11+ even as superusers. This PR fixes the issues around the `discover` consumer. I added the following alert document to the `data.json.gz` to test for alerts with `discover` consumer. ``` { "type": "doc", "value": { "id": "1b75bfe9-d2f5-47e9-bac6-b082dd9c9e97", "index": ".internal.alerts-stack.alerts-default-000001", "source": { "@timestamp": "2021-10-19T14:00:38.749Z", "event.action": "active", "event.kind": "signal", "kibana.alert.duration.us": 1370302000, "kibana.alert.evaluation.threshold": -1, "kibana.alert.evaluation.value": 80, "kibana.alert.instance.id": "query matched", "kibana.alert.reason": "Document count is 80 in the last 100d in .kibana_alerting_cases index. Alert when greater than -1.", "kibana.alert.rule.category": "Elasticsearch query", "kibana.alert.rule.consumer": "discover", "kibana.alert.rule.name": "EsQuery discover", "kibana.alert.rule.producer": "stackAlerts", "kibana.alert.rule.rule_type_id": ".es-query", "kibana.alert.rule.uuid": "25c14920-faa7-4a9a-830c-ce32c8211237", "kibana.alert.start": "2021-10-19T15:00:41.555Z", "kibana.alert.status": "active", "kibana.alert.time_range": { "gte": "2021-10-19T15:00:41.555Z" }, "kibana.alert.uuid": "23237979-75bf-4b68-a210-ce5056b93356", "kibana.alert.workflow_status": "open", "kibana.space_ids": [ "default" ], "kibana.version": "8.0.0", "tags": [] } } } ``` ## Testing 1. Create a rule with the consumer as `discover`. See https://github.com/elastic/kibana/issues/184595 for instructions. 2. Go to the rule details page. 3. Verify that you do not get any error toaster and you can see the alerts. Fixes: https://github.com/elastic/kibana/issues/184595 ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ## Release notes Fix an issue with rules not being accessible created from Discover before 8.11.0. --------- Co-authored-by: Elastic Machine --- .../alerting_authorization.test.ts | 90 +++++++++--------- .../authorization/alerting_authorization.ts | 28 +++++- .../alerts_table/cells/render_cell_value.tsx | 2 +- .../observability/alerts/data.json.gz | Bin 4223 -> 4610 bytes .../common/lib/authentication/roles.ts | 18 ++++ .../common/lib/authentication/users.ts | 8 ++ .../tests/basic/search_strategy.ts | 81 ++++++++++++++++ 7 files changed, 180 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts index 569fff83eaefe..f1cfb99a6daaa 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { fromKueryExpression } from '@kbn/es-query'; +import { KueryNode, fromKueryExpression, toKqlExpression } from '@kbn/es-query'; import { KibanaRequest } from '@kbn/core/server'; import { ruleTypeRegistryMock } from '../rule_type_registry.mock'; import { securityMock } from '@kbn/security-plugin/server/mocks'; @@ -910,20 +910,19 @@ describe('AlertingAuthorization', () => { getSpaceId, }); ruleTypeRegistry.list.mockReturnValue(setOfAlertTypes); - expect( - ( - await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { - type: AlertingAuthorizationFilterType.KQL, - fieldNames: { - ruleTypeId: 'path.to.rule_type_id', - consumer: 'consumer-field', - }, - }) - ).filter - ).toEqual( - fromKueryExpression( - `((path.to.rule_type_id:myAppAlertType and consumer-field:(alerts or myApp or myOtherApp or myAppWithSubFeature)) or (path.to.rule_type_id:mySecondAppAlertType and consumer-field:(alerts or myApp or myOtherApp or myAppWithSubFeature)) or (path.to.rule_type_id:myOtherAppAlertType and consumer-field:(alerts or myApp or myOtherApp or myAppWithSubFeature)))` - ) + + const filter = ( + await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { + type: AlertingAuthorizationFilterType.KQL, + fieldNames: { + ruleTypeId: 'path.to.rule_type_id', + consumer: 'consumer-field', + }, + }) + ).filter; + + expect(toKqlExpression(filter as KueryNode)).toMatchInlineSnapshot( + `"((path.to.rule_type_id: myAppAlertType AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: myApp OR consumer-field: myOtherApp OR consumer-field: myAppWithSubFeature)) OR (path.to.rule_type_id: mySecondAppAlertType AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: myApp OR consumer-field: myOtherApp OR consumer-field: myAppWithSubFeature)) OR (path.to.rule_type_id: myOtherAppAlertType AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: myApp OR consumer-field: myOtherApp OR consumer-field: myAppWithSubFeature)))"` ); }); test('throws if user has no privileges to any rule type', async () => { @@ -1274,6 +1273,10 @@ describe('AlertingAuthorization', () => { "all": true, "read": true, }, + "discover": Object { + "all": true, + "read": true, + }, "myApp": Object { "all": true, "read": true, @@ -1311,6 +1314,10 @@ describe('AlertingAuthorization', () => { "all": true, "read": true, }, + "discover": Object { + "all": true, + "read": true, + }, "myApp": Object { "all": true, "read": true, @@ -2251,20 +2258,18 @@ describe('AlertingAuthorization', () => { }); }); test('creates a filter based on the privileged types', async () => { - expect( - ( - await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { - type: AlertingAuthorizationFilterType.KQL, - fieldNames: { - ruleTypeId: 'path.to.rule_type_id', - consumer: 'consumer-field', - }, - }) - ).filter - ).toEqual( - fromKueryExpression( - `path.to.rule_type_id:.esQuery and consumer-field:(alerts or stackAlerts or discover)` - ) + const filter = ( + await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { + type: AlertingAuthorizationFilterType.KQL, + fieldNames: { + ruleTypeId: 'path.to.rule_type_id', + consumer: 'consumer-field', + }, + }) + ).filter; + + expect(toKqlExpression(filter as KueryNode)).toMatchInlineSnapshot( + `"(path.to.rule_type_id: .esQuery AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: stackAlerts))"` ); }); }); @@ -2557,21 +2562,20 @@ describe('AlertingAuthorization', () => { expect(ruleTypeRegistry.get).toHaveBeenCalledTimes(1); }); }); + test('creates a filter based on the privileged types', async () => { - expect( - ( - await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { - type: AlertingAuthorizationFilterType.KQL, - fieldNames: { - ruleTypeId: 'path.to.rule_type_id', - consumer: 'consumer-field', - }, - }) - ).filter - ).toEqual( - fromKueryExpression( - `(path.to.rule_type_id:.esQuery and consumer-field:(alerts or stackAlerts or logs or discover)) or (path.to.rule_type_id:.logs-threshold-o11y and consumer-field:(alerts or stackAlerts or logs or discover)) or (path.to.rule_type_id:.threshold-rule-o11y and consumer-field:(alerts or stackAlerts or logs or discover))` - ) + const filter = ( + await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { + type: AlertingAuthorizationFilterType.KQL, + fieldNames: { + ruleTypeId: 'path.to.rule_type_id', + consumer: 'consumer-field', + }, + }) + ).filter; + + expect(toKqlExpression(filter as KueryNode)).toMatchInlineSnapshot( + `"((path.to.rule_type_id: .esQuery AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: stackAlerts OR consumer-field: logs)) OR (path.to.rule_type_id: .logs-threshold-o11y AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: stackAlerts OR consumer-field: logs)) OR (path.to.rule_type_id: .threshold-rule-o11y AND (consumer-field: alerts OR consumer-field: discover OR consumer-field: stackAlerts OR consumer-field: logs)))"` ); }); }); diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts index 0fb53c1eab0a1..6b24f2f5de9a4 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts @@ -13,6 +13,7 @@ import { KueryNode } from '@kbn/es-query'; import { SecurityPluginSetup } from '@kbn/security-plugin/server'; import { FeaturesPluginStart } from '@kbn/features-plugin/server'; import { Space } from '@kbn/spaces-plugin/server'; +import { STACK_ALERTS_FEATURE_ID } from '@kbn/rule-data-utils'; import { RegistryRuleType } from '../rule_type_registry'; import { ALERTING_FEATURE_ID, RuleTypeRegistry } from '../types'; import { @@ -88,6 +89,8 @@ export interface ConstructorOptions { authorization?: SecurityPluginSetup['authz']; } +const DISCOVER_FEATURE_ID = 'discover'; + export class AlertingAuthorization { private readonly ruleTypeRegistry: RuleTypeRegistry; private readonly request: KibanaRequest; @@ -135,7 +138,7 @@ export class AlertingAuthorization { this.allPossibleConsumers = this.featuresIds.then((featuresIds) => { return featuresIds.size - ? asAuthorizedConsumers([ALERTING_FEATURE_ID, ...featuresIds], { + ? asAuthorizedConsumers([ALERTING_FEATURE_ID, DISCOVER_FEATURE_ID, ...featuresIds], { read: true, all: true, }) @@ -328,7 +331,22 @@ export class AlertingAuthorization { hasAllRequested: boolean; authorizedRuleTypes: Set; }> { - const fIds = featuresIds ?? (await this.featuresIds); + const fIds = new Set(featuresIds ?? (await this.featuresIds)); + + /** + * Temporary hack to fix issues with the discover consumer. + * Issue: https://github.com/elastic/kibana/issues/184595. + * PR https://github.com/elastic/kibana/pull/183756 will + * remove the hack and fix it in a generic way. + * + * The discover consumer should be authorized + * as the stackAlerts consumer. + */ + if (fIds.has(DISCOVER_FEATURE_ID)) { + fIds.delete(DISCOVER_FEATURE_ID); + fIds.add(STACK_ALERTS_FEATURE_ID); + } + if (this.authorization && this.shouldCheckAuthorization()) { const checkPrivileges = this.authorization.checkPrivilegesDynamicallyWithRequest( this.request @@ -347,11 +365,15 @@ export class AlertingAuthorization { >(); const allPossibleConsumers = await this.allPossibleConsumers; const addLegacyConsumerPrivileges = (legacyConsumer: string) => - legacyConsumer === ALERTING_FEATURE_ID || isEmpty(featuresIds); + legacyConsumer === ALERTING_FEATURE_ID || + legacyConsumer === DISCOVER_FEATURE_ID || + isEmpty(featuresIds); + for (const feature of fIds) { const featureDef = this.features .getKibanaFeatures() .find((kFeature) => kFeature.id === feature); + for (const ruleTypeId of featureDef?.alerting ?? []) { const ruleTypeAuth = ruleTypesWithAuthorization.find((rtwa) => rtwa.id === ruleTypeId); if (ruleTypeAuth) { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/cells/render_cell_value.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/cells/render_cell_value.tsx index 2d76d4cd19aba..ad82a9d3ee97c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/cells/render_cell_value.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/cells/render_cell_value.tsx @@ -138,7 +138,7 @@ export function getAlertFormatters(fieldFormats: FieldFormatsRegistry) { const producer = rowData?.find(({ field }) => field === ALERT_RULE_PRODUCER)?.value?.[0]; const consumer: AlertConsumers = observabilityFeatureIds.includes(producer) ? 'observability' - : producer && (value === 'alerts' || value === 'stackAlerts') + : producer && (value === 'alerts' || value === 'stackAlerts' || value === 'discover') ? producer : value; const consumerData = alertProducersData[consumer]; diff --git a/x-pack/test/functional/es_archives/observability/alerts/data.json.gz b/x-pack/test/functional/es_archives/observability/alerts/data.json.gz index 72d24a0b36668d9c5aeda8be16e998f8cd4730b6..4017aaab1bddf1ca9ba2582b819b813dfdc42e2d 100644 GIT binary patch literal 4610 zcmV+d68-HTiwFpgcHL$G17u-zVJ>QOZ*BnXom+1sxs}J?=Tis`1ejTb72Yp;2r|gd z0s(e_?C#_x>A>LCR@#;vUEJvm`n&I8$!^(Jm0awW%932uJq=r8@vvCr|HnffvVQ$; zG5R+Y9FA>iFk%x>H zv(?;hiUObfVL7>pi>1A}&G}PI2_hH~^9vDUipNY>ikrXQUk~ZyU7Ri}>z9++G+&W_ zx{J@h{{SV<-!3MXP}t44A12OD?YfLrSj}zDrdll^Eg?n`!=bdzsbj9ib^7JiJT9(g z*V%-4G4(_3Gh8XEw2{ULg*6ep`O?W0s$=S7wSG>yPM32#U99i>I~SluVC{H&!q=Fu+Jb^2d+avj6y zk=4a08yrm*qf1BzO<=UVveS{M@NY)n`_+67l|HI(G^b(YH$RNhY(8ozV4LyPb*wz( zd^wwcYA(aN2%Ea!l@XM9bra`x{nhPpSL&&~sr$>1fBt!NZ}yi*X8$*v{eCu$KkUln zc0LO$e{b^kW>?bu&qeN}7cV{GUAe4Q>#GGNE)a_m!!aO2qDMv(=+?pqoUD(|w$&B1 zv-xtn+hIKBq!L2>wf(wf-DkFX-;-pyXTxnwFCTY!NOZZ3JB{9_{M?-D!+jU%*Yhks z&gLJ|_3Y!t=0;|>ak`ayaSPQ44=Jbk+ot^Y()Li!zdyh1F3uPC>ZB`N;Z45KNPJu@ zX7j3+shr}`gWsgfnmPdmh|{|X^qZUev@dn%hsz!s^v>?Lw3qdLZHoV>DAfZ)9?Qx4 zhChFo|Ns2mcfWRL4fk3>BPA#$Mi94HAZ;;6nz2ZOHCzilux6jE;g!LZF}NRLjN(jw zD{E%AF2Wb+_S5nTzVQ*R|8%idy{C=$P*4%~Ppx6qAK}qo z#_ifVHm)@F;^!=B>vi2QvX+al2Z*$cYpDqeOmM^nPsoZ8PzWg{j-@x64glFBKuAl* z<-qudy|Wh&4oQ!^Aov+CazO@K47At_EeZtbT)dAGN<8gr-5BxBUIwFHC+WZsgr|VG zp%iH)B0Q4-17RSzRC0jCULo<#l;|{t1un0h`zxpwH~SYf@L;Pjx0fKZAx^7*+}dkz zuPx|qtMKiSDtMUN8t8Ihx)dncxzOcn`}xt%d3hRD6gZ;DY4#_TK$cQy#fC)^eAFu0 zfku0z5vS0_7%_xv!z59Cq3L=Ct@3KNSdJOc;ot<~Yyi*zpaTP_K)lWjKyAJGXgL$K z=bBNAm^2P?W&*MW3~w4s;pla$vd? zNYIR(x6+2?+ zJj%9iB-@!b1L)CpE#12{qx(+q*m6UM-Mah>p}v|sE;1IPkcb5)5vSNAn~Xp_YV9yh z-b?e!+`&3~HbVEp9i=g$W!z~h-=4WcyHB(o33sR(xO1G`!E{VmKfiVfU(oYAXsM=28sjuHheG`OeSA{UiKSSl;6BT>ZH_IJSLCLCOD+yi$Am6#Oz zJ5A-=H+Q;E!yOBEz@68QXMRikq0w>} z8%RXCk1%3T7#SHDiY5dbw33MxujpLQE*EASGoQr8==+=5Jgz~a#1EqzyYyG^YXsq+hDp7sQ*|ZAe?z_p zB*ik%EO!J$Zi6Lc*tFRSI?O8f=&D9v7f2W#nDQb+g32`{G)@7Lz(M-7;aaB7kkAh^ zPNou^_6LbJyN!@|+UC1KqCjen#yRhv;!)obE zs`sFzPcjE@Vz#;+xld(7?_L$wc>{lBJq%C#S$0rkVJc~QUA=x}w3}uYsK*&;rr;R< zP=lnbx7%xQCmi@-iWx1Pw*>0oZE2W=yA`*+h>h`&JZc>iwv{$1WK_x{~)-@o(o3Dn)h!l!?O zMC(ReC-Jwdb&Ap1><{s`Lf|4sg#^C$Pe{$)B@))(EZb6PEy zvzwnEOn|xNLwVL;)u|?-{-nMQwEi4D6brsilX$&OQU7W$;qhPA&3Jv;-R1jtpFigU zt^3-a)`{;QEqvD%Ka**i+r@Ie^2^nHXOzQp5Is?X>dW)0I&pO)%pxYn_ck6EV`9dX zRZ_PuuO2EyeB17*C1m1}pmf7mfsmgOzQ9lO$(sOhp#bfK2{KkwBz!VfQEI6f@bxI-V!1xlZ;syBHRiXi31HJ})y&k>_g#3)~WjRYYD2IfO8gc6)vRY$AH8|j&QN?ue zMEon^>uHsLHN0M%TAqd0UcE1;OH{OgTDwX#P-~#psZi_1-g+QvHQ3!7wF>n6jHpF1 zk3I&Aq!$rf&6JS!o*>Ty2Y1tHgWVBO3x+GgR2uiM2`t9vK&k#k3Xgo`Y(=WbNtKH}LS!?SdS4|!$^p)$#`x4b6DYZgH>->I? zIAFSxyl*LOu-hi3kJ@%ODJ>9{bCOaDcqLKg*ELwg39#15ppj69F=d$#p*WiRFjBhZ zaUO2VrZ9X*Xkv?!?)Hd}(-V-gX!&LE1O`vw96SM{;BTdv>Kk9%c6Z?GK~Os4tGke& z5xxWl$A?mnV0=Rn_Y|N_l|)ig8-%6Y==kdR;$uN`Y`ws{VoCRfFUc_0CG=`8-YEnR z&`J)$0|UL@6uqFgk};;xTU(E%I@Ea!+jg7j^+Zs*(W^km&xl^haId1GC@_r?kJ2FR z7$}u&&X*~g#%eC#2?P&tQG~A{cwoTSfUkb=wGotV z_$mp5 z*x-E)_WacS}7HU_-ZKM33y)u7X`r$-q(Pyv%r_APeR50hHf|7ZN=9{P`cr( zK*-MsUx_7cq|MEOc*LFN$eLhK@Rp|(qUGlGClAFK^ZNZ(vX7-Nq75cH4pC`5Y`dX+ zClI*-_)B%iM(M8DowqupkFJrR_SlZV}f{EYDBsq_{@V+fYihvz!v zf-uN34b@3x)T#JA5hsqX9Jx{Cd>w{feJp*kiVV)zK(Dt(FIK<)NcJ5z-(Yud^eWKt zGoqIx-lUWi5+*WmG*v)aVTF_o3Y#RkFyt8MrRrBgl3i!|?sM*t6$KtPm+usuFIu$p zH8@`bzRm()V$69ZRNrCq4R%}cwGotV_$m`vJyaT@aea-G3;^(bNEF^=B7YT7i7}CTuU^#Y4 zC7~lOek<4^yfB(KPDtE~7pAq*rqBy(DBmeeBI2U6V~0t^0b{3+F<^uq3syn(})E^eujRSa2!kTJ)$@o#Dj3iTCR`?;EbdoBD9oaz*s}WJLo>< z!dS!?JH~PPVNwr~^aIA;9>!Sxx_8_fdUYs_ZQE_d*hWygVXQ#N&k$q8dK0Y`NKqva zmo6fWtwxkdDlAWqiPv8hYuN z@(vg~m7oqGMa-Lb5%E4C9z{f!=Uv>II1{-i;Rs?9o0nk^dK^b7zFt};K2Cf|I;@5b z_n`MHgfFeBfmUHq;1cfDd5bL830a4=3!XaVj^a2D zJf@}+ypOYdB`rJ)vAKAs5K&+D9^fIOexTP`(CY+35;uaKC2=38$}%D_D-7yxD&HwM0(dwSeQ*Tcm?O~P7_vhJb#L2k#n(nqI!SDT5JBOh8r@Ot3L7BpA*Dk_bbL;e*o;MyL@?!FbD%UMJKU3I$uHyXD=*BMn zRcnvgsO^8wJSZ5brk|~*wa{ujnoL2Q;^-P=W<)R!`Gabm!9|_HWO{kw?IPw033!~< z=*Rr&=;KwKJ{4+2s;4%`u?=|pSps&T=Q6V>(=?> ziz5GAbE~*OFW$?Sftc`w8;Vh~Rv~VUg)tcR$VW!KrUd)~Rj9JKUiuUr_HRG$3Ev>G s8>1ZupbT!zD1)+$Anv3_mO^$u3JgO~!(bqK8UxV(2U;<`jvWF40CwK;1poj5 literal 4223 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 V6Ve`%GWrNF{|_Dp+$ZP!004?fEG7T| diff --git a/x-pack/test/rule_registry/common/lib/authentication/roles.ts b/x-pack/test/rule_registry/common/lib/authentication/roles.ts index 89878a10cc6d0..df887ea463e29 100644 --- a/x-pack/test/rule_registry/common/lib/authentication/roles.ts +++ b/x-pack/test/rule_registry/common/lib/authentication/roles.ts @@ -265,6 +265,23 @@ export const logsOnlyAllSpacesAll: Role = { }, }; +export const stackAlertsOnlyAllSpacesAll: Role = { + name: 'stack_alerts_only_all_spaces_all', + privileges: { + elasticsearch: { + indices: [], + }, + kibana: [ + { + feature: { + stackAlerts: ['all'], + }, + spaces: ['*'], + }, + ], + }, +}; + /** * This role exists to test that the alert search strategy allows * users who do not have access to security solutions the ability @@ -494,6 +511,7 @@ export const allRoles = [ securitySolutionOnlyReadSpacesAll, observabilityOnlyAllSpacesAll, logsOnlyAllSpacesAll, + stackAlertsOnlyAllSpacesAll, observabilityOnlyReadSpacesAll, observabilityOnlyAllSpacesAllWithReadESIndices, observabilityMinReadAlertsRead, diff --git a/x-pack/test/rule_registry/common/lib/authentication/users.ts b/x-pack/test/rule_registry/common/lib/authentication/users.ts index 2a63c296d842a..3d418ab9e779d 100644 --- a/x-pack/test/rule_registry/common/lib/authentication/users.ts +++ b/x-pack/test/rule_registry/common/lib/authentication/users.ts @@ -30,6 +30,7 @@ import { observabilityMinReadAlertsAllSpacesAll, observabilityOnlyAllSpacesAllWithReadESIndices, securitySolutionOnlyAllSpacesAllWithReadESIndices, + stackAlertsOnlyAllSpacesAll, } from './roles'; import { User } from './types'; @@ -176,6 +177,12 @@ export const logsOnlySpacesAll: User = { roles: [logsOnlyAllSpacesAll.name], }; +export const stackAlertsOnlySpacesAll: User = { + username: 'stack_alerts_only_all_spaces_all', + password: 'stack_alerts_only_all_spaces_all', + roles: [stackAlertsOnlyAllSpacesAll.name], +}; + export const obsOnlySpacesAllEsRead: User = { username: 'obs_only_all_spaces_all_es_read', password: 'obs_only_all_spaces_all_es_read', @@ -290,6 +297,7 @@ export const allUsers = [ secOnlyReadSpacesAll, obsOnlySpacesAll, logsOnlySpacesAll, + stackAlertsOnlySpacesAll, obsSecSpacesAll, obsSecReadSpacesAll, obsMinReadAlertsRead, diff --git a/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts b/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts index cbdd9d2301294..2fe2567f5e523 100644 --- a/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts +++ b/x-pack/test/rule_registry/security_and_spaces/tests/basic/search_strategy.ts @@ -13,6 +13,8 @@ import { obsOnlySpacesAll, logsOnlySpacesAll, secOnlySpacesAllEsReadAll, + stackAlertsOnlySpacesAll, + superUser, } from '../../../common/lib/authentication/users'; type RuleRegistrySearchResponseWithErrors = RuleRegistrySearchResponse & { @@ -346,6 +348,85 @@ export default ({ getService }: FtrProviderContext) => { }); }); + describe('discover', () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/observability/alerts'); + }); + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); + }); + + it('should return alerts from .es-query rule type with consumer discover with access only to stack rules', async () => { + const result = await secureBsearch.send({ + supertestWithoutAuth, + auth: { + username: stackAlertsOnlySpacesAll.username, + password: stackAlertsOnlySpacesAll.password, + }, + referer: 'test', + kibanaVersion, + internalOrigin: 'Kibana', + options: { + featureIds: ['discover'], + }, + strategy: 'privateRuleRegistryAlertsSearchStrategy', + }); + + expect(result.rawResponse.hits.total).to.eql(1); + + const consumers = result.rawResponse.hits.hits.map((hit) => { + return hit.fields?.['kibana.alert.rule.consumer']; + }); + + expect(consumers.every((consumer) => consumer === 'discover')); + }); + + it('should return alerts from .es-query rule type with consumer discover as superuser', async () => { + const result = await secureBsearch.send({ + supertestWithoutAuth, + auth: { + username: superUser.username, + password: superUser.password, + }, + referer: 'test', + kibanaVersion, + internalOrigin: 'Kibana', + options: { + featureIds: ['discover'], + }, + strategy: 'privateRuleRegistryAlertsSearchStrategy', + }); + + expect(result.rawResponse.hits.total).to.eql(1); + + const consumers = result.rawResponse.hits.hits.map((hit) => { + return hit.fields?.['kibana.alert.rule.consumer']; + }); + + expect(consumers.every((consumer) => consumer === 'discover')); + }); + + it('should not return alerts from .es-query rule type with consumer discover without access to stack rules', async () => { + const result = await secureBsearch.send({ + supertestWithoutAuth, + auth: { + username: logsOnlySpacesAll.username, + password: logsOnlySpacesAll.password, + }, + referer: 'test', + kibanaVersion, + internalOrigin: 'Kibana', + options: { + featureIds: ['discover'], + }, + strategy: 'privateRuleRegistryAlertsSearchStrategy', + }); + + expect(result.statusCode).to.be(500); + expect(result.message).to.be('Unauthorized to find alerts for any rule types'); + }); + }); + describe('empty response', () => { it('should return an empty response', async () => { const result = await secureBsearch.send({ From 0dada14ac580088b24a084d1d1b61b08a7055ebb Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 30 Sep 2024 09:20:16 -0500 Subject: [PATCH 014/107] [cloud deploy] Fix deployment config (#194076) Followup to https://github.com/elastic/kibana/pull/193101 Fixes https://buildkite.com/elastic/kibana-pull-request/builds/237163#01922ad1-38ef-48e6-a0bd-d3f051c4bb0f/537-542 --- .buildkite/scripts/steps/artifacts/cloud.sh | 1 - .buildkite/scripts/steps/cloud/build_and_deploy.sh | 1 - 2 files changed, 2 deletions(-) diff --git a/.buildkite/scripts/steps/artifacts/cloud.sh b/.buildkite/scripts/steps/artifacts/cloud.sh index bc28ceabd1c04..a7a556598ce42 100644 --- a/.buildkite/scripts/steps/artifacts/cloud.sh +++ b/.buildkite/scripts/steps/artifacts/cloud.sh @@ -42,7 +42,6 @@ jq ' .resources.kibana[0].plan.kibana.docker_image = "'$KIBANA_TEST_IMAGE'" | .resources.kibana[0].plan.kibana.version = "'$FULL_VERSION'" | .resources.elasticsearch[0].plan.elasticsearch.version = "'$FULL_VERSION'" | - .resources.enterprise_search[0].plan.enterprise_search.version = "'$FULL_VERSION'" | .resources.integrations_server[0].plan.integrations_server.version = "'$FULL_VERSION'" ' .buildkite/scripts/steps/cloud/deploy.json > "$DEPLOYMENT_SPEC" diff --git a/.buildkite/scripts/steps/cloud/build_and_deploy.sh b/.buildkite/scripts/steps/cloud/build_and_deploy.sh index 6615d0ec4cdd4..25e7d8fc631c9 100755 --- a/.buildkite/scripts/steps/cloud/build_and_deploy.sh +++ b/.buildkite/scripts/steps/cloud/build_and_deploy.sh @@ -68,7 +68,6 @@ if [ -z "${CLOUD_DEPLOYMENT_ID}" ] || [ "${CLOUD_DEPLOYMENT_ID}" = 'null' ]; the .name = "'$CLOUD_DEPLOYMENT_NAME'" | .resources.kibana[0].plan.kibana.version = "'$VERSION'" | .resources.elasticsearch[0].plan.elasticsearch.version = "'$VERSION'" | - .resources.enterprise_search[0].plan.enterprise_search.version = "'$VERSION'" | .resources.integrations_server[0].plan.integrations_server.version = "'$VERSION'" ' .buildkite/scripts/steps/cloud/deploy.json > /tmp/deploy.json From 9f9d911dbacc45729fd6e93bad0e08a761eb8823 Mon Sep 17 00:00:00 2001 From: Irene Blanco Date: Mon, 30 Sep 2024 16:38:45 +0200 Subject: [PATCH 015/107] [Inventory] Promote new inventory plugin in APM (#193997) ## Summary Closes https://github.com/elastic/kibana/issues/192856. This PR removes the ability to enable the new APM experience and replaces it with a link promoting the new Inventory feature. ![Screen Recording 2024-09-25 at 15 02 29](https://github.com/user-attachments/assets/5dc6b8af-f207-43e5-8125-fffb4b823e4d) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../custom_no_data_page.cy.ts | 40 ---- .../app/service_inventory/index.tsx | 34 +-- .../entities_inventory_callout.tsx | 59 +++++ .../index.tsx} | 119 +++++------ .../templates/custom_no_data_template.tsx | 124 ----------- .../templates/service_group_template.tsx | 8 - .../shared/entity_enablement/index.tsx | 202 ------------------ .../entity_manager_context.tsx | 7 +- .../observability_solution/apm/tsconfig.json | 5 +- .../inventory/public/types.ts | 3 +- .../observability_shared/common/index.ts | 3 + .../entity_inventory_locator.ts | 24 +++ .../common/locators/index.ts | 1 + .../observability_shared/public/plugin.ts | 4 + 14 files changed, 151 insertions(+), 482 deletions(-) delete mode 100644 x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/custom_no_data_page/custom_no_data_page.cy.ts create mode 100644 x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/entities_inventory_callout.tsx rename x-pack/plugins/observability_solution/apm/public/components/routing/templates/{apm_main_template.tsx => apm_main_template/index.tsx} (63%) delete mode 100644 x-pack/plugins/observability_solution/apm/public/components/routing/templates/custom_no_data_template.tsx delete mode 100644 x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx create mode 100644 x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/custom_no_data_page/custom_no_data_page.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/custom_no_data_page/custom_no_data_page.cy.ts deleted file mode 100644 index a246a2ccb7c34..0000000000000 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/custom_no_data_page/custom_no_data_page.cy.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -describe('Custom no data page', () => { - beforeEach(() => { - cy.loginAsEditorUser(); - }); - - before(() => { - // make sure entity centric experience is disabled - cy.updateAdvancedSettings({ - 'observability:entityCentricExperience': false, - }); - }); - - after(() => { - cy.updateAdvancedSettings({ - 'observability:entityCentricExperience': false, - }); - }); - - it('shows the default no data screen when entity centric experience is disabled ', () => { - cy.visitKibana('/app/apm'); - cy.contains('Welcome to Elastic Observability!'); - }); - - it('shows the custom no data screen when entity centric experience is enabled', () => { - cy.updateAdvancedSettings({ - 'observability:entityCentricExperience': true, - }); - cy.visitKibana('/app/apm'); - cy.contains('Welcome to Elastic Observability!').should('not.exist'); - cy.contains('Detect and resolve problems with your application'); - cy.contains('Try collecting services from logs'); - }); -}); diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/index.tsx index e30c79eb483f7..55f72d21f48d7 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/index.tsx @@ -5,40 +5,8 @@ * 2.0. */ import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiEmptyPrompt, EuiLoadingLogo } from '@elastic/eui'; -import { isEmpty } from 'lodash'; import { ApmServiceInventory } from './apm_signal_inventory'; -import { MultiSignalInventory } from './multi_signal_inventory'; -import { useApmParams } from '../../../hooks/use_apm_params'; -import { useEntityManagerEnablementContext } from '../../../context/entity_manager_context/use_entity_manager_enablement_context'; export function ServiceInventory() { - const { isEnablementPending, isEntityCentricExperienceViewEnabled } = - useEntityManagerEnablementContext(); - - const { - query: { serviceGroup }, - } = useApmParams('/services'); - - if (isEnablementPending) { - return ( - } - title={ -

- {i18n.translate('xpack.apm.loadingService', { - defaultMessage: 'Loading services', - })} -

- } - /> - ); - } - - return isEntityCentricExperienceViewEnabled && isEmpty(serviceGroup) ? ( - - ) : ( - - ); + return ; } diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/entities_inventory_callout.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/entities_inventory_callout.tsx new file mode 100644 index 0000000000000..16cc93e2827f2 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/entities_inventory_callout.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiToolTip, EuiButtonIcon } from '@elastic/eui'; +import { TechnicalPreviewBadge } from '@kbn/observability-shared-plugin/public'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { ApmPluginStartDeps } from '../../../../plugin'; + +interface EntitiesInventoryCalloutProps { + onDissmiss: () => void; +} + +export function EntitiesInventoryCallout({ onDissmiss }: EntitiesInventoryCalloutProps) { + const { services } = useKibana(); + const { observabilityShared } = services; + + const entitiesInventoryLocator = observabilityShared.locators.entitiesInventory; + + return ( + + + + + + + + + + + + } + > + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/index.tsx similarity index 63% rename from x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx rename to x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/index.tsx index fca4f3809edb5..8633e206599b6 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template/index.tsx @@ -11,24 +11,22 @@ import { entityCentricExperience } from '@kbn/observability-plugin/common'; import { ObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; import type { KibanaPageTemplateProps } from '@kbn/shared-ux-page-kibana-template'; import React, { useContext } from 'react'; -import { i18n } from '@kbn/i18n'; import { useLocation } from 'react-router-dom'; import { FeatureFeedbackButton } from '@kbn/observability-shared-plugin/public'; -import { useEntityManagerEnablementContext } from '../../../context/entity_manager_context/use_entity_manager_enablement_context'; -import { useDefaultAiAssistantStarterPromptsForAPM } from '../../../hooks/use_default_ai_assistant_starter_prompts_for_apm'; -import { KibanaEnvironmentContext } from '../../../context/kibana_environment_context/kibana_environment_context'; -import { getPathForFeedback } from '../../../utils/get_path_for_feedback'; -import { EnvironmentsContextProvider } from '../../../context/environments_context/environments_context'; -import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; -import { ApmPluginStartDeps } from '../../../plugin'; -import { ServiceGroupSaveButton } from '../../app/service_groups'; -import { ServiceGroupsButtonGroup } from '../../app/service_groups/service_groups_button_group'; -import { ApmEnvironmentFilter } from '../../shared/environment_filter'; -import { getNoDataConfig } from './no_data_config'; -import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; -import { EntityEnablement } from '../../shared/entity_enablement'; -import { CustomNoDataTemplate } from './custom_no_data_template'; -import { ServiceInventoryView } from '../../../context/entity_manager_context/entity_manager_context'; +import { useLocalStorage } from '../../../../hooks/use_local_storage'; +import { useEntityManagerEnablementContext } from '../../../../context/entity_manager_context/use_entity_manager_enablement_context'; +import { useDefaultAiAssistantStarterPromptsForAPM } from '../../../../hooks/use_default_ai_assistant_starter_prompts_for_apm'; +import { KibanaEnvironmentContext } from '../../../../context/kibana_environment_context/kibana_environment_context'; +import { getPathForFeedback } from '../../../../utils/get_path_for_feedback'; +import { EnvironmentsContextProvider } from '../../../../context/environments_context/environments_context'; +import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; +import { ApmPluginStartDeps } from '../../../../plugin'; +import { ServiceGroupSaveButton } from '../../../app/service_groups'; +import { ServiceGroupsButtonGroup } from '../../../app/service_groups/service_groups_button_group'; +import { ApmEnvironmentFilter } from '../../../shared/environment_filter'; +import { getNoDataConfig } from '../no_data_config'; +import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; +import { EntitiesInventoryCallout } from './entities_inventory_callout'; // Paths that must skip the no data screen const bypassNoDataScreenPaths = ['/settings', '/diagnostics']; @@ -78,8 +76,8 @@ export function ApmMainTemplate({ entityCentricExperience, true ); - const { isEntityCentricExperienceViewEnabled, serviceInventoryViewLocalStorageSetting } = - useEntityManagerEnablementContext(); + + const { isEntityCentricExperienceViewEnabled } = useEntityManagerEnablementContext(); const ObservabilityPageTemplate = observabilityShared.navigation.PageTemplate; @@ -117,11 +115,6 @@ export function ApmMainTemplate({ const hasApmData = !!data?.hasData; const hasApmIntegrations = !!fleetApmPoliciesData?.hasApmPolicies; - const showCustomEmptyState = - !hasApmData && - !isLoading && - isEntityCentricExperienceSettingEnabled && - serviceInventoryViewLocalStorageSetting === ServiceInventoryView.classic; const noDataConfig = getNoDataConfig({ basePath, @@ -142,6 +135,7 @@ export function ApmMainTemplate({ const rightSideItems = [...(showServiceGroupSaveButton ? [] : [])]; const sanitizedPath = getPathForFeedback(window.location.pathname); + const pageHeaderTitle = ( {pageHeader?.pageTitle ?? pageTitle} @@ -168,47 +162,44 @@ export function ApmMainTemplate({ ); - const pageTemplate = showCustomEmptyState ? ( - - ) : ( - - {isEntityCentricExperienceSettingEnabled && - showEnablementCallout && - selectedNavButton === 'allServices' ? ( - - ) : null} - {showServiceGroupsNav && selectedNavButton && ( - - )} -
- ), - }} - {...pageTemplateProps} - > - {children} -
+ const [dismissedEntitiesInventoryCallout, setdismissedEntitiesInventoryCallout] = useLocalStorage( + `apm.dismissedEntitiesInventoryCallout`, + false ); - return {pageTemplate}; + const showEntitiesInventoryCallout = + !dismissedEntitiesInventoryCallout && + isEntityCentricExperienceSettingEnabled && + selectedNavButton !== undefined; + + return ( + + + {showEntitiesInventoryCallout ? ( + { + setdismissedEntitiesInventoryCallout(true); + }} + /> + ) : null} + {showServiceGroupsNav && selectedNavButton && ( + + )} + + ), + }} + {...pageTemplateProps} + > + {children} + + + ); } diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/custom_no_data_template.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/custom_no_data_template.tsx deleted file mode 100644 index d006e43c3971b..0000000000000 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/custom_no_data_template.tsx +++ /dev/null @@ -1,124 +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 { - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiTextColor, - EuiText, - EuiButton, - EuiPageTemplate, - EuiCard, - EuiImage, - EuiScreenReaderOnly, -} from '@elastic/eui'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { KibanaSolutionAvatar } from '@kbn/shared-ux-avatar-solution'; -import { NoDataConfig } from '@kbn/shared-ux-page-no-data-config-types'; -import { ApmPluginStartDeps } from '../../../plugin'; -import { EntityEnablement } from '../../shared/entity_enablement'; - -export function CustomNoDataTemplate({ - isPageDataLoaded, - noDataConfig, -}: { - isPageDataLoaded: boolean; - noDataConfig?: NoDataConfig; -}) { - const { services } = useKibana(); - const { http, observabilityShared } = services; - const basePath = http?.basePath.get(); - - const ObservabilityPageTemplate = observabilityShared.navigation.PageTemplate; - const imageUrl = `${basePath}/plugins/kibanaReact/assets/elastic_agent_card.svg`; - - return ( - - - - - - -

- {i18n.translate('xpack.apm.customEmtpyState.title', { - defaultMessage: 'Detect and resolve problems with your application', - })} -

- -

- {i18n.translate('xpack.apm.customEmtpyState.description', { - defaultMessage: - 'Start collecting data for your applications and services so you can detect and resolve problems faster.', - })} -

-
-
- - - - {i18n.translate('xpack.apm.customEmtpyState.title.reader', { - defaultMessage: 'Add APM data', - })} - - - } - description={i18n.translate('xpack.apm.customEmtpyState.card.description', { - defaultMessage: - 'Use APM agents to collect APM data. We make it easy with agents for many popular languages.', - })} - footer={ - - - - {noDataConfig?.action.elasticAgent.title} - - - -

- -

-
-
-
- } - image={ - - } - /> -
-
-
- ); -} diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx index 67695c6485006..d9fb2437be14c 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx @@ -20,8 +20,6 @@ import { useApmRouter } from '../../../hooks/use_apm_router'; import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; import { ApmMainTemplate } from './apm_main_template'; import { useBreadcrumb } from '../../../context/breadcrumbs/use_breadcrumb'; -import { TechnicalPreviewBadge } from '../../shared/technical_preview_badge'; -import { useEntityManagerEnablementContext } from '../../../context/entity_manager_context/use_entity_manager_enablement_context'; export function ServiceGroupTemplate({ pageTitle, @@ -165,7 +163,6 @@ type ServiceGroupContextTab = NonNullable[0] & { function useTabs(selectedTab: ServiceGroupContextTab['key']) { const router = useApmRouter(); const { query } = useAnyOfApmParams('/services', '/service-map'); - const { isEntityCentricExperienceViewEnabled } = useEntityManagerEnablementContext(); const tabs: ServiceGroupContextTab[] = [ { @@ -180,11 +177,6 @@ function useTabs(selectedTab: ServiceGroupContextTab['key']) { defaultMessage: 'Inventory', })} - - {isEntityCentricExperienceViewEnabled && ( - - )} - ), href: router.link('/services', { query }), diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx deleted file mode 100644 index 62f5cf708bcf7..0000000000000 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx +++ /dev/null @@ -1,202 +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, { useState } from 'react'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import useToggle from 'react-use/lib/useToggle'; -import { - EuiButtonIcon, - EuiFlexGroup, - EuiFlexItem, - EuiLink, - EuiLoadingSpinner, - EuiPopover, - EuiPopoverFooter, - EuiSkeletonText, - EuiText, - EuiTextColor, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import type { IHttpFetchError, ResponseErrorBody } from '@kbn/core/public'; -import { EntityManagerUnauthorizedError } from '@kbn/entityManager-plugin/public'; -import { TechnicalPreviewBadge } from '../technical_preview_badge'; -import { ApmPluginStartDeps } from '../../../plugin'; -import { useEntityManagerEnablementContext } from '../../../context/entity_manager_context/use_entity_manager_enablement_context'; -import { FeedbackModal } from './feedback_modal'; -import { ServiceInventoryView } from '../../../context/entity_manager_context/entity_manager_context'; -import { Unauthorized } from './unauthorized_modal'; -import { useLocalStorage } from '../../../hooks/use_local_storage'; - -export function EntityEnablement({ label, tooltip }: { label: string; tooltip?: string }) { - const [isFeedbackModalVisible, setsIsFeedbackModalVisible] = useLocalStorage( - 'apm.isFeedbackModalVisible', - undefined - ); - - const [isUnauthorizedModalVisible, setsIsUnauthorizedModalVisible] = useState(false); - - const { - services: { entityManager }, - notifications, - } = useKibana(); - - const { - isEntityManagerEnabled, - isEnablementPending, - refetch, - setServiceInventoryViewLocalStorageSetting, - isEntityCentricExperienceViewEnabled, - tourState, - updateTourState, - } = useEntityManagerEnablementContext(); - - const [isPopoverOpen, togglePopover] = useToggle(false); - const [isLoading, setIsLoading] = useToggle(false); - - const handleRestoreView = async () => { - setServiceInventoryViewLocalStorageSetting(ServiceInventoryView.classic); - if (isFeedbackModalVisible === undefined) { - setsIsFeedbackModalVisible(true); - } - }; - - const handleEnablement = async () => { - if (isEntityManagerEnabled) { - setServiceInventoryViewLocalStorageSetting(ServiceInventoryView.entity); - if (tourState.isModalVisible === undefined) { - updateTourState({ isModalVisible: true }); - } - return; - } - - setIsLoading(true); - try { - const response = await entityManager.entityClient.enableManagedEntityDiscovery(); - if (response.success) { - setIsLoading(false); - setServiceInventoryViewLocalStorageSetting(ServiceInventoryView.entity); - - if (tourState.isModalVisible === undefined) { - updateTourState({ isModalVisible: true }); - } - refetch(); - } else { - throw new Error(response.message); - } - } catch (error) { - setIsLoading(false); - - if (error instanceof EntityManagerUnauthorizedError) { - setsIsUnauthorizedModalVisible(true); - return; - } - - const err = error as Error | IHttpFetchError; - notifications.toasts.danger({ - title: i18n.translate('xpack.apm.eemEnablement.errorTitle', { - defaultMessage: 'Error while enabling the new experience', - }), - body: 'response' in err ? err.body?.message ?? err.response?.statusText : err.message, - }); - } - }; - - const handleOnCloseFeedback = () => { - setsIsFeedbackModalVisible(false); - }; - - return isEnablementPending ? ( - - - - ) : ( - - - {isLoading ? ( - - ) : ( - - )} - - - - {isEntityCentricExperienceViewEnabled - ? i18n.translate('xpack.apm.eemEnablement.enabled.', { - defaultMessage: 'Viewing our new experience', - }) - : label} - - - {tooltip && ( - - - } - isOpen={isPopoverOpen} - closePopover={togglePopover} - anchorPosition="downLeft" - > -
- -

- {i18n.translate('xpack.apm.entityEnablement.content', { - defaultMessage: - 'Our new experience combines both APM-instrumented services with services detected from logs in a single service inventory.', - })} -

-
-
- - - - {i18n.translate('xpack.apm.entityEnablement.footer', { - defaultMessage: 'Learn more', - })} - - - -
-
- )} - {isEntityCentricExperienceViewEnabled && ( - - - {i18n.translate('xpack.apm.eemEnablement.restoreClassicView.', { - defaultMessage: 'Restore classic view', - })} - - - )} - - setsIsUnauthorizedModalVisible(false)} - label={label} - /> -
- ); -} diff --git a/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx b/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx index 93205c907caa0..95a246ddce566 100644 --- a/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx +++ b/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx @@ -62,11 +62,6 @@ export function EntityManagerEnablementContextProvider({ true ); - const isEntityCentricExperienceViewEnabled = - isEntityManagerEnabled && - serviceInventoryViewLocalStorageSetting === ServiceInventoryView.entity && - isEntityCentricExperienceSettingEnabled; - function handleServiceInventoryViewChange(nextView: ServiceInventoryView) { setServiceInventoryViewLocalStorageSetting(nextView); // Updates the telemetry context variable every time the user switches views @@ -88,7 +83,7 @@ export function EntityManagerEnablementContextProvider({ refetch, serviceInventoryViewLocalStorageSetting, setServiceInventoryViewLocalStorageSetting: handleServiceInventoryViewChange, - isEntityCentricExperienceViewEnabled, + isEntityCentricExperienceViewEnabled: isEntityCentricExperienceSettingEnabled, tourState, updateTourState: handleTourStateUpdate, }} diff --git a/x-pack/plugins/observability_solution/apm/tsconfig.json b/x-pack/plugins/observability_solution/apm/tsconfig.json index 9195c2547a71a..6f3ff13a2af3e 100644 --- a/x-pack/plugins/observability_solution/apm/tsconfig.json +++ b/x-pack/plugins/observability_solution/apm/tsconfig.json @@ -120,10 +120,6 @@ "@kbn/test-jest-helpers", "@kbn/security-plugin-types-common", "@kbn/entityManager-plugin", - "@kbn/react-hooks", - "@kbn/shared-ux-avatar-solution", - "@kbn/shared-ux-page-no-data-config-types", - "@kbn/react-hooks", "@kbn/server-route-repository-utils", "@kbn/core-analytics-browser", "@kbn/apm-types", @@ -131,6 +127,7 @@ "@kbn/serverless", "@kbn/aiops-log-rate-analysis", "@kbn/router-utils", + "@kbn/react-hooks", ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_solution/inventory/public/types.ts b/x-pack/plugins/observability_solution/inventory/public/types.ts index ed4a500edca68..2393b1b55e2b6 100644 --- a/x-pack/plugins/observability_solution/inventory/public/types.ts +++ b/x-pack/plugins/observability_solution/inventory/public/types.ts @@ -13,10 +13,10 @@ import { EntityManagerPublicPluginStart, } from '@kbn/entityManager-plugin/public'; import type { InferencePublicStart, InferencePublicSetup } from '@kbn/inference-plugin/public'; +import type { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; -import type { SharePluginStart } from '@kbn/share-plugin/public'; /* eslint-disable @typescript-eslint/no-empty-interface*/ @@ -25,6 +25,7 @@ export interface ConfigSchema {} export interface InventorySetupDependencies { observabilityShared: ObservabilitySharedPluginSetup; inference: InferencePublicSetup; + share: SharePluginSetup; data: DataPublicPluginSetup; entityManager: EntityManagerPublicPluginSetup; } diff --git a/x-pack/plugins/observability_solution/observability_shared/common/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/index.ts index d845ea1d398fd..d13e2b32839d6 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/index.ts @@ -178,6 +178,7 @@ export type { ServiceEntityLocatorParams, TransactionDetailsByTraceIdLocator, TransactionDetailsByTraceIdLocatorParams, + EntitiesInventoryLocator, } from './locators'; export { @@ -201,6 +202,8 @@ export { SERVICE_ENTITY_LOCATOR, TransactionDetailsByTraceIdLocatorDefinition, TRANSACTION_DETAILS_BY_TRACE_ID_LOCATOR, + EntitiesInventoryLocatorDefinition, + ENTITIES_INVENTORY_LOCATOR_ID, } from './locators'; export { COMMON_OBSERVABILITY_GROUPING } from './embeddable_grouping'; diff --git a/x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts new file mode 100644 index 0000000000000..deb820b0d5e0a --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts @@ -0,0 +1,24 @@ +/* + * Copyright 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 { SerializableRecord } from '@kbn/utility-types'; +import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/common'; + +export type EntitiesInventoryLocator = LocatorPublic; + +export const ENTITIES_INVENTORY_LOCATOR_ID = 'ENTITY_INVENTORY_LOCATOR'; + +export class EntitiesInventoryLocatorDefinition implements LocatorDefinition { + public readonly id = ENTITIES_INVENTORY_LOCATOR_ID; + + public readonly getLocation = async () => { + return { + app: 'observability', + path: `/inventory`, + state: {}, + }; + }; +} diff --git a/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts index 9c5ded4940d5a..34a6ff391d672 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/locators/index.ts @@ -17,3 +17,4 @@ export * from './infra/metrics_explorer_locator'; export * from './profiling/flamegraph_locator'; export * from './profiling/stacktraces_locator'; export * from './profiling/topn_functions_locator'; +export * from './entity_inventory/entity_inventory_locator'; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts b/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts index 7cd63d7be7602..7a131a2686ad0 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts @@ -45,6 +45,8 @@ import { type MetricsExplorerLocator, type ServiceEntityLocator, type TransactionDetailsByTraceIdLocator, + type EntitiesInventoryLocator, + EntitiesInventoryLocatorDefinition, } from '../common'; import { updateGlobalNavigation } from './services/update_global_navigation'; export interface ObservabilitySharedSetup { @@ -82,6 +84,7 @@ interface ObservabilitySharedLocators { transactionDetailsByTraceId: TransactionDetailsByTraceIdLocator; serviceEntity: ServiceEntityLocator; }; + entitiesInventory: EntitiesInventoryLocator; } export class ObservabilitySharedPlugin implements Plugin { @@ -159,6 +162,7 @@ export class ObservabilitySharedPlugin implements Plugin { ), serviceEntity: urlService.locators.create(new ServiceEntityLocatorDefinition()), }, + entitiesInventory: urlService.locators.create(new EntitiesInventoryLocatorDefinition()), }; } } From 05926c20c57b7abc69c6c068d5733f29306f73ba Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Mon, 30 Sep 2024 10:40:02 -0400 Subject: [PATCH 016/107] [Response Ops][Alerting] Use ES client to update rule SO at end of rule run instead of SO client. (#193341) Resolves https://github.com/elastic/kibana/issues/192397 ## Summary Updates alerting task runner end of run updates to use the ES client update function for a true partial update instead of the saved objects client update function that performs a GET then an update. ## To verify Create a rule in multiple spaces and ensure they run correctly and their execution status and monitoring history are updated at the end of each run. Because we're performing a partial update on attributes that are not in the AAD, the rule should continue running without any encryption errors. ## Risk Matrix | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Updating saved object directly using ES client will break BWC | Medium | High | Response Ops follows an intermediate release strategy for any changes to the rule saved object where schema changes are introduced in an intermediate release before any changes to the saved object are actually made in a followup release. This ensures that any rollbacks that may be required in a release will roll back to a version that is already aware of the new schema. The team is socialized to this strategy as we are requiring users of the alerting framework to also follow this strategy. This should address any backward compatibility issues that might arise by circumventing the saved objects client update function. | | Updating saved object directly using ES client will break AAD | Medium | High | An explicit allowlist of non-AAD fields that are allowed to be partially updated has been introduced and any fields not in this allowlist will not be included in the partial update. Any updates to the rule saved object that might break AAD would show up with > 1 execution of a rule and we have a plethora of functional tests that rely on multiple executions of a rule that would flag if there were issues running due to AAD issues. | --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../alerting/server/saved_objects/index.ts | 2 +- .../partially_update_rule.test.ts | 164 +++++++++++++++++- .../saved_objects/partially_update_rule.ts | 50 ++++++ .../alerting/server/task_runner/fixtures.ts | 89 +++++----- .../server/task_runner/task_runner.test.ts | 51 ++---- .../server/task_runner/task_runner.ts | 19 +- .../task_runner_alerts_client.test.ts | 18 +- .../task_runner/task_runner_cancel.test.ts | 85 ++++----- x-pack/plugins/alerting/tsconfig.json | 3 +- 9 files changed, 340 insertions(+), 141 deletions(-) diff --git a/x-pack/plugins/alerting/server/saved_objects/index.ts b/x-pack/plugins/alerting/server/saved_objects/index.ts index eb07a84950d14..a3bb0b4f0afe8 100644 --- a/x-pack/plugins/alerting/server/saved_objects/index.ts +++ b/x-pack/plugins/alerting/server/saved_objects/index.ts @@ -23,7 +23,7 @@ import { RawRule } from '../types'; import { getImportWarnings } from './get_import_warnings'; import { isRuleExportable } from './is_rule_exportable'; import { RuleTypeRegistry } from '../rule_type_registry'; -export { partiallyUpdateRule } from './partially_update_rule'; +export { partiallyUpdateRule, partiallyUpdateRuleWithEs } from './partially_update_rule'; import { RULES_SETTINGS_SAVED_OBJECT_TYPE, MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, 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 5fcf23cbae6fb..294bc81481540 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 @@ -10,16 +10,23 @@ import { ISavedObjectsRepository, SavedObjectsErrorHelpers, } from '@kbn/core/server'; - -import { PartiallyUpdateableRuleAttributes, partiallyUpdateRule } from './partially_update_rule'; -import { savedObjectsClientMock } from '@kbn/core/server/mocks'; +import { + PartiallyUpdateableRuleAttributes, + partiallyUpdateRule, + partiallyUpdateRuleWithEs, +} from './partially_update_rule'; +import { elasticsearchServiceMock, savedObjectsClientMock } from '@kbn/core/server/mocks'; import { RULE_SAVED_OBJECT_TYPE } from '.'; +import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; +import { estypes } from '@elastic/elasticsearch'; +import { RuleExecutionStatuses } from '@kbn/alerting-types'; const MockSavedObjectsClientContract = savedObjectsClientMock.create(); const MockISavedObjectsRepository = MockSavedObjectsClientContract as unknown as jest.Mocked; +const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; -describe('partially_update_rule', () => { +describe('partiallyUpdateRule', () => { beforeEach(() => { jest.resetAllMocks(); }); @@ -104,6 +111,101 @@ describe('partially_update_rule', () => { }); }); +describe('partiallyUpdateRuleWithEs', () => { + beforeEach(() => { + jest.resetAllMocks(); + jest.clearAllMocks(); + }); + + test('should work with no options', async () => { + esClient.update.mockResolvedValueOnce(MockEsUpdateResponse(MockRuleId)); + + await partiallyUpdateRuleWithEs(esClient, MockRuleId, DefaultAttributesForEsUpdate); + expect(esClient.update).toHaveBeenCalledTimes(1); + expect(esClient.update).toHaveBeenCalledWith({ + id: `alert:${MockRuleId}`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + doc: { + alert: DefaultAttributesForEsUpdate, + }, + }); + }); + + test('should strip unallowed attributes ', async () => { + const attributes = + AttributesForEsUpdateWithUnallowedFields as unknown as PartiallyUpdateableRuleAttributes; + esClient.update.mockResolvedValueOnce(MockEsUpdateResponse(MockRuleId)); + + await partiallyUpdateRuleWithEs(esClient, MockRuleId, attributes); + expect(esClient.update).toHaveBeenCalledWith({ + id: `alert:${MockRuleId}`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + doc: { + alert: DefaultAttributesForEsUpdate, + }, + }); + }); + + test('should handle ES errors', async () => { + esClient.update.mockRejectedValueOnce(new Error('wops')); + + await expect( + partiallyUpdateRuleWithEs(esClient, MockRuleId, DefaultAttributes) + ).rejects.toThrowError('wops'); + }); + + test('should handle the version option', async () => { + esClient.update.mockResolvedValueOnce(MockEsUpdateResponse(MockRuleId)); + + await partiallyUpdateRuleWithEs(esClient, MockRuleId, DefaultAttributesForEsUpdate, { + version: 'WzQsMV0=', + }); + expect(esClient.update).toHaveBeenCalledWith({ + id: `alert:${MockRuleId}`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + if_primary_term: 1, + if_seq_no: 4, + doc: { + alert: DefaultAttributesForEsUpdate, + }, + }); + }); + + test('should handle the ignore404 option', async () => { + esClient.update.mockResolvedValueOnce(MockEsUpdateResponse(MockRuleId)); + + await partiallyUpdateRuleWithEs(esClient, MockRuleId, DefaultAttributesForEsUpdate, { + ignore404: true, + }); + expect(esClient.update).toHaveBeenCalledWith( + { + id: `alert:${MockRuleId}`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + doc: { + alert: DefaultAttributesForEsUpdate, + }, + }, + { ignore: [404] } + ); + }); + + test('should handle the refresh option', async () => { + esClient.update.mockResolvedValueOnce(MockEsUpdateResponse(MockRuleId)); + + await partiallyUpdateRuleWithEs(esClient, MockRuleId, DefaultAttributesForEsUpdate, { + refresh: 'wait_for', + }); + expect(esClient.update).toHaveBeenCalledWith({ + id: `alert:${MockRuleId}`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + doc: { + alert: DefaultAttributesForEsUpdate, + }, + refresh: 'wait_for', + }); + }); +}); + function getMockSavedObjectClients(): Record< string, jest.Mocked @@ -126,6 +228,50 @@ const DefaultAttributes = { const ExtraneousAttributes = { ...DefaultAttributes, foo: 'bar' }; +const DefaultAttributesForEsUpdate = { + running: false, + executionStatus: { + status: 'active' as RuleExecutionStatuses, + lastExecutionDate: '2023-01-01T08:44:40.000Z', + lastDuration: 12, + error: null, + warning: null, + }, + monitoring: { + run: { + calculated_metrics: { + success_ratio: 20, + }, + history: [ + { + success: true, + timestamp: 1640991880000, + duration: 12, + outcome: 'success', + }, + ], + last_run: { + timestamp: '2023-01-01T08:44:40.000Z', + metrics: { + duration: 12, + gap_duration_s: null, + total_alerts_created: null, + total_alerts_detected: null, + total_indexing_duration_ms: null, + total_search_duration_ms: null, + }, + }, + }, + }, +}; + +const AttributesForEsUpdateWithUnallowedFields = { + ...DefaultAttributesForEsUpdate, + alertTypeId: 'foo', + consumer: 'consumer', + randomField: 'bar', +}; + const MockRuleId = 'rule-id'; const MockUpdateValue = { @@ -137,3 +283,13 @@ const MockUpdateValue = { }, references: [], }; + +const MockEsUpdateResponse = (id: string) => ({ + _index: '.kibana_alerting_cases_9.0.0_001', + _id: `alert:${id}`, + _version: 3, + result: 'updated' as estypes.Result, + _shards: { total: 1, successful: 1, failed: 0 }, + _seq_no: 5, + _primary_term: 1, +}); 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 2665845a1110f..f9b4da5ed767b 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 @@ -7,10 +7,13 @@ import { omit, pick } from 'lodash'; import { + ElasticsearchClient, SavedObjectsClient, SavedObjectsErrorHelpers, SavedObjectsUpdateOptions, } from '@kbn/core/server'; +import { decodeRequestVersion } from '@kbn/core-saved-objects-base-server-internal'; +import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import { RawRule } from '../types'; import { @@ -67,3 +70,50 @@ export async function partiallyUpdateRule( throw err; } } + +// Explicit list of attributes that we allow to be partially updated +// There should be no overlap between this list and RuleAttributesIncludedInAAD or RuleAttributesToEncrypt +const RuleAttributesAllowedForPartialUpdate = [ + 'executionStatus', + 'lastRun', + 'monitoring', + 'nextRun', + 'running', +]; + +// direct, partial update to a rule saved object via ElasticsearchClient + +// we do this direct partial update to avoid the overhead of the SavedObjectsClient for +// only these allow-listed fields which don't impact encryption. in addition, because these +// fields are only updated by the system user at the end of a rule run, they should not +// need to be included in any (user-centric) audit logs. +export async function partiallyUpdateRuleWithEs( + esClient: ElasticsearchClient, + id: string, + attributes: PartiallyUpdateableRuleAttributes, + options: PartiallyUpdateRuleSavedObjectOptions = {} +): Promise { + // ensure we only have the valid attributes that are not encrypted and are excluded from AAD + const attributeUpdates = omit(attributes, [ + ...RuleAttributesToEncrypt, + ...RuleAttributesIncludedInAAD, + ]); + // ensure we only have attributes that we explicitly allow to be updated + const attributesAllowedForUpdate = pick(attributeUpdates, RuleAttributesAllowedForPartialUpdate); + + const updateParams = { + id: `alert:${id}`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + ...(options.version ? decodeRequestVersion(options.version) : {}), + doc: { + alert: attributesAllowedForUpdate, + }, + ...(options.refresh ? { refresh: options.refresh } : {}), + }; + + if (options.ignore404) { + await esClient.update(updateParams, { ignore: [404] }); + } else { + await esClient.update(updateParams); + } +} diff --git a/x-pack/plugins/alerting/server/task_runner/fixtures.ts b/x-pack/plugins/alerting/server/task_runner/fixtures.ts index ae8eccfcb1f86..5174aa9b965ec 100644 --- a/x-pack/plugins/alerting/server/task_runner/fixtures.ts +++ b/x-pack/plugins/alerting/server/task_runner/fixtures.ts @@ -7,6 +7,7 @@ import { TaskStatus } from '@kbn/task-manager-plugin/server'; import { SavedObject } from '@kbn/core/server'; +import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import { Rule, RuleTypeParams, @@ -64,7 +65,7 @@ const defaultHistory = [ }, ]; -export const generateSavedObjectParams = ({ +export const generateRuleUpdateParams = ({ error = null, warning = null, status = 'ok', @@ -83,53 +84,59 @@ export const generateSavedObjectParams = ({ history?: RuleMonitoring['run']['history']; alertsCount?: Record; }) => [ - RULE_SAVED_OBJECT_TYPE, - '1', { - monitoring: { - run: { - calculated_metrics: { - success_ratio: successRatio, + id: `alert:1`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + doc: { + alert: { + monitoring: { + run: { + calculated_metrics: { + success_ratio: successRatio, + }, + history, + last_run: { + timestamp: '1970-01-01T00:00:00.000Z', + metrics: { + duration: 0, + gap_duration_s: null, + total_alerts_created: null, + total_alerts_detected: null, + total_indexing_duration_ms: null, + total_search_duration_ms: null, + }, + }, + }, }, - history, - last_run: { - timestamp: '1970-01-01T00:00:00.000Z', - metrics: { - duration: 0, - gap_duration_s: null, - total_alerts_created: null, - total_alerts_detected: null, - total_indexing_duration_ms: null, - total_search_duration_ms: null, + executionStatus: { + error, + lastDuration: 0, + lastExecutionDate: '1970-01-01T00:00:00.000Z', + status, + warning, + }, + lastRun: { + outcome, + outcomeOrder: RuleLastRunOutcomeOrderMap[outcome], + outcomeMsg: + (error?.message && [error?.message]) || + (warning?.message && [warning?.message]) || + null, + warning: error?.reason || warning?.reason || null, + alertsCount: { + active: 0, + ignored: 0, + new: 0, + recovered: 0, + ...(alertsCount || {}), }, }, + nextRun, + running: false, }, }, - executionStatus: { - error, - lastDuration: 0, - lastExecutionDate: '1970-01-01T00:00:00.000Z', - status, - warning, - }, - lastRun: { - outcome, - outcomeOrder: RuleLastRunOutcomeOrderMap[outcome], - outcomeMsg: - (error?.message && [error?.message]) || (warning?.message && [warning?.message]) || null, - warning: error?.reason || warning?.reason || null, - alertsCount: { - active: 0, - ignored: 0, - new: 0, - recovered: 0, - ...(alertsCount || {}), - }, - }, - nextRun, - running: false, }, - { refresh: false, namespace: undefined }, + { ignore: [404] }, ]; export const GENERIC_ERROR_MESSAGE = 'GENERIC ERROR MESSAGE'; diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 438ffb3685e2a..e06c260109b76 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -59,7 +59,7 @@ import { generateRunnerResult, RULE_ACTIONS, generateEnqueueFunctionInput, - generateSavedObjectParams, + generateRuleUpdateParams, mockTaskInstance, GENERIC_ERROR_MESSAGE, generateAlertInstance, @@ -341,8 +341,8 @@ describe('Task Runner', () => { testAlertingEventLogCalls({ status: 'ok' }); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({}) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({}) ); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toBeCalledTimes(1); @@ -2676,8 +2676,8 @@ describe('Task Runner', () => { status: 'ok', }); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({}) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({}) ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -2789,10 +2789,8 @@ describe('Task Runner', () => { }); await taskRunner.run(); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({ - nextRun: '1970-01-01T00:00:10.000Z', - }) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({ nextRun: '1970-01-01T00:00:10.000Z' }) ); }); @@ -2825,21 +2823,14 @@ describe('Task Runner', () => { ); await taskRunner.run(); ruleType.executor.mockClear(); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({ - error: { - message: GENERIC_ERROR_MESSAGE, - reason: 'execute', - }, + + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({ + error: { message: GENERIC_ERROR_MESSAGE, reason: 'execute' }, outcome: 'failed', status: 'error', successRatio: 0, - history: [ - { - success: false, - timestamp: 0, - }, - ], + history: [{ success: false, timestamp: 0 }], }) ); }); @@ -2947,15 +2938,12 @@ describe('Task Runner', () => { expect(actionsClient.bulkEnqueueExecution).toHaveBeenCalledTimes(1); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({ + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({ status: 'warning', outcome: 'warning', warning, - alertsCount: { - active: 1, - new: 1, - }, + alertsCount: { active: 1, new: 1 }, }) ); @@ -3117,15 +3105,12 @@ describe('Task Runner', () => { expect(actionsClient.bulkEnqueueExecution).toHaveBeenCalledTimes(1); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({ + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({ status: 'warning', outcome: 'warning', warning, - alertsCount: { - active: 2, - new: 2, - }, + alertsCount: { active: 2, new: 2 }, }) ); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index e01dd73df7e58..b5a1854581bf3 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -42,7 +42,7 @@ import { import { asErr, asOk, isErr, isOk, map, resolveErr, Result } from '../lib/result_type'; import { taskInstanceToAlertTaskInstance } from './alert_task_instance'; import { isAlertSavedObjectNotFoundError, isEsUnavailableError } from '../lib/is_alerting_error'; -import { partiallyUpdateRule, RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; +import { partiallyUpdateRuleWithEs, RULE_SAVED_OBJECT_TYPE } from '../saved_objects'; import { AlertInstanceContext, AlertInstanceState, @@ -204,7 +204,6 @@ export class TaskRunner< private async updateRuleSavedObjectPostRun( ruleId: string, - namespace: string | undefined, attributes: { executionStatus?: RawRuleExecutionStatus; monitoring?: RawRuleMonitoring; @@ -212,7 +211,7 @@ export class TaskRunner< lastRun?: RawRuleLastRun | null; } ) { - const client = this.internalSavedObjectsRepository; + const client = this.context.elasticsearch.client.asInternalUser; try { // Future engineer -> Here we are just checking if we need to wait for // the update of the attribute `running` in the rule's saved object @@ -223,13 +222,12 @@ export class TaskRunner< // eslint-disable-next-line no-empty } catch {} try { - await partiallyUpdateRule( + await partiallyUpdateRuleWithEs( client, ruleId, { ...attributes, running: false }, { ignore404: true, - namespace, refresh: false, } ); @@ -548,7 +546,7 @@ export class TaskRunner< const { executionStatus: execStatus, executionMetrics: execMetrics } = await this.timer.runWithTimer(TaskRunnerTimerSpan.ProcessRuleRun, async () => { const { - params: { alertId: ruleId, spaceId }, + params: { alertId: ruleId }, startedAt, schedule: taskSchedule, } = this.taskInstance; @@ -560,8 +558,6 @@ export class TaskRunner< nextRun = getNextRun({ startDate: startedAt, interval: taskSchedule.interval }); } - const namespace = this.context.spaceIdToNamespace(spaceId); - const { executionStatus, executionMetrics, lastRun, outcome } = processRunResults({ logger: this.logger, logPrefix: `${this.ruleType.id}:${ruleId}`, @@ -602,7 +598,7 @@ export class TaskRunner< )} - ${JSON.stringify(lastRun)}` ); } - await this.updateRuleSavedObjectPostRun(ruleId, namespace, { + await this.updateRuleSavedObjectPostRun(ruleId, { executionStatus: ruleExecutionStatusToRaw(executionStatus), nextRun, lastRun: lastRunToRaw(lastRun), @@ -758,11 +754,10 @@ export class TaskRunner< // Write event log entry const { - params: { alertId: ruleId, spaceId, consumer }, + params: { alertId: ruleId, consumer }, schedule: taskSchedule, startedAt, } = this.taskInstance; - const namespace = this.context.spaceIdToNamespace(spaceId); if (consumer && !this.ruleConsumer) { this.ruleConsumer = consumer; @@ -803,7 +798,7 @@ export class TaskRunner< `Updating rule task for ${this.ruleType.id} rule with id ${ruleId} - execution error due to timeout` ); const outcome = 'failed'; - await this.updateRuleSavedObjectPostRun(ruleId, namespace, { + await this.updateRuleSavedObjectPostRun(ruleId, { executionStatus: ruleExecutionStatusToRaw(executionStatus), lastRun: { outcome, diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts index c116230016e9b..6c7331de463ea 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts @@ -46,7 +46,7 @@ import { RULE_NAME, generateRunnerResult, RULE_ACTIONS, - generateSavedObjectParams, + generateRuleUpdateParams, mockTaskInstance, DATE_1970, DATE_1970_5_MIN, @@ -376,8 +376,8 @@ describe('Task Runner', () => { { tags: ['1', 'test'] } ); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({}) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({}) ); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toBeCalledTimes(1); @@ -510,8 +510,8 @@ describe('Task Runner', () => { 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', { tags: ['1', 'test'] } ); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({}) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({}) ); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toBeCalledTimes(1); expect( @@ -708,8 +708,8 @@ describe('Task Runner', () => { tags: ['1', 'test'], }); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({}) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({}) ); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toBeCalledTimes(1); @@ -799,8 +799,8 @@ describe('Task Runner', () => { tags: ['1', 'test'], }); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - ...generateSavedObjectParams({}) + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( + ...generateRuleUpdateParams({}) ); expect(taskRunnerFactoryInitializerParams.executionContext.withContext).toBeCalledTimes(1); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts index 3a6a9547fb902..e5572707ae6fd 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts @@ -63,6 +63,7 @@ import { TaskRunnerContext } from './types'; import { backfillClientMock } from '../backfill_client/backfill_client.mock'; import { UntypedNormalizedRuleType } from '../rule_type_registry'; import { rulesSettingsServiceMock } from '../rules_settings/rules_settings_service.mock'; +import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import { maintenanceWindowsServiceMock } from './maintenance_windows/maintenance_windows_service.mock'; jest.mock('uuid', () => ({ @@ -225,53 +226,57 @@ describe('Task Runner Cancel', () => { testAlertingEventLogCalls({ status: 'ok' }); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledTimes(1); - expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( - RULE_SAVED_OBJECT_TYPE, - '1', + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledTimes(1); + expect(elasticsearchService.client.asInternalUser.update).toHaveBeenCalledWith( { - executionStatus: { - error: { - message: `test:1: execution cancelled due to timeout - exceeded rule type timeout of 5m`, - reason: 'timeout', - }, - lastDuration: 0, - lastExecutionDate: '1970-01-01T00:00:00.000Z', - status: 'error', - warning: null, - }, - lastRun: { - alertsCount: {}, - outcome: 'failed', - outcomeMsg: [ - 'test:1: execution cancelled due to timeout - exceeded rule type timeout of 5m', - ], - outcomeOrder: 20, - warning: 'timeout', - }, - monitoring: { - run: { - calculated_metrics: { - success_ratio: 0, + id: `alert:1`, + index: ALERTING_CASES_SAVED_OBJECT_INDEX, + doc: { + alert: { + executionStatus: { + error: { + message: `test:1: execution cancelled due to timeout - exceeded rule type timeout of 5m`, + reason: 'timeout', + }, + lastDuration: 0, + lastExecutionDate: '1970-01-01T00:00:00.000Z', + status: 'error', + warning: null, + }, + lastRun: { + alertsCount: {}, + outcome: 'failed', + outcomeMsg: [ + 'test:1: execution cancelled due to timeout - exceeded rule type timeout of 5m', + ], + outcomeOrder: 20, + warning: 'timeout', }, - history: [], - last_run: { - metrics: { - duration: 0, - gap_duration_s: null, - total_alerts_created: null, - total_alerts_detected: null, - total_indexing_duration_ms: null, - total_search_duration_ms: null, + monitoring: { + run: { + calculated_metrics: { + success_ratio: 0, + }, + history: [], + last_run: { + metrics: { + duration: 0, + gap_duration_s: null, + total_alerts_created: null, + total_alerts_detected: null, + total_indexing_duration_ms: null, + total_search_duration_ms: null, + }, + timestamp: '1970-01-01T00:00:00.000Z', + }, }, - timestamp: '1970-01-01T00:00:00.000Z', }, + nextRun: '1970-01-01T00:00:10.000Z', + running: false, }, }, - nextRun: '1970-01-01T00:00:10.000Z', - running: false, }, - { refresh: false, namespace: undefined } + { ignore: [404] } ); expect(mockUsageCounter.incrementCounter).toHaveBeenCalledTimes(1); expect(mockUsageCounter.incrementCounter).toHaveBeenCalledWith({ diff --git a/x-pack/plugins/alerting/tsconfig.json b/x-pack/plugins/alerting/tsconfig.json index c09816222b010..c0951663a8489 100644 --- a/x-pack/plugins/alerting/tsconfig.json +++ b/x-pack/plugins/alerting/tsconfig.json @@ -72,7 +72,8 @@ "@kbn/alerting-state-types", "@kbn/core-security-server", "@kbn/core-http-server", - "@kbn/zod" + "@kbn/zod", + "@kbn/core-saved-objects-base-server-internal" ], "exclude": [ "target/**/*" From 2a935dcce37bd3e3f3fce32d6257b2ec7191dac5 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 30 Sep 2024 09:55:49 -0500 Subject: [PATCH 017/107] Hide progress bar on initial load when client prefers reduced motion (#194365) ## Summary See https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion ![CleanShot 2024-09-29 at 21 57 36](https://github.com/user-attachments/assets/27436ec4-986b-4c91-9d9f-e49d59d76e7c) --- .../apps/core-apps-server-internal/assets/legacy_styles.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/core/apps/core-apps-server-internal/assets/legacy_styles.css b/packages/core/apps/core-apps-server-internal/assets/legacy_styles.css index 55ed0fbfdf8ba..ea149e7fec132 100644 --- a/packages/core/apps/core-apps-server-internal/assets/legacy_styles.css +++ b/packages/core/apps/core-apps-server-internal/assets/legacy_styles.css @@ -114,3 +114,9 @@ body, html { transform: scaleX(1) translateX(100%); } } + +@media (prefers-reduced-motion) { + .kbnProgress { + display: none; + } +} From 508141423e7d18ce87628d826628d161c3292418 Mon Sep 17 00:00:00 2001 From: Hanna Tamoudi Date: Mon, 30 Sep 2024 17:46:05 +0200 Subject: [PATCH 018/107] [Automatic Import] add fields mapping to readme (#193717) --- .../build_integration.test.ts | 62 ++++-- .../integration_builder/build_integration.ts | 43 +++-- .../integration_builder/data_stream.test.ts | 12 ++ .../server/integration_builder/data_stream.ts | 37 +++- .../server/integration_builder/fields.test.ts | 34 ++++ .../server/integration_builder/fields.ts | 20 +- .../integration_builder/readme_files.test.ts | 182 ++++++++++++++++++ .../integration_builder/readme_files.ts | 42 ++++ .../server/templates/build_readme.md.njk | 8 + .../server/templates/package_readme.md.njk | 43 ++--- .../server/templates/readme.njk | 31 +++ .../server/util/samples.test.ts | 159 ++++++++++++++- .../server/util/samples.ts | 43 ++++- 13 files changed, 634 insertions(+), 82 deletions(-) create mode 100644 x-pack/plugins/integration_assistant/server/integration_builder/readme_files.test.ts create mode 100644 x-pack/plugins/integration_assistant/server/integration_builder/readme_files.ts create mode 100644 x-pack/plugins/integration_assistant/server/templates/build_readme.md.njk create mode 100644 x-pack/plugins/integration_assistant/server/templates/readme.njk diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts index e8800af12653f..419e287e23bf7 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts @@ -14,6 +14,7 @@ import { createAgentInput } from './agent'; import { createPipeline } from './pipeline'; import { DataStream, Docs, InputType, Pipeline, Integration } from '../../common'; import yaml from 'js-yaml'; +import { createReadme } from './readme_files'; const mockedDataPath = 'path'; const mockedId = 123; @@ -23,6 +24,10 @@ jest.mock('./data_stream'); jest.mock('./fields'); jest.mock('./agent'); jest.mock('./pipeline'); +jest.mock('./readme_files'); + +(createFieldMapping as jest.Mock).mockReturnValue([]); +(createDataStream as jest.Mock).mockReturnValue([]); (generateUniqueId as jest.Mock).mockReturnValue(mockedId); @@ -106,22 +111,11 @@ describe('buildPackage', () => { // _dev files expect(ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/_dev/build`); - expect(createSync).toHaveBeenCalledWith( - `${integrationPath}/_dev/build/docs/README.md`, - expect.any(String) - ); expect(createSync).toHaveBeenCalledWith( `${integrationPath}/_dev/build/build.yml`, expect.any(String) ); - // Docs files - expect(ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/docs/`); - expect(createSync).toHaveBeenCalledWith( - `${integrationPath}/docs/README.md`, - expect.any(String) - ); - // Changelog file expect(createSync).toHaveBeenCalledWith(`${integrationPath}/changelog.yml`, expect.any(String)); @@ -188,6 +182,52 @@ describe('buildPackage', () => { secondDataStreamDocs ); }); + + it('Should call createReadme once with sorted fields', async () => { + jest.clearAllMocks(); + + const firstDSFieldsMapping = [{ name: 'name a', description: 'description 1', type: 'type 1' }]; + + const firstDataStreamFields = [ + { name: 'name b', description: 'description 1', type: 'type 1' }, + ]; + + const secondDSFieldsMapping = [ + { name: 'name c', description: 'description 2', type: 'type 2' }, + { name: 'name e', description: 'description 3', type: 'type 3' }, + ]; + + const secondDataStreamFields = [ + { name: 'name d', description: 'description 2', type: 'type 2' }, + ]; + + (createFieldMapping as jest.Mock).mockReturnValueOnce(firstDSFieldsMapping); + (createDataStream as jest.Mock).mockReturnValueOnce(firstDataStreamFields); + + (createFieldMapping as jest.Mock).mockReturnValueOnce(secondDSFieldsMapping); + (createDataStream as jest.Mock).mockReturnValueOnce(secondDataStreamFields); + + await buildPackage(testIntegration); + + expect(createReadme).toHaveBeenCalledWith(integrationPath, testIntegration.name, [ + { + datastream: firstDatastreamName, + fields: [ + { name: 'name a', description: 'description 1', type: 'type 1' }, + + { name: 'name b', description: 'description 1', type: 'type 1' }, + ], + }, + { + datastream: secondDatastreamName, + fields: [ + { name: 'name c', description: 'description 2', type: 'type 2' }, + { name: 'name d', description: 'description 2', type: 'type 2' }, + { name: 'name e', description: 'description 3', type: 'type 3' }, + ], + }, + ]); + }); }); describe('renderPackageManifestYAML', () => { diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts index b9bc1b55268d7..8743ada38bdb6 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts @@ -16,6 +16,8 @@ import { createAgentInput } from './agent'; import { createDataStream } from './data_stream'; import { createFieldMapping } from './fields'; import { createPipeline } from './pipeline'; +import { createReadme } from './readme_files'; +import { Field, flattenObjectsList } from '../util/samples'; const initialVersion = '1.0.0'; @@ -37,17 +39,27 @@ export async function buildPackage(integration: Integration): Promise { const packageDir = createDirectories(workingDir, integration, packageDirectoryName); const dataStreamsDir = joinPath(packageDir, 'data_stream'); - - for (const dataStream of integration.dataStreams) { + const fieldsPerDatastream = integration.dataStreams.map((dataStream) => { const dataStreamName = dataStream.name; const specificDataStreamDir = joinPath(dataStreamsDir, dataStreamName); - createDataStream(integration.name, specificDataStreamDir, dataStream); + const dataStreamFields = createDataStream(integration.name, specificDataStreamDir, dataStream); createAgentInput(specificDataStreamDir, dataStream.inputTypes); createPipeline(specificDataStreamDir, dataStream.pipeline); - createFieldMapping(integration.name, dataStreamName, specificDataStreamDir, dataStream.docs); - } + const fields = createFieldMapping( + integration.name, + dataStreamName, + specificDataStreamDir, + dataStream.docs + ); + + return { + datastream: dataStreamName, + fields: mergeAndSortFields(fields, dataStreamFields), + }; + }); + createReadme(packageDir, integration.name, fieldsPerDatastream); const zipBuffer = await createZipArchive(workingDir, packageDirectoryName); removeDirSync(workingDir); @@ -67,7 +79,6 @@ function createDirectories( } function createPackage(packageDir: string, integration: Integration): void { - createReadme(packageDir, integration); createChangelog(packageDir); createBuildFile(packageDir); createPackageManifest(packageDir, integration); @@ -102,20 +113,6 @@ function createChangelog(packageDir: string): void { createSync(joinPath(packageDir, 'changelog.yml'), changelogTemplate); } -function createReadme(packageDir: string, integration: Integration) { - const readmeDirPath = joinPath(packageDir, '_dev/build/docs/'); - const mainReadmeDirPath = joinPath(packageDir, 'docs/'); - ensureDirSync(mainReadmeDirPath); - ensureDirSync(readmeDirPath); - const readmeTemplate = nunjucks.render('package_readme.md.njk', { - package_name: integration.name, - data_streams: integration.dataStreams, - }); - - createSync(joinPath(readmeDirPath, 'README.md'), readmeTemplate); - createSync(joinPath(mainReadmeDirPath, 'README.md'), readmeTemplate); -} - async function createZipArchive(workingDir: string, packageDirectoryName: string): Promise { const tmpPackageDir = joinPath(workingDir, packageDirectoryName); const zip = new AdmZip(); @@ -124,6 +121,12 @@ async function createZipArchive(workingDir: string, packageDirectoryName: string return buffer; } +function mergeAndSortFields(fields: Field[], dataStreamFields: Field[]): Field[] { + const mergedFields = [...fields, ...dataStreamFields]; + + return flattenObjectsList(mergedFields); +} + /* eslint-disable @typescript-eslint/naming-convention */ /** * Creates a package manifest dictionary. diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts index 550c6118636cc..0a269fa07a1c8 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts @@ -81,4 +81,16 @@ describe('createDataStream', () => { expect(render).toHaveBeenCalledWith(`filestream_manifest.yml.njk`, expect.anything()); expect(render).toHaveBeenCalledWith(`azure_eventhub_manifest.yml.njk`, expect.anything()); }); + + it('Should return the list of fields', async () => { + const fields = createDataStream(packageName, dataStreamPath, firstDataStream); + + expect(Array.isArray(fields)).toBe(true); + fields.forEach((field) => { + expect(field).toMatchObject({ + name: expect.any(String), + type: expect.any(String), + }); + }); + }); }); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.ts b/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.ts index 02b3f12f53d68..d66ee1958b3ea 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.ts @@ -7,14 +7,16 @@ import nunjucks from 'nunjucks'; import { join as joinPath } from 'path'; +import { load } from 'js-yaml'; import type { DataStream } from '../../common'; -import { copySync, createSync, ensureDirSync, listDirSync } from '../util'; +import { copySync, createSync, ensureDirSync, listDirSync, readSync } from '../util'; +import { Field } from '../util/samples'; export function createDataStream( packageName: string, specificDataStreamDir: string, dataStream: DataStream -): void { +): Field[] { const dataStreamName = dataStream.name; const pipelineDir = joinPath(specificDataStreamDir, 'elasticsearch', 'ingest_pipeline'); const title = dataStream.title; @@ -23,7 +25,7 @@ export function createDataStream( const useMultilineNDJSON = samplesFormat.name === 'ndjson' && samplesFormat.multiline === true; ensureDirSync(specificDataStreamDir); - createDataStreamFolders(specificDataStreamDir, pipelineDir); + const fields = createDataStreamFolders(specificDataStreamDir, pipelineDir); createPipelineTests(specificDataStreamDir, dataStream.rawSamples, packageName, dataStreamName); const dataStreams: string[] = []; @@ -51,19 +53,34 @@ export function createDataStream( }); createSync(joinPath(specificDataStreamDir, 'manifest.yml'), finalManifest); + + return fields; +} + +function createDataStreamFolders(specificDataStreamDir: string, pipelineDir: string): Field[] { + ensureDirSync(pipelineDir); + return copyFilesFromTemplateDir(specificDataStreamDir); } -function createDataStreamFolders(specificDataStreamDir: string, pipelineDir: string): void { +function copyFilesFromTemplateDir(specificDataStreamDir: string): Field[] { const dataStreamTemplatesDir = joinPath(__dirname, '../templates/data_stream'); const items = listDirSync(dataStreamTemplatesDir); + return items.flatMap((item) => { + const sourcePath = joinPath(dataStreamTemplatesDir, item); + const destinationPath = joinPath(specificDataStreamDir, item); + copySync(sourcePath, destinationPath); + const files = listDirSync(sourcePath); - for (const item of items) { - const s = joinPath(dataStreamTemplatesDir, item); - const d = joinPath(specificDataStreamDir, item); - copySync(s, d); - } + return loadFieldsFromFiles(sourcePath, files); + }); +} - ensureDirSync(pipelineDir); +function loadFieldsFromFiles(sourcePath: string, files: string[]): Field[] { + return files.flatMap((file) => { + const filePath = joinPath(sourcePath, file); + const content = readSync(filePath); + return load(content) as Field[]; + }); } function createPipelineTests( diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts index a657f699cfff9..bb76577d64fd3 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts @@ -65,4 +65,38 @@ describe('createFieldMapping', () => { ); expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/fields/fields.yml`, expectedFields); }); + + it('Should return all fields flattened', async () => { + const docs: Docs = [ + { + key: 'foo', + anotherKey: 'bar', + }, + ]; + + const baseFields = `- name: data_stream.type + type: constant_keyword + description: Data stream type. +- name: data_stream.dataset + type: constant_keyword +- name: "@timestamp" + type: date + description: Event timestamp. +`; + (render as jest.Mock).mockReturnValue(baseFields); + + const fieldsResult = createFieldMapping(packageName, dataStreamName, dataStreamPath, docs); + + expect(fieldsResult).toEqual([ + { + name: 'data_stream.type', + type: 'constant_keyword', + description: 'Data stream type.', + }, + { name: 'data_stream.dataset', type: 'constant_keyword' }, + { name: '@timestamp', type: 'date', description: 'Event timestamp.' }, + { name: 'key', type: 'keyword' }, + { name: 'anotherKey', type: 'keyword' }, + ]); + }); }); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/fields.ts b/x-pack/plugins/integration_assistant/server/integration_builder/fields.ts index 79977ef2f3927..476bc0e74d697 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/fields.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/fields.ts @@ -6,7 +6,8 @@ */ import nunjucks from 'nunjucks'; - +import { load } from 'js-yaml'; +import { Field } from '../util/samples'; import { createSync, generateFields, mergeSamples } from '../util'; export function createFieldMapping( @@ -14,28 +15,33 @@ export function createFieldMapping( dataStreamName: string, specificDataStreamDir: string, docs: object[] -): void { +): Field[] { const dataStreamFieldsDir = `${specificDataStreamDir}/fields`; - createBaseFields(dataStreamFieldsDir, packageName, dataStreamName); - createCustomFields(dataStreamFieldsDir, docs); + const baseFields = createBaseFields(dataStreamFieldsDir, packageName, dataStreamName); + const customFields = createCustomFields(dataStreamFieldsDir, docs); + + return [...baseFields, ...customFields]; } function createBaseFields( dataStreamFieldsDir: string, packageName: string, dataStreamName: string -): void { +): Field[] { const datasetName = `${packageName}.${dataStreamName}`; const baseFields = nunjucks.render('base_fields.yml.njk', { module: packageName, dataset: datasetName, }); - createSync(`${dataStreamFieldsDir}/base-fields.yml`, baseFields); + + return load(baseFields) as Field[]; } -function createCustomFields(dataStreamFieldsDir: string, pipelineResults: object[]): void { +function createCustomFields(dataStreamFieldsDir: string, pipelineResults: object[]): Field[] { const mergedResults = mergeSamples(pipelineResults); const fieldKeys = generateFields(mergedResults); createSync(`${dataStreamFieldsDir}/fields.yml`, fieldKeys); + + return load(fieldKeys) as Field[]; } diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/readme_files.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/readme_files.test.ts new file mode 100644 index 0000000000000..ae9080fff8a74 --- /dev/null +++ b/x-pack/plugins/integration_assistant/server/integration_builder/readme_files.test.ts @@ -0,0 +1,182 @@ +/* + * Copyright 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 { testIntegration } from '../../__jest__/fixtures/build_integration'; +import { ensureDirSync, createSync } from '../util'; +import { configure } from 'nunjucks'; +import { join as joinPath } from 'path'; +import { createReadme } from './readme_files'; + +jest.mock('../util', () => ({ + ...jest.requireActual('../util'), + createSync: jest.fn(), + ensureDirSync: jest.fn(), +})); + +describe('createReadme', () => { + const integrationPath = 'path'; + + const templateDir = joinPath(__dirname, '../templates'); + configure([templateDir], { + autoescape: false, + }); + + beforeEach(async () => { + jest.clearAllMocks(); + }); + + it('Should create expected files', async () => { + const fields = [ + { + datastream: 'data_stream_1', + fields: [ + { + name: 'data_stream.type', + type: 'constant_keyword', + description: 'Data stream type.', + }, + { + name: 'data_stream.dataset', + type: 'constant_keyword', + description: 'Data stream dataset name.', + }, + { + name: 'event.dataset', + type: 'constant_keyword', + description: 'Event dataset', + value: 'package.datastream', + }, + { name: '@timestamp', type: 'date', description: 'Event timestamp.' }, + ], + }, + { + datastream: 'data_stream_2', + fields: [{ name: '@timestamp', type: 'date', description: 'Event timestamp.' }], + }, + ]; + + createReadme(integrationPath, testIntegration.name, fields); + + expect(createSync).toHaveBeenCalledWith( + `${integrationPath}/_dev/build/docs/README.md`, + expect.any(String) + ); + + // Docs files + expect(ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/docs/`); + expect(createSync).toHaveBeenCalledWith( + `${integrationPath}/docs/README.md`, + expect.any(String) + ); + }); + + it('Should render a table per datastream with fields mapping in package readme', async () => { + const fields = [ + { + datastream: 'data_stream_1', + fields: [ + { + name: 'data_stream.type', + type: 'constant_keyword', + description: 'Data stream type.', + }, + { + name: 'data_stream.dataset', + type: 'constant_keyword', + }, + { + name: 'event.dataset', + type: 'constant_keyword', + description: 'Event dataset', + value: 'package.datastream', + }, + { name: '@timestamp', type: 'date', description: 'Event timestamp.' }, + ], + }, + { + datastream: 'data_stream_2', + fields: [{ name: '@timestamp', type: 'date', description: 'Event timestamp.' }], + }, + ]; + + createReadme(integrationPath, testIntegration.name, fields); + + const firstDatastreamFieldsDisplayed = ` +| Field | Description | Type | +|---|---|---| +| data_stream.type | Data stream type. | constant_keyword | +| data_stream.dataset | | constant_keyword | +| event.dataset | Event dataset | constant_keyword | +| @timestamp | Event timestamp. | date | +`; + + const secondDatastreamFieldsDisplayed = ` +| Field | Description | Type | +|---|---|---| +| @timestamp | Event timestamp. | date | +`; + + expect(createSync).toHaveBeenCalledWith( + `${integrationPath}/docs/README.md`, + expect.stringContaining(firstDatastreamFieldsDisplayed) + ); + + expect(createSync).toHaveBeenCalledWith( + `${integrationPath}/docs/README.md`, + expect.stringContaining(secondDatastreamFieldsDisplayed) + ); + }); + + it('Should not render a fields mapping table in build readme', async () => { + const fields = [ + { + datastream: 'data_stream_1', + fields: [{ name: '@timestamp', type: 'date', description: 'Event timestamp.' }], + }, + ]; + + createReadme(integrationPath, testIntegration.name, fields); + + expect(createSync).toHaveBeenCalledWith( + `${integrationPath}/_dev/build/docs/README.md`, + expect.stringContaining('{{fields "data_stream_1"}}') + ); + }); + + it('Should render a formatted table per datastream with fields mapping in package readme', async () => { + const fields = [ + { + datastream: 'data_stream_1', + fields: [ + { + name: 'data_stream.type', + type: 'constant_keyword', + description: 'Data stream type.\n', + }, + { + name: 'data_stream.dataset', + type: 'constant_keyword', + }, + ], + }, + ]; + + createReadme(integrationPath, testIntegration.name, fields); + + const firstDatastreamFieldsDisplayed = ` +| Field | Description | Type | +|---|---|---| +| data_stream.type | Data stream type. | constant_keyword | +| data_stream.dataset | | constant_keyword | +`; + + expect(createSync).toHaveBeenCalledWith( + `${integrationPath}/docs/README.md`, + expect.stringContaining(firstDatastreamFieldsDisplayed) + ); + }); +}); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/readme_files.ts b/x-pack/plugins/integration_assistant/server/integration_builder/readme_files.ts new file mode 100644 index 0000000000000..163b2b04b52f9 --- /dev/null +++ b/x-pack/plugins/integration_assistant/server/integration_builder/readme_files.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import nunjucks from 'nunjucks'; + +import { join as joinPath } from 'path'; +import { createSync, ensureDirSync } from '../util'; + +export function createReadme(packageDir: string, integrationName: string, fields: object[]) { + createPackageReadme(packageDir, integrationName, fields); + createBuildReadme(packageDir, integrationName, fields); +} + +function createPackageReadme(packageDir: string, integrationName: string, fields: object[]) { + const dirPath = joinPath(packageDir, 'docs/'); + createReadmeFile(dirPath, 'package_readme.md.njk', integrationName, fields); +} + +function createBuildReadme(packageDir: string, integrationName: string, fields: object[]) { + const dirPath = joinPath(packageDir, '_dev/build/docs/'); + createReadmeFile(dirPath, 'build_readme.md.njk', integrationName, fields); +} + +function createReadmeFile( + targetDir: string, + templateName: string, + integrationName: string, + fields: object[] +) { + ensureDirSync(targetDir); + + const template = nunjucks.render(templateName, { + package_name: integrationName, + fields, + }); + + createSync(joinPath(targetDir, 'README.md'), template); +} diff --git a/x-pack/plugins/integration_assistant/server/templates/build_readme.md.njk b/x-pack/plugins/integration_assistant/server/templates/build_readme.md.njk new file mode 100644 index 0000000000000..e23fa4af9efe8 --- /dev/null +++ b/x-pack/plugins/integration_assistant/server/templates/build_readme.md.njk @@ -0,0 +1,8 @@ +{% include "readme.njk" %} +{% for data_stream in fields %} +### {{ data_stream.datastream }} + +Insert a description of the datastream here. + +{% raw %}{{fields {% endraw %}"{{ data_stream.datastream }}"{% raw %}}}{% endraw %} +{% endfor %} \ No newline at end of file diff --git a/x-pack/plugins/integration_assistant/server/templates/package_readme.md.njk b/x-pack/plugins/integration_assistant/server/templates/package_readme.md.njk index 02bf606ab386a..b47e3491b5bc2 100644 --- a/x-pack/plugins/integration_assistant/server/templates/package_readme.md.njk +++ b/x-pack/plugins/integration_assistant/server/templates/package_readme.md.njk @@ -1,38 +1,17 @@ -# {{ package_name }} Integration +{% include "readme.njk" %} +{% for data_stream in fields %} +### {{ data_stream.datastream }} -## Overview - -Explain what the integration is, define the third-party product that is providing data, establish its relationship to the larger ecosystem of Elastic products, and help the reader understand how it can be used to solve a tangible problem. -Check the [overview guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-overview) for more information. - -## Datastreams - -Provide a high-level overview of the kind of data that is collected by the integration. -Check the [datastreams guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-datastreams) for more information. - -## Requirements - -The requirements section helps readers to confirm that the integration will work with their systems. -Check the [requirements guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-requirements) for more information. - -## Setup - -Point the reader to the [Observability Getting started guide](https://www.elastic.co/guide/en/observability/master/observability-get-started.html) for generic, step-by-step instructions. Include any additional setup instructions beyond what’s included in the guide, which may include instructions to update the configuration of a third-party service. -Check the [setup guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-setup) for more information. - -## Troubleshooting (optional) - -Provide information about special cases and exceptions that aren’t necessary for getting started or won’t be applicable to all users. Check the [troubleshooting guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-troubleshooting) for more information. - -## Reference +Insert a description of the datastream here. -Provide detailed information about the log or metric types we support within the integration. Check the [reference guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-reference) for more information. +**ECS Field Reference** -## Logs -{% for data_stream in data_streams %} -### {{ data_stream.name }} +Please refer to the following [document](https://www.elastic.co/guide/en/ecs/current/ecs-field-reference.html) for detailed information on ECS fields. -Insert a description of the datastream here. +**Exported fields** -{% raw %}{{fields {% endraw %}"{{ data_stream.name }}"{% raw %}}}{% endraw %} +| Field | Description | Type | +|---|---|---| +{% for field in data_stream.fields %}| {{ field.name }} | {{ field.description | default('') | replace('\n', ' ') | trim }} | {{ field.type }} | {% endfor %} +{% endfor %} \ No newline at end of file diff --git a/x-pack/plugins/integration_assistant/server/templates/readme.njk b/x-pack/plugins/integration_assistant/server/templates/readme.njk new file mode 100644 index 0000000000000..91c1bf6f1b40c --- /dev/null +++ b/x-pack/plugins/integration_assistant/server/templates/readme.njk @@ -0,0 +1,31 @@ +# {{ package_name }} Integration + +## Overview + +Explain what the integration is, define the third-party product that is providing data, establish its relationship to the larger ecosystem of Elastic products, and help the reader understand how it can be used to solve a tangible problem. +Check the [overview guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-overview) for more information. + +## Datastreams + +Provide a high-level overview of the kind of data that is collected by the integration. +Check the [datastreams guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-datastreams) for more information. + +## Requirements + +The requirements section helps readers to confirm that the integration will work with their systems. +Check the [requirements guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-requirements) for more information. + +## Setup + +Point the reader to the [Observability Getting started guide](https://www.elastic.co/guide/en/observability/master/observability-get-started.html) for generic, step-by-step instructions. Include any additional setup instructions beyond what’s included in the guide, which may include instructions to update the configuration of a third-party service. +Check the [setup guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-setup) for more information. + +## Troubleshooting (optional) + +Provide information about special cases and exceptions that aren’t necessary for getting started or won’t be applicable to all users. Check the [troubleshooting guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-troubleshooting) for more information. + +## Reference + +Provide detailed information about the log or metric types we support within the integration. Check the [reference guidelines](https://www.elastic.co/guide/en/integrations-developer/current/documentation-guidelines.html#idg-docs-guidelines-reference) for more information. + +## Logs \ No newline at end of file diff --git a/x-pack/plugins/integration_assistant/server/util/samples.test.ts b/x-pack/plugins/integration_assistant/server/util/samples.test.ts index 131135e842334..f87f9a96ca2c0 100644 --- a/x-pack/plugins/integration_assistant/server/util/samples.test.ts +++ b/x-pack/plugins/integration_assistant/server/util/samples.test.ts @@ -5,7 +5,164 @@ * 2.0. */ -import { merge } from './samples'; +import { flattenObjectsList, merge } from './samples'; + +describe('flattenObjectsList', () => { + it('Should return a list with flattened key/value entries', async () => { + const result = flattenObjectsList([ + { + name: 'a', + type: 'group', + fields: [ + { + name: 'b', + type: 'keyword', + description: 'Some description for b', + }, + { + name: 'c', + type: 'group', + fields: [ + { + name: 'd', + type: 'keyword', + }, + { + name: 'e', + description: 'Some description for e', + type: 'keyword', + }, + ], + }, + ], + }, + ]); + + expect(result).toEqual([ + { + name: 'a.b', + type: 'keyword', + description: 'Some description for b', + }, + { + name: 'a.c.d', + type: 'keyword', + description: undefined, + }, + { + name: 'a.c.e', + type: 'keyword', + description: 'Some description for e', + }, + ]); + }); + + it('Should return an empty list if passed an empty list', async () => { + const result = flattenObjectsList([]); + + expect(result).toEqual([]); + }); + + it('Should return a list with key/value entries', async () => { + const result = flattenObjectsList([ + { + name: 'a', + type: 'keyword', + description: 'Some description for a', + }, + ]); + + expect(result).toEqual([ + { + name: 'a', + type: 'keyword', + description: 'Some description for a', + }, + ]); + }); + + it('Should return an sorted list of key/value entries', async () => { + const result = flattenObjectsList([ + { + name: 'c', + type: 'group', + fields: [ + { + name: 'b', + type: 'keyword', + description: 'Some description for b', + }, + { + name: 'a', + type: 'group', + fields: [ + { + name: 'e', + type: 'keyword', + description: 'Some description for e', + }, + { + name: 'd', + type: 'keyword', + }, + ], + }, + ], + }, + ]); + + expect(result).toEqual([ + { + name: 'c.a.d', + type: 'keyword', + description: undefined, + }, + { + name: 'c.a.e', + type: 'keyword', + description: 'Some description for e', + }, + { + name: 'c.b', + type: 'keyword', + description: 'Some description for b', + }, + ]); + }); + + it('Should not error if group type is not an array', async () => { + const result = flattenObjectsList([ + { + name: 'a', + type: 'group', + fields: [ + { + name: 'b', + type: 'keyword', + description: 'Some description for b', + }, + { + name: 'c', + type: 'group', + }, + ], + }, + ]); + + expect(result).toEqual([ + { + name: 'a.b', + type: 'keyword', + description: 'Some description for b', + }, + { + name: 'a.c', + type: 'group', + description: undefined, + }, + ]); + }); +}); describe('merge', () => { it('Should return source if target is empty', async () => { diff --git a/x-pack/plugins/integration_assistant/server/util/samples.ts b/x-pack/plugins/integration_assistant/server/util/samples.ts index a29813c1643f8..6993e87a774e9 100644 --- a/x-pack/plugins/integration_assistant/server/util/samples.ts +++ b/x-pack/plugins/integration_assistant/server/util/samples.ts @@ -18,9 +18,10 @@ interface NewObj { }; } -interface Field { +export interface Field { name: string; type: string; + description?: string; fields?: Field[]; } @@ -233,3 +234,43 @@ export function mergeSamples(objects: any[]): string { return JSON.stringify(result, null, 2); } + +export function flattenObjectsList( + obj: Field[] +): Array<{ name: string; type: string; description?: string }> { + const result: Array<{ name: string; type: string; description?: string }> = []; + flattenObject(obj, '', '.', result); + + return sortArrayOfObjects(result); +} + +function flattenObject( + obj: Field[], + parentKey: string = '', + separator: string = '.', + result: Array<{ name: string; type: string; description?: string }> +): void { + obj.forEach((element) => { + if (element.name) { + const newKey = parentKey ? `${parentKey}${separator}${element.name}` : element.name; + + if (element.fields && Array.isArray(element.fields)) { + flattenObject(element.fields, newKey, separator, result); + } else { + result.push({ + name: newKey, + type: element.type, + description: element.description, + }); + } + } + }); +} + +function sortArrayOfObjects( + objectsArray: Array<{ name: string; type: string; description?: string }> +): Array<{ name: string; type: string; description?: string }> { + return objectsArray.sort((a, b) => { + return a.name.localeCompare(b.name); + }); +} From 896dce358c05d6553ac184abae2164a907447c31 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 30 Sep 2024 18:09:52 +0200 Subject: [PATCH 019/107] [SLOs] Update API docs for group-by field !! (#194393) ## Summary Update API docs for group-by field !! --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../output/kibana.serverless.staging.yaml | 29 +++++++++----- oas_docs/output/kibana.serverless.yaml | 29 +++++++++----- oas_docs/output/kibana.staging.yaml | 29 +++++++++----- oas_docs/output/kibana.yaml | 29 +++++++++----- .../slo/docs/openapi/slo/bundled.json | 40 ++++++++++++++----- .../slo/docs/openapi/slo/bundled.yaml | 27 ++++++++----- .../schemas/create_slo_request.yaml | 4 +- .../slo/components/schemas/group_by.yaml | 11 +++++ .../schemas/slo_definition_response.yaml | 6 +-- .../schemas/slo_with_summary_response.yaml | 6 +-- .../schemas/update_slo_request.yaml | 2 + 11 files changed, 147 insertions(+), 65 deletions(-) create mode 100644 x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/group_by.yaml diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index cf5cdbac0e9a4..a5d53bd71cc83 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -32014,9 +32014,7 @@ components: description: A description for the SLO. type: string groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: >- A optional and unique identifier for the SLO. Must be between 8 and @@ -32175,6 +32173,21 @@ components: type: number title: Find SLO response type: object + SLOs_group_by: + description: >- + optional group by field or fields to use to generate an SLO per distinct + value + example: + - - service.name + - service.name + - - service.name + - service.environment + oneOf: + - type: string + - items: + type: string + type: array + title: Group by SLOs_indicator_properties_apm_availability: description: Defines properties for the APM availability indicator type type: object @@ -32765,9 +32778,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -32851,9 +32862,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -33074,6 +33083,8 @@ components: description: description: A description for the SLO. type: string + groupBy: + $ref: '#/components/schemas/SLOs_group_by' indicator: oneOf: - $ref: '#/components/schemas/SLOs_indicator_properties_custom_kql' diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 675e8c0903b2f..93c3a5533c8a0 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -15304,9 +15304,7 @@ components: description: A description for the SLO. type: string groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: >- A optional and unique identifier for the SLO. Must be between 8 and @@ -15465,6 +15463,21 @@ components: type: number title: Find SLO response type: object + SLOs_group_by: + description: >- + optional group by field or fields to use to generate an SLO per distinct + value + example: + - - service.name + - service.name + - - service.name + - service.environment + oneOf: + - type: string + - items: + type: string + type: array + title: Group by SLOs_indicator_properties_apm_availability: description: Defines properties for the APM availability indicator type type: object @@ -16055,9 +16068,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -16141,9 +16152,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -16364,6 +16373,8 @@ components: description: description: A description for the SLO. type: string + groupBy: + $ref: '#/components/schemas/SLOs_group_by' indicator: oneOf: - $ref: '#/components/schemas/SLOs_indicator_properties_custom_kql' diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index c70f9b4bce454..96352fc0cd962 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -40005,9 +40005,7 @@ components: description: A description for the SLO. type: string groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: >- A optional and unique identifier for the SLO. Must be between 8 and @@ -40166,6 +40164,21 @@ components: type: number title: Find SLO response type: object + SLOs_group_by: + description: >- + optional group by field or fields to use to generate an SLO per distinct + value + example: + - - service.name + - service.name + - - service.name + - service.environment + oneOf: + - type: string + - items: + type: string + type: array + title: Group by SLOs_indicator_properties_apm_availability: description: Defines properties for the APM availability indicator type type: object @@ -40756,9 +40769,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -40842,9 +40853,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -41065,6 +41074,8 @@ components: description: description: A description for the SLO. type: string + groupBy: + $ref: '#/components/schemas/SLOs_group_by' indicator: oneOf: - $ref: '#/components/schemas/SLOs_indicator_properties_custom_kql' diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 947ae1155041f..6d53cb1a38bdd 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -22291,9 +22291,7 @@ components: description: A description for the SLO. type: string groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: >- A optional and unique identifier for the SLO. Must be between 8 and @@ -22452,6 +22450,21 @@ components: type: number title: Find SLO response type: object + SLOs_group_by: + description: >- + optional group by field or fields to use to generate an SLO per distinct + value + example: + - - service.name + - service.name + - - service.name + - service.environment + oneOf: + - type: string + - items: + type: string + type: array + title: Group by SLOs_indicator_properties_apm_availability: description: Defines properties for the APM availability indicator type type: object @@ -23042,9 +23055,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -23128,9 +23139,7 @@ components: example: true type: boolean groupBy: - description: optional group by field to use to generate an SLO per distinct value - example: some.field - type: string + $ref: '#/components/schemas/SLOs_group_by' id: description: The identifier of the SLO. example: 8853df00-ae2e-11ed-90af-09bb6422b258 @@ -23351,6 +23360,8 @@ components: description: description: A description for the SLO. type: string + groupBy: + $ref: '#/components/schemas/SLOs_group_by' indicator: oneOf: - $ref: '#/components/schemas/SLOs_indicator_properties_custom_kql' diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json index 7e28ae729cc46..b8d3e28ce210a 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.json @@ -1738,6 +1738,31 @@ } } }, + "group_by": { + "title": "Group by", + "description": "optional group by field or fields to use to generate an SLO per distinct value", + "example": [ + [ + "service.name" + ], + "service.name", + [ + "service.name", + "service.environment" + ] + ], + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, "slo_with_summary_response": { "title": "SLO response", "type": "object", @@ -1835,9 +1860,7 @@ "example": true }, "groupBy": { - "description": "optional group by field to use to generate an SLO per distinct value", - "type": "string", - "example": "some.field" + "$ref": "#/components/schemas/group_by" }, "instanceId": { "description": "the value derived from the groupBy field, if present, otherwise '*'", @@ -2046,9 +2069,7 @@ "$ref": "#/components/schemas/settings" }, "groupBy": { - "description": "optional group by field to use to generate an SLO per distinct value", - "type": "string", - "example": "some.field" + "$ref": "#/components/schemas/group_by" }, "tags": { "description": "List of tags", @@ -2142,6 +2163,9 @@ "settings": { "$ref": "#/components/schemas/settings" }, + "groupBy": { + "$ref": "#/components/schemas/group_by" + }, "tags": { "description": "List of tags", "type": "array", @@ -2243,9 +2267,7 @@ "example": true }, "groupBy": { - "description": "optional group by field to use to generate an SLO per distinct value", - "type": "string", - "example": "some.field" + "$ref": "#/components/schemas/group_by" }, "tags": { "description": "List of tags", diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml index 0426d2d03bc89..dc57f3e4ea4f6 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/bundled.yaml @@ -1204,6 +1204,19 @@ components: example: 0.9836 errorBudget: $ref: '#/components/schemas/error_budget' + group_by: + title: Group by + description: optional group by field or fields to use to generate an SLO per distinct value + example: + - - service.name + - service.name + - - service.name + - service.environment + oneOf: + - type: string + - type: array + items: + type: string slo_with_summary_response: title: SLO response type: object @@ -1274,9 +1287,7 @@ components: type: boolean example: true groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: some.field + $ref: '#/components/schemas/group_by' instanceId: description: the value derived from the groupBy field, if present, otherwise '*' type: string @@ -1425,9 +1436,7 @@ components: settings: $ref: '#/components/schemas/settings' groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: some.field + $ref: '#/components/schemas/group_by' tags: description: List of tags type: array @@ -1487,6 +1496,8 @@ components: $ref: '#/components/schemas/objective' settings: $ref: '#/components/schemas/settings' + groupBy: + $ref: '#/components/schemas/group_by' tags: description: List of tags type: array @@ -1558,9 +1569,7 @@ components: type: boolean example: true groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: some.field + $ref: '#/components/schemas/group_by' tags: description: List of tags type: array diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/create_slo_request.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/create_slo_request.yaml index c3a848fe52133..292836da1c535 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/create_slo_request.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/create_slo_request.yaml @@ -37,9 +37,7 @@ properties: settings: $ref: "settings.yaml" groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: "some.field" + $ref: "group_by.yaml" tags: description: List of tags type: array diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/group_by.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/group_by.yaml new file mode 100644 index 0000000000000..6870d539c17ee --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/group_by.yaml @@ -0,0 +1,11 @@ +title: Group by +description: optional group by field or fields to use to generate an SLO per distinct value +example: + - [ "service.name" ] + - service.name + - [ "service.name", "service.environment" ] +oneOf: + - type: string + - type: array + items: + type: string diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_definition_response.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_definition_response.yaml index 0b4ffa774d10f..430b105eb32fc 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_definition_response.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_definition_response.yaml @@ -63,9 +63,7 @@ properties: type: boolean example: true groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: "some.field" + $ref: "group_by.yaml" tags: description: List of tags type: array @@ -82,4 +80,4 @@ properties: version: description: The internal SLO version type: number - example: 2 \ No newline at end of file + example: 2 diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml index df8e35996feb3..3da2423acb154 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/slo_with_summary_response.yaml @@ -67,9 +67,7 @@ properties: type: boolean example: true groupBy: - description: optional group by field to use to generate an SLO per distinct value - type: string - example: "some.field" + $ref: "group_by.yaml" instanceId: description: the value derived from the groupBy field, if present, otherwise '*' type: string @@ -90,4 +88,4 @@ properties: version: description: The internal SLO version type: number - example: 2 \ No newline at end of file + example: 2 diff --git a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/update_slo_request.yaml b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/update_slo_request.yaml index 8d2c61c7b2249..95603878e8e99 100644 --- a/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/update_slo_request.yaml +++ b/x-pack/plugins/observability_solution/slo/docs/openapi/slo/components/schemas/update_slo_request.yaml @@ -26,6 +26,8 @@ properties: $ref: "objective.yaml" settings: $ref: "settings.yaml" + groupBy: + $ref: "group_by.yaml" tags: description: List of tags type: array From 5def848d2cee99e337a46f57893c14be1d1c7052 Mon Sep 17 00:00:00 2001 From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:14:58 +0200 Subject: [PATCH 020/107] [ES|QL] AST package documentation (#194296) Updates documentation for the ES|QL AST package. --- packages/kbn-esql-ast/README.md | 97 ++------- packages/kbn-esql-ast/src/builder/README.md | 39 ++++ packages/kbn-esql-ast/src/parser/README.md | 144 ++++++++++++- .../kbn-esql-ast/src/pretty_print/README.md | 76 ++++++- packages/kbn-esql-ast/src/visitor/README.md | 202 +++++++++++++++++- packages/kbn-esql-ast/src/walker/README.md | 125 ++++++++--- 6 files changed, 575 insertions(+), 108 deletions(-) create mode 100644 packages/kbn-esql-ast/src/builder/README.md diff --git a/packages/kbn-esql-ast/README.md b/packages/kbn-esql-ast/README.md index 76232d371b9cb..f7be5248f2ca0 100644 --- a/packages/kbn-esql-ast/README.md +++ b/packages/kbn-esql-ast/README.md @@ -1,89 +1,38 @@ -# ES|QL utility library +# ES|QL AST library -## Folder structure +The general idea of this package is to provide low-level ES|QL parsing, +building, traversal, pretty-printing, and manipulation features on top of a +custom compact AST representation, which is designed to be resilient to many +grammar changes. -This library brings all the foundation data structure to enable all advanced features within an editor for ES|QL as validation, autocomplete, hover, etc... -The package is structure as follow: +Contents of this package: -``` -src - |- antlr // => contains the ES|QL grammar files and various compilation assets - | ast_factory.ts // => binding to the Antlr that generates the AST data structure - | ast_errors.ts // => error translation utility from raw Antlr to something understandable (somewhat) - | antlr_error_listener.ts // => The ES|QL syntax error listener - | antlr_facade.ts // => getParser and getLexer utilities - | ... // => miscellaneas utilities to work with AST -``` - -### Basic usage - -#### Get AST from a query string +- [`builder` — Contains the `Builder` class for AST node construction](./src/builder/README.md). +- [`parser` — Contains text to ES|QL AST parsing code](./src/parser/README.md). +- [`walker` — Contains the ES|QL AST `Walker` utility](./src/walker/README.md). +- [`visitor` — Contains the ES|QL AST `Visitor` utility](./src/visitor/README.md). +- [`pretty_print` — Contains code for formatting AST to text](./src/pretty_print/README.md). -This module contains the entire logic to translate from a query string into the AST data structure. -The `getAstAndSyntaxErrors` function returns the AST data structure, unless a syntax error happens in which case the `errors` array gets populated with a Syntax error. -##### Usage +## Demo -```js -import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; +Much of the functionality of this package is demonstrated in the demo UI. You +can run it in Storybook, using the following command: -const queryString = "from index | stats 1 + avg(myColumn) "; -const { ast, errors} = await astProvider(queryString); - -if(errors){ - console.log({ syntaxErrors: errors }); -} -// do stuff with the ast +```bash +yarn storybook esql_ast_inspector ``` -## How does it work - -The general idea of this package is to provide all ES|QL features on top of a custom compact AST definition (all data structure types defined in `./types.ts`) which is designed to be resilient to many grammar changes. -The pipeline is the following: +Alternatively, you can start Kibana with *Example Plugins* enabled, using: +```bash +yarn start --run-examples ``` -Antlr grammar files -=> Compiled grammar files (.ts assets in the antlr folder) -=> AST Factory (Antlr Parser tree => custom AST) -``` - -Each feature function works with the combination of the AST and the definition files: the former describe the current statement in a easy to traverse way, while the definitions describe what's the expected behaviour of each node in the AST node (i.e. what arguments should it accept? How many arguments? etc...). -While AST requires the grammar to be compiled to be updated, definitions are static files which can be dynamically updated without running the ANTLR compile task. - -#### AST - -The AST is generated by 2 files: `ast_factory.ts` and its buddy `ast_walker.ts`: -* `ast_factory.ts` is a binding to Antlr and access the Parser tree -* Parser tree is passed over to `ast_walker` to append new AST nodes - -In general Antlr is resilient to grammar errors, in the sense that it can produe a Parser tree up to the point of the error, then stops. This is useful to perform partial tasks even with broken queries and this means that a partial AST can be produced even with an invalid query. - -### Keeping ES|QL up to date - -In general when operating on changes here use the `yarn kbn watch` in a terminal window to make sure changes are correctly compiled. - -### How to add new commands/options -When a new command/option is added to ES|QL it is done via a grammar update. -Therefore adding them requires a two step phase: -* Update the grammar with the new one - * add/fix all AST generator bindings in case of new/changed TOKENS in the `lexer` grammar file -* Update the definition files for commands/options +Then navigate to the *ES|QL AST Inspector* plugin in the Kibana UI. -To update the grammar: -1. Make sure the `lexer` and `parser` files are up to date with their ES counterparts - * an existing Kibana CI job is updating them already automatically -2. Run the script into the `package.json` to compile the ES|QL grammar. -3. open the `ast_factory.ts` file and add a new `exit` method -4. write some code in the `ast_walker/ts` to translate the Antlr Parser tree into the custom AST (there are already few utilites for that, but sometimes it is required to write some more code if the `parser` introduced a new flow) - * pro tip: use the `http://lab.antlr.org/` to visualize/debug the parser tree for a given statement (copy and paste the grammar files there) -5. if something goes wrong with new quoted/unquoted identifier token, open the `ast_helpers.ts` and check the ids of the new tokens in the `getQuotedText` and `getUnquotedText` functions - please make sure to leave a comment on the token name -#### Debug and fix grammar changes (tokens, etc...) +## Keeping ES|QL AST library up to date -On TOKEN renaming or with subtle `lexer` grammar changes it can happens that test breaks, this can be happen for two main issues: -* A TOKEN name changed so the `ast_walker.ts` doesn't find it any more. Go there and rename the TOKEN name. -* TOKEN order changed and tests started failing. This probably generated some TOKEN id reorder and there are two functions in `ast_helpers.ts` who rely on hardcoded ids: `getQuotedText` and `getUnquotedText`. - * Note that the `getQuotedText` and `getUnquotedText` are automatically updated on grammar changes detected by the Kibana CI sync job. - * to fix this just look at the commented tokens and update the ids. If a new token add it and leave a comment to point to the new token name. - * This choice was made to reduce the bundle size, as importing the `esql_parser` adds some hundreds of Kbs to the bundle otherwise. \ No newline at end of file +In general when operating on changes here use the `yarn kbn watch` in a terminal +window to make sure changes are correctly compiled. diff --git a/packages/kbn-esql-ast/src/builder/README.md b/packages/kbn-esql-ast/src/builder/README.md new file mode 100644 index 0000000000000..8b874579dab29 --- /dev/null +++ b/packages/kbn-esql-ast/src/builder/README.md @@ -0,0 +1,39 @@ +# Builder + +Contains the `Builder` class for AST node construction. It provides the most +low-level stateless AST node construction API. + +The `Builder` API can be used when constructing AST nodes from scratch manually, +and it is also used by the parser to construct the AST nodes during the parsing +process. + +When parsing the AST nodes will typically have more information, such as the +position in the source code, and other metadata. When constructing the AST nodes +manually, this information is not available, but the `Builder` API can still be +used as it permits to skip the metadata. + + +## Usage + +Construct a `literal` expression node: + +```typescript +import { Builder } from '@kbn/esql-ast'; + +const node = Builder.expression.literal.numeric({ value: 42, literalType: 'integer' }); +``` + +Returns: + +```js +{ + type: 'literal', + literalType: 'integer', + value: 42, + name: '42', + + location: { min: 0, max: 0 }, + text: '', + incomplete: false, +} +``` diff --git a/packages/kbn-esql-ast/src/parser/README.md b/packages/kbn-esql-ast/src/parser/README.md index 1500be94c40c8..e054c8999714c 100644 --- a/packages/kbn-esql-ast/src/parser/README.md +++ b/packages/kbn-esql-ast/src/parser/README.md @@ -1,6 +1,91 @@ +# ES|QL Parser + +The Kibana ES|QL parser uses the ANTLR library for lexing and parse tree (CST) +generation. The ANTLR grammar is imported from the Elasticsearch repository in +an automated CI job. + +We use the ANTLR outputs: (1) the token stream; and (2) the parse tree to +generate (1) the Abstract Syntax Tree (AST), (2) for syntax validation, (3) for +syntax highlighting, and (4) for formatting (comment and whitespace) extraction +and assignment to AST nodes. + +In general ANTLR is resilient to grammar errors, in the sense that it can +produce a Parser tree up to the point of the error, then stops. This is useful +to perform partial tasks even with broken queries and this means that a partial +AST can be produced even with an invalid query. + + +## Folder structure + +The parser is structured as follows: + +``` +src/ +|- parser/ Contains the logic to parse the ES|QL query and generate the AST. +| |- factories.ts Contains AST node factories. +| |- antlr_error_listener.ts Contains code which traverses ANTLR CST and collects syntax errors. +| |- esql_ast_builder_listener.ts Contains code which traverses ANTLR CST and builds the AST. +| +|- antlr/ Contains the autogenerated ES|QL ANTLR grammar files and various compilation assets. + |- esql_lexer.g4 Contains the ES|QL ANTLR lexer grammar. + |- esql_parser.g4 Contains the ES|QL ANTLR parser grammar. +``` + + +## Usage + +### Get AST from a query string + +The `parse` function returns the AST data structure, unless a syntax error +happens in which case the `errors` array gets populated with a Syntax errors. + +```js +import { parse } from '@kbn/esql-ast'; + +const src = "FROM index | STATS 1 + AVG(myColumn) "; +const { root, errors } = await parse(src); + +if(errors){ + console.log({ syntaxErrors: errors }); +} + +// do stuff with the ast +``` + +The `root` is the root node of the AST. The AST is a tree structure where each +node represents a part of the query. Each node has a `type` property which +indicates the type of the node. + + +### Parse a query and populate the AST with comments + +When calling the `parse` method with the `withFormatting` flag set to `true`, +the AST will be populated with comments. + +```js +import { parse } from '@kbn/esql-ast'; + +const src = "FROM /* COMMENT */ index"; +const { root } = await parse(src, { withFormatting: true }); +``` + + ## Comments -### Inter-node comment places +By default, when parsing the AST does not include any *formatting* information, +such as comments or whitespace. This is because the AST is designed to be +compact and to be used for syntax validation, syntax highlighting, and other +high-level operations. + +However, sometimes it is useful to have comments attached to the AST nodes. The +parser can collect all comments when the `withFormatting` flag is set to `true` +and attach them to the AST nodes. The comments are attached to the closest node, +while also considering the surrounding punctuation. + +### Inter-node comments + +Currently, when parsed inter-node comments are attached to the node from the +left side. Around colon in source identifier: @@ -25,3 +110,60 @@ Time interface expressions: ```eslq STATS 1 /* asdf */ DAY ``` + + +## Internal Details + + +### How does it work? + +The pipeline is the following: + +1. ANTLR grammar files are added to Kibana. +2. ANTLR grammar files are compiled to `.ts` assets in the `antlr` folder. +3. A query is parsed to a CST by ANTLR. +4. The `ESQLAstBuilderListener` traverses the CST and builds the AST. +5. Optionally: + 1. Comments and whitespace are extracted from the ANTLR lexer's token stream. + 2. The comments and whitespace are attached to the AST nodes. + + +### How to add new commands/options? + +When a new command/option is added to ES|QL it is done via a grammar update. +Therefore adding them requires a two step phase: + +To update the grammar: + +1. Make sure the `lexer` and `parser` files are up to date with their ES + counterparts. + * an existing Kibana CI job is updating them already automatically +2. Run the script into the `package.json` to compile the ES|QL grammar. +3. open the `ast_factory.ts` file and add a new `exit` method +4. write some code in the `ast_walker/ts` to translate the Antlr Parser tree + into the custom AST (there are already few utilites for that, but sometimes + it is required to write some more code if the `parser` introduced a new flow) + * pro tip: use the `http://lab.antlr.org/` to visualize/debug the parser tree + for a given statement (copy and paste the grammar files there) +5. if something goes wrong with new quoted/unquoted identifier token, open + the `ast_helpers.ts` and check the ids of the new tokens in the `getQuotedText` + and `getUnquotedText` functions, please make sure to leave a comment on the + token name + + +#### Debug and fix grammar changes (tokens, etc...) + +On token renaming or with subtle `lexer` grammar changes it can happens that +test breaks, this can be happen for two main issues: + +* A token name changed so the `esql_ast_builder_listener.ts` doesn't find it any + more. Go there and rename the TOKEN name. +* Token order changed and tests started failing. This probably generated some + token id reorder and there are two functions in `helpers.ts` who rely on + hardcoded ids: `getQuotedText` and `getUnquotedText`. + * Note that the `getQuotedText` and `getUnquotedText` are automatically + updated on grammar changes detected by the Kibana CI sync job. + * to fix this just look at the commented tokens and update the ids. If a new + token add it and leave a comment to point to the new token name. + * This choice was made to reduce the bundle size, as importing the + `esql_parser` adds some hundreds of Kbs to the bundle otherwise. diff --git a/packages/kbn-esql-ast/src/pretty_print/README.md b/packages/kbn-esql-ast/src/pretty_print/README.md index 48066697a5a7e..1d600fc19d3bc 100644 --- a/packages/kbn-esql-ast/src/pretty_print/README.md +++ b/packages/kbn-esql-ast/src/pretty_print/README.md @@ -4,20 +4,82 @@ human-readable string. This is useful for debugging or for displaying the AST to the user. -This module provides a number of pretty-printing options. +This module provides a number of pretty-printing facilities. There are two +main classes that provide pretty-printing: + +- `BasicPrettyPrinter` — provides the basic pretty-printing to a single + line. +- `WrappingPrettyPrinter` — provides more advanced pretty-printing, which + can wrap the query to multiple lines, and can also wrap the query to a + specific width. ## `BasicPrettyPrinter` -The `BasicPrettyPrinter` class provides the most basic pretty-printing—it -prints a query to a single line. Or it can print a query with each command on -a separate line, with the ability to customize the indentation before the pipe -character. +The `BasicPrettyPrinter` class provides the simpler pretty-printing +functionality—it prints a query to a single line. Or, it can print a query +with each command on a separate line, with the ability to customize the +indentation before the pipe character. + +Usage: + +```typescript +import { parse, BasicPrettyPrinter } from '@kbn/esql-ast'; + +const src = 'FROM index | LIMIT 10'; +const { root } = parse(src); +const text = BasicPrettyPrinter.print(root); + +console.log(text); // FROM index | LIMIT 10 +``` + +It can print each command on a separate line, with a custom indentation before +the pipe character: + +```typescript +const text = BasicPrettyPrinter.multiline(root, { pipeTab: ' ' }); +``` It can also print a single command to a single line; or an expression to a -single line. +single line. Below is the summary of the top-level functions: - `BasicPrettyPrinter.print()` — prints query to a single line. - `BasicPrettyPrinter.multiline()` — prints a query to multiple lines. - `BasicPrettyPrinter.command()` — prints a command to a single line. -- `BasicPrettyPrinter.expression()` — prints an expression to a single line. +- `BasicPrettyPrinter.expression()` — prints an expression to a single + line. + +See `BasicPrettyPrinterOptions` for formatting options. For example, a +`lowercase` options allows you to lowercase all ES|QL keywords: + +```typescript +const text = BasicPrettyPrinter.print(root, { lowercase: true }); +``` + +The `BasicPrettyPrinter` prints only *left* and *right* multi-line comments, +which do not have line breaks, as this formatter is designed to print a query +to a single line. If you need to print a query to multiple lines, use the +`WrappingPrettyPrinter`. + + +## `WrappingPrettyPrinter` + +The *wrapping pretty printer* can print a query to multiple lines, and can wrap +the text to a new line if the line width exceeds a certain threshold. It also +prints all comments attached to the AST (including ones that force the text +to be wrapped). + +Usage: + +```typescript +import { parse, WrappingPrettyPrinter } from '@kbn/esql-ast'; + +const src = ` + FROM index /* this is a comment */ + | LIMIT 10`; +const { root } = parse(src, { withFormatting: true }); +const text = WrappingPrettyPrinter.print(root); +``` + +See `WrappingPrettyPrinterOptions` interface for available formatting options. + diff --git a/packages/kbn-esql-ast/src/visitor/README.md b/packages/kbn-esql-ast/src/visitor/README.md index c952c8a34d8d9..20d55c0967e10 100644 --- a/packages/kbn-esql-ast/src/visitor/README.md +++ b/packages/kbn-esql-ast/src/visitor/README.md @@ -1,4 +1,28 @@ -## High-level AST structure +# `Visitor` Traversal API + +The `Visitor` traversal API provides a feature-rich way to traverse the ES|QL +AST. It is more powerful than the [`Walker` API](../walker/README.md), as it +allows to traverse the AST in a more flexible way. + +The `Visitor` API allows to traverse the AST starting from the root node or a +command statement, or an expression. Unlike in the `Walker` API, the `Visitor` +does not automatically traverse the entire AST. Instead, the developer has to +manually call the necessary *visit* methods to traverse the AST. This allows +to traverse the AST in a more flexible way: only traverse the parts of the AST +that are needed, or maybe traverse the AST in a different order, or multiple +times. + +The `Visitor` API is also more powerful than the `Walker` API, as for each +visitor callback it provides a *context* object, which contains the information +about the current node as well as the parent node, and the whole parent chain +up to the root node. + +In addition, each visitor callback can return a value (*output*), which is then +passed to the parent node, in the place where the visitor was called. Also, when +a child is visited, the parent node can pass in *input* to the child visitor. + + +## About ES|QL AST structure Broadly, there are two AST node types: (1) commands (say `FROM ...`, like *statements* in other languages), and (2) expressions (say `a + b`, or `fn()`). @@ -59,7 +83,8 @@ As of this writing, the following expressions are defined: - Column identifier expression, `{type: "column"}`, like `@timestamp` - Function call expression, `{type: "function"}`, like `fn(123)` - Literal expression, `{type: "literal"}`, like `123`, `"hello"` -- List literal expression, `{type: "list"}`, like `[1, 2, 3]`, `["a", "b", "c"]`, `[true, false]` +- List literal expression, `{type: "list"}`, like `[1, 2, 3]`, + `["a", "b", "c"]`, `[true, false]` - Time interval expression, `{type: "interval"}`, like `1h`, `1d`, `1w` - Inline cast expression, `{type: "cast"}`, like `abc::int`, `def::string` - Unknown node, `{type: "unknown"}` @@ -67,3 +92,176 @@ As of this writing, the following expressions are defined: Each expression has a `visitExpressionX` callback, where `X` is the type of the expression. If a expression-specific callback is not found, the generic `visitExpression` callback is called. + + +## `Visitor` API Usage + +The `Visitor` API is used to traverse the AST. The process is as follows: + +1. Create a new `Visitor` instance. +2. Register callbacks for the nodes you are interested in. +3. Call the `visitQuery`, `visitCommand`, or `visitExpression` method to start + the traversal. + +For example, the below code snippet prints the type of each expression node: + +```typescript +new Visitor() + .on('visitExpression', (ctx) => console.log(ctx.node.type)) + .on('visitCommand', (ctx) => [...ctx.visitArguments()]) + .on('visitQuery', (ctx) => [...ctx.visitCommands()]) + .visitQuery(root); +``` + +In the `visitQuery` callback it visits all commands, using the `visitCommands`. +In the `visitCommand` callback it visits all arguments, using the +`visitArguments`. And finally, in the `visitExpression` callback it prints the +type of the expression node. + +Above we started the traversal from the root node, using the `.visitQuery(root)` +method. However, one can start the traversal from any node, by calling the +following methods: + +- `.visitQuery()` — Start traversal from the root node. +- `.visitCommand()` — Start traversal from a command node. +- `.visitExpression()` — Start traversal from an expression node. + + +### Specifying Callbacks + +The simplest way to traverse the AST is to specify the below three callbacks: + +- `visitQuery` — Called for every query node. (Normally once.) +- `visitCommand` — Called for every command node. +- `visitExpression` — Called for every expression node. + + +However, you can be more specific and specify callbacks for commands and +expression types. This way the context `ctx` provided to the callback will have +helpful methods specific to the node type. + +When a more specific callback is not found, the generic `visitCommand` or +`visitExpression` callbacks are not called for that node. + +You can specify a specific callback for each command, instead of the generic +`visitCommand`: + +- `visitFromCommand` — Called for every `FROM` command node. +- `visitLimitCommand` — Called for every `LIMIT` command node. +- `visitExplainCommand` — Called for every `EXPLAIN` command node. +- `visitRowCommand` — Called for every `ROW` command node. +- `visitMetricsCommand` — Called for every `METRICS` command node. +- `visitShowCommand` — Called for every `SHOW` command node. +- `visitMetaCommand` — Called for every `META` command node. +- `visitEvalCommand` — Called for every `EVAL` command node. +- `visitStatsCommand` — Called for every `STATS` command node. +- `visitInlineStatsCommand` — Called for every `INLINESTATS` command node. +- `visitLookupCommand` — Called for every `LOOKUP` command node. +- `visitKeepCommand` — Called for every `KEEP` command node. +- `visitSortCommand` — Called for every `SORT` command node. +- `visitWhereCommand` — Called for every `WHERE` command node. +- `visitDropCommand` — Called for every `DROP` command node. +- `visitRenameCommand` — Called for every `RENAME` command node. +- `visitDissectCommand` — Called for every `DISSECT` command node. +- `visitGrokCommand` — Called for every `GROK` command node. +- `visitEnrichCommand` — Called for every `ENRICH` command node. +- `visitMvExpandCommand` — Called for every `MV_EXPAND` command node. + +Similarly, you can specify a specific callback for each expression type, instead +of the generic `visitExpression`: + +- `visitColumnExpression` — Called for every column expression node, say + `@timestamp`. +- `visitSourceExpression` — Called for every source expression node, say + `tsdb_index`. +- `visitFunctionCallExpression` — Called for every function call + expression node. Including binary expressions, such as `a + b`. +- `visitLiteralExpression` — Called for every literal expression node, say + `123`, `"hello"`. +- `visitListLiteralExpression` — Called for every list literal expression + node, say `[1, 2, 3]`, `["a", "b", "c"]`. +- `visitTimeIntervalLiteralExpression` — Called for every time interval + literal expression node, say `1h`, `1d`, `1w`. +- `visitInlineCastExpression` — Called for every inline cast expression + node, say `abc::int`, `def::string`. +- `visitRenameExpression` — Called for every rename expression node, say + `a AS b`. +- `visitOrderExpression` — Called for every order expression node, say + `@timestamp ASC`. + + +### Using the Node Context + +Each visitor callback receives a `ctx` object, which contains the reference to +the parent node's context: + +```typescript +new Visitor() + .on('visitExpression', (ctx) => { + ctx.parent + }); +``` + +Each visitor callback also contains various methods to visit the children nodes, +if needed. For example, to visit all arguments of a command node: + +```typescript +const expressions = []; + +new Visitor() + .on('visitExpression', (ctx) => expressions.push(ctx.node)); + .on('visitCommand', (ctx) => { + for (const output of ctx.visitArguments()) { + } + }); +``` + +The node context object may also have node specific methods. For example, the +`LIMIT` command context has the `.numeric()` method, which returns the numeric +value of the `LIMIT` command: + +```typescript +new Visitor() + .on('visitLimitCommand', (ctx) => { + console.log(ctx.numeric()); + }) + .on('visitCommand', () => null) + .on('visitQuery', (ctx) => [...ctx.visitCommands()]) + .visitQuery(root); +``` + + +### Using the Visitor Output + +Each visitor callback can return a *output*, which is then passed to the parent +callback. This allows to pass information from the child node to the parent +node. + +For example, the below code snippet collects all column names in the AST: + +```typescript +const columns = new Visitor() + .on('visitExpression', (ctx) => null) + .on('visitColumnExpression', (ctx) => ctx.node.name) + .on('visitCommand', (ctx) => [...ctx.visitArguments()]) + .on('visitQuery', (ctx) => [...ctx.visitCommands()]) + .visitQuery(root); +``` + + +### Using the Visitor Input + +Analogous to the output, each visitor callback can receive an *input* value. +This allows to pass information from the parent node to the child node. + +For example, the below code snippet prints all column names prefixed with the +text `"prefix"`: + +```typescript +new Visitor() + .on('visitExpression', (ctx) => null) + .on('visitColumnExpression', (ctx, INPUT) => console.log(INPUT + ctx.node.name)) + .on('visitCommand', (ctx) => [...ctx.visitArguments("prefix")]) + .on('visitQuery', (ctx) => [...ctx.visitCommands()]) + .visitQuery(root); +``` diff --git a/packages/kbn-esql-ast/src/walker/README.md b/packages/kbn-esql-ast/src/walker/README.md index 74e834e9095bc..4614350279b0c 100644 --- a/packages/kbn-esql-ast/src/walker/README.md +++ b/packages/kbn-esql-ast/src/walker/README.md @@ -1,41 +1,118 @@ -# ES|QL AST Walker +# `Walker` Traversal API -The ES|QL AST Walker is a utility that traverses the ES|QL AST and provides a -set of callbacks that can be used to perform introspection of the AST. +The ES|QL AST `Walker` is a utility that traverses the ES|QL AST. The developer +can provide a set of callbacks which are called when the walker visits a +specific type of node. + +The `Walker` utility allows to traverse the AST starting from any node, not just +the root node. + + +## Low-level API To start a new *walk* you create a `Walker` instance and call the `walk()` method with the AST node to start the walk from. ```ts - -import { Walker, getAstAndSyntaxErrors } from '@kbn/esql-ast'; +import { Walker } from '@kbn/esql-ast'; const walker = new Walker({ - // Called every time a function node is visited. - visitFunction: (fn) => { + /** + * Visit commands + */ + visitCommand: (node: ESQLCommand) => { + // Called for every command node. + }, + visitCommandOption: (node: ESQLCommandOption) => { + // Called for every command option node. + }, + + /** + * Visit expressions + */ + visitFunction: (fn: ESQLFunction) => { + // Called every time a function expression is visited. console.log('Function:', fn.name); }, - // Called every time a source identifier node is visited. - visitSource: (source) => { + visitSource: (source: ESQLSource) => { + // Called every time a source identifier expression is visited. console.log('Source:', source.name); }, + visitQuery: (node: ESQLAstQueryExpression) => { + // Called for every query node. + }, + visitColumn: (node: ESQLColumn) => { + // Called for every column node. + }, + visitLiteral: (node: ESQLLiteral) => { + // Called for every literal node. + }, + visitListLiteral: (node: ESQLList) => { + // Called for every list literal node. + }, + visitTimeIntervalLiteral: (node: ESQLTimeInterval) => { + // Called for every time interval literal node. + }, + visitInlineCast: (node: ESQLInlineCast) => { + // Called for every inline cast node. + }, }); -const { ast } = getAstAndSyntaxErrors('FROM source | STATS fn()'); walker.walk(ast); ``` -Conceptual structure of an ES|QL AST: - -- A single ES|QL query is composed of one or more source commands and zero or - more transformation commands. -- Each command is represented by a `command` node. -- Each command contains a list expressions named in ES|QL AST as *AST Item*. - - `function` — function call expression. - - `option` — a list of expressions with a specific role in the command. - - `source` — s source identifier expression. - - `column` — a field identifier expression. - - `timeInterval` — a time interval expression. - - `list` — a list literal expression. - - `literal` — a literal expression. - - `inlineCast` — an inline cast expression. +It is also possible to provide a single `visitAny` callback that is called for +any node type that does not have a specific visitor. + +```ts +import { Walker } from '@kbn/esql-ast'; + +const walker = new Walker({ + visitAny?: (node: ESQLProperNode) => { + // Called for any node type that does not have a specific visitor. + }, +}); + +walker.walk(ast); +``` + + +## High-level API + +There are few high-level utility functions that are implemented on top of the +low-level API, for your convenience: + +- `Walker.walk` — Walks the AST and calls the appropriate visitor functions. +- `Walker.commands` — Walks the AST and extracts all command statements. +- `Walker.params` — Walks the AST and extracts all parameter literals. +- `Walker.find` — Finds and returns the first node that matches the search criteria. +- `Walker.findAll` — Finds and returns all nodes that match the search criteria. +- `Walker.match` — Matches a single node against a template object. +- `Walker.matchAll` — Matches all nodes against a template object. +- `Walker.findFunction` — Finds the first function that matches the predicate. +- `Walker.hasFunction` — Searches for at least one occurrence of a function or expression in the AST. +- `Walker.visitComments` — Visits all comments in the AST. + +The `Walker.walk()` method is simply a sugar syntax around the low-level +`new Walker().walk()` method. + +The `Walker.commands()` method returns a list of all commands. This also +includes nested commands, once they become supported in ES|QL. + +The `Walker.params()` method collects all param literals, such as unnamed `?` or +named `?param`, or ordered `?1`. + +The `Walker.find()` and `Walker.findAll()` methods are used to search for nodes +in the AST that match a specific criteria. The criteria is specified using a +predicate function. + +The `Walker.match()` and `Walker.matchAll()` methods are also used to search for +nodes in the AST, but unlike `find` and `findAll`, they use a template object +to match the nodes. + +The `Walker.findFunction()` is a simple utility to find the first function that +matches a predicate. The `Walker.hasFunction()` returns `true` if at least one +function or expression in the AST matches the predicate. + +The `Walker.visitComments()` method is used to visit all comments in the AST. +You specify a callback that is called for each comment node. From 7aa64b6ed59488ab10a5136199b69de0c86668af Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Mon, 30 Sep 2024 18:20:21 +0200 Subject: [PATCH 021/107] [OneDiscover] Add EBT event to track field usage (#193996) - Closes https://github.com/elastic/kibana/issues/186156 - Closes https://github.com/elastic/kibana/issues/189454 ## Summary This PR adds new EBT event type `discover_field_usage` which we use for tracking adding and removing grid columns and adding filters via +/-/exists buttons. Properties of the added events consist of: `eventType`: `dataTableSelection`, `dataTableRemoval`, or `filterAddition` `fieldName`: name of the field if it's from ECS schema `filterOperation`: `+`, `-`, or `_exists_` Screenshot 2024-09-25 at 17 51 27 ## Testing Enable "Usage collection" global setting. Navigate to Discover and observe `kibana-browser` requests in Network tab. ### 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 --- .../discover/public/__mocks__/services.ts | 2 + .../application/context/context_app.test.tsx | 1 + .../application/context/context_app.tsx | 31 +- .../components/layout/discover_documents.tsx | 32 +- .../components/layout/discover_layout.tsx | 40 ++- src/plugins/discover/public/build_services.ts | 10 +- .../context_awareness/__mocks__/index.tsx | 8 +- .../profiles_manager.test.ts | 4 +- .../context_awareness/profiles_manager.ts | 10 +- src/plugins/discover/public/plugin.tsx | 86 +++-- .../discover_ebt_context_manager.test.ts | 95 ----- .../services/discover_ebt_context_manager.ts | 75 ---- .../services/discover_ebt_manager.test.ts | 242 +++++++++++++ .../public/services/discover_ebt_manager.ts | 219 ++++++++++++ .../context_awareness/_data_source_profile.ts | 101 +----- .../discover/context_awareness/_telemetry.ts | 326 ++++++++++++++++++ .../apps/discover/context_awareness/index.ts | 1 + 17 files changed, 946 insertions(+), 337 deletions(-) delete mode 100644 src/plugins/discover/public/services/discover_ebt_context_manager.test.ts delete mode 100644 src/plugins/discover/public/services/discover_ebt_context_manager.ts create mode 100644 src/plugins/discover/public/services/discover_ebt_manager.test.ts create mode 100644 src/plugins/discover/public/services/discover_ebt_manager.ts create mode 100644 test/functional/apps/discover/context_awareness/_telemetry.ts diff --git a/src/plugins/discover/public/__mocks__/services.ts b/src/plugins/discover/public/__mocks__/services.ts index 3d78239558f3e..f00d105444630 100644 --- a/src/plugins/discover/public/__mocks__/services.ts +++ b/src/plugins/discover/public/__mocks__/services.ts @@ -45,6 +45,7 @@ import { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; import { urlTrackerMock } from './url_tracker.mock'; import { createElement } from 'react'; import { createContextAwarenessMocks } from '../context_awareness/__mocks__'; +import { DiscoverEBTManager } from '../services/discover_ebt_manager'; export function createDiscoverServicesMock(): DiscoverServices { const dataPlugin = dataPluginMock.createStartContract(); @@ -245,6 +246,7 @@ export function createDiscoverServicesMock(): DiscoverServices { singleDocLocator: { getRedirectUrl: jest.fn(() => '') }, urlTracker: urlTrackerMock, profilesManager: profilesManagerMock, + ebtManager: new DiscoverEBTManager(), setHeaderActionMenu: jest.fn(), } as unknown as DiscoverServices; } diff --git a/src/plugins/discover/public/application/context/context_app.test.tsx b/src/plugins/discover/public/application/context/context_app.test.tsx index 9c77d1e40bbb2..7a99194cad575 100644 --- a/src/plugins/discover/public/application/context/context_app.test.tsx +++ b/src/plugins/discover/public/application/context/context_app.test.tsx @@ -72,6 +72,7 @@ describe('ContextApp test', () => { contextLocator: { getRedirectUrl: jest.fn(() => '') }, singleDocLocator: { getRedirectUrl: jest.fn(() => '') }, profilesManager: discoverServices.profilesManager, + ebtManager: discoverServices.ebtManager, timefilter: discoverServices.timefilter, uiActions: discoverServices.uiActions, } as unknown as DiscoverServices; diff --git a/src/plugins/discover/public/application/context/context_app.tsx b/src/plugins/discover/public/application/context/context_app.tsx index e0dfa985b594e..b0fc1342a8f72 100644 --- a/src/plugins/discover/public/application/context/context_app.tsx +++ b/src/plugins/discover/public/application/context/context_app.tsx @@ -56,6 +56,8 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => navigation, filterManager, core, + ebtManager, + fieldsMetadata, } = services; const isLegacy = useMemo(() => uiSettings.get(DOC_TABLE_LEGACY), [uiSettings]); @@ -199,15 +201,36 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => ); const addFilter = useCallback( - async (field: DataViewField | string, values: unknown, operation: string) => { + async (field: DataViewField | string, values: unknown, operation: '+' | '-') => { const newFilters = generateFilters(filterManager, field, values, operation, dataView); filterManager.addFilters(newFilters); if (dataViews) { const fieldName = typeof field === 'string' ? field : field.name; await popularizeField(dataView, fieldName, dataViews, capabilities); + void ebtManager.trackFilterAddition({ + fieldName: fieldName === '_exists_' ? String(values) : fieldName, + filterOperation: fieldName === '_exists_' ? '_exists_' : operation, + fieldsMetadata, + }); } }, - [filterManager, dataViews, dataView, capabilities] + [filterManager, dataViews, dataView, capabilities, ebtManager, fieldsMetadata] + ); + + const onAddColumnWithTracking = useCallback( + (columnName: string) => { + onAddColumn(columnName); + void ebtManager.trackDataTableSelection({ fieldName: columnName, fieldsMetadata }); + }, + [onAddColumn, ebtManager, fieldsMetadata] + ); + + const onRemoveColumnWithTracking = useCallback( + (columnName: string) => { + onRemoveColumn(columnName); + void ebtManager.trackDataTableRemoval({ fieldName: columnName, fieldsMetadata }); + }, + [onRemoveColumn, ebtManager, fieldsMetadata] ); const TopNavMenu = navigation.ui.AggregateQueryTopNavMenu; @@ -271,8 +294,8 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => isLegacy={isLegacy} columns={columns} grid={appState.grid} - onAddColumn={onAddColumn} - onRemoveColumn={onRemoveColumn} + onAddColumn={onAddColumnWithTracking} + onRemoveColumn={onRemoveColumnWithTracking} onSetColumns={onSetColumns} predecessorCount={appState.predecessorCount} successorCount={appState.successorCount} diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index 2fe2a4f5a8f93..77befc4dc334f 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -117,7 +117,7 @@ function DiscoverDocumentsComponent({ const services = useDiscoverServices(); const documents$ = stateContainer.dataState.data$.documents$; const savedSearch = useSavedSearchInitial(); - const { dataViews, capabilities, uiSettings, uiActions } = services; + const { dataViews, capabilities, uiSettings, uiActions, ebtManager, fieldsMetadata } = services; const [ dataSource, query, @@ -200,6 +200,22 @@ function DiscoverDocumentsComponent({ settings: grid, }); + const onAddColumnWithTracking = useCallback( + (columnName: string) => { + onAddColumn(columnName); + void ebtManager.trackDataTableSelection({ fieldName: columnName, fieldsMetadata }); + }, + [onAddColumn, ebtManager, fieldsMetadata] + ); + + const onRemoveColumnWithTracking = useCallback( + (columnName: string) => { + onRemoveColumn(columnName); + void ebtManager.trackDataTableRemoval({ fieldName: columnName, fieldsMetadata }); + }, + [onRemoveColumn, ebtManager, fieldsMetadata] + ); + const setExpandedDoc = useCallback( (doc: DataTableRecord | undefined) => { stateContainer.internalState.transitions.setExpandedDoc(doc); @@ -299,14 +315,22 @@ function DiscoverDocumentsComponent({ columnsMeta={customColumnsMeta} savedSearchId={savedSearch.id} onFilter={onAddFilter} - onRemoveColumn={onRemoveColumn} - onAddColumn={onAddColumn} + onRemoveColumn={onRemoveColumnWithTracking} + onAddColumn={onAddColumnWithTracking} onClose={() => setExpandedDoc(undefined)} setExpandedDoc={setExpandedDoc} query={query} /> ), - [dataView, onAddColumn, onAddFilter, onRemoveColumn, query, savedSearch.id, setExpandedDoc] + [ + dataView, + onAddColumnWithTracking, + onAddFilter, + onRemoveColumnWithTracking, + query, + savedSearch.id, + setExpandedDoc, + ] ); const configRowHeight = uiSettings.get(ROW_HEIGHT_OPTION); diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index 49e645e3f2206..bc9cad72a5eb6 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -78,6 +78,8 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { spaces, observabilityAIAssistant, dataVisualizer: dataVisualizerService, + ebtManager, + fieldsMetadata, } = useDiscoverServices(); const pageBackgroundColor = useEuiBackgroundColor('plain'); const globalQueryState = data.query.getState(); @@ -154,6 +156,22 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { settings: grid, }); + const onAddColumnWithTracking = useCallback( + (columnName: string) => { + onAddColumn(columnName); + void ebtManager.trackDataTableSelection({ fieldName: columnName, fieldsMetadata }); + }, + [onAddColumn, ebtManager, fieldsMetadata] + ); + + const onRemoveColumnWithTracking = useCallback( + (columnName: string) => { + onRemoveColumn(columnName); + void ebtManager.trackDataTableRemoval({ fieldName: columnName, fieldsMetadata }); + }, + [onRemoveColumn, ebtManager, fieldsMetadata] + ); + // The assistant is getting the state from the url correctly // expect from the index pattern where we have only the dataview id useEffect(() => { @@ -175,9 +193,14 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { if (trackUiMetric) { trackUiMetric(METRIC_TYPE.CLICK, 'filter_added'); } + void ebtManager.trackFilterAddition({ + fieldName: fieldName === '_exists_' ? String(values) : fieldName, + filterOperation: fieldName === '_exists_' ? '_exists_' : operation, + fieldsMetadata, + }); return filterManager.addFilters(newFilters); }, - [filterManager, dataView, dataViews, trackUiMetric, capabilities] + [filterManager, dataView, dataViews, trackUiMetric, capabilities, ebtManager, fieldsMetadata] ); const getOperator = (fieldName: string, values: unknown, operation: '+' | '-') => { @@ -222,8 +245,13 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { if (trackUiMetric) { trackUiMetric(METRIC_TYPE.CLICK, 'esql_filter_added'); } + void ebtManager.trackFilterAddition({ + fieldName: fieldName === '_exists_' ? String(values) : fieldName, + filterOperation: fieldName === '_exists_' ? '_exists_' : operation, + fieldsMetadata, + }); }, - [data.query.queryString, query, trackUiMetric] + [data.query.queryString, query, trackUiMetric, ebtManager, fieldsMetadata] ); const onFilter = isEsqlMode ? onPopulateWhereClause : onAddFilter; @@ -274,8 +302,8 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { return undefined; } - return () => onAddColumn(draggingFieldName); - }, [onAddColumn, draggingFieldName, currentColumns]); + return () => onAddColumnWithTracking(draggingFieldName); + }, [onAddColumnWithTracking, draggingFieldName, currentColumns]); const [sidebarToggleState$] = useState>( () => new BehaviorSubject({ isCollapsed: false, toggle: () => {} }) @@ -396,10 +424,10 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { sidebarPanel={ { const { usageCollection } = plugins; @@ -223,7 +223,7 @@ export const buildServices = memoize( noDataPage: plugins.noDataPage, observabilityAIAssistant: plugins.observabilityAIAssistant, profilesManager, - ebtContextManager, + ebtManager, fieldsMetadata: plugins.fieldsMetadata, logsDataAccess: plugins.logsDataAccess, }; diff --git a/src/plugins/discover/public/context_awareness/__mocks__/index.tsx b/src/plugins/discover/public/context_awareness/__mocks__/index.tsx index a15b7aa26a8a0..153d401cc980a 100644 --- a/src/plugins/discover/public/context_awareness/__mocks__/index.tsx +++ b/src/plugins/discover/public/context_awareness/__mocks__/index.tsx @@ -23,7 +23,7 @@ import { } from '../profiles'; import { ProfileProviderServices } from '../profile_providers/profile_provider_services'; import { ProfilesManager } from '../profiles_manager'; -import { DiscoverEBTContextManager } from '../../services/discover_ebt_context_manager'; +import { DiscoverEBTManager } from '../../services/discover_ebt_manager'; import { createLogsContextServiceMock } from '@kbn/discover-utils/src/__mocks__'; export const createContextAwarenessMocks = ({ @@ -152,12 +152,12 @@ export const createContextAwarenessMocks = ({ documentProfileServiceMock.registerProvider(documentProfileProviderMock); } - const ebtContextManagerMock = new DiscoverEBTContextManager(); + const ebtManagerMock = new DiscoverEBTManager(); const profilesManagerMock = new ProfilesManager( rootProfileServiceMock, dataSourceProfileServiceMock, documentProfileServiceMock, - ebtContextManagerMock + ebtManagerMock ); const profileProviderServices = createProfileProviderServicesMock(); @@ -173,7 +173,7 @@ export const createContextAwarenessMocks = ({ contextRecordMock2, profilesManagerMock, profileProviderServices, - ebtContextManagerMock, + ebtManagerMock, }; }; diff --git a/src/plugins/discover/public/context_awareness/profiles_manager.test.ts b/src/plugins/discover/public/context_awareness/profiles_manager.test.ts index 87965edbe7488..da5ad8b56dcf3 100644 --- a/src/plugins/discover/public/context_awareness/profiles_manager.test.ts +++ b/src/plugins/discover/public/context_awareness/profiles_manager.test.ts @@ -21,7 +21,7 @@ describe('ProfilesManager', () => { beforeEach(() => { jest.clearAllMocks(); mocks = createContextAwarenessMocks(); - jest.spyOn(mocks.ebtContextManagerMock, 'updateProfilesContextWith'); + jest.spyOn(mocks.ebtManagerMock, 'updateProfilesContextWith'); }); it('should return default profiles', () => { @@ -62,7 +62,7 @@ describe('ProfilesManager', () => { mocks.documentProfileProviderMock.profile, ]); - expect(mocks.ebtContextManagerMock.updateProfilesContextWith).toHaveBeenCalledWith([ + expect(mocks.ebtManagerMock.updateProfilesContextWith).toHaveBeenCalledWith([ 'root-profile', 'data-source-profile', ]); diff --git a/src/plugins/discover/public/context_awareness/profiles_manager.ts b/src/plugins/discover/public/context_awareness/profiles_manager.ts index 2c8b1c7d16cb0..6b7bef5e02294 100644 --- a/src/plugins/discover/public/context_awareness/profiles_manager.ts +++ b/src/plugins/discover/public/context_awareness/profiles_manager.ts @@ -25,7 +25,7 @@ import type { DocumentContext, } from './profiles'; import type { ContextWithProfileId } from './profile_service'; -import { DiscoverEBTContextManager } from '../services/discover_ebt_context_manager'; +import { DiscoverEBTManager } from '../services/discover_ebt_manager'; interface SerializedRootProfileParams { solutionNavId: RootProfileProviderParams['solutionNavId']; @@ -53,7 +53,7 @@ export interface GetProfilesOptions { export class ProfilesManager { private readonly rootContext$: BehaviorSubject>; private readonly dataSourceContext$: BehaviorSubject>; - private readonly ebtContextManager: DiscoverEBTContextManager; + private readonly ebtManager: DiscoverEBTManager; private prevRootProfileParams?: SerializedRootProfileParams; private prevDataSourceProfileParams?: SerializedDataSourceProfileParams; @@ -64,11 +64,11 @@ export class ProfilesManager { private readonly rootProfileService: RootProfileService, private readonly dataSourceProfileService: DataSourceProfileService, private readonly documentProfileService: DocumentProfileService, - ebtContextManager: DiscoverEBTContextManager + ebtManager: DiscoverEBTManager ) { this.rootContext$ = new BehaviorSubject(rootProfileService.defaultContext); this.dataSourceContext$ = new BehaviorSubject(dataSourceProfileService.defaultContext); - this.ebtContextManager = ebtContextManager; + this.ebtManager = ebtManager; } /** @@ -206,7 +206,7 @@ export class ProfilesManager { private trackActiveProfiles(rootContextProfileId: string, dataSourceContextProfileId: string) { const dscProfiles = [rootContextProfileId, dataSourceContextProfileId]; - this.ebtContextManager.updateProfilesContextWith(dscProfiles); + this.ebtManager.updateProfilesContextWith(dscProfiles); } } diff --git a/src/plugins/discover/public/plugin.tsx b/src/plugins/discover/public/plugin.tsx index e6430f82c62fe..dbbcc90a7d451 100644 --- a/src/plugins/discover/public/plugin.tsx +++ b/src/plugins/discover/public/plugin.tsx @@ -59,7 +59,7 @@ import { RootProfileService } from './context_awareness/profiles/root_profile'; import { DataSourceProfileService } from './context_awareness/profiles/data_source_profile'; import { DocumentProfileService } from './context_awareness/profiles/document_profile'; import { ProfilesManager } from './context_awareness/profiles_manager'; -import { DiscoverEBTContextManager } from './services/discover_ebt_context_manager'; +import { DiscoverEBTManager } from './services/discover_ebt_manager'; /** * Contains Discover, one of the oldest parts of Kibana @@ -149,8 +149,12 @@ export class DiscoverPlugin this.urlTracker = { setTrackedUrl, restorePreviousUrl, setTrackingEnabled }; this.stopUrlTracking = stopUrlTracker; - const ebtContextManager = new DiscoverEBTContextManager(); - ebtContextManager.initialize({ core }); + const ebtManager = new DiscoverEBTManager(); + ebtManager.initialize({ + core, + shouldInitializeCustomContext: true, + shouldInitializeCustomEvents: true, + }); core.application.register({ id: PLUGIN_ID, @@ -176,7 +180,7 @@ export class DiscoverPlugin window.dispatchEvent(new HashChangeEvent('hashchange')); }); - ebtContextManager.enable(); + ebtManager.enableContext(); const services = buildServices({ core: coreStart, @@ -188,12 +192,12 @@ export class DiscoverPlugin history: this.historyService.getHistory(), scopedHistory: this.scopedHistory, urlTracker: this.urlTracker!, - profilesManager: await this.createProfilesManager( - coreStart, - discoverStartPlugins, - ebtContextManager - ), - ebtContextManager, + profilesManager: await this.createProfilesManager({ + core: coreStart, + plugins: discoverStartPlugins, + ebtManager, + }), + ebtManager, setHeaderActionMenu: params.setHeaderActionMenu, }); @@ -226,7 +230,7 @@ export class DiscoverPlugin }); return () => { - ebtContextManager.disableAndReset(); + ebtManager.disableAndResetContext(); unlistenParentHistory(); unmount(); appUnMounted(); @@ -296,11 +300,12 @@ export class DiscoverPlugin } const getDiscoverServicesInternal = () => { + const ebtManager = new DiscoverEBTManager(); // It is not initialized outside of Discover return this.getDiscoverServices( core, plugins, - this.createEmptyProfilesManager(), - new DiscoverEBTContextManager() // it's not enabled outside of Discover + this.createEmptyProfilesManager({ ebtManager }), + ebtManager ); }; @@ -326,11 +331,15 @@ export class DiscoverPlugin return { rootProfileService, dataSourceProfileService, documentProfileService }; } - private createProfilesManager = async ( - core: CoreStart, - plugins: DiscoverStartPlugins, - ebtContextManager: DiscoverEBTContextManager - ) => { + private async createProfilesManager({ + core, + plugins, + ebtManager, + }: { + core: CoreStart; + plugins: DiscoverStartPlugins; + ebtManager: DiscoverEBTManager; + }) { const { registerProfileProviders } = await import('./context_awareness/profile_providers'); const { rootProfileService, dataSourceProfileService, documentProfileService } = this.createProfileServices(); @@ -341,7 +350,7 @@ export class DiscoverPlugin rootProfileService, dataSourceProfileService, documentProfileService, - ebtContextManager + ebtManager ); await registerProfileProviders({ @@ -349,21 +358,18 @@ export class DiscoverPlugin dataSourceProfileService, documentProfileService, enabledExperimentalProfileIds, - services: this.getDiscoverServices(core, plugins, profilesManager, ebtContextManager), + services: this.getDiscoverServices(core, plugins, profilesManager, ebtManager), }); return profilesManager; - }; - - private createEmptyProfilesManager() { - const { rootProfileService, dataSourceProfileService, documentProfileService } = - this.createProfileServices(); + } + private createEmptyProfilesManager({ ebtManager }: { ebtManager: DiscoverEBTManager }) { return new ProfilesManager( - rootProfileService, - dataSourceProfileService, - documentProfileService, - new DiscoverEBTContextManager() // it's not enabled outside of Discover + new RootProfileService(), + new DataSourceProfileService(), + new DocumentProfileService(), + ebtManager ); } @@ -371,7 +377,7 @@ export class DiscoverPlugin core: CoreStart, plugins: DiscoverStartPlugins, profilesManager: ProfilesManager, - ebtContextManager: DiscoverEBTContextManager + ebtManager: DiscoverEBTManager ) => { return buildServices({ core, @@ -383,11 +389,13 @@ export class DiscoverPlugin history: this.historyService.getHistory(), urlTracker: this.urlTracker!, profilesManager, - ebtContextManager, + ebtManager, }); }; private registerEmbeddable(core: CoreSetup, plugins: DiscoverSetupPlugins) { + const ebtManager = new DiscoverEBTManager(); // It is not initialized outside of Discover + const getStartServices = async () => { const [coreStart, deps] = await core.getStartServices(); return { @@ -396,16 +404,20 @@ export class DiscoverPlugin }; }; - const getDiscoverServicesInternal = async () => { + const getDiscoverServicesForEmbeddable = async () => { const [coreStart, deps] = await core.getStartServices(); - const ebtContextManager = new DiscoverEBTContextManager(); // it's not enabled outside of Discover - const profilesManager = await this.createProfilesManager(coreStart, deps, ebtContextManager); - return this.getDiscoverServices(coreStart, deps, profilesManager, ebtContextManager); + + const profilesManager = await this.createProfilesManager({ + core: coreStart, + plugins: deps, + ebtManager, + }); + return this.getDiscoverServices(coreStart, deps, profilesManager, ebtManager); }; plugins.embeddable.registerReactEmbeddableSavedObject({ onAdd: async (container, savedObject) => { - const services = await getDiscoverServicesInternal(); + const services = await getDiscoverServicesForEmbeddable(); const initialState = await deserializeState({ serializedState: { rawState: { savedObjectId: savedObject.id }, @@ -429,7 +441,7 @@ export class DiscoverPlugin plugins.embeddable.registerReactEmbeddableFactory(SEARCH_EMBEDDABLE_TYPE, async () => { const [startServices, discoverServices, { getSearchEmbeddableFactory }] = await Promise.all([ getStartServices(), - getDiscoverServicesInternal(), + getDiscoverServicesForEmbeddable(), import('./embeddable/get_search_embeddable_factory'), ]); diff --git a/src/plugins/discover/public/services/discover_ebt_context_manager.test.ts b/src/plugins/discover/public/services/discover_ebt_context_manager.test.ts deleted file mode 100644 index 3b2836325b671..0000000000000 --- a/src/plugins/discover/public/services/discover_ebt_context_manager.test.ts +++ /dev/null @@ -1,95 +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 { BehaviorSubject } from 'rxjs'; -import { coreMock } from '@kbn/core/public/mocks'; -import { DiscoverEBTContextManager } from './discover_ebt_context_manager'; - -const coreSetupMock = coreMock.createSetup(); - -describe('DiscoverEBTContextManager', () => { - let discoverEBTContextManager: DiscoverEBTContextManager; - - beforeEach(() => { - discoverEBTContextManager = new DiscoverEBTContextManager(); - }); - - describe('register', () => { - it('should register the context provider', () => { - discoverEBTContextManager.initialize({ core: coreSetupMock }); - - expect(coreSetupMock.analytics.registerContextProvider).toHaveBeenCalledWith({ - name: 'discover_context', - context$: expect.any(BehaviorSubject), - schema: { - discoverProfiles: { - type: 'array', - items: { - type: 'keyword', - _meta: { - description: 'List of active Discover context awareness profiles', - }, - }, - }, - }, - }); - }); - }); - - describe('updateProfilesWith', () => { - it('should update the profiles with the provided props', () => { - const dscProfiles = ['profile1', 'profile2']; - const dscProfiles2 = ['profile21', 'profile22']; - discoverEBTContextManager.initialize({ core: coreSetupMock }); - discoverEBTContextManager.enable(); - - discoverEBTContextManager.updateProfilesContextWith(dscProfiles); - expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); - - discoverEBTContextManager.updateProfilesContextWith(dscProfiles2); - expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles2); - }); - - it('should not update the profiles if profile list did not change', () => { - const dscProfiles = ['profile1', 'profile2']; - const dscProfiles2 = ['profile1', 'profile2']; - discoverEBTContextManager.initialize({ core: coreSetupMock }); - discoverEBTContextManager.enable(); - - discoverEBTContextManager.updateProfilesContextWith(dscProfiles); - expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); - - discoverEBTContextManager.updateProfilesContextWith(dscProfiles2); - expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); - }); - - it('should not update the profiles if not enabled yet', () => { - const dscProfiles = ['profile1', 'profile2']; - discoverEBTContextManager.initialize({ core: coreSetupMock }); - - discoverEBTContextManager.updateProfilesContextWith(dscProfiles); - expect(discoverEBTContextManager.getProfilesContext()).toEqual([]); - }); - - it('should not update the profiles after resetting unless enabled again', () => { - const dscProfiles = ['profile1', 'profile2']; - discoverEBTContextManager.initialize({ core: coreSetupMock }); - discoverEBTContextManager.enable(); - discoverEBTContextManager.updateProfilesContextWith(dscProfiles); - expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); - discoverEBTContextManager.disableAndReset(); - expect(discoverEBTContextManager.getProfilesContext()).toEqual([]); - discoverEBTContextManager.updateProfilesContextWith(dscProfiles); - expect(discoverEBTContextManager.getProfilesContext()).toEqual([]); - discoverEBTContextManager.enable(); - discoverEBTContextManager.updateProfilesContextWith(dscProfiles); - expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); - }); - }); -}); diff --git a/src/plugins/discover/public/services/discover_ebt_context_manager.ts b/src/plugins/discover/public/services/discover_ebt_context_manager.ts deleted file mode 100644 index 12ea918c495d9..0000000000000 --- a/src/plugins/discover/public/services/discover_ebt_context_manager.ts +++ /dev/null @@ -1,75 +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 { BehaviorSubject } from 'rxjs'; -import { isEqual } from 'lodash'; -import type { CoreSetup } from '@kbn/core-lifecycle-browser'; - -export interface DiscoverEBTContextProps { - discoverProfiles: string[]; // Discover Context Awareness Profiles -} -export type DiscoverEBTContext = BehaviorSubject; - -export class DiscoverEBTContextManager { - private isEnabled: boolean = false; - private ebtContext$: DiscoverEBTContext | undefined; - - constructor() {} - - // https://docs.elastic.dev/telemetry/collection/event-based-telemetry - public initialize({ core }: { core: CoreSetup }) { - const context$ = new BehaviorSubject({ - discoverProfiles: [], - }); - - core.analytics.registerContextProvider({ - name: 'discover_context', - context$, - schema: { - discoverProfiles: { - type: 'array', - items: { - type: 'keyword', - _meta: { - description: 'List of active Discover context awareness profiles', - }, - }, - }, - // If we decide to extend EBT context with more properties, we can do it here - }, - }); - - this.ebtContext$ = context$; - } - - public enable() { - this.isEnabled = true; - } - - public updateProfilesContextWith(discoverProfiles: DiscoverEBTContextProps['discoverProfiles']) { - if ( - this.isEnabled && - this.ebtContext$ && - !isEqual(this.ebtContext$.getValue().discoverProfiles, discoverProfiles) - ) { - this.ebtContext$.next({ - discoverProfiles, - }); - } - } - - public getProfilesContext() { - return this.ebtContext$?.getValue()?.discoverProfiles; - } - - public disableAndReset() { - this.updateProfilesContextWith([]); - this.isEnabled = false; - } -} diff --git a/src/plugins/discover/public/services/discover_ebt_manager.test.ts b/src/plugins/discover/public/services/discover_ebt_manager.test.ts new file mode 100644 index 0000000000000..0ed20dacdb0ce --- /dev/null +++ b/src/plugins/discover/public/services/discover_ebt_manager.test.ts @@ -0,0 +1,242 @@ +/* + * Copyright 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 { BehaviorSubject } from 'rxjs'; +import { coreMock } from '@kbn/core/public/mocks'; +import { DiscoverEBTManager } from './discover_ebt_manager'; +import { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; + +describe('DiscoverEBTManager', () => { + let discoverEBTContextManager: DiscoverEBTManager; + + const coreSetupMock = coreMock.createSetup(); + + const fieldsMetadata = { + getClient: jest.fn().mockResolvedValue({ + find: jest.fn().mockResolvedValue({ + fields: { + test: { + short: 'test', + }, + }, + }), + }), + } as unknown as FieldsMetadataPublicStart; + + beforeEach(() => { + discoverEBTContextManager = new DiscoverEBTManager(); + }); + + describe('register', () => { + it('should register the context provider and custom events', () => { + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: true, + shouldInitializeCustomEvents: true, + }); + + expect(coreSetupMock.analytics.registerContextProvider).toHaveBeenCalledWith({ + name: 'discover_context', + context$: expect.any(BehaviorSubject), + schema: { + discoverProfiles: { + type: 'array', + items: { + type: 'keyword', + _meta: { + description: 'List of active Discover context awareness profiles', + }, + }, + }, + }, + }); + + expect(coreSetupMock.analytics.registerEventType).toHaveBeenCalledWith({ + eventType: 'discover_field_usage', + schema: { + eventName: { + type: 'keyword', + _meta: { + description: + 'The name of the event that is tracked in the metrics i.e. dataTableSelection, dataTableRemoval', + }, + }, + fieldName: { + type: 'keyword', + _meta: { + description: "Field name if it's a part of ECS schema", + optional: true, + }, + }, + filterOperation: { + type: 'keyword', + _meta: { + description: "Operation type when a filter is added i.e. '+', '-', '_exists_'", + optional: true, + }, + }, + }, + }); + }); + }); + + describe('updateProfilesWith', () => { + it('should update the profiles with the provided props', () => { + const dscProfiles = ['profile1', 'profile2']; + const dscProfiles2 = ['profile21', 'profile22']; + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: true, + shouldInitializeCustomEvents: false, + }); + discoverEBTContextManager.enableContext(); + + discoverEBTContextManager.updateProfilesContextWith(dscProfiles); + expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); + + discoverEBTContextManager.updateProfilesContextWith(dscProfiles2); + expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles2); + }); + + it('should not update the profiles if profile list did not change', () => { + const dscProfiles = ['profile1', 'profile2']; + const dscProfiles2 = ['profile1', 'profile2']; + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: true, + shouldInitializeCustomEvents: false, + }); + discoverEBTContextManager.enableContext(); + + discoverEBTContextManager.updateProfilesContextWith(dscProfiles); + expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); + + discoverEBTContextManager.updateProfilesContextWith(dscProfiles2); + expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); + }); + + it('should not update the profiles if not enabled yet', () => { + const dscProfiles = ['profile1', 'profile2']; + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: true, + shouldInitializeCustomEvents: false, + }); + + discoverEBTContextManager.updateProfilesContextWith(dscProfiles); + expect(discoverEBTContextManager.getProfilesContext()).toEqual([]); + }); + + it('should not update the profiles after resetting unless enabled again', () => { + const dscProfiles = ['profile1', 'profile2']; + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: true, + shouldInitializeCustomEvents: false, + }); + discoverEBTContextManager.enableContext(); + discoverEBTContextManager.updateProfilesContextWith(dscProfiles); + expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); + discoverEBTContextManager.disableAndResetContext(); + expect(discoverEBTContextManager.getProfilesContext()).toEqual([]); + discoverEBTContextManager.updateProfilesContextWith(dscProfiles); + expect(discoverEBTContextManager.getProfilesContext()).toEqual([]); + discoverEBTContextManager.enableContext(); + discoverEBTContextManager.updateProfilesContextWith(dscProfiles); + expect(discoverEBTContextManager.getProfilesContext()).toBe(dscProfiles); + }); + }); + + describe('trackFieldUsageEvent', () => { + it('should track the field usage when a field is added to the table', async () => { + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: false, + shouldInitializeCustomEvents: true, + }); + + await discoverEBTContextManager.trackDataTableSelection({ + fieldName: 'test', + fieldsMetadata, + }); + + expect(coreSetupMock.analytics.reportEvent).toHaveBeenCalledWith('discover_field_usage', { + eventName: 'dataTableSelection', + fieldName: 'test', + }); + + await discoverEBTContextManager.trackDataTableSelection({ + fieldName: 'test2', + fieldsMetadata, + }); + + expect(coreSetupMock.analytics.reportEvent).toHaveBeenLastCalledWith('discover_field_usage', { + eventName: 'dataTableSelection', // non-ECS fields would not be included in properties + }); + }); + + it('should track the field usage when a field is removed from the table', async () => { + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: false, + shouldInitializeCustomEvents: true, + }); + + await discoverEBTContextManager.trackDataTableRemoval({ + fieldName: 'test', + fieldsMetadata, + }); + + expect(coreSetupMock.analytics.reportEvent).toHaveBeenCalledWith('discover_field_usage', { + eventName: 'dataTableRemoval', + fieldName: 'test', + }); + + await discoverEBTContextManager.trackDataTableRemoval({ + fieldName: 'test2', + fieldsMetadata, + }); + + expect(coreSetupMock.analytics.reportEvent).toHaveBeenLastCalledWith('discover_field_usage', { + eventName: 'dataTableRemoval', // non-ECS fields would not be included in properties + }); + }); + + it('should track the field usage when a filter is created', async () => { + discoverEBTContextManager.initialize({ + core: coreSetupMock, + shouldInitializeCustomContext: false, + shouldInitializeCustomEvents: true, + }); + + await discoverEBTContextManager.trackFilterAddition({ + fieldName: 'test', + fieldsMetadata, + filterOperation: '+', + }); + + expect(coreSetupMock.analytics.reportEvent).toHaveBeenCalledWith('discover_field_usage', { + eventName: 'filterAddition', + fieldName: 'test', + filterOperation: '+', + }); + + await discoverEBTContextManager.trackFilterAddition({ + fieldName: 'test2', + fieldsMetadata, + filterOperation: '_exists_', + }); + + expect(coreSetupMock.analytics.reportEvent).toHaveBeenLastCalledWith('discover_field_usage', { + eventName: 'filterAddition', // non-ECS fields would not be included in properties + filterOperation: '_exists_', + }); + }); + }); +}); diff --git a/src/plugins/discover/public/services/discover_ebt_manager.ts b/src/plugins/discover/public/services/discover_ebt_manager.ts new file mode 100644 index 0000000000000..420eb6c244444 --- /dev/null +++ b/src/plugins/discover/public/services/discover_ebt_manager.ts @@ -0,0 +1,219 @@ +/* + * Copyright 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 { BehaviorSubject } from 'rxjs'; +import { isEqual } from 'lodash'; +import type { CoreSetup } from '@kbn/core-lifecycle-browser'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; + +const FIELD_USAGE_EVENT_TYPE = 'discover_field_usage'; +const FIELD_USAGE_EVENT_NAME = 'eventName'; +const FIELD_USAGE_FIELD_NAME = 'fieldName'; +const FIELD_USAGE_FILTER_OPERATION = 'filterOperation'; + +type FilterOperation = '+' | '-' | '_exists_'; + +export enum FieldUsageEventName { + dataTableSelection = 'dataTableSelection', + dataTableRemoval = 'dataTableRemoval', + filterAddition = 'filterAddition', +} +interface FieldUsageEventData { + [FIELD_USAGE_EVENT_NAME]: FieldUsageEventName; + [FIELD_USAGE_FIELD_NAME]?: string; + [FIELD_USAGE_FILTER_OPERATION]?: FilterOperation; +} + +export interface DiscoverEBTContextProps { + discoverProfiles: string[]; // Discover Context Awareness Profiles +} +export type DiscoverEBTContext = BehaviorSubject; + +export class DiscoverEBTManager { + private isCustomContextEnabled: boolean = false; + private customContext$: DiscoverEBTContext | undefined; + private reportEvent: CoreSetup['analytics']['reportEvent'] | undefined; + + constructor() {} + + // https://docs.elastic.dev/telemetry/collection/event-based-telemetry + public initialize({ + core, + shouldInitializeCustomContext, + shouldInitializeCustomEvents, + }: { + core: CoreSetup; + shouldInitializeCustomContext: boolean; + shouldInitializeCustomEvents: boolean; + }) { + if (shouldInitializeCustomContext) { + // Register Discover specific context to be used in EBT + const context$ = new BehaviorSubject({ + discoverProfiles: [], + }); + core.analytics.registerContextProvider({ + name: 'discover_context', + context$, + schema: { + discoverProfiles: { + type: 'array', + items: { + type: 'keyword', + _meta: { + description: 'List of active Discover context awareness profiles', + }, + }, + }, + // If we decide to extend EBT context with more properties, we can do it here + }, + }); + this.customContext$ = context$; + } + + if (shouldInitializeCustomEvents) { + // Register Discover events to be used with EBT + core.analytics.registerEventType({ + eventType: FIELD_USAGE_EVENT_TYPE, + schema: { + [FIELD_USAGE_EVENT_NAME]: { + type: 'keyword', + _meta: { + description: + 'The name of the event that is tracked in the metrics i.e. dataTableSelection, dataTableRemoval', + }, + }, + [FIELD_USAGE_FIELD_NAME]: { + type: 'keyword', + _meta: { + description: "Field name if it's a part of ECS schema", + optional: true, + }, + }, + [FIELD_USAGE_FILTER_OPERATION]: { + type: 'keyword', + _meta: { + description: "Operation type when a filter is added i.e. '+', '-', '_exists_'", + optional: true, + }, + }, + }, + }); + this.reportEvent = core.analytics.reportEvent; + } + } + + public enableContext() { + this.isCustomContextEnabled = true; + } + + public disableAndResetContext() { + this.updateProfilesContextWith([]); + this.isCustomContextEnabled = false; + } + + public updateProfilesContextWith(discoverProfiles: DiscoverEBTContextProps['discoverProfiles']) { + if ( + this.isCustomContextEnabled && + this.customContext$ && + !isEqual(this.customContext$.getValue().discoverProfiles, discoverProfiles) + ) { + this.customContext$.next({ + discoverProfiles, + }); + } + } + + public getProfilesContext() { + return this.customContext$?.getValue()?.discoverProfiles; + } + + private async trackFieldUsageEvent({ + eventName, + fieldName, + filterOperation, + fieldsMetadata, + }: { + eventName: FieldUsageEventName; + fieldName: string; + filterOperation?: FilterOperation; + fieldsMetadata: FieldsMetadataPublicStart | undefined; + }) { + if (!this.reportEvent) { + return; + } + + const eventData: FieldUsageEventData = { + [FIELD_USAGE_EVENT_NAME]: eventName, + }; + + if (fieldsMetadata) { + const client = await fieldsMetadata.getClient(); + const { fields } = await client.find({ + attributes: ['short'], + fieldNames: [fieldName], + }); + + // excludes non ECS fields + if (fields[fieldName]?.short) { + eventData[FIELD_USAGE_FIELD_NAME] = fieldName; + } + } + + if (filterOperation) { + eventData[FIELD_USAGE_FILTER_OPERATION] = filterOperation; + } + + this.reportEvent(FIELD_USAGE_EVENT_TYPE, eventData); + } + + public async trackDataTableSelection({ + fieldName, + fieldsMetadata, + }: { + fieldName: string; + fieldsMetadata: FieldsMetadataPublicStart | undefined; + }) { + await this.trackFieldUsageEvent({ + eventName: FieldUsageEventName.dataTableSelection, + fieldName, + fieldsMetadata, + }); + } + + public async trackDataTableRemoval({ + fieldName, + fieldsMetadata, + }: { + fieldName: string; + fieldsMetadata: FieldsMetadataPublicStart | undefined; + }) { + await this.trackFieldUsageEvent({ + eventName: FieldUsageEventName.dataTableRemoval, + fieldName, + fieldsMetadata, + }); + } + + public async trackFilterAddition({ + fieldName, + fieldsMetadata, + filterOperation, + }: { + fieldName: string; + fieldsMetadata: FieldsMetadataPublicStart | undefined; + filterOperation: FilterOperation; + }) { + await this.trackFieldUsageEvent({ + eventName: FieldUsageEventName.filterAddition, + fieldName, + fieldsMetadata, + filterOperation, + }); + } +} diff --git a/test/functional/apps/discover/context_awareness/_data_source_profile.ts b/test/functional/apps/discover/context_awareness/_data_source_profile.ts index ecf4b2fb29c4c..35e3552afa655 100644 --- a/test/functional/apps/discover/context_awareness/_data_source_profile.ts +++ b/test/functional/apps/discover/context_awareness/_data_source_profile.ts @@ -12,115 +12,16 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, discover, unifiedFieldList, dashboard, header, timePicker } = getPageObjects([ + const { common, discover, unifiedFieldList } = getPageObjects([ 'common', 'discover', 'unifiedFieldList', - 'dashboard', - 'header', - 'timePicker', ]); const testSubjects = getService('testSubjects'); const dataViews = getService('dataViews'); const dataGrid = getService('dataGrid'); - const monacoEditor = getService('monacoEditor'); - const ebtUIHelper = getService('kibana_ebt_ui'); - const retry = getService('retry'); - const esArchiver = getService('esArchiver'); - const kibanaServer = getService('kibanaServer'); - const dashboardAddPanel = getService('dashboardAddPanel'); describe('data source profile', () => { - describe('telemetry', () => { - before(async () => { - await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); - await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); - }); - - after(async () => { - await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); - }); - - it('should set EBT context for telemetry events with default profile', async () => { - await common.navigateToApp('discover'); - await discover.selectTextBaseLang(); - await discover.waitUntilSearchingHasFinished(); - await monacoEditor.setCodeEditorValue('from my-example-* | sort @timestamp desc'); - await ebtUIHelper.setOptIn(true); - await testSubjects.click('querySubmitButton'); - await discover.waitUntilSearchingHasFinished(); - - const events = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { - eventTypes: ['performance_metric'], - withTimeoutMs: 500, - }); - - expect(events[events.length - 1].context.discoverProfiles).to.eql([ - 'example-root-profile', - 'default-data-source-profile', - ]); - }); - - it('should set EBT context for telemetry events when example profile and reset', async () => { - await common.navigateToApp('discover'); - await discover.selectTextBaseLang(); - await discover.waitUntilSearchingHasFinished(); - await monacoEditor.setCodeEditorValue('from my-example-logs | sort @timestamp desc'); - await ebtUIHelper.setOptIn(true); - await testSubjects.click('querySubmitButton'); - await discover.waitUntilSearchingHasFinished(); - - const events = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { - eventTypes: ['performance_metric'], - withTimeoutMs: 500, - }); - - expect(events[events.length - 1].context.discoverProfiles).to.eql([ - 'example-root-profile', - 'example-data-source-profile', - ]); - - // should reset the profiles when navigating away from Discover - await testSubjects.click('logo'); - await retry.waitFor('home page to open', async () => { - return (await testSubjects.getVisibleText('euiBreadcrumb')) === 'Home'; - }); - await testSubjects.click('addSampleData'); - - await retry.try(async () => { - const eventsAfter = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { - eventTypes: ['click'], - withTimeoutMs: 500, - }); - - expect(eventsAfter[eventsAfter.length - 1].context.discoverProfiles).to.eql([]); - }); - }); - - it('should not set EBT context for embeddables', async () => { - await dashboard.navigateToApp(); - await dashboard.gotoDashboardLandingPage(); - await dashboard.clickNewDashboard(); - await timePicker.setDefaultAbsoluteRange(); - await ebtUIHelper.setOptIn(true); - await dashboardAddPanel.addSavedSearch('A Saved Search'); - await header.waitUntilLoadingHasFinished(); - await dashboard.waitForRenderComplete(); - const rows = await dataGrid.getDocTableRows(); - expect(rows.length).to.be.above(0); - await testSubjects.click('dashboardEditorMenuButton'); - - const events = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { - eventTypes: ['click'], - withTimeoutMs: 500, - }); - - expect( - events.every((event) => !(event.context.discoverProfiles as string[])?.length) - ).to.be(true); - }); - }); - describe('ES|QL mode', () => { describe('cell renderers', () => { it('should render custom @timestamp but not custom log.level', async () => { diff --git a/test/functional/apps/discover/context_awareness/_telemetry.ts b/test/functional/apps/discover/context_awareness/_telemetry.ts new file mode 100644 index 0000000000000..587de698f9336 --- /dev/null +++ b/test/functional/apps/discover/context_awareness/_telemetry.ts @@ -0,0 +1,326 @@ +/* + * Copyright 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 expect from '@kbn/expect'; +import type { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const { common, discover, unifiedFieldList, dashboard, header, timePicker } = getPageObjects([ + 'common', + 'discover', + 'unifiedFieldList', + 'dashboard', + 'header', + 'timePicker', + ]); + const testSubjects = getService('testSubjects'); + const dataGrid = getService('dataGrid'); + const dataViews = getService('dataViews'); + const monacoEditor = getService('monacoEditor'); + const ebtUIHelper = getService('kibana_ebt_ui'); + const retry = getService('retry'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const dashboardAddPanel = getService('dashboardAddPanel'); + + describe('telemetry', () => { + describe('context', () => { + before(async () => { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + }); + + it('should set EBT context for telemetry events with default profile', async () => { + await common.navigateToApp('discover'); + await discover.selectTextBaseLang(); + await discover.waitUntilSearchingHasFinished(); + await monacoEditor.setCodeEditorValue('from my-example-* | sort @timestamp desc'); + await ebtUIHelper.setOptIn(true); + await testSubjects.click('querySubmitButton'); + await discover.waitUntilSearchingHasFinished(); + + const events = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['performance_metric'], + withTimeoutMs: 500, + }); + + expect(events[events.length - 1].context.discoverProfiles).to.eql([ + 'example-root-profile', + 'default-data-source-profile', + ]); + }); + + it('should set EBT context for telemetry events when example profile and reset', async () => { + await common.navigateToApp('discover'); + await discover.selectTextBaseLang(); + await discover.waitUntilSearchingHasFinished(); + await monacoEditor.setCodeEditorValue('from my-example-logs | sort @timestamp desc'); + await ebtUIHelper.setOptIn(true); + await testSubjects.click('querySubmitButton'); + await discover.waitUntilSearchingHasFinished(); + + const events = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['performance_metric'], + withTimeoutMs: 500, + }); + + expect(events[events.length - 1].context.discoverProfiles).to.eql([ + 'example-root-profile', + 'example-data-source-profile', + ]); + + // should reset the profiles when navigating away from Discover + await testSubjects.click('logo'); + await retry.waitFor('home page to open', async () => { + return (await testSubjects.getVisibleText('euiBreadcrumb')) === 'Home'; + }); + await testSubjects.click('addSampleData'); + + await retry.try(async () => { + const eventsAfter = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['click'], + withTimeoutMs: 500, + }); + + expect(eventsAfter[eventsAfter.length - 1].context.discoverProfiles).to.eql([]); + }); + }); + + it('should not set EBT context for embeddables', async () => { + await dashboard.navigateToApp(); + await dashboard.gotoDashboardLandingPage(); + await dashboard.clickNewDashboard(); + await timePicker.setDefaultAbsoluteRange(); + await ebtUIHelper.setOptIn(true); + await dashboardAddPanel.addSavedSearch('A Saved Search'); + await header.waitUntilLoadingHasFinished(); + await dashboard.waitForRenderComplete(); + const rows = await dataGrid.getDocTableRows(); + expect(rows.length).to.be.above(0); + await testSubjects.click('dashboardEditorMenuButton'); + + const events = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['click'], + withTimeoutMs: 500, + }); + + expect( + events.length > 0 && + events.every((event) => !(event.context.discoverProfiles as string[])?.length) + ).to.be(true); + }); + }); + + describe('events', () => { + beforeEach(async () => { + await common.navigateToApp('discover'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + }); + + it('should track field usage when a field is added to the table', async () => { + await dataViews.switchToAndValidate('my-example-*'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + await ebtUIHelper.setOptIn(true); + await unifiedFieldList.clickFieldListItemAdd('service.name'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + const [event] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event.properties).to.eql({ + eventName: 'dataTableSelection', + fieldName: 'service.name', + }); + + await unifiedFieldList.clickFieldListItemAdd('_score'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + const [_, event2] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event2.properties).to.eql({ + eventName: 'dataTableSelection', + }); + }); + + it('should track field usage when a field is removed from the table', async () => { + await dataViews.switchToAndValidate('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + await ebtUIHelper.setOptIn(true); + await unifiedFieldList.clickFieldListItemRemove('log.level'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + const [event] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event.properties).to.eql({ + eventName: 'dataTableRemoval', + fieldName: 'log.level', + }); + }); + + it('should track field usage when a filter is added', async () => { + await dataViews.switchToAndValidate('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await ebtUIHelper.setOptIn(true); + await dataGrid.clickCellFilterForButtonExcludingControlColumns(0, 0); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + const [event] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event.properties).to.eql({ + eventName: 'filterAddition', + fieldName: '@timestamp', + filterOperation: '+', + }); + + await unifiedFieldList.clickFieldListExistsFilter('log.level'); + + const [_, event2] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event2.properties).to.eql({ + eventName: 'filterAddition', + fieldName: 'log.level', + filterOperation: '_exists_', + }); + }); + + it('should track field usage for doc viewer too', async () => { + await dataViews.switchToAndValidate('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + await ebtUIHelper.setOptIn(true); + + await dataGrid.clickRowToggle(); + await discover.isShowingDocViewer(); + + // event 1 + await dataGrid.clickFieldActionInFlyout('service.name', 'toggleColumnButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + // event 2 + await dataGrid.clickFieldActionInFlyout('log.level', 'toggleColumnButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + // event 3 + await dataGrid.clickFieldActionInFlyout('log.level', 'addFilterOutValueButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + const [event1, event2, event3] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event1.properties).to.eql({ + eventName: 'dataTableSelection', + fieldName: 'service.name', + }); + + expect(event2.properties).to.eql({ + eventName: 'dataTableRemoval', + fieldName: 'log.level', + }); + + expect(event3.properties).to.eql({ + eventName: 'filterAddition', + fieldName: 'log.level', + filterOperation: '-', + }); + }); + + it('should track field usage on surrounding documents page', async () => { + await dataViews.switchToAndValidate('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + await dataGrid.clickRowToggle({ rowIndex: 1 }); + await discover.isShowingDocViewer(); + + const [, surroundingActionEl] = await dataGrid.getRowActions(); + await surroundingActionEl.click(); + await header.waitUntilLoadingHasFinished(); + await ebtUIHelper.setOptIn(true); + + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await discover.isShowingDocViewer(); + + // event 1 + await dataGrid.clickFieldActionInFlyout('service.name', 'toggleColumnButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + // event 2 + await dataGrid.clickFieldActionInFlyout('log.level', 'toggleColumnButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + // event 3 + await dataGrid.clickFieldActionInFlyout('log.level', 'addFilterOutValueButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + const [event1, event2, event3] = await ebtUIHelper.getEvents(Number.MAX_SAFE_INTEGER, { + eventTypes: ['discover_field_usage'], + withTimeoutMs: 500, + }); + + expect(event1.properties).to.eql({ + eventName: 'dataTableSelection', + fieldName: 'service.name', + }); + + expect(event2.properties).to.eql({ + eventName: 'dataTableRemoval', + fieldName: 'log.level', + }); + + expect(event3.properties).to.eql({ + eventName: 'filterAddition', + fieldName: 'log.level', + filterOperation: '-', + }); + + expect(event3.context.discoverProfiles).to.eql([ + 'example-root-profile', + 'example-data-source-profile', + ]); + }); + }); + }); +} diff --git a/test/functional/apps/discover/context_awareness/index.ts b/test/functional/apps/discover/context_awareness/index.ts index 655f4460883d1..f937f38c741f9 100644 --- a/test/functional/apps/discover/context_awareness/index.ts +++ b/test/functional/apps/discover/context_awareness/index.ts @@ -38,6 +38,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid loadTestFile(require.resolve('./_root_profile')); loadTestFile(require.resolve('./_data_source_profile')); + loadTestFile(require.resolve('./_telemetry')); loadTestFile(require.resolve('./extensions/_get_row_indicator_provider')); loadTestFile(require.resolve('./extensions/_get_row_additional_leading_controls')); loadTestFile(require.resolve('./extensions/_get_doc_viewer')); From f207c2c176ec6d96768f4fefec546596cce57463 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 30 Sep 2024 12:34:04 -0400 Subject: [PATCH 022/107] ESLint Rule to discourage hashes being created with unsafe algorithms (#190973) Closes https://github.com/elastic/kibana/issues/185601 ## Summary Using non-compliant algorithms with Node Cryptos createHash function will cause failures when running Kibana in FIPS mode. We want to discourage usages of such algorithms. --------- Co-authored-by: Sid Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../src/bundle_routes/utils.ts | 2 +- .../src/bootstrap/bootstrap_renderer.ts | 2 +- .../src/get_migration_hash.ts | 2 +- packages/kbn-es/src/install/install_source.ts | 4 +- packages/kbn-eslint-config/.eslintrc.js | 1 + packages/kbn-eslint-plugin-eslint/index.js | 1 + .../rules/no_unsafe_hash.js | 166 ++++++++++++++++++ .../rules/no_unsafe_hash.test.js | 142 +++++++++++++++ .../report_failures_to_file.ts | 2 +- .../kbn-optimizer/src/common/dll_manifest.ts | 2 +- .../server/rest_api_routes/internal/fields.ts | 2 +- .../server/routes/fullstory.ts | 2 +- .../common/plugins/cases/server/routes.ts | 2 +- 13 files changed, 320 insertions(+), 10 deletions(-) create mode 100644 packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.js create mode 100644 packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.test.js diff --git a/packages/core/apps/core-apps-server-internal/src/bundle_routes/utils.ts b/packages/core/apps/core-apps-server-internal/src/bundle_routes/utils.ts index 05a31f85a51cc..ee115cda6e5b8 100644 --- a/packages/core/apps/core-apps-server-internal/src/bundle_routes/utils.ts +++ b/packages/core/apps/core-apps-server-internal/src/bundle_routes/utils.ts @@ -13,7 +13,7 @@ import * as Rx from 'rxjs'; import { map, takeUntil } from 'rxjs'; export const generateFileHash = (fd: number): Promise => { - const hash = createHash('sha1'); + const hash = createHash('sha1'); // eslint-disable-line @kbn/eslint/no_unsafe_hash const read = createReadStream(null as any, { fd, start: 0, diff --git a/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts index 757862d1d3c6c..8aa0d2a6c0387 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts @@ -114,7 +114,7 @@ export const bootstrapRendererFactory: BootstrapRendererFactory = ({ publicPathMap, }); - const hash = createHash('sha1'); + const hash = createHash('sha1'); // eslint-disable-line @kbn/eslint/no_unsafe_hash hash.update(body); const etag = hash.digest('hex'); diff --git a/packages/core/test-helpers/core-test-helpers-so-type-serializer/src/get_migration_hash.ts b/packages/core/test-helpers/core-test-helpers-so-type-serializer/src/get_migration_hash.ts index 461188703b3aa..c65f6330e176b 100644 --- a/packages/core/test-helpers/core-test-helpers-so-type-serializer/src/get_migration_hash.ts +++ b/packages/core/test-helpers/core-test-helpers-so-type-serializer/src/get_migration_hash.ts @@ -16,7 +16,7 @@ type SavedObjectTypeMigrationHash = string; export const getMigrationHash = (soType: SavedObjectsType): SavedObjectTypeMigrationHash => { const migInfo = extractMigrationInfo(soType); - const hash = createHash('sha1'); + const hash = createHash('sha1'); // eslint-disable-line @kbn/eslint/no_unsafe_hash const hashParts = [ migInfo.name, diff --git a/packages/kbn-es/src/install/install_source.ts b/packages/kbn-es/src/install/install_source.ts index 7dfbe8d7bd5b3..244b349002829 100644 --- a/packages/kbn-es/src/install/install_source.ts +++ b/packages/kbn-es/src/install/install_source.ts @@ -84,7 +84,7 @@ async function sourceInfo(cwd: string, license: string, log: ToolingLog = defaul log.info('on %s at %s', chalk.bold(branch), chalk.bold(sha)); log.info('%s locally modified file(s)', chalk.bold(status.modified.length)); - const etag = crypto.createHash('md5').update(branch); + const etag = crypto.createHash('md5').update(branch); // eslint-disable-line @kbn/eslint/no_unsafe_hash etag.update(sha); // for changed files, use last modified times in hash calculation @@ -92,7 +92,7 @@ async function sourceInfo(cwd: string, license: string, log: ToolingLog = defaul etag.update(fs.statSync(path.join(cwd, file.path)).mtime.toString()); }); - const cwdHash = crypto.createHash('md5').update(cwd).digest('hex').substr(0, 8); + const cwdHash = crypto.createHash('md5').update(cwd).digest('hex').substr(0, 8); // eslint-disable-line @kbn/eslint/no_unsafe_hash const basename = `${branch}-${task}-${cwdHash}`; const filename = `${basename}.${ext}`; diff --git a/packages/kbn-eslint-config/.eslintrc.js b/packages/kbn-eslint-config/.eslintrc.js index a68dc6ecd949e..205e5b182e215 100644 --- a/packages/kbn-eslint-config/.eslintrc.js +++ b/packages/kbn-eslint-config/.eslintrc.js @@ -314,6 +314,7 @@ module.exports = { '@kbn/eslint/no_constructor_args_in_property_initializers': 'error', '@kbn/eslint/no_this_in_property_initializers': 'error', '@kbn/eslint/no_unsafe_console': 'error', + '@kbn/eslint/no_unsafe_hash': 'error', '@kbn/imports/no_unresolvable_imports': 'error', '@kbn/imports/uniform_imports': 'error', '@kbn/imports/no_unused_imports': 'error', diff --git a/packages/kbn-eslint-plugin-eslint/index.js b/packages/kbn-eslint-plugin-eslint/index.js index 1b9c04a2b7918..5ff3d70ae8a32 100644 --- a/packages/kbn-eslint-plugin-eslint/index.js +++ b/packages/kbn-eslint-plugin-eslint/index.js @@ -19,5 +19,6 @@ module.exports = { no_constructor_args_in_property_initializers: require('./rules/no_constructor_args_in_property_initializers'), no_this_in_property_initializers: require('./rules/no_this_in_property_initializers'), no_unsafe_console: require('./rules/no_unsafe_console'), + no_unsafe_hash: require('./rules/no_unsafe_hash'), }, }; diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.js b/packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.js new file mode 100644 index 0000000000000..2088c196ddd60 --- /dev/null +++ b/packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.js @@ -0,0 +1,166 @@ +/* + * Copyright 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". + */ + +const allowedAlgorithms = ['sha256', 'sha3-256', 'sha512']; + +module.exports = { + allowedAlgorithms, + meta: { + type: 'problem', + docs: { + description: 'Allow usage of createHash only with allowed algorithms.', + category: 'FIPS', + recommended: false, + }, + messages: { + noDisallowedHash: + 'Usage of {{functionName}} with "{{algorithm}}" is not allowed. Only the following algorithms are allowed: [{{allowedAlgorithms}}]. If you need to use a different algorithm, please contact the Kibana security team.', + }, + schema: [], + }, + create(context) { + let isCreateHashImported = false; + let createHashName = 'createHash'; + let cryptoLocalName = 'crypto'; + let usedFunctionName = ''; + const sourceCode = context.getSourceCode(); + + const disallowedAlgorithmNodes = new Set(); + + function isAllowedAlgorithm(algorithm) { + return allowedAlgorithms.includes(algorithm); + } + + function isHashOrCreateHash(value) { + if (value === 'hash' || value === 'createHash') { + usedFunctionName = value; + return true; + } + return false; + } + + function getIdentifierValue(node) { + const scope = sourceCode.getScope(node); + if (!scope) { + return; + } + const variable = scope.variables.find((variable) => variable.name === node.name); + if (variable && variable.defs.length > 0) { + const def = variable.defs[0]; + if ( + def.node.init && + def.node.init.type === 'Literal' && + !isAllowedAlgorithm(def.node.init.value) + ) { + disallowedAlgorithmNodes.add(node.name); + return def.node.init.value; + } + } + } + + return { + ImportDeclaration(node) { + if (node.source.value === 'crypto' || node.source.value === 'node:crypto') { + node.specifiers.forEach((specifier) => { + if ( + specifier.type === 'ImportSpecifier' && + isHashOrCreateHash(specifier.imported.name) + ) { + isCreateHashImported = true; + createHashName = specifier.local.name; // Capture local name (renamed or not) + } else if (specifier.type === 'ImportDefaultSpecifier') { + cryptoLocalName = specifier.local.name; + } + }); + } + }, + VariableDeclarator(node) { + if (node.init && node.init.type === 'Literal' && !isAllowedAlgorithm(node.init.value)) { + disallowedAlgorithmNodes.add(node.id.name); + } + }, + AssignmentExpression(node) { + if ( + node.right.type === 'Literal' && + node.right.value === 'md5' && + node.left.type === 'Identifier' + ) { + disallowedAlgorithmNodes.add(node.left.name); + } + }, + CallExpression(node) { + const callee = node.callee; + + if ( + callee.type === 'MemberExpression' && + callee.object.name === cryptoLocalName && + isHashOrCreateHash(callee.property.name) + ) { + const arg = node.arguments[0]; + if (arg) { + if (arg.type === 'Literal' && !isAllowedAlgorithm(arg.value)) { + context.report({ + node, + messageId: 'noDisallowedHash', + data: { + algorithm: arg.value, + allowedAlgorithms: allowedAlgorithms.join(', '), + functionName: usedFunctionName, + }, + }); + } else if (arg.type === 'Identifier') { + const identifierValue = getIdentifierValue(arg); + if (disallowedAlgorithmNodes.has(arg.name) && identifierValue) { + context.report({ + node, + messageId: 'noDisallowedHash', + data: { + algorithm: identifierValue, + allowedAlgorithms: allowedAlgorithms.join(', '), + functionName: usedFunctionName, + }, + }); + } + } + } + } + + if (isCreateHashImported && callee.name === createHashName) { + const arg = node.arguments[0]; + if (arg) { + if (arg.type === 'Literal' && !isAllowedAlgorithm(arg.value)) { + context.report({ + node, + messageId: 'noDisallowedHash', + data: { + algorithm: arg.value, + allowedAlgorithms: allowedAlgorithms.join(', '), + functionName: usedFunctionName, + }, + }); + } else if (arg.type === 'Identifier') { + const identifierValue = getIdentifierValue(arg); + if (disallowedAlgorithmNodes.has(arg.name) && identifierValue) { + context.report({ + node, + messageId: 'noDisallowedHash', + data: { + algorithm: identifierValue, + allowedAlgorithms: allowedAlgorithms.join(', '), + functionName: usedFunctionName, + }, + }); + } + } + } + } + }, + }; + }, +}; diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.test.js b/packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.test.js new file mode 100644 index 0000000000000..d384ea40819eb --- /dev/null +++ b/packages/kbn-eslint-plugin-eslint/rules/no_unsafe_hash.test.js @@ -0,0 +1,142 @@ +/* + * Copyright 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". + */ + +const { RuleTester } = require('eslint'); +const { allowedAlgorithms, ...rule } = require('./no_unsafe_hash'); + +const dedent = require('dedent'); + +const joinedAllowedAlgorithms = `[${allowedAlgorithms.join(', ')}]`; + +const ruleTester = new RuleTester({ + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + ecmaFeatures: { + jsx: true, + }, + }, +}); + +ruleTester.run('@kbn/eslint/no_unsafe_hash', rule, { + valid: [ + // valid import of crypto and call of createHash + { + code: dedent` + import crypto from 'crypto'; + crypto.createHash('sha256'); + `, + }, + // valid import and call of createHash + { + code: dedent` + import { createHash } from 'crypto'; + createHash('sha256'); + `, + }, + // valid import and call of createHash with a variable containing a compliant aglorithm + { + code: dedent` + import { createHash } from 'crypto'; + const myHash = 'sha256'; + createHash(myHash); + `, + }, + // valid import and call of hash with a variable containing a compliant aglorithm + { + code: dedent` + import { hash } from 'crypto'; + const myHash = 'sha256'; + hash(myHash); + `, + }, + ], + + invalid: [ + // invalid call of createHash when calling from crypto + { + code: dedent` + import crypto from 'crypto'; + crypto.createHash('md5'); + `, + errors: [ + { + line: 2, + message: `Usage of createHash with "md5" is not allowed. Only the following algorithms are allowed: ${joinedAllowedAlgorithms}. If you need to use a different algorithm, please contact the Kibana security team.`, + }, + ], + }, + // invalid call of createHash when importing directly + { + code: dedent` + import { createHash } from 'crypto'; + createHash('md5'); + `, + errors: [ + { + line: 2, + message: `Usage of createHash with "md5" is not allowed. Only the following algorithms are allowed: ${joinedAllowedAlgorithms}. If you need to use a different algorithm, please contact the Kibana security team.`, + }, + ], + }, + // invalid call of createHash when calling with a variable containing md5 + { + code: dedent` + import { createHash } from 'crypto'; + const myHash = 'md5'; + createHash(myHash); + `, + errors: [ + { + line: 3, + message: `Usage of createHash with "md5" is not allowed. Only the following algorithms are allowed: ${joinedAllowedAlgorithms}. If you need to use a different algorithm, please contact the Kibana security team.`, + }, + ], + }, + // invalid import and call of hash when importing directly + { + code: dedent` + import { hash } from 'crypto'; + hash('md5'); + `, + errors: [ + { + line: 2, + message: `Usage of hash with "md5" is not allowed. Only the following algorithms are allowed: ${joinedAllowedAlgorithms}. If you need to use a different algorithm, please contact the Kibana security team.`, + }, + ], + }, + { + code: dedent` + import _crypto from 'crypto'; + _crypto.hash('md5'); + `, + errors: [ + { + line: 2, + message: `Usage of hash with "md5" is not allowed. Only the following algorithms are allowed: ${joinedAllowedAlgorithms}. If you need to use a different algorithm, please contact the Kibana security team.`, + }, + ], + }, + + { + code: dedent` + import { hash as _hash } from 'crypto'; + _hash('md5'); + `, + errors: [ + { + line: 2, + message: `Usage of hash with "md5" is not allowed. Only the following algorithms are allowed: ${joinedAllowedAlgorithms}. If you need to use a different algorithm, please contact the Kibana security team.`, + }, + ], + }, + ], +}); diff --git a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts index 7876efb8502a5..b1e3997ebf030 100644 --- a/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts +++ b/packages/kbn-failed-test-reporter-cli/failed_tests_reporter/report_failures_to_file.ts @@ -127,7 +127,7 @@ export async function reportFailuresToFile( // Jest could, in theory, fail 1000s of tests and write 1000s of failures // So let's just write files for the first 20 for (const failure of failures.slice(0, 20)) { - const hash = createHash('md5').update(failure.name).digest('hex'); + const hash = createHash('md5').update(failure.name).digest('hex'); // eslint-disable-line @kbn/eslint/no_unsafe_hash const filenameBase = `${ process.env.BUILDKITE_JOB_ID ? process.env.BUILDKITE_JOB_ID + '_' : '' }${hash}`; diff --git a/packages/kbn-optimizer/src/common/dll_manifest.ts b/packages/kbn-optimizer/src/common/dll_manifest.ts index 0a5bebefdeca5..fc8c597110156 100644 --- a/packages/kbn-optimizer/src/common/dll_manifest.ts +++ b/packages/kbn-optimizer/src/common/dll_manifest.ts @@ -20,7 +20,7 @@ export interface ParsedDllManifest { } const hash = (s: string) => { - return Crypto.createHash('sha1').update(s).digest('base64').replace(/=+$/, ''); + return Crypto.createHash('sha1').update(s).digest('base64').replace(/=+$/, ''); // eslint-disable-line @kbn/eslint/no_unsafe_hash }; export function parseDllManifest(manifest: DllManifest): ParsedDllManifest { diff --git a/src/plugins/data_views/server/rest_api_routes/internal/fields.ts b/src/plugins/data_views/server/rest_api_routes/internal/fields.ts index 7b13704f3c50a..0d8f8b4dd67b5 100644 --- a/src/plugins/data_views/server/rest_api_routes/internal/fields.ts +++ b/src/plugins/data_views/server/rest_api_routes/internal/fields.ts @@ -21,7 +21,7 @@ import { parseFields, IBody, IQuery, querySchema, validate } from './fields_for' import { DEFAULT_FIELD_CACHE_FRESHNESS } from '../../constants'; export function calculateHash(srcBuffer: Buffer) { - const hash = createHash('sha1'); + const hash = createHash('sha1'); // eslint-disable-line @kbn/eslint/no_unsafe_hash hash.update(srcBuffer); return hash.digest('hex'); } diff --git a/x-pack/plugins/cloud_integrations/cloud_full_story/server/routes/fullstory.ts b/x-pack/plugins/cloud_integrations/cloud_full_story/server/routes/fullstory.ts index 03e38baee4e91..d983191c726df 100644 --- a/x-pack/plugins/cloud_integrations/cloud_full_story/server/routes/fullstory.ts +++ b/x-pack/plugins/cloud_integrations/cloud_full_story/server/routes/fullstory.ts @@ -26,7 +26,7 @@ export const renderFullStoryLibraryFactory = (dist = true) => headers: HttpResponseOptions['headers']; }> => { const srcBuffer = await fs.readFile(FULLSTORY_LIBRARY_PATH); - const hash = createHash('sha1'); + const hash = createHash('sha1'); // eslint-disable-line @kbn/eslint/no_unsafe_hash hash.update(srcBuffer); const hashDigest = hash.digest('hex'); diff --git a/x-pack/test/cases_api_integration/common/plugins/cases/server/routes.ts b/x-pack/test/cases_api_integration/common/plugins/cases/server/routes.ts index 10139f636c809..3269f9f059446 100644 --- a/x-pack/test/cases_api_integration/common/plugins/cases/server/routes.ts +++ b/x-pack/test/cases_api_integration/common/plugins/cases/server/routes.ts @@ -19,7 +19,7 @@ import { CASES_TELEMETRY_TASK_NAME } from '@kbn/cases-plugin/common/constants'; import type { FixtureStartDeps } from './plugin'; const hashParts = (parts: string[]): string => { - const hash = createHash('sha1'); + const hash = createHash('sha1'); // eslint-disable-line @kbn/eslint/no_unsafe_hash const hashFeed = parts.join('-'); return hash.update(hashFeed).digest('hex'); }; From fefa59f41206c534297813af2cb6f732c2c59aeb Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:37:29 -0400 Subject: [PATCH 023/107] [Security Solution] Test plan for rule `type` field diff algorithm (#193372) ## Summary Related ticket: https://github.com/elastic/kibana/issues/190482 Adds test plan for diff algorithm for `type` field diff algorithm implemented here: https://github.com/elastic/kibana/pull/193369 ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../upgrade_review_algorithms.md | 117 ++++++++++++++++-- 1 file changed, 109 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md b/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md index e65d366e0f44c..c4a39a994144f 100644 --- a/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md +++ b/x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules/upgrade_review_algorithms.md @@ -17,12 +17,16 @@ Status: `in progress`. - [Rule field doesn't have an update and has no custom value - `AAA`](#rule-field-doesnt-have-an-update-and-has-no-custom-value---aaa) - [**Scenario: `AAA` - Rule field is any type**](#scenario-aaa---rule-field-is-any-type) - [Rule field doesn't have an update but has a custom value - `ABA`](#rule-field-doesnt-have-an-update-but-has-a-custom-value---aba) - - [**Scenario: `ABA` - Rule field is any type**](#scenario-aba---rule-field-is-any-type) + - [**Scenario: `ABA` - Rule field is any type except rule `type`**](#scenario-aba---rule-field-is-any-type-except-rule-type) + - [**Scenario: `ABA` - Rule field is rule `type`**](#scenario-aba---rule-field-is-rule-type) - [Rule field has an update and doesn't have a custom value - `AAB`](#rule-field-has-an-update-and-doesnt-have-a-custom-value---aab) - - [**Scenario: `AAB` - Rule field is any type**](#scenario-aab---rule-field-is-any-type) + - [**Scenario: `AAB` - Rule field is any type except rule `type`**](#scenario-aab---rule-field-is-any-type-except-rule-type) + - [**Scenario: `AAB` - Rule field is rule `type`**](#scenario-aab---rule-field-is-rule-type) - [Rule field has an update and a custom value that are the same - `ABB`](#rule-field-has-an-update-and-a-custom-value-that-are-the-same---abb) - - [**Scenario: `ABB` - Rule field is any type**](#scenario-abb---rule-field-is-any-type) + - [**Scenario: `ABB` - Rule field is any type except rule `type`**](#scenario-abb---rule-field-is-any-type-except-rule-type) + - [**Scenario: `ABB` - Rule field is rule `type`**](#scenario-abb---rule-field-is-rule-type) - [Rule field has an update and a custom value that are NOT the same - `ABC`](#rule-field-has-an-update-and-a-custom-value-that-are-not-the-same---abc) + - [**Scenario: `ABC` - Rule field is rule `type`**](#scenario-abc---rule-field-is-rule-type) - [**Scenario: `ABC` - Rule field is a number or single line string**](#scenario-abc---rule-field-is-a-number-or-single-line-string) - [**Scenario: `ABC` - Rule field is a mergeable multi line string**](#scenario-abc---rule-field-is-a-mergeable-multi-line-string) - [**Scenario: `ABC` - Rule field is a non-mergeable multi line string**](#scenario-abc---rule-field-is-a-non-mergeable-multi-line-string) @@ -37,6 +41,7 @@ Status: `in progress`. - [**Scenario: `-AB` - Rule field is an array of scalar values**](#scenario--ab---rule-field-is-an-array-of-scalar-values) - [**Scenario: `-AB` - Rule field is a solvable `data_source` object**](#scenario--ab---rule-field-is-a-solvable-data_source-object) - [**Scenario: `-AB` - Rule field is a non-solvable `data_source` object**](#scenario--ab---rule-field-is-a-non-solvable-data_source-object) + - [**Scenario: `-AB` - Rule field is rule `type`**](#scenario--ab---rule-field-is-rule-type) ## Useful information @@ -74,7 +79,7 @@ Status: `in progress`. #### **Scenario: `AAA` - Rule field is any type** -**Automation**: 10 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 11 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given field is not customized by the user (current version == base version) @@ -85,6 +90,7 @@ And field should not be shown in the upgrade preview UI Examples: | algorithm | field_name | base_version | current_version | target_version | merged_version | +| rule type | type | "query" | "query" | "query" | "query" | | single line string | name | "A" | "A" | "A" | "A" | | multi line string | description | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | | number | risk_score | 1 | 1 | 1 | 1 | @@ -99,7 +105,7 @@ Examples: ### Rule field doesn't have an update but has a custom value - `ABA` -#### **Scenario: `ABA` - Rule field is any type** +#### **Scenario: `ABA` - Rule field is any type except rule `type`** **Automation**: 10 integration tests with mock rules + a set of unit tests for each algorithm @@ -124,9 +130,27 @@ Examples: | esql_query | esql_query | {query: "FROM query WHERE true", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | {query: "FROM query WHERE true", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | ``` +#### **Scenario: `ABA` - Rule field is rule `type`** + +**Automation**: 1 integration test with mock rules + a set of unit tests for each algorithm + +```Gherkin +Given field is customized by the user (current version != base version) +And field is not updated by Elastic in this upgrade (target version == base version) +Then for field the diff algorithm should output the target version as the merged one with a non-solvable conflict +And field should be returned from the `upgrade/_review` API endpoint +And field should be shown in the upgrade preview UI + +Examples: +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| rule type | type | "query" | "saved_query" | "query" | "query" | +``` + +Notes: `type` field can only be changed between `query` and `saved_query` rule types in the UI and API via normal conventions, but the logic for others is still covered + ### Rule field has an update and doesn't have a custom value - `AAB` -#### **Scenario: `AAB` - Rule field is any type** +#### **Scenario: `AAB` - Rule field is any type except rule `type`** **Automation**: 10 integration tests with mock rules + a set of unit tests for each algorithm @@ -151,9 +175,27 @@ Examples: | esql_query | esql_query | {query: "FROM query WHERE true", language: "esql"} | {query: "FROM query WHERE true", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | ``` +#### **Scenario: `AAB` - Rule field is rule `type`** + +**Automation**: 1 integration test with mock rules + a set of unit tests for each algorithm + +```Gherkin +Given field is not customized by the user (current version == base version) +And field is updated by Elastic in this upgrade (target version != base version) +Then for field the diff algorithm should output the target version as the merged one with a non-solvable conflict +And field should be returned from the `upgrade/_review` API endpoint +And field should be shown in the upgrade preview UI + +Examples: +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| rule type | type | "query" | "query" | "saved_query" | "saved_query" | +``` + +Notes: `type` field can only be changed between `query` and `saved_query` rule types in the UI and API via normal conventions, but the logic for others is still covered + ### Rule field has an update and a custom value that are the same - `ABB` -#### **Scenario: `ABB` - Rule field is any type** +#### **Scenario: `ABB` - Rule field is any type except rule `type`** **Automation**: 10 integration tests with mock rules + a set of unit tests for each algorithm @@ -179,8 +221,46 @@ Examples: | esql_query | esql_query | {query: "FROM query WHERE true", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | {query: "FROM query WHERE false", language: "esql"} | ``` +#### **Scenario: `ABB` - Rule field is rule `type`** + +**Automation**: 1 integration test with mock rules + a set of unit tests for each algorithm + +```Gherkin +Given field is customized by the user (current version != base version) +And field is updated by Elastic in this upgrade (target version != base version) +And customized field is the same as the Elastic update in this upgrade (current version == target version) +Then for field the diff algorithm should output the target version as the merged one with a non-solvable conflict +And field should be returned from the `upgrade/_review` API endpoint +And field should be shown in the upgrade preview UI + +Examples: +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| rule type | type | "query" | "saved_query" | "saved_query" | "saved_query" | +``` + +Notes: `type` field can only be changed between `query` and `saved_query` rule types in the UI and API via normal conventions, but the logic for others is still covered + ### Rule field has an update and a custom value that are NOT the same - `ABC` +#### **Scenario: `ABC` - Rule field is rule `type`** + +**Automation**: 1 integration test with mock rules + a set of unit tests for the algorithms + +```Gherkin +Given field is customized by the user (current version != base version) +And field is updated by Elastic in this upgrade (target version != base version) +And customized field is different than the Elastic update in this upgrade (current version != target version) +Then for field the diff algorithm should output the target version as the merged one with a non-solvable conflict +And field should be returned from the `upgrade/_review` API endpoint +And field should be shown in the upgrade preview UI + +Examples: +| algorithm | field_name | base_version | current_version | target_version | merged_version | +| rule type | type | "query" | "saved_query" | "threshold" | "threshold" | +``` + +Notes: `type` field can only be changed between `query` and `saved_query` rule types in the UI and API via normal conventions, but the logic for others is still covered. This test case scenario cannot currently be reached. + #### **Scenario: `ABC` - Rule field is a number or single line string** **Automation**: 2 integration tests with mock rules + a set of unit tests for the algorithms @@ -328,7 +408,7 @@ Examples: #### **Scenario: `-AA` - Rule field is any type** -**Automation**: 9 integration tests with mock rules + a set of unit tests for each algorithm +**Automation**: 11 integration tests with mock rules + a set of unit tests for each algorithm ```Gherkin Given at least 1 installed prebuilt rule has a new version available @@ -340,6 +420,7 @@ And field should not be shown in the upgrade preview UI Examples: | algorithm | field_name | base_version | current_version | target_version | merged_version | +| rule type | type | N/A | "query" | "query" | "query" | | single line string | name | N/A | "A" | "A" | "A" | | multi line string | description | N/A | "My description.\nThis is a second line." | "My description.\nThis is a second line." | "My description.\nThis is a second line." | | number | risk_score | N/A | 1 | 1 | 1 | @@ -438,3 +519,23 @@ Examples: | algorithm | base_version | current_version | target_version | merged_version | | data_source | N/A | {type: "index_patterns", "index_patterns": ["one", "two", "three"]} | {type: "data_view", "data_view_id": "A"} | {type: "data_view", "data_view_id": "A"} | ``` + +#### **Scenario: `-AB` - Rule field is rule `type`** + +**Automation**: 1 integration test with mock rules + a set of unit tests for the algorithm + +```Gherkin +Given at least 1 installed prebuilt rule has a new version available +And the base version of the rule cannot be determined +And customized data_source field is different than the Elastic update in this upgrade (current version != target version) +And current version and target version are not both array fields in data_source +Then for data_source field the diff algorithm should output the target version as the merged version with a non-solvable conflict +And data_source field should be returned from the `upgrade/_review` API endpoint +And data_source field should be shown in the upgrade preview UI + +Examples: +| algorithm | base_version | current_version | target_version | merged_version | +| rule type | N/A | "query" | "saved_query" | "saved_query" | +``` + +Notes: `type` field can only be changed between `query` and `saved_query` rule types in the UI and API via normal conventions, but the logic for others is still covered From c1f72d71cade7423ab5ab5d3ed68f4aa086f5faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:19:19 +0100 Subject: [PATCH 024/107] [Inventory] Typing entities (#194431) Adds typescript to the Entity type. It correctly infers the type based on the entity.type field. Screenshot 2024-09-30 at 14 03 27 Screenshot 2024-09-30 at 14 03 37 Screenshot 2024-09-30 at 14 03 49 --- .../inventory/common/entities.ts | 42 +++++++++++++++++++ .../entities_grid/entities_grid.stories.tsx | 2 +- .../entities_grid/mock/entities_mock.ts | 4 +- .../routes/entities/get_latest_entities.ts | 19 ++------- .../common/field_names/elasticsearch.ts | 1 + .../observability_shared/common/index.ts | 1 + 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/observability_solution/inventory/common/entities.ts b/x-pack/plugins/observability_solution/inventory/common/entities.ts index 2135688d75467..5dec3420ee005 100644 --- a/x-pack/plugins/observability_solution/inventory/common/entities.ts +++ b/x-pack/plugins/observability_solution/inventory/common/entities.ts @@ -7,6 +7,19 @@ import * as t from 'io-ts'; import { ENTITY_LATEST, entitiesAliasPattern } from '@kbn/entities-schema'; import { isRight } from 'fp-ts/lib/Either'; +import { + SERVICE_ENVIRONMENT, + SERVICE_NAME, + CONTAINER_ID, + HOST_NAME, +} from '@kbn/observability-shared-plugin/common'; +import { + ENTITY_DEFINITION_ID, + ENTITY_DISPLAY_NAME, + ENTITY_ID, + ENTITY_LAST_SEEN, + ENTITY_TYPE, +} from './es_fields/entities'; export const entityTypeRt = t.union([ t.literal('service'), @@ -57,3 +70,32 @@ export const entityTypesRt = new t.Type( }, (arr) => arr.join() ); + +interface BaseEntity { + [ENTITY_LAST_SEEN]: string; + [ENTITY_ID]: string; + [ENTITY_TYPE]: EntityType; + [ENTITY_DISPLAY_NAME]: string; + [ENTITY_DEFINITION_ID]: string; +} + +/** + * These types are based on service, host and container from the built in definition. + */ +interface ServiceEntity extends BaseEntity { + [ENTITY_TYPE]: 'service'; + [SERVICE_NAME]: string; + [SERVICE_ENVIRONMENT]?: string | null; +} + +interface HostEntity extends BaseEntity { + [ENTITY_TYPE]: 'host'; + [HOST_NAME]: string; +} + +interface ContainerEntity extends BaseEntity { + [ENTITY_TYPE]: 'container'; + [CONTAINER_ID]: string; +} + +export type Entity = ServiceEntity | HostEntity | ContainerEntity; diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx index 996f0ec951581..f05bf920a1845 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entities_grid.stories.tsx @@ -40,7 +40,7 @@ export const Example: Story<{}> = () => { ); return ( - + {`Entity filter: ${selectedEntityType || 'N/A'}`} ; -export const entitiesMock: InventoryEntitiesAPIReturnType['entities'] = [ +export const entitiesMock = [ { 'entity.lastSeenTimestamp': '2023-08-20T10:50:06.384Z', 'entity.type': 'host', @@ -3011,4 +3011,4 @@ export const entitiesMock: InventoryEntitiesAPIReturnType['entities'] = [ 'entity.displayName': 'Troy McClure', 'entity.id': '499', }, -]; +] as unknown as InventoryEntitiesAPIReturnType['entities']; diff --git a/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts b/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts index be909308e49c3..853d52d8401a9 100644 --- a/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts +++ b/x-pack/plugins/observability_solution/inventory/server/routes/entities/get_latest_entities.ts @@ -12,22 +12,10 @@ import { ENTITIES_LATEST_ALIAS, MAX_NUMBER_OF_ENTITIES, type EntityType, + Entity, } from '../../../common/entities'; -import { - ENTITY_DISPLAY_NAME, - ENTITY_ID, - ENTITY_LAST_SEEN, - ENTITY_TYPE, -} from '../../../common/es_fields/entities'; import { getEntityDefinitionIdWhereClause, getEntityTypesWhereClause } from './query_helper'; -export interface LatestEntity { - [ENTITY_LAST_SEEN]: string; - [ENTITY_TYPE]: string; - [ENTITY_DISPLAY_NAME]: string; - [ENTITY_ID]: string; -} - export async function getLatestEntities({ inventoryEsClient, sortDirection, @@ -47,8 +35,7 @@ export async function getLatestEntities({ | ${getEntityDefinitionIdWhereClause()} | SORT ${sortField} ${sortDirection} | LIMIT ${MAX_NUMBER_OF_ENTITIES} - | KEEP ${ENTITY_LAST_SEEN}, ${ENTITY_TYPE}, ${ENTITY_DISPLAY_NAME}, ${ENTITY_ID} - `, + `, filter: { bool: { filter: [...kqlQuery(kuery)], @@ -56,5 +43,5 @@ export async function getLatestEntities({ }, }); - return esqlResultToPlainObjects(latestEntitiesEsqlResponse); + return esqlResultToPlainObjects(latestEntitiesEsqlResponse); } diff --git a/x-pack/plugins/observability_solution/observability_shared/common/field_names/elasticsearch.ts b/x-pack/plugins/observability_solution/observability_shared/common/field_names/elasticsearch.ts index 35873a31150ac..afaf78ef1aa9b 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/field_names/elasticsearch.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/field_names/elasticsearch.ts @@ -107,6 +107,7 @@ export const LABEL_NAME = 'labels.name'; export const HOST = 'host'; export const HOST_HOSTNAME = 'host.hostname'; +export const HOST_NAME = 'host.name'; export const HOST_OS_PLATFORM = 'host.os.platform'; export const CONTAINER_ID = 'container.id'; export const KUBERNETES = 'kubernetes'; diff --git a/x-pack/plugins/observability_solution/observability_shared/common/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/index.ts index d13e2b32839d6..e14bbb4139176 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/index.ts @@ -98,6 +98,7 @@ export { LABEL_NAME, HOST, HOST_HOSTNAME, + HOST_NAME, HOST_OS_PLATFORM, CONTAINER_ID, KUBERNETES, From 18465e7f7e5d9912e61da68873045f0db984fa2b Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:27:29 -0400 Subject: [PATCH 025/107] [Security Solution] Rule `type` field diff algorithm (#193369) ## Summary Addresses https://github.com/elastic/kibana/issues/190482 Adds the diff algorithm implementation for the prebuilt rule `type` field. Returns `target_version` and a `NON_SOLVABLE` conflict for every outcome that changes the field. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../diff/calculation/algorithms/index.ts | 1 + .../rule_type_diff_algorithm.test.ts | 165 ++++++++++++++++++ .../algorithms/rule_type_diff_algorithm.ts | 98 +++++++++++ 3 files changed, 264 insertions(+) create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.ts diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/index.ts index 629f329c72b9b..c8b55a49edc00 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/index.ts @@ -14,3 +14,4 @@ export { dataSourceDiffAlgorithm } from './data_source_diff_algorithm'; export { kqlQueryDiffAlgorithm } from './kql_query_diff_algorithm'; export { eqlQueryDiffAlgorithm } from './eql_query_diff_algorithm'; export { esqlQueryDiffAlgorithm } from './esql_query_diff_algorithm'; +export { ruleTypeDiffAlgorithm } from './rule_type_diff_algorithm'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.test.ts new file mode 100644 index 0000000000000..accf133ac71b3 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.test.ts @@ -0,0 +1,165 @@ +/* + * Copyright 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 { + DiffableRuleTypes, + ThreeVersionsOf, +} from '../../../../../../../../common/api/detection_engine'; +import { + ThreeWayDiffOutcome, + ThreeWayMergeOutcome, + MissingVersion, + ThreeWayDiffConflict, +} from '../../../../../../../../common/api/detection_engine'; +import { ruleTypeDiffAlgorithm } from './rule_type_diff_algorithm'; + +describe('ruleTypeDiffAlgorithm', () => { + it('returns current_version as merged output if there is no update - scenario AAA', () => { + const mockVersions: ThreeVersionsOf = { + base_version: 'query', + current_version: 'query', + target_version: 'query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.StockValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + }) + ); + }); + + it('returns current_version as merged output if current_version is different and there is no update - scenario ABA', () => { + // User can change rule type field between `query` and `saved_query` in the UI, no other rule types + const mockVersions: ThreeVersionsOf = { + base_version: 'query', + current_version: 'saved_query', + target_version: 'query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + }) + ); + }); + + it('returns target_version as merged output if current_version is the same and there is an update - scenario AAB', () => { + // User can change rule type field between `query` and `saved_query` in the UI, no other rule types + const mockVersions: ThreeVersionsOf = { + base_version: 'query', + current_version: 'query', + target_version: 'saved_query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.StockValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + }) + ); + }); + + it('returns current_version as merged output if current version is different but it matches the update - scenario ABB', () => { + // User can change rule type field between `query` and `saved_query` in the UI, no other rule types + const mockVersions: ThreeVersionsOf = { + base_version: 'query', + current_version: 'saved_query', + target_version: 'saved_query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueSameUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + }) + ); + }); + + it('returns current_version as merged output if all three versions are different - scenario ABC', () => { + // User can change rule type field between `query` and `saved_query` in the UI, no other rule types + // NOTE: This test case scenario is currently inaccessible via normal UI or API workflows, but the logic is covered just in case + const mockVersions: ThreeVersionsOf = { + base_version: 'query', + current_version: 'eql', + target_version: 'saved_query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.CustomizedValueCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + }) + ); + }); + + describe('if base_version is missing', () => { + it('returns current_version as merged output if current_version and target_version are the same - scenario -AA', () => { + const mockVersions: ThreeVersionsOf = { + base_version: MissingVersion, + current_version: 'query', + target_version: 'query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + has_base_version: false, + base_version: undefined, + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.MissingBaseNoUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NONE, + }) + ); + }); + + it('returns target_version as merged output if current_version and target_version are different - scenario -AB', () => { + // User can change rule type field between `query` and `saved_query` in the UI, no other rule types + const mockVersions: ThreeVersionsOf = { + base_version: MissingVersion, + current_version: 'query', + target_version: 'saved_query', + }; + + const result = ruleTypeDiffAlgorithm(mockVersions); + + expect(result).toEqual( + expect.objectContaining({ + has_base_version: false, + base_version: undefined, + merged_version: mockVersions.target_version, + diff_outcome: ThreeWayDiffOutcome.MissingBaseCanUpdate, + merge_outcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + }) + ); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.ts new file mode 100644 index 0000000000000..0701d1e46d251 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/algorithms/rule_type_diff_algorithm.ts @@ -0,0 +1,98 @@ +/* + * Copyright 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 { assertUnreachable } from '../../../../../../../../common/utility_types'; +import type { + DiffableRuleTypes, + ThreeVersionsOf, + ThreeWayDiff, +} from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; +import { + determineDiffOutcome, + determineIfValueCanUpdate, + MissingVersion, + ThreeWayDiffConflict, + ThreeWayDiffOutcome, + ThreeWayMergeOutcome, +} from '../../../../../../../../common/api/detection_engine/prebuilt_rules'; + +export const ruleTypeDiffAlgorithm = ( + versions: ThreeVersionsOf +): ThreeWayDiff => { + const { + base_version: baseVersion, + current_version: currentVersion, + target_version: targetVersion, + } = versions; + + const diffOutcome = determineDiffOutcome(baseVersion, currentVersion, targetVersion); + const valueCanUpdate = determineIfValueCanUpdate(diffOutcome); + + const hasBaseVersion = baseVersion !== MissingVersion; + + const { mergeOutcome, conflict, mergedVersion } = mergeVersions({ + targetVersion, + diffOutcome, + }); + + return { + has_base_version: hasBaseVersion, + base_version: hasBaseVersion ? baseVersion : undefined, + current_version: currentVersion, + target_version: targetVersion, + merged_version: mergedVersion, + merge_outcome: mergeOutcome, + + diff_outcome: diffOutcome, + has_update: valueCanUpdate, + conflict, + }; +}; + +interface MergeResult { + mergeOutcome: ThreeWayMergeOutcome; + mergedVersion: TValue; + conflict: ThreeWayDiffConflict; +} + +interface MergeArgs { + targetVersion: TValue; + diffOutcome: ThreeWayDiffOutcome; +} + +const mergeVersions = ({ + targetVersion, + diffOutcome, +}: MergeArgs): MergeResult => { + switch (diffOutcome) { + // Scenario -AA is treated as scenario AAA: + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseNoUpdate: + case ThreeWayDiffOutcome.StockValueNoUpdate: + return { + conflict: ThreeWayDiffConflict.NONE, + mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, + }; + case ThreeWayDiffOutcome.CustomizedValueNoUpdate: + case ThreeWayDiffOutcome.CustomizedValueSameUpdate: + case ThreeWayDiffOutcome.StockValueCanUpdate: + // NOTE: This scenario is currently inaccessible via normal UI or API workflows, but the logic is covered just in case + case ThreeWayDiffOutcome.CustomizedValueCanUpdate: + // Scenario -AB is treated as scenario ABC: + // https://github.com/elastic/kibana/pull/184889#discussion_r1636421293 + case ThreeWayDiffOutcome.MissingBaseCanUpdate: { + return { + mergedVersion: targetVersion, + mergeOutcome: ThreeWayMergeOutcome.Target, + conflict: ThreeWayDiffConflict.NON_SOLVABLE, + }; + } + default: + return assertUnreachable(diffOutcome); + } +}; From 7730eaba8d631c56df92e206aafd82084e4351cc Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:43:02 -0700 Subject: [PATCH 026/107] [ResponseOps][Connectors] add the "service message" to the message generated for errors (#194213) Resolves https://github.com/elastic/kibana/issues/187288 ## Summary When a connector fails we log the error message. In this PR I updated the log message to include the error message followed by the serviceMessage if it's populated. This change will help provide more detailed info in the log messages when a connector fails. ### Checklist - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### To verify - Create a connector and update the executor code to make it fail - Create rule with your connector - Verify that the log message includes more details about the error instead of something like the following example for email connectors: `Action '[email connector name]' failed: error sending email"` --- .../server/lib/task_runner_factory.test.ts | 48 +++++++++++++++++++ .../actions/server/lib/task_runner_factory.ts | 8 +++- 2 files changed, 55 insertions(+), 1 deletion(-) 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 3dd86bdcf148d..6c4cdd31ccf6c 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 @@ -890,6 +890,54 @@ describe('Task Runner Factory', () => { expect(getErrorSource(err)).toBe(TaskErrorSource.FRAMEWORK); }); + test(`will throw an error and log the error message with the serviceMessage`, async () => { + const taskRunner = taskRunnerFactory.create({ + taskInstance: { + ...mockedTaskInstance, + attempts: 0, + }, + }); + + mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ + id: '3', + type: 'action_task_params', + attributes: { + actionId: '2', + params: { baz: true }, + executionId: '123abc', + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [ + { + id: '2', + name: 'actionRef', + type: 'action', + }, + ], + }); + mockedActionExecutor.execute.mockResolvedValueOnce({ + status: 'error', + actionId: '2', + message: 'Error message', + serviceMessage: 'Service message', + data: { foo: true }, + retry: false, + errorSource: TaskErrorSource.FRAMEWORK, + }); + + let err; + try { + await taskRunner.run(); + } catch (e) { + err = e; + } + + expect(err).toBeDefined(); + expect(taskRunnerFactoryInitializerParams.logger.error as jest.Mock).toHaveBeenCalledWith( + `Action '2' failed: Error message: Service message` + ); + }); + test(`fallbacks to FRAMEWORK error if ActionExecutor does not return any type of source'`, async () => { const taskRunner = taskRunnerFactory.create({ taskInstance: { 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 2c28c61cad3de..d6b418c481ea5 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.ts @@ -150,7 +150,13 @@ export class TaskRunnerFactory { inMemoryMetrics.increment(IN_MEMORY_METRICS.ACTION_EXECUTIONS); if (executorResult.status === 'error') { inMemoryMetrics.increment(IN_MEMORY_METRICS.ACTION_FAILURES); - logger.error(`Action '${actionId}' failed: ${executorResult.message}`); + + let message = executorResult.message; + if (executorResult.serviceMessage) { + message = `${message}: ${executorResult.serviceMessage}`; + } + logger.error(`Action '${actionId}' failed: ${message}`); + // 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`. throw throwRetryableError( From f7d1dd4bf35648b7a3db8fc7d16666f93949b43c Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Mon, 30 Sep 2024 12:49:59 -0500 Subject: [PATCH 027/107] [Search][Onboarding] Start Page File Upload & O11y links (#194231) ## Summary - Clean-up for start page - enabled submitting create index form w/ enter in index name input - extracted start page example to hook to make it easier to update later - Moved start page language up so changes are saved when switching between UI & Code views - Added File Upload link to the ML file uploader - Added callouts for O11y ### Screenshots image ### 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) - [ ] [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 --------- Co-authored-by: Michael DeFazio --- .../search_indices/common/doc_links.ts | 2 + .../public/analytics/constants.ts | 1 + .../public/code_examples/create_index.ts | 2 + .../public/components/start/create_index.tsx | 197 ++++++++----- .../components/start/create_index_code.tsx | 32 +-- .../components/start/elasticsearch_start.tsx | 260 ++++++++++++------ .../start/hooks/use_coding_examples.tsx | 15 + .../public/components/start/types.ts | 3 + .../plugins/search_indices/public/plugin.ts | 3 + x-pack/plugins/search_indices/public/types.ts | 1 + .../svl_search_elasticsearch_start_page.ts | 23 ++ .../search/config.feature_flags.ts | 9 +- .../functional/test_suites/search/config.ts | 6 +- .../test_suites/search/elasticsearch_start.ts | 12 + 14 files changed, 389 insertions(+), 177 deletions(-) create mode 100644 x-pack/plugins/search_indices/public/components/start/hooks/use_coding_examples.tsx diff --git a/x-pack/plugins/search_indices/common/doc_links.ts b/x-pack/plugins/search_indices/common/doc_links.ts index 8cceb45041ab9..d7e7119dd7004 100644 --- a/x-pack/plugins/search_indices/common/doc_links.ts +++ b/x-pack/plugins/search_indices/common/doc_links.ts @@ -10,12 +10,14 @@ import { DocLinks } from '@kbn/doc-links'; class SearchIndicesDocLinks { public apiReference: string = ''; public setupSemanticSearch: string = ''; + public analyzeLogs: string = ''; constructor() {} setDocLinks(newDocLinks: DocLinks) { this.apiReference = newDocLinks.apiReference; this.setupSemanticSearch = newDocLinks.enterpriseSearch.semanticSearch; + this.analyzeLogs = newDocLinks.serverlessSearch.integrations; } } export const docLinks = new SearchIndicesDocLinks(); diff --git a/x-pack/plugins/search_indices/public/analytics/constants.ts b/x-pack/plugins/search_indices/public/analytics/constants.ts index 563e5b62382c0..2a8c6d0d0ea0d 100644 --- a/x-pack/plugins/search_indices/public/analytics/constants.ts +++ b/x-pack/plugins/search_indices/public/analytics/constants.ts @@ -13,6 +13,7 @@ export enum AnalyticsEvents { startCreateIndexLanguageSelect = 'start_code_lang_select', startCreateIndexCodeCopyInstall = 'start_code_copy_install', startCreateIndexCodeCopy = 'start_code_copy', + startFileUploadClick = 'start_file_upload', indexDetailsInstallCodeCopy = 'index_details_code_copy_install', indexDetailsAddMappingsCodeCopy = 'index_details_add_mappings_code_copy', indexDetailsIngestDocumentsCodeCopy = 'index_details_ingest_documents_code_copy', diff --git a/x-pack/plugins/search_indices/public/code_examples/create_index.ts b/x-pack/plugins/search_indices/public/code_examples/create_index.ts index 627329b37d0be..01d969df3d70d 100644 --- a/x-pack/plugins/search_indices/public/code_examples/create_index.ts +++ b/x-pack/plugins/search_indices/public/code_examples/create_index.ts @@ -13,6 +13,7 @@ import { PythonServerlessCreateIndexExamples } from './python'; import { ConsoleCreateIndexExamples } from './sense'; export const DefaultServerlessCodeExamples: CreateIndexCodeExamples = { + exampleType: 'search', sense: ConsoleCreateIndexExamples.default, curl: CurlCreateIndexExamples.default, python: PythonServerlessCreateIndexExamples.default, @@ -20,6 +21,7 @@ export const DefaultServerlessCodeExamples: CreateIndexCodeExamples = { }; export const DenseVectorSeverlessCodeExamples: CreateIndexCodeExamples = { + exampleType: 'vector', sense: ConsoleCreateIndexExamples.dense_vector, curl: CurlCreateIndexExamples.dense_vector, python: PythonServerlessCreateIndexExamples.dense_vector, diff --git a/x-pack/plugins/search_indices/public/components/start/create_index.tsx b/x-pack/plugins/search_indices/public/components/start/create_index.tsx index ae191481e5da4..bd80922d79689 100644 --- a/x-pack/plugins/search_indices/public/components/start/create_index.tsx +++ b/x-pack/plugins/search_indices/public/components/start/create_index.tsx @@ -13,12 +13,16 @@ import { EuiFlexItem, EuiForm, EuiFormRow, + EuiHorizontalRule, EuiIcon, + EuiLink, + EuiPanel, EuiSpacer, EuiText, EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; import type { UserStartPrivilegesResponse } from '../../../common'; import { AnalyticsEvents } from '../../analytics/constants'; @@ -28,6 +32,7 @@ import { isValidIndexName } from '../../utils/indices'; import { useCreateIndex } from './hooks/use_create_index'; import { CreateIndexFormState } from './types'; +import { useKibana } from '../../hooks/use_kibana'; const CREATE_INDEX_CONTENT = i18n.translate( 'xpack.searchIndices.startPage.createIndex.action.text', @@ -47,6 +52,7 @@ export const CreateIndexForm = ({ formState, setFormState, }: CreateIndexFormProps) => { + const { application } = useKibana().services; const [indexNameHasError, setIndexNameHasError] = useState(false); const usageTracker = useUsageTracker(); const { createIndex, isLoading } = useCreateIndex(); @@ -65,93 +71,136 @@ export const CreateIndexForm = ({ setIndexNameHasError(invalidIndexName); } }; + const onFileUpload = useCallback(() => { + usageTracker.click(AnalyticsEvents.startFileUploadClick); + application.navigateToApp('ml', { path: 'filedatavisualizer' }); + }, [usageTracker, application]); return ( - - - + + - - - - - {userPrivileges?.privileges?.canCreateIndex === false ? ( - - {i18n.translate('xpack.searchIndices.startPage.createIndex.permissionTooltip', { - defaultMessage: 'You do not have permission to create an index.', - })} -

+ > + + )} + /> +
+ + + + {userPrivileges?.privileges?.canCreateIndex === false ? ( + + {i18n.translate('xpack.searchIndices.startPage.createIndex.permissionTooltip', { + defaultMessage: 'You do not have permission to create an index.', + })} +

+ } + > + + {CREATE_INDEX_CONTENT} + +
+ ) : ( {CREATE_INDEX_CONTENT} - - ) : ( - - {CREATE_INDEX_CONTENT} - - )} -
- - {userPrivileges?.privileges?.canCreateApiKeys && ( - - - -

- {i18n.translate( - 'xpack.searchIndices.startPage.createIndex.apiKeyCreation.description', - { - defaultMessage: "We'll create an API key for this index", - } - )} -

-
-
- )} -
-
-
+ )} +
+ + {userPrivileges?.privileges?.canCreateApiKeys && ( + + + +

+ {i18n.translate( + 'xpack.searchIndices.startPage.createIndex.apiKeyCreation.description', + { + defaultMessage: "We'll create an API key for this index", + } + )} +

+
+
+ )} +
+
+ + + + + + + + + +

+ + {i18n.translate( + 'xpack.searchIndices.startPage.createIndex.fileUpload.link', + { + defaultMessage: 'Upload a file', + } + )} + + ), + }} + /> +

+
+
+
+
+ ); }; diff --git a/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx b/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx index 6fc2fb3b50e2f..e8efe1c3b7e66 100644 --- a/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx +++ b/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx @@ -4,46 +4,47 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { TryInConsoleButton } from '@kbn/try-in-console'; import { AnalyticsEvents } from '../../analytics/constants'; import { Languages, AvailableLanguages, LanguageOptions } from '../../code_examples'; -import { DenseVectorSeverlessCodeExamples } from '../../code_examples/create_index'; + import { useUsageTracker } from '../../hooks/use_usage_tracker'; import { useKibana } from '../../hooks/use_kibana'; import { useElasticsearchUrl } from '../../hooks/use_elasticsearch_url'; -import { getDefaultCodingLanguage } from '../../utils/language'; import { CodeSample } from '../shared/code_sample'; import { LanguageSelector } from '../shared/language_selector'; import { CreateIndexFormState } from './types'; +import { useStartPageCodingExamples } from './hooks/use_coding_examples'; export interface CreateIndexCodeViewProps { createIndexForm: CreateIndexFormState; + changeCodingLanguage: (language: AvailableLanguages) => void; } -// TODO: this will be dynamic based on stack / es3 & onboarding token -const SelectedCodeExamples = DenseVectorSeverlessCodeExamples; - -export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProps) => { +export const CreateIndexCodeView = ({ + createIndexForm, + changeCodingLanguage, +}: CreateIndexCodeViewProps) => { const { application, share, console: consolePlugin } = useKibana().services; const usageTracker = useUsageTracker(); + const selectedCodeExamples = useStartPageCodingExamples(); - const [selectedLanguage, setSelectedLanguage] = - useState(getDefaultCodingLanguage); + const { codingLanguage: selectedLanguage } = createIndexForm; const onSelectLanguage = useCallback( (value: AvailableLanguages) => { - setSelectedLanguage(value); + changeCodingLanguage(value); usageTracker.count([ AnalyticsEvents.startCreateIndexLanguageSelect, `${AnalyticsEvents.startCreateIndexLanguageSelect}_${value}`, ]); }, - [usageTracker] + [usageTracker, changeCodingLanguage] ); const elasticsearchUrl = useElasticsearchUrl(); const codeParams = useMemo(() => { @@ -53,8 +54,8 @@ export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProp }; }, [createIndexForm.indexName, elasticsearchUrl]); const selectedCodeExample = useMemo(() => { - return SelectedCodeExamples[selectedLanguage]; - }, [selectedLanguage]); + return selectedCodeExamples[selectedLanguage]; + }, [selectedLanguage, selectedCodeExamples]); return ( @@ -69,7 +70,7 @@ export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProp {selectedLanguage === 'curl' && ( diff --git a/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx b/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx index 131948d1a0377..8d6e85bfc900a 100644 --- a/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx +++ b/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx @@ -5,33 +5,39 @@ * 2.0. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { + EuiButtonEmpty, EuiButtonGroup, EuiFlexGroup, EuiFlexItem, - EuiForm, EuiIcon, EuiPanel, EuiSpacer, EuiText, + EuiTextAlign, EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { IndicesStatusResponse, UserStartPrivilegesResponse } from '../../../common'; +import { docLinks } from '../../../common/doc_links'; import { AnalyticsEvents } from '../../analytics/constants'; +import { AvailableLanguages } from '../../code_examples'; import { useUsageTracker } from '../../hooks/use_usage_tracker'; - import { generateRandomIndexName } from '../../utils/indices'; +import { getDefaultCodingLanguage } from '../../utils/language'; + import { CreateIndexForm } from './create_index'; import { CreateIndexCodeView } from './create_index_code'; import { CreateIndexFormState } from './types'; +import { useKibana } from '../../hooks/use_kibana'; function initCreateIndexState(): CreateIndexFormState { return { indexName: generateRandomIndexName(), + codingLanguage: getDefaultCodingLanguage(), }; } @@ -47,11 +53,13 @@ export interface ElasticsearchStartProps { } export const ElasticsearchStart = ({ userPrivileges }: ElasticsearchStartProps) => { + const { cloud, http } = useKibana().services; const [createIndexView, setCreateIndexView] = useState( userPrivileges?.privileges.canCreateIndex === false ? CreateIndexView.Code : CreateIndexView.UI ); - const [formState, setFormState] = useState(initCreateIndexState()); + const [formState, setFormState] = useState(initCreateIndexState); const usageTracker = useUsageTracker(); + useEffect(() => { usageTracker.load(AnalyticsEvents.startPageOpened); }, [usageTracker]); @@ -61,6 +69,15 @@ export const ElasticsearchStart = ({ userPrivileges }: ElasticsearchStartProps) setCreateIndexView(CreateIndexView.Code); } }, [userPrivileges]); + + const o11yTrialLink = useMemo(() => { + if (cloud && cloud.isServerlessEnabled) { + const baseUrl = cloud?.projectsUrl ?? 'https://cloud.elastic.co/projects/'; + return `${baseUrl}create/observability/start`; + } + return http.basePath.prepend('/app/observability/onboarding'); + }, [cloud, http]); + const onChangeView = useCallback( (id) => { switch (id) { @@ -76,6 +93,15 @@ export const ElasticsearchStart = ({ userPrivileges }: ElasticsearchStartProps) }, [usageTracker] ); + const onChangeCodingLanguage = useCallback( + (language: AvailableLanguages) => { + setFormState({ + ...formState, + codingLanguage: language, + }); + }, + [formState, setFormState] + ); return ( - - - - - - + + + + + +

{i18n.translate('xpack.searchIndices.startPage.pageTitle', { @@ -98,81 +124,153 @@ export const ElasticsearchStart = ({ userPrivileges }: ElasticsearchStartProps) })}

- - -

- {i18n.translate('xpack.searchIndices.startPage.pageDescription', { - defaultMessage: 'Vectorize, search, and visualize your data', - })} -

-
-
-
-
+
+
+ + +

+ {i18n.translate('xpack.searchIndices.startPage.pageDescription', { + defaultMessage: 'Vectorize, search, and visualize your data', + })} +

+
+ - - - - - -

- {i18n.translate('xpack.searchIndices.startPage.createIndex.title', { - defaultMessage: 'Create your first index', - })} -

-
-
- - - -
- -

- {i18n.translate('xpack.searchIndices.startPage.createIndex.description', { - defaultMessage: - 'An index stores your data and defines the schema, or field mappings, for your searches', - })} -

-
- {createIndexView === CreateIndexView.UI && ( - + + + +

+ {i18n.translate('xpack.searchIndices.startPage.createIndex.title', { + defaultMessage: 'Create your first index', + })} +

+
+
+ + - )} - {createIndexView === CreateIndexView.Code && ( - - )} +
-
+ +

+ {i18n.translate('xpack.searchIndices.startPage.createIndex.description', { + defaultMessage: + 'An index stores your data and defines the schema, or field mappings, for your searches', + })} +

+
+ {createIndexView === CreateIndexView.UI && ( + + )} + {createIndexView === CreateIndexView.Code && ( + + )} +
+ + + + + +
+ {i18n.translate('xpack.searchIndices.startPage.observabilityCallout.title', { + defaultMessage: 'Looking to store your logs or metrics data?', + })} +
+
+
+ + + + + {i18n.translate('xpack.searchIndices.startPage.observabilityCallout.logs.button', { + defaultMessage: 'Collect and analyze logs', + })} + + + + {i18n.translate( + 'xpack.searchIndices.startPage.observabilityCallout.logs.subTitle', + { + defaultMessage: 'Explore Logstash and Beats', + } + )} + + + + + or + + + + {i18n.translate( + 'xpack.searchIndices.startPage.observabilityCallout.o11yTrial.button', + { + defaultMessage: 'Start an Observability trial', + } + )} + + + + {i18n.translate( + 'xpack.searchIndices.startPage.observabilityCallout.o11yTrial.subTitle', + { + defaultMessage: 'Powerful performance monitoring', + } + )} + + + +
); diff --git a/x-pack/plugins/search_indices/public/components/start/hooks/use_coding_examples.tsx b/x-pack/plugins/search_indices/public/components/start/hooks/use_coding_examples.tsx new file mode 100644 index 0000000000000..1a351d10943f2 --- /dev/null +++ b/x-pack/plugins/search_indices/public/components/start/hooks/use_coding_examples.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 { CreateIndexCodeExamples } from '../../../types'; +import { DenseVectorSeverlessCodeExamples } from '../../../code_examples/create_index'; + +export const useStartPageCodingExamples = (): CreateIndexCodeExamples => { + // TODO: in the future this will be dynamic based on the onboarding token + // or project sub-type + return DenseVectorSeverlessCodeExamples; +}; diff --git a/x-pack/plugins/search_indices/public/components/start/types.ts b/x-pack/plugins/search_indices/public/components/start/types.ts index 6b6c1c8e38f61..c0dbbeca88883 100644 --- a/x-pack/plugins/search_indices/public/components/start/types.ts +++ b/x-pack/plugins/search_indices/public/components/start/types.ts @@ -5,6 +5,9 @@ * 2.0. */ +import type { AvailableLanguages } from '../../code_examples'; + export interface CreateIndexFormState { indexName: string; + codingLanguage: AvailableLanguages; } diff --git a/x-pack/plugins/search_indices/public/plugin.ts b/x-pack/plugins/search_indices/public/plugin.ts index 5ebfb84e1cd39..bec4f7cb7bfe6 100644 --- a/x-pack/plugins/search_indices/public/plugin.ts +++ b/x-pack/plugins/search_indices/public/plugin.ts @@ -7,6 +7,8 @@ import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; + +import { docLinks } from '../common/doc_links'; import type { SearchIndicesAppPluginStartDependencies, SearchIndicesPluginSetup, @@ -64,6 +66,7 @@ export class SearchIndicesPlugin } public start(core: CoreStart): SearchIndicesPluginStart { + docLinks.setDocLinks(core.docLinks.links); return {}; } diff --git a/x-pack/plugins/search_indices/public/types.ts b/x-pack/plugins/search_indices/public/types.ts index 95f5eb2883d2e..a3e63df2642b3 100644 --- a/x-pack/plugins/search_indices/public/types.ts +++ b/x-pack/plugins/search_indices/public/types.ts @@ -77,6 +77,7 @@ export interface CreateIndexCodeDefinition { } export interface CreateIndexCodeExamples { + exampleType: string; sense: CreateIndexCodeDefinition; curl: CreateIndexCodeDefinition; python: CreateIndexCodeDefinition; diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts b/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts index 33dbc6f693ea8..798d396258e75 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts @@ -30,6 +30,11 @@ export function SvlSearchElasticsearchStartPageProvider({ getService }: FtrProvi ); }); }, + async expectToBeOnMLFileUploadPage() { + await retry.tryForTime(60 * 1000, async () => { + expect(await browser.getCurrentUrl()).contain('/app/ml/filedatavisualizer'); + }); + }, async expectIndexNameToExist() { await testSubjects.existOrFail('indexNameField'); }, @@ -67,5 +72,23 @@ export function SvlSearchElasticsearchStartPageProvider({ getService }: FtrProvi await testSubjects.existOrFail('createIndexCodeViewBtn'); await testSubjects.click('createIndexCodeViewBtn'); }, + async clickFileUploadLink() { + await testSubjects.existOrFail('uploadFileLink'); + await testSubjects.click('uploadFileLink'); + }, + async expectAnalyzeLogsLink() { + await testSubjects.existOrFail('analyzeLogsBtn'); + expect(await testSubjects.getAttribute('analyzeLogsBtn', 'href')).equal( + 'https://docs.elastic.co/serverless/elasticsearch/ingest-your-data' + ); + expect(await testSubjects.getAttribute('analyzeLogsBtn', 'target')).equal('_blank'); + }, + async expectO11yTrialLink() { + await testSubjects.existOrFail('startO11yTrialBtn'); + expect(await testSubjects.getAttribute('startO11yTrialBtn', 'href')).equal( + 'https://fake-cloud.elastic.co/projects/create/observability/start' + ); + expect(await testSubjects.getAttribute('startO11yTrialBtn', 'target')).equal('_blank'); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts index 05eb6136bf008..824d145282257 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts @@ -19,10 +19,11 @@ export default createTestConfig({ suiteTags: { exclude: ['skipSvlSearch'] }, // add feature flags kbnServerArgs: [ - `--xpack.cloud.id='ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg=='`, - `--xpack.cloud.serverless.project_id='fakeprojectid'`, - `--xpack.cloud.base_url='https://cloud.elastic.co'`, - `--xpack.cloud.organization_url='/account/members'`, + `--xpack.cloud.id=ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg==`, + `--xpack.cloud.serverless.project_id=fakeprojectid`, + `--xpack.cloud.base_url=https://fake-cloud.elastic.co`, + `--xpack.cloud.projects_url=/projects/`, + `--xpack.cloud.organization_url=/account/members`, `--xpack.security.roleManagementEnabled=true`, `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities `--xpack.searchIndices.enabled=true`, // global empty state FF diff --git a/x-pack/test_serverless/functional/test_suites/search/config.ts b/x-pack/test_serverless/functional/test_suites/search/config.ts index 6853e75d987b8..4739cde53bf86 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.ts @@ -19,7 +19,9 @@ export default createTestConfig({ // https://github.com/elastic/project-controller/blob/main/internal/project/esproject/config/elasticsearch.yml esServerArgs: [], kbnServerArgs: [ - `--xpack.cloud.id='ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg=='`, - `--xpack.cloud.serverless.project_id='fakeprojectid'`, + `--xpack.cloud.id=ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg==`, + `--xpack.cloud.serverless.project_id=fakeprojectid`, + `--xpack.cloud.base_url=https://fake-cloud.elastic.co`, + `--xpack.cloud.projects_url=/projects/`, ], }); diff --git a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts index 55f1551141e47..f6362a409658e 100644 --- a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts +++ b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts @@ -81,6 +81,18 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.svlSearchElasticsearchStartPage.clickUIViewButton(); await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexUIView(); }); + + it('should have file upload link', async () => { + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.clickFileUploadLink(); + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnMLFileUploadPage(); + }); + + it('should have o11y links', async () => { + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.expectAnalyzeLogsLink(); + await pageObjects.svlSearchElasticsearchStartPage.expectO11yTrialLink(); + }); }); describe('viewer', function () { before(async () => { From c362ab8b920a0c34582ab046e8a3925e7a2d42fb Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Mon, 30 Sep 2024 11:59:14 -0600 Subject: [PATCH 028/107] [Security solution] Update ebt fields script to new Vault policy (#194458) --- x-pack/plugins/security_solution/scripts/telemetry/README.md | 2 +- .../security_solution/scripts/telemetry/build_ebt_data_view.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/scripts/telemetry/README.md b/x-pack/plugins/security_solution/scripts/telemetry/README.md index ea17f9b4a140c..f1cfa92dd731c 100644 --- a/x-pack/plugins/security_solution/scripts/telemetry/README.md +++ b/x-pack/plugins/security_solution/scripts/telemetry/README.md @@ -13,7 +13,7 @@ If you have further events to be included in the data views, please update the s ### Usage -1. Login with Vault (`vault login -method github`), ensure you have siem-team access. If you have never accessed Vault before, follow [these instructions](https://github.com/elastic/infra/blob/master/docs/vault/README.md) +1. Login with Vault (`vault login -method oidc`), ensure you have siem-team access. If you have never accessed Vault before, follow [these instructions](https://github.com/elastic/infra/blob/master/docs/vault/README.md) 2. cd into this directory 3. Run the script with the appropriate arguments. By default, the script will run for the `security-solution-ebt-kibana-browser` data view in the `securitysolution` space. If you want to run the script for the server data view, pass the `--telemetry_type` argument with the value `server`. diff --git a/x-pack/plugins/security_solution/scripts/telemetry/build_ebt_data_view.ts b/x-pack/plugins/security_solution/scripts/telemetry/build_ebt_data_view.ts index e17b72d195c6c..9cf8fe842a9e9 100755 --- a/x-pack/plugins/security_solution/scripts/telemetry/build_ebt_data_view.ts +++ b/x-pack/plugins/security_solution/scripts/telemetry/build_ebt_data_view.ts @@ -11,7 +11,7 @@ import { events as genAiEvents } from '@kbn/elastic-assistant-plugin/server/lib/ import { events as securityEvents } from '../../server/lib/telemetry/event_based/events'; import { telemetryEvents } from '../../public/common/lib/telemetry/events/telemetry_events'; -// uncomment and add to run script, but do not commit as creates cirular dependency +// uncomment and add to run script, but do not commit as creates circular dependency // import { telemetryEvents as serverlessEvents } from '@kbn/security-solution-serverless/server/telemetry/event_based_telemetry'; const logger = new ToolingLog({ From 5f83ac05991cd980ef5b205acd19c997b60045a3 Mon Sep 17 00:00:00 2001 From: Marshall Main <55718608+marshallmain@users.noreply.github.com> Date: Mon, 30 Sep 2024 11:07:39 -0700 Subject: [PATCH 029/107] [Security Solution][Detection Engine] Avoid creating list items for empty lines in import list API (#192681) ## Summary The quickstart tooling introduced in https://github.com/elastic/kibana/pull/190634 uses axios under the hood to make requests to Kibana. When attaching file data to the axios request with `FormData`, axios adds an extra empty line after the end content boundary. The logic in `buffer_lines.ts` assumes that there are no more lines after the end content boundary line, so importing a list with the quickstart tooling would create a list with an extra empty item. This empty item fails validation when retrieved through other APIs. This PR prevents lines after the end content boundary from being turned into list items in the import list API. --- .../services/items/buffer_lines.test.ts | 92 +++++++------------ .../server/services/items/buffer_lines.ts | 2 +- .../write_lines_to_bulk_list_items.test.ts | 12 +++ 3 files changed, 45 insertions(+), 61 deletions(-) diff --git a/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts b/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts index 509233d006b73..7faef72c38907 100644 --- a/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts +++ b/x-pack/plugins/lists/server/services/items/buffer_lines.test.ts @@ -23,9 +23,15 @@ describe('buffer_lines', () => { }).toThrow('bufferSize must be greater than zero'); }); - test('it can read a single line', (done) => { + test('two identical lines are collapsed into just one line without duplicates', (done) => { const input = new TestReadable(); + input.push('--boundary\n'); + input.push('Content-type: text/plain\n'); + input.push('Content-Disposition: form-data; name="fieldName"; filename="filename.text"\n'); + input.push('\n'); + input.push('line one\n'); input.push('line one\n'); + input.push('--boundary--\n'); input.push(null); const bufferedLine = new BufferLines({ bufferSize: IMPORT_BUFFER_SIZE, input }); let linesToTest: string[] = []; @@ -38,25 +44,8 @@ describe('buffer_lines', () => { }); }); - test('it can read a single line using a buffer size of 1', (done) => { + test('it can close out without writing any lines', (done) => { const input = new TestReadable(); - input.push('line one\n'); - input.push(null); - const bufferedLine = new BufferLines({ bufferSize: 1, input }); - let linesToTest: string[] = []; - bufferedLine.on('lines', (lines: string[]) => { - linesToTest = [...linesToTest, ...lines]; - }); - bufferedLine.on('close', () => { - expect(linesToTest).toEqual(['line one']); - done(); - }); - }); - - test('it can read two lines', (done) => { - const input = new TestReadable(); - input.push('line one\n'); - input.push('line two\n'); input.push(null); const bufferedLine = new BufferLines({ bufferSize: IMPORT_BUFFER_SIZE, input }); let linesToTest: string[] = []; @@ -64,74 +53,56 @@ describe('buffer_lines', () => { linesToTest = [...linesToTest, ...lines]; }); bufferedLine.on('close', () => { - expect(linesToTest).toEqual(['line one', 'line two']); - done(); - }); - }); - - test('it can read two lines using a buffer size of 1', (done) => { - const input = new TestReadable(); - input.push('line one\n'); - input.push('line two\n'); - input.push(null); - const bufferedLine = new BufferLines({ bufferSize: 1, input }); - let linesToTest: string[] = []; - bufferedLine.on('lines', (lines: string[]) => { - linesToTest = [...linesToTest, ...lines]; - }); - bufferedLine.on('close', () => { - expect(linesToTest).toEqual(['line one', 'line two']); + expect(linesToTest).toEqual([]); done(); }); }); - test('two identical lines are collapsed into just one line without duplicates', (done) => { + test('it can read 200 lines', (done) => { const input = new TestReadable(); - input.push('line one\n'); - input.push('line one\n'); - input.push(null); const bufferedLine = new BufferLines({ bufferSize: IMPORT_BUFFER_SIZE, input }); + input.push('--boundary\n'); + input.push('Content-type: text/plain\n'); + input.push('Content-Disposition: form-data; name="fieldName"; filename="filename.text"\n'); + input.push('\n'); let linesToTest: string[] = []; - bufferedLine.on('lines', (lines: string[]) => { - linesToTest = [...linesToTest, ...lines]; - }); - bufferedLine.on('close', () => { - expect(linesToTest).toEqual(['line one']); - done(); - }); - }); - - test('it can close out without writing any lines', (done) => { - const input = new TestReadable(); + const size200: string[] = new Array(200).fill(null).map((_, index) => `${index}\n`); + size200.forEach((element) => input.push(element)); + input.push('--boundary--\n'); input.push(null); - const bufferedLine = new BufferLines({ bufferSize: IMPORT_BUFFER_SIZE, input }); - let linesToTest: string[] = []; bufferedLine.on('lines', (lines: string[]) => { linesToTest = [...linesToTest, ...lines]; }); bufferedLine.on('close', () => { - expect(linesToTest).toEqual([]); + expect(linesToTest.length).toEqual(200); done(); }); }); - test('it can read 200 lines', (done) => { + test('it can read an example multi-part message', (done) => { const input = new TestReadable(); + input.push('--boundary\n'); + input.push('Content-type: text/plain\n'); + input.push('Content-Disposition: form-data; name="fieldName"; filename="filename.text"\n'); + input.push('\n'); + input.push('127.0.0.1\n'); + input.push('127.0.0.2\n'); + input.push('127.0.0.3\n'); + input.push('\n'); + input.push('--boundary--\n'); + input.push(null); const bufferedLine = new BufferLines({ bufferSize: IMPORT_BUFFER_SIZE, input }); let linesToTest: string[] = []; - const size200: string[] = new Array(200).fill(null).map((_, index) => `${index}\n`); - size200.forEach((element) => input.push(element)); - input.push(null); bufferedLine.on('lines', (lines: string[]) => { linesToTest = [...linesToTest, ...lines]; }); bufferedLine.on('close', () => { - expect(linesToTest.length).toEqual(200); + expect(linesToTest).toEqual(['127.0.0.1', '127.0.0.2', '127.0.0.3']); done(); }); }); - test('it can read an example multi-part message', (done) => { + test('it does not create empty values for lines after the end boundary', (done) => { const input = new TestReadable(); input.push('--boundary\n'); input.push('Content-type: text/plain\n'); @@ -142,6 +113,7 @@ describe('buffer_lines', () => { input.push('127.0.0.3\n'); input.push('\n'); input.push('--boundary--\n'); + input.push('\n'); input.push(null); const bufferedLine = new BufferLines({ bufferSize: IMPORT_BUFFER_SIZE, input }); let linesToTest: string[] = []; diff --git a/x-pack/plugins/lists/server/services/items/buffer_lines.ts b/x-pack/plugins/lists/server/services/items/buffer_lines.ts index cb6d073010127..e179fc4358468 100644 --- a/x-pack/plugins/lists/server/services/items/buffer_lines.ts +++ b/x-pack/plugins/lists/server/services/items/buffer_lines.ts @@ -48,7 +48,7 @@ export class BufferLines extends Readable { // we are at the end of the stream this.boundary = null; this.readableText = false; - } else { + } else if (this.readableText) { // we have actual content to push this.push(line); } diff --git a/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.test.ts b/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.test.ts index 78098fde59827..89c3d89fe631e 100644 --- a/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.test.ts +++ b/x-pack/plugins/lists/server/services/items/write_lines_to_bulk_list_items.test.ts @@ -49,6 +49,12 @@ describe('write_lines_to_bulk_list_items', () => { test('It imports a set of items to a write buffer by calling "getListItemByValues" with a single value given', async () => { const options = getImportListItemsToStreamOptionsMock(); const promise = importListItemsToStream(options); + options.stream.push('--boundary\n'); + options.stream.push('Content-type: text/plain\n'); + options.stream.push( + 'Content-Disposition: form-data; name="fieldName"; filename="filename.text"\n' + ); + options.stream.push('\n'); options.stream.push('127.0.0.1\n'); options.stream.push(null); await promise; @@ -58,6 +64,12 @@ describe('write_lines_to_bulk_list_items', () => { test('It imports a set of items to a write buffer by calling "getListItemByValues" with two values given', async () => { const options = getImportListItemsToStreamOptionsMock(); const promise = importListItemsToStream(options); + options.stream.push('--boundary\n'); + options.stream.push('Content-type: text/plain\n'); + options.stream.push( + 'Content-Disposition: form-data; name="fieldName"; filename="filename.text"\n' + ); + options.stream.push('\n'); options.stream.push('127.0.0.1\n'); options.stream.push('127.0.0.2\n'); options.stream.push(null); From d922ee1f8c1051633d58b34b5f272619687786de Mon Sep 17 00:00:00 2001 From: Toby Brain Date: Tue, 1 Oct 2024 04:14:11 +1000 Subject: [PATCH 030/107] Support global_data_tags in the policy update request (#194421) ## Summary https://github.com/elastic/kibana/pull/183563 adds support for `global_data_tags` however the field is not added to the update request definition in the OpenAPI spec. This PR defines the field within the API spec. Related to https://github.com/elastic/terraform-provider-elasticstack/pull/730 ### 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/)) - [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] 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) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../output/kibana.serverless.staging.yaml | 11 +++++++++++ oas_docs/output/kibana.serverless.yaml | 11 +++++++++++ oas_docs/output/kibana.staging.yaml | 11 +++++++++++ oas_docs/output/kibana.yaml | 11 +++++++++++ .../plugins/fleet/common/openapi/bundled.json | 19 ++++++++++++++++++- .../plugins/fleet/common/openapi/bundled.yaml | 11 +++++++++++ .../schemas/agent_policy_update_request.yaml | 9 +++++++++ 7 files changed, 82 insertions(+), 1 deletion(-) diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index a5d53bd71cc83..f4ed7a9767924 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -19977,6 +19977,17 @@ components: force: description: Force agent policy creation even if packages are not verified. type: boolean + global_data_tags: + items: + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. + type: object + type: array inactivity_timeout: type: integer is_protected: diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 93c3a5533c8a0..1b4209e9eec0a 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -12821,6 +12821,17 @@ components: force: description: Force agent policy creation even if packages are not verified. type: boolean + global_data_tags: + items: + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. + type: object + type: array inactivity_timeout: type: integer is_protected: diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index 96352fc0cd962..618bd42ab1f72 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -27753,6 +27753,17 @@ components: force: description: Force agent policy creation even if packages are not verified. type: boolean + global_data_tags: + items: + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. + type: object + type: array inactivity_timeout: type: integer is_protected: diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 6d53cb1a38bdd..35a446f538a6a 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -19780,6 +19780,17 @@ components: force: description: Force agent policy creation even if packages are not verified. type: boolean + global_data_tags: + items: + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. + type: object + type: array inactivity_timeout: type: integer is_protected: diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 2d74305ad3bd5..7ddd44baacf2d 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -7812,6 +7812,23 @@ "force": { "type": "boolean", "description": "Force agent policy creation even if packages are not verified." + }, + "global_data_tags": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "description": "User defined data tags that are added to all of the inputs. The values can be strings or numbers." + } } }, "required": [ @@ -9563,4 +9580,4 @@ "basicAuth": [] } ] -} +} \ No newline at end of file diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index c36758e8a4432..d60963068b8e5 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -5011,6 +5011,17 @@ components: force: type: boolean description: Force agent policy creation even if packages are not verified. + global_data_tags: + type: array + items: + type: object + additionalProperties: + oneOf: + - type: string + - type: number + description: >- + User defined data tags that are added to all of the inputs. The + values can be strings or numbers. required: - name - namespace diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_update_request.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_update_request.yaml index 7fb5581aa79e4..1d1dbd45037ae 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_update_request.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy_update_request.yaml @@ -47,6 +47,15 @@ properties: force: type: boolean description: Force agent policy creation even if packages are not verified. + global_data_tags: + type: array + items: + type: object + additionalProperties: + oneOf: + - type: string + - type: number + description: User defined data tags that are added to all of the inputs. The values can be strings or numbers. required: - name - namespace From 866adf37f13c79c06fe426fa822231940132de03 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 30 Sep 2024 11:37:47 -0700 Subject: [PATCH 031/107] Delete imports/references to EUI's distributed `.css` files (#194237) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Trying #194082 again, this time wholly deleting `kbn-ui-shared-deps-npm.v8.light/dark.css` as well 🤞 Original PR description: > These files no longer contain any meaningful CSS used within Kibana as of EUI's completed Emotion migration, and can be safely removed. EUI will shortly no longer distribute these static `.css` files (although `.scss` src files will still remain exported for the near future). --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../src/render_utils.test.ts | 36 ++++++++----------- .../src/render_utils.ts | 18 ++-------- .../src/rendering_service.test.ts | 9 ----- .../src/rendering_service.tsx | 1 - packages/kbn-storybook/templates/index.ejs | 1 - packages/kbn-ui-shared-deps-npm/index.js | 24 ------------- .../kbn-ui-shared-deps-npm/webpack.config.js | 2 -- .../plugins/canvas/shareable_runtime/index.ts | 1 - .../plugins/canvas/storybook/addon/panel.tsx | 1 - .../__snapshots__/prompt_page.test.tsx.snap | 4 +-- .../unauthenticated_page.test.tsx.snap | 4 +-- .../reset_session_page.test.tsx.snap | 4 +-- .../plugins/security/server/prompt_page.tsx | 2 -- x-pack/plugins/security/tsconfig.json | 1 - 14 files changed, 22 insertions(+), 86 deletions(-) diff --git a/packages/core/rendering/core-rendering-server-internal/src/render_utils.test.ts b/packages/core/rendering/core-rendering-server-internal/src/render_utils.test.ts index 85b3186a57c80..5cdf7ceb4ba39 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/render_utils.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/render_utils.test.ts @@ -55,39 +55,31 @@ describe('getCommonStylesheetPaths', () => { describe('getStylesheetPaths', () => { describe('when darkMode is `true`', () => { - describe('when themeVersion is `v8`', () => { - it('returns the correct list', () => { - expect( - getThemeStylesheetPaths({ - darkMode: true, - themeVersion: 'v8', - baseHref: '/base-path/buildShaShort', - }) - ).toMatchInlineSnapshot(` + it('returns the correct list', () => { + expect( + getThemeStylesheetPaths({ + darkMode: true, + baseHref: '/base-path/buildShaShort', + }) + ).toMatchInlineSnapshot(` Array [ - "/base-path/buildShaShort/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.v8.dark.css", "/base-path/buildShaShort/ui/legacy_dark_theme.min.css", ] `); - }); }); }); describe('when darkMode is `false`', () => { - describe('when themeVersion is `v8`', () => { - it('returns the correct list', () => { - expect( - getThemeStylesheetPaths({ - darkMode: false, - themeVersion: 'v8', - baseHref: '/base-path/buildShaShort', - }) - ).toMatchInlineSnapshot(` + it('returns the correct list', () => { + expect( + getThemeStylesheetPaths({ + darkMode: false, + baseHref: '/base-path/buildShaShort', + }) + ).toMatchInlineSnapshot(` Array [ - "/base-path/buildShaShort/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.v8.light.css", "/base-path/buildShaShort/ui/legacy_light_theme.min.css", ] `); - }); }); }); }); diff --git a/packages/core/rendering/core-rendering-server-internal/src/render_utils.ts b/packages/core/rendering/core-rendering-server-internal/src/render_utils.ts index dd8782e67edff..776e385906d7f 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/render_utils.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/render_utils.ts @@ -8,7 +8,6 @@ */ import { firstValueFrom } from 'rxjs'; -import UiSharedDepsNpm from '@kbn/ui-shared-deps-npm'; import * as UiSharedDepsSrc from '@kbn/ui-shared-deps-src'; import type { IConfigService } from '@kbn/config'; import type { BrowserLoggingConfig } from '@kbn/core-logging-common-internal'; @@ -57,28 +56,15 @@ export const getCommonStylesheetPaths = ({ baseHref }: { baseHref: string }) => export const getThemeStylesheetPaths = ({ darkMode, - themeVersion, baseHref, }: { darkMode: boolean; - themeVersion: UiSharedDepsNpm.ThemeVersion; baseHref: string; }) => { - const bundlesHref = getBundlesHref(baseHref); return [ ...(darkMode - ? [ - `${bundlesHref}/kbn-ui-shared-deps-npm/${UiSharedDepsNpm.darkCssDistFilename( - themeVersion - )}`, - `${baseHref}/ui/legacy_dark_theme.min.css`, - ] - : [ - `${bundlesHref}/kbn-ui-shared-deps-npm/${UiSharedDepsNpm.lightCssDistFilename( - themeVersion - )}`, - `${baseHref}/ui/legacy_light_theme.min.css`, - ]), + ? [`${baseHref}/ui/legacy_dark_theme.min.css`] + : [`${baseHref}/ui/legacy_light_theme.min.css`]), ]; }; diff --git a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts index b22697a494788..7f7f2f504411d 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts @@ -224,12 +224,10 @@ function renderTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledTimes(2); expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: true, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: false, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -380,7 +378,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: true, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -405,7 +402,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: false, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -428,7 +424,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: false, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -451,7 +446,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: true, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -474,7 +468,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: false, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -497,7 +490,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: false, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); @@ -520,7 +512,6 @@ function renderDarkModeTestCases( expect(getThemeStylesheetPathsMock).toHaveBeenCalledWith({ darkMode: true, - themeVersion: 'v8', baseHref: '/mock-server-basepath', }); }); diff --git a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx index a696328475853..44841ec0fbe3f 100644 --- a/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx @@ -212,7 +212,6 @@ export class RenderingService { const themeStylesheetPaths = (mode: boolean) => getThemeStylesheetPaths({ darkMode: mode, - themeVersion, baseHref: staticAssetsHrefBase, }); const commonStylesheetPaths = getCommonStylesheetPaths({ diff --git a/packages/kbn-storybook/templates/index.ejs b/packages/kbn-storybook/templates/index.ejs index bf40dfb9fd3ca..776b495447cec 100644 --- a/packages/kbn-storybook/templates/index.ejs +++ b/packages/kbn-storybook/templates/index.ejs @@ -27,7 +27,6 @@ - <% if (typeof headHtmlSnippet !=='undefined' ) { %> diff --git a/packages/kbn-ui-shared-deps-npm/index.js b/packages/kbn-ui-shared-deps-npm/index.js index b8be150acc311..73aaf151e8f0f 100644 --- a/packages/kbn-ui-shared-deps-npm/index.js +++ b/packages/kbn-ui-shared-deps-npm/index.js @@ -44,28 +44,4 @@ module.exports = { * Webpack loader for configuring the public path lookup from `window.__kbnPublicPath__`. */ publicPathLoader, - - /** - * Filename of the light-theme css file in the distributable directory - * @param {ThemeVersion} themeVersion - */ - lightCssDistFilename(themeVersion) { - if (themeVersion !== 'v8') { - throw new Error(`unsupported theme version [${themeVersion}]`); - } - - return 'kbn-ui-shared-deps-npm.v8.light.css'; - }, - - /** - * Filename of the dark-theme css file in the distributable directory - * @param {ThemeVersion} themeVersion - */ - darkCssDistFilename(themeVersion) { - if (themeVersion !== 'v8') { - throw new Error(`unsupported theme version [${themeVersion}]`); - } - - return 'kbn-ui-shared-deps-npm.v8.dark.css'; - }, }; diff --git a/packages/kbn-ui-shared-deps-npm/webpack.config.js b/packages/kbn-ui-shared-deps-npm/webpack.config.js index 4f3971d293489..3b16430aeb724 100644 --- a/packages/kbn-ui-shared-deps-npm/webpack.config.js +++ b/packages/kbn-ui-shared-deps-npm/webpack.config.js @@ -101,8 +101,6 @@ module.exports = (_, argv) => { 'tslib', 'uuid', ], - 'kbn-ui-shared-deps-npm.v8.dark': ['@elastic/eui/dist/eui_theme_dark.css'], - 'kbn-ui-shared-deps-npm.v8.light': ['@elastic/eui/dist/eui_theme_light.css'], }, context: __dirname, devtool: 'cheap-source-map', diff --git a/x-pack/plugins/canvas/shareable_runtime/index.ts b/x-pack/plugins/canvas/shareable_runtime/index.ts index 475989494c574..ca7b1441d7bb1 100644 --- a/x-pack/plugins/canvas/shareable_runtime/index.ts +++ b/x-pack/plugins/canvas/shareable_runtime/index.ts @@ -8,4 +8,3 @@ export * from './api'; import '@kbn/core-apps-server-internal/assets/legacy_light_theme.css'; import '../public/style/index.scss'; -import '@elastic/eui/dist/eui_theme_light.css'; diff --git a/x-pack/plugins/canvas/storybook/addon/panel.tsx b/x-pack/plugins/canvas/storybook/addon/panel.tsx index c799df73bd8ae..d9883ab7ed086 100644 --- a/x-pack/plugins/canvas/storybook/addon/panel.tsx +++ b/x-pack/plugins/canvas/storybook/addon/panel.tsx @@ -9,7 +9,6 @@ import React, { useState } from 'react'; import { EuiResizableContainer } from '@elastic/eui'; import { StateChange } from './components/state_change'; -import '@elastic/eui/dist/eui_theme_light.css'; import './panel.css'; import { RecordedAction } from './types'; diff --git a/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap b/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap index 0556a61dbf47b..df1140ea44828 100644 --- a/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap +++ b/x-pack/plugins/security/server/__snapshots__/prompt_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PromptPage renders as expected with additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; +exports[`PromptPage renders as expected with additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; -exports[`PromptPage renders as expected without additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; +exports[`PromptPage renders as expected without additional scripts 1`] = `"ElasticMockedFonts

Some Title

Some Body
Action#1
Action#2
"`; diff --git a/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap b/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap index 127d02f38b08e..2466a01112102 100644 --- a/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap +++ b/x-pack/plugins/security/server/authentication/__snapshots__/unauthenticated_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UnauthenticatedPage renders as expected 1`] = `"ElasticMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; +exports[`UnauthenticatedPage renders as expected 1`] = `"ElasticMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; -exports[`UnauthenticatedPage renders as expected with custom title 1`] = `"My Company NameMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; +exports[`UnauthenticatedPage renders as expected with custom title 1`] = `"My Company NameMockedFonts

We hit an authentication error

Try logging in again, and if the problem persists, contact your system administrator.

"`; diff --git a/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap b/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap index 394b0014e7cae..f851cb9139ebd 100644 --- a/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap +++ b/x-pack/plugins/security/server/authorization/__snapshots__/reset_session_page.test.tsx.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ResetSessionPage renders as expected 1`] = `"ElasticMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; +exports[`ResetSessionPage renders as expected 1`] = `"ElasticMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; -exports[`ResetSessionPage renders as expected with custom page title 1`] = `"My Company NameMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; +exports[`ResetSessionPage renders as expected with custom page title 1`] = `"My Company NameMockedFonts

You do not have permission to access the requested page

Either go back to the previous page or log in as a different user.

"`; diff --git a/x-pack/plugins/security/server/prompt_page.tsx b/x-pack/plugins/security/server/prompt_page.tsx index f33910024c737..1161585baeb37 100644 --- a/x-pack/plugins/security/server/prompt_page.tsx +++ b/x-pack/plugins/security/server/prompt_page.tsx @@ -23,7 +23,6 @@ import type { IStaticAssets } from '@kbn/core-http-server'; import { Fonts } from '@kbn/core-rendering-server-internal'; import { i18n } from '@kbn/i18n'; import { I18nProvider } from '@kbn/i18n-react'; -import UiSharedDepsNpm from '@kbn/ui-shared-deps-npm'; import * as UiSharedDepsSrc from '@kbn/ui-shared-deps-src'; // Preload the warning icon used by `EuiEmptyPrompt` to ensure that it's loaded @@ -79,7 +78,6 @@ export function PromptPage({ const regularBundlePath = staticAssets.prependPublicUrl('/bundles'); const styleSheetPaths = [ `${regularBundlePath}/kbn-ui-shared-deps-src/${UiSharedDepsSrc.cssDistFilename}`, - `${regularBundlePath}/kbn-ui-shared-deps-npm/${UiSharedDepsNpm.lightCssDistFilename('v8')}`, ]; return ( diff --git a/x-pack/plugins/security/tsconfig.json b/x-pack/plugins/security/tsconfig.json index c3df5dda29481..21a32edcec212 100644 --- a/x-pack/plugins/security/tsconfig.json +++ b/x-pack/plugins/security/tsconfig.json @@ -43,7 +43,6 @@ "@kbn/utils", "@kbn/core-logging-server-mocks", "@kbn/core-rendering-server-internal", - "@kbn/ui-shared-deps-npm", "@kbn/ui-shared-deps-src", "@kbn/core-saved-objects-server", "@kbn/utility-types-jest", From 7fd33174235bfc12d29a4fc18afabf9e028cea5b Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 30 Sep 2024 20:43:47 +0200 Subject: [PATCH 032/107] [Lens] Fix all deprecated `mixed-decls` warnings (#193864) --- .../expression_gauge/public/components/index.scss | 2 +- .../expression_heatmap/public/components/index.scss | 2 +- .../public/components/metric.scss | 2 +- .../public/components/tooltip/tooltip.scss | 11 ++++++----- .../public/filter_bar/filter_item/filter_item.scss | 4 +++- .../saved_query_management_list.scss | 2 +- src/plugins/vis_default_editor/public/_sidebar.scss | 2 +- .../components/vis_types/markdown/_markdown.scss | 3 +-- .../vis_types/vega/public/components/vega_vis.scss | 6 ++---- .../public/vislib/components/legend/_legend.scss | 2 +- .../vislib/public/vislib/lib/layout/_layout.scss | 3 +-- .../visualize_app/components/visualize_editor.scss | 6 ++---- src/plugins/visualizations/public/wizard/dialog.scss | 12 +++++------- .../wizard/group_selection/group_selection.scss | 5 ++--- .../public/datasources/form_based/help_popover.scss | 2 +- .../editor_frame/config_panel/layer_panel.scss | 2 +- .../editor_frame/frame_layout.scss | 10 +++------- .../editor_frame/suggestion_panel.scss | 4 ++-- .../editor_frame/workspace_panel/message_list.scss | 2 +- .../workspace_panel/workspace_panel_wrapper.scss | 3 +-- .../public/embeddable/embeddable_info_badges.scss | 3 +-- .../dataview_picker/toolbar_button.scss | 10 +++++----- .../public/shared_components/flyout_container.scss | 2 +- .../setting_with_sibling_flyout.scss | 2 +- .../trigger_actions/open_lens_config/helpers.scss | 6 +++--- .../plugins/lens/public/visualization_container.scss | 5 ++--- 26 files changed, 50 insertions(+), 63 deletions(-) diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/index.scss b/src/plugins/chart_expressions/expression_gauge/public/components/index.scss index fb7addf29ae55..ea2b35fba9718 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/index.scss +++ b/src/plugins/chart_expressions/expression_gauge/public/components/index.scss @@ -1,9 +1,9 @@ .gauge-container { - @include euiScrollBar; height: 100%; width: 100%; // the FocusTrap is adding extra divs which are making the visualization redraw twice // with a visible glitch. This make the chart library resilient to this extra reflow overflow: hidden; user-select: text; + @include euiScrollBar; } diff --git a/src/plugins/chart_expressions/expression_heatmap/public/components/index.scss b/src/plugins/chart_expressions/expression_heatmap/public/components/index.scss index 65134907719eb..66f45c113cc64 100644 --- a/src/plugins/chart_expressions/expression_heatmap/public/components/index.scss +++ b/src/plugins/chart_expressions/expression_heatmap/public/components/index.scss @@ -1,5 +1,4 @@ .heatmap-container { - @include euiScrollBar; height: 100%; width: 100%; // the FocusTrap is adding extra divs which are making the visualization redraw twice @@ -7,4 +6,5 @@ overflow: auto hidden; user-select: text; padding: $euiSizeS; + @include euiScrollBar; } diff --git a/src/plugins/chart_expressions/expression_legacy_metric/public/components/metric.scss b/src/plugins/chart_expressions/expression_legacy_metric/public/components/metric.scss index 7adcb109bc931..59d06546da494 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/public/components/metric.scss +++ b/src/plugins/chart_expressions/expression_legacy_metric/public/components/metric.scss @@ -6,7 +6,6 @@ // mtrChart__legend-isLoading .legacyMtrVis { - @include euiScrollBar; height: 100%; width: 100%; display: flex; @@ -15,6 +14,7 @@ align-items: center; flex-wrap: wrap; overflow: auto; + @include euiScrollBar; } .legacyMtrVis__value { diff --git a/src/plugins/chart_expressions/expression_xy/public/components/tooltip/tooltip.scss b/src/plugins/chart_expressions/expression_xy/public/components/tooltip/tooltip.scss index 1e705724fbedc..95eb4bae87c1d 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/tooltip/tooltip.scss +++ b/src/plugins/chart_expressions/expression_xy/public/components/tooltip/tooltip.scss @@ -1,10 +1,11 @@ .detailedTooltip { - @include euiToolTipStyle('s'); pointer-events: none; - max-width: $euiSizeXL * 10; - overflow: hidden; - padding: $euiSizeS; - + @include euiToolTipStyle('s'); + & { // stylelint-disable-line no-duplicate-selectors + max-width: $euiSizeXL * 10; + overflow: hidden; + padding: $euiSizeS; + } table { table-layout: fixed; width: 100%; diff --git a/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss b/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss index 362aec7264983..45618a623aad3 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss +++ b/src/plugins/unified_search/public/filter_bar/filter_item/filter_item.scss @@ -14,7 +14,9 @@ &:not(.globalFilterItem-isDisabled) { @include euiFormControlDefaultShadow; - box-shadow: #{$euiFormControlBoxShadow}, inset 0 0 0 1px $kbnGlobalFilterItemBorderColor; // Make the actual border more visible + & { // stylelint-disable-line no-duplicate-selectors + box-shadow: #{$euiFormControlBoxShadow}, inset 0 0 0 1px $kbnGlobalFilterItemBorderColor; // Make the actual border more visible + } } } diff --git a/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss b/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss index ad78b43fb1963..0309f919d6986 100644 --- a/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss +++ b/src/plugins/unified_search/public/saved_query_management/saved_query_management_list.scss @@ -5,9 +5,9 @@ } .kbnSavedQueryManagement__list { - @include euiYScrollWithShadows; max-height: inherit; // Fixes overflow for applied max-height // Left/Right padding is calculated to match the left alignment of the // popover text and buttons padding: calc($euiSizeM / 2) $euiSizeXS !important; // Override flush + @include euiYScrollWithShadows; } diff --git a/src/plugins/vis_default_editor/public/_sidebar.scss b/src/plugins/vis_default_editor/public/_sidebar.scss index 0586b6809bcc0..1fe20c85422c2 100644 --- a/src/plugins/vis_default_editor/public/_sidebar.scss +++ b/src/plugins/vis_default_editor/public/_sidebar.scss @@ -24,9 +24,9 @@ } @include euiBreakpoint('l', 'xl') { + overflow: auto; @include flexParent(1, 1, 1px); @include euiScrollBar; - overflow: auto; } } diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/_markdown.scss b/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/_markdown.scss index ec16404df8e7f..661667288ad93 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/_markdown.scss +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/_markdown.scss @@ -6,7 +6,6 @@ } .tvbMarkdown__content { - @include euiScrollBar; display: flex; flex-direction: column; flex: 1 0 auto; @@ -16,7 +15,7 @@ right: 0; bottom: 0; overflow: hidden; - + @include euiScrollBar; &--middle { justify-content: center; } diff --git a/src/plugins/vis_types/vega/public/components/vega_vis.scss b/src/plugins/vis_types/vega/public/components/vega_vis.scss index 830f4f7b1fd95..f21a1223ed951 100644 --- a/src/plugins/vis_types/vega/public/components/vega_vis.scss +++ b/src/plugins/vis_types/vega/public/components/vega_vis.scss @@ -1,10 +1,9 @@ // stylelint-disable selector-no-qualifying-type .vgaVis__wrapper { - @include euiScrollBar; - display: flex; flex: 1 1 0; overflow: auto; + @include euiScrollBar; } .vgaVis { @@ -21,12 +20,11 @@ } .vgaVis__view { - @include euiScrollBar; overflow: auto; z-index: 0; flex: 1 1 100%; - display: block; + @include euiScrollBar; canvas { display: block; diff --git a/src/plugins/vis_types/vislib/public/vislib/components/legend/_legend.scss b/src/plugins/vis_types/vislib/public/vislib/components/legend/_legend.scss index cb63811800c2d..a6b029674dcaf 100644 --- a/src/plugins/vis_types/vislib/public/vislib/components/legend/_legend.scss +++ b/src/plugins/vis_types/vislib/public/vislib/components/legend/_legend.scss @@ -45,7 +45,6 @@ $visLegendWidth: 150px; } .visLegend__list { - @include euiScrollBar; display: flex; width: $visLegendWidth; // Must be a hard-coded width for the chart to get its correct dimensions flex: 1 1 auto; @@ -53,6 +52,7 @@ $visLegendWidth: 150px; overflow-x: hidden; overflow-y: auto; + @include euiScrollBar; .visLegend__button { font-size: $euiFontSizeXS; text-align: left; diff --git a/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss b/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss index 8b92af5a4fdcf..b470b528d5b22 100644 --- a/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss +++ b/src/plugins/vis_types/vislib/public/vislib/lib/layout/_layout.scss @@ -134,12 +134,11 @@ } .chart { - @include euiScrollBar; flex: 1 1 100%; min-height: 0; min-width: 0; overflow: visible; - + @include euiScrollBar; > svg { display: block; } diff --git a/src/plugins/visualizations/public/visualize_app/components/visualize_editor.scss b/src/plugins/visualizations/public/visualize_app/components/visualize_editor.scss index 6ddf3c1264bff..6ab251c7ee37e 100644 --- a/src/plugins/visualizations/public/visualize_app/components/visualize_editor.scss +++ b/src/plugins/visualizations/public/visualize_app/components/visualize_editor.scss @@ -1,8 +1,6 @@ .visEditor { - @include flexParent(); - height: 100%; - + @include flexParent(); @include euiBreakpoint('xs', 's', 'm') { .visualization { // While we are on a small screen the visualization is below the @@ -23,7 +21,7 @@ a tilemap in an iframe: https://github.com/elastic/kibana/issues/16457 */ } .visEditor__content { - @include flexParent(); width: 100%; z-index: 0; + @include flexParent(); } diff --git a/src/plugins/visualizations/public/wizard/dialog.scss b/src/plugins/visualizations/public/wizard/dialog.scss index a3dcef1b82b33..96862073b89cf 100644 --- a/src/plugins/visualizations/public/wizard/dialog.scss +++ b/src/plugins/visualizations/public/wizard/dialog.scss @@ -2,20 +2,15 @@ $modalWidth: $euiSizeL * 34; $modalHeight: $euiSizeL * 30; .visNewVisDialog { - @include euiBreakpoint('xs', 's') { - max-height: 100%; - } - max-width: $modalWidth; max-height: $modalHeight; background: $euiColorEmptyShade; -} - -.visNewVisDialog--aggbased { @include euiBreakpoint('xs', 's') { max-height: 100%; } +} +.visNewVisDialog--aggbased { max-width: $modalWidth; max-height: $modalHeight; background-repeat: no-repeat; @@ -23,6 +18,9 @@ $modalHeight: $euiSizeL * 30; background-size: 30%; // sass-lint:disable-block quotes space-after-comma background-image: url(lightOrDarkTheme("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='313' height='461' viewBox='0 0 313 461'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23F5F7FA' d='M294.009,184.137 C456.386,184.137 588.018,315.77 588.018,478.146 C588.018,640.523 456.386,772.156 294.009,772.156 C131.632,772.156 0,640.523 0,478.146 C0,315.77 131.632,184.137 294.009,184.137 Z M294.009,384.552 C242.318,384.552 200.415,426.456 200.415,478.146 C200.415,529.837 242.318,571.741 294.009,571.741 C345.7,571.741 387.604,529.837 387.604,478.146 C387.604,426.456 345.7,384.552 294.009,384.552 Z'/%3E%3Cpath fill='%23E6EBF2' d='M202.958,365.731 L202.958,380.991 L187.698,380.991 L187.698,365.731 L202.958,365.731 Z M202.958,327.073 L202.958,342.333 L187.698,342.333 L187.698,327.073 L202.958,327.073 Z M243.651,325.038 L243.651,340.298 L228.391,340.298 L228.391,325.038 L243.651,325.038 Z M243.651,286.379 L243.651,301.639 L228.391,301.639 L228.391,286.379 L243.651,286.379 Z M202.958,285.362 L202.958,300.622 L187.698,300.622 L187.698,285.362 L202.958,285.362 Z M284.345,284.345 L284.345,299.605 L269.085,299.605 L269.085,284.345 L284.345,284.345 Z M284.345,245.686 L284.345,260.946 L269.085,260.946 L269.085,245.686 L284.345,245.686 Z M243.651,244.669 L243.651,259.929 L228.391,259.929 L228.391,244.669 L243.651,244.669 Z M202.958,243.651 L202.958,258.911 L187.698,258.911 L187.698,243.651 L202.958,243.651 Z M284.345,203.975 L284.345,219.235 L269.085,219.235 L269.085,203.975 L284.345,203.975 Z M202.958,203.975 L202.958,219.235 L187.698,219.235 L187.698,203.975 L202.958,203.975 Z M243.651,202.958 L243.651,218.218 L228.391,218.218 L228.391,202.958 L243.651,202.958 Z M243.651,163.282 L243.651,178.542 L228.391,178.542 L228.391,163.282 L243.651,163.282 Z M202.958,163.282 L202.958,178.542 L187.698,178.542 L187.698,163.282 L202.958,163.282 Z M284.345,162.265 L284.345,177.525 L269.085,177.525 L269.085,162.265 L284.345,162.265 Z M284.345,122.589 L284.345,137.849 L269.085,137.849 L269.085,122.589 L284.345,122.589 Z M243.651,122.589 L243.651,137.849 L228.391,137.849 L228.391,122.589 L243.651,122.589 Z M202.958,122.589 L202.958,137.849 L187.698,137.849 L187.698,122.589 L202.958,122.589 Z M284.345,81.8954 L284.345,97.1554 L269.085,97.1554 L269.085,81.8954 L284.345,81.8954 Z M243.651,81.8954 L243.651,97.1554 L228.391,97.1554 L228.391,81.8954 L243.651,81.8954 Z M202.958,81.8954 L202.958,97.1554 L187.698,97.1554 L187.698,81.8954 L202.958,81.8954 Z M284.345,41.202 L284.345,56.462 L269.085,56.462 L269.085,41.202 L284.345,41.202 Z M243.651,41.202 L243.651,56.462 L228.391,56.462 L228.391,41.202 L243.651,41.202 Z M284.345,0.508789 L284.345,15.7688 L269.085,15.7688 L269.085,0.508789 L284.345,0.508789 Z'/%3E%3C/g%3E%3C/svg%3E","data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='313' height='461' viewBox='0 0 313 461'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%2318191E' d='M294.009,184.137 C456.386,184.137 588.018,315.77 588.018,478.146 C588.018,640.523 456.386,772.156 294.009,772.156 C131.632,772.156 0,640.523 0,478.146 C0,315.77 131.632,184.137 294.009,184.137 Z M294.009,384.552 C242.318,384.552 200.415,426.456 200.415,478.146 C200.415,529.837 242.318,571.741 294.009,571.741 C345.7,571.741 387.604,529.837 387.604,478.146 C387.604,426.456 345.7,384.552 294.009,384.552 Z'/%3E%3Cpath fill='%2315161B' d='M202.958,365.731 L202.958,380.991 L187.698,380.991 L187.698,365.731 L202.958,365.731 Z M202.958,327.073 L202.958,342.333 L187.698,342.333 L187.698,327.073 L202.958,327.073 Z M243.651,325.038 L243.651,340.298 L228.391,340.298 L228.391,325.038 L243.651,325.038 Z M243.651,286.379 L243.651,301.639 L228.391,301.639 L228.391,286.379 L243.651,286.379 Z M202.958,285.362 L202.958,300.622 L187.698,300.622 L187.698,285.362 L202.958,285.362 Z M284.345,284.345 L284.345,299.605 L269.085,299.605 L269.085,284.345 L284.345,284.345 Z M284.345,245.686 L284.345,260.946 L269.085,260.946 L269.085,245.686 L284.345,245.686 Z M243.651,244.669 L243.651,259.929 L228.391,259.929 L228.391,244.669 L243.651,244.669 Z M202.958,243.651 L202.958,258.911 L187.698,258.911 L187.698,243.651 L202.958,243.651 Z M284.345,203.975 L284.345,219.235 L269.085,219.235 L269.085,203.975 L284.345,203.975 Z M202.958,203.975 L202.958,219.235 L187.698,219.235 L187.698,203.975 L202.958,203.975 Z M243.651,202.958 L243.651,218.218 L228.391,218.218 L228.391,202.958 L243.651,202.958 Z M243.651,163.282 L243.651,178.542 L228.391,178.542 L228.391,163.282 L243.651,163.282 Z M202.958,163.282 L202.958,178.542 L187.698,178.542 L187.698,163.282 L202.958,163.282 Z M284.345,162.265 L284.345,177.525 L269.085,177.525 L269.085,162.265 L284.345,162.265 Z M284.345,122.589 L284.345,137.849 L269.085,137.849 L269.085,122.589 L284.345,122.589 Z M243.651,122.589 L243.651,137.849 L228.391,137.849 L228.391,122.589 L243.651,122.589 Z M202.958,122.589 L202.958,137.849 L187.698,137.849 L187.698,122.589 L202.958,122.589 Z M284.345,81.8954 L284.345,97.1554 L269.085,97.1554 L269.085,81.8954 L284.345,81.8954 Z M243.651,81.8954 L243.651,97.1554 L228.391,97.1554 L228.391,81.8954 L243.651,81.8954 Z M202.958,81.8954 L202.958,97.1554 L187.698,97.1554 L187.698,81.8954 L202.958,81.8954 Z M284.345,41.202 L284.345,56.462 L269.085,56.462 L269.085,41.202 L284.345,41.202 Z M243.651,41.202 L243.651,56.462 L228.391,56.462 L228.391,41.202 L243.651,41.202 Z M284.345,0.508789 L284.345,15.7688 L269.085,15.7688 L269.085,0.508789 L284.345,0.508789 Z'/%3E%3C/g%3E%3C/svg%3E")); + @include euiBreakpoint('xs', 's') { + max-height: 100%; + } } .visNewVisSearchDialog { diff --git a/src/plugins/visualizations/public/wizard/group_selection/group_selection.scss b/src/plugins/visualizations/public/wizard/group_selection/group_selection.scss index ce46b872a97ee..04c1c3b26ece0 100644 --- a/src/plugins/visualizations/public/wizard/group_selection/group_selection.scss +++ b/src/plugins/visualizations/public/wizard/group_selection/group_selection.scss @@ -10,12 +10,11 @@ } .visNewVisDialogGroupSelection__footer { + padding: 0 $euiSizeXL $euiSizeL; + background: $euiColorLightestShade; @include euiBreakpoint('xs', 's') { background: $euiColorEmptyShade; } - - padding: 0 $euiSizeXL $euiSizeL; - background: $euiColorLightestShade; } .visNewVisDialogGroupSelection__footerDescriptionList { diff --git a/x-pack/plugins/lens/public/datasources/form_based/help_popover.scss b/x-pack/plugins/lens/public/datasources/form_based/help_popover.scss index ab5ac58a35ee0..af1bdcb459093 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/help_popover.scss +++ b/x-pack/plugins/lens/public/datasources/form_based/help_popover.scss @@ -3,9 +3,9 @@ } .lnsHelpPopover__content { - @include euiYScrollWithShadows; max-height: 40vh; padding: $euiSizeM; + @include euiYScrollWithShadows; } .lnsHelpPopover__buttonIcon { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss index 2776e57753d7a..23a3133501073 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.scss @@ -87,8 +87,8 @@ // Added .lnsLayerPanel__dimension specificity required for animation style override .lnsLayerPanel__dimension .lnsLayerPanel__dimensionLink { &:focus { - @include passDownFocusRing('.dimensionTrigger__textLabel'); background-color: transparent; text-decoration-thickness: $euiBorderWidthThin !important; + @include passDownFocusRing('.dimensionTrigger__textLabel'); } } \ No newline at end of file diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss index 622dab25e00ed..7b69fb1a6ea23 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.scss @@ -35,10 +35,8 @@ } .visEditor { - @include flexParent(); - height: 100%; - + @include flexParent(); @include euiBreakpoint('xs', 's', 'm') { .visualization { // While we are on a small screen the visualization is below the @@ -59,7 +57,6 @@ a tilemap in an iframe: https://github.com/elastic/kibana/issues/16457 */ } .lnsFrameLayout__pageBody { - @include euiScrollBar; min-width: $lnsPanelMinWidth + $euiSizeXL; overflow: hidden auto; display: flex; @@ -73,7 +70,7 @@ a tilemap in an iframe: https://github.com/elastic/kibana/issues/16457 */ z-index: $lnsZLevel1; border-left: $euiBorderThin; border-right: $euiBorderThin; - + @include euiScrollBar; &:first-child { padding-left: $euiSize; } @@ -111,10 +108,9 @@ a tilemap in an iframe: https://github.com/elastic/kibana/issues/16457 */ } .lnsConfigPanel { - @include euiYScroll; padding: $euiSize $euiSize $euiSizeXL ($euiFormMaxWidth + $euiSize); margin-left: -$euiFormMaxWidth; - + @include euiYScroll; @include euiBreakpoint('xs', 's', 'm') { padding-left: $euiSize; margin-left: 0; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss index 35606c67382d5..a4af057dd33b0 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss @@ -6,7 +6,6 @@ } .lnsSuggestionPanel__suggestions { - @include euiScrollBar; @include lnsOverflowShadowHorizontal; padding-top: $euiSizeXS; overflow-x: scroll; @@ -18,6 +17,7 @@ margin-left: -$euiSizeXS; padding-right: $euiSizeXS; margin-right: -$euiSizeXS; + @include euiScrollBar; } .lnsSuggestionPanel__button { @@ -31,8 +31,8 @@ box-shadow: none !important; // sass-lint:disable-line no-important &:focus { - @include euiFocusRing; transform: none !important; // sass-lint:disable-line no-important + @include euiFocusRing; } .lnsSuggestionPanel__expressionRenderer { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.scss index 3b7dd8049757a..6d91fc7d6465f 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.scss @@ -5,9 +5,9 @@ } .lnsWorkspaceWarningList { - @include euiYScroll; max-height: $euiSize * 20; width: $euiSize * 16; + @include euiYScroll; } .lnsWorkspaceWarningList__item { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss index db0ca2613cc2f..98b9f6849fc88 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss @@ -17,7 +17,6 @@ .lnsWorkspacePanelWrapper__pageContentBody { @include euiBottomShadowMedium; - @include euiScrollBar; flex-grow: 1; display: flex; align-items: stretch; @@ -25,7 +24,7 @@ border-radius: $euiBorderRadius; background: $euiColorEmptyShade; height: 100%; - + @include euiScrollBar; &>* { flex: 1 1 100%; display: flex; diff --git a/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.scss b/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.scss index d7f5840e4ff17..55407855b49f6 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.scss +++ b/x-pack/plugins/lens/public/embeddable/embeddable_info_badges.scss @@ -1,5 +1,4 @@ - .lnsEmbeddablePanelFeatureList { - @include euiYScroll; max-height: $euiSize * 20; + @include euiYScroll; } diff --git a/x-pack/plugins/lens/public/shared_components/dataview_picker/toolbar_button.scss b/x-pack/plugins/lens/public/shared_components/dataview_picker/toolbar_button.scss index cbf6d85349446..abd4d45a9e955 100644 --- a/x-pack/plugins/lens/public/shared_components/dataview_picker/toolbar_button.scss +++ b/x-pack/plugins/lens/public/shared_components/dataview_picker/toolbar_button.scss @@ -1,11 +1,6 @@ .kbnToolbarButton { line-height: $euiButtonHeight; // Keeps alignment of text and chart icon - // Override background color for non-disabled buttons - &:not(:disabled) { - background-color: $euiColorEmptyShade; - } - // todo: once issue https://github.com/elastic/eui/issues/4730 is merged, this code might be safe to remove // Some toolbar buttons are just icons, but EuiButton comes with margin and min-width that need to be removed min-width: 0; @@ -13,6 +8,11 @@ border-style: solid; border-color: $euiBorderColor; // Lighten the border color for all states + // Override background color for non-disabled buttons + &:not(:disabled) { + background-color: $euiColorEmptyShade; + } + .kbnToolbarButton__text > svg { margin-top: -1px; // Just some weird alignment issue when icon is the child not the `iconType` } diff --git a/x-pack/plugins/lens/public/shared_components/flyout_container.scss b/x-pack/plugins/lens/public/shared_components/flyout_container.scss index 8f8083068acdc..2d26d07d8a682 100644 --- a/x-pack/plugins/lens/public/shared_components/flyout_container.scss +++ b/x-pack/plugins/lens/public/shared_components/flyout_container.scss @@ -30,8 +30,8 @@ } .lnsDimensionContainer__content { - @include euiYScroll; flex: 1; + @include euiYScroll; } .lnsDimensionContainer__footer { diff --git a/x-pack/plugins/lens/public/shared_components/setting_with_sibling_flyout.scss b/x-pack/plugins/lens/public/shared_components/setting_with_sibling_flyout.scss index b6975710753e0..27dc29ed8af0c 100644 --- a/x-pack/plugins/lens/public/shared_components/setting_with_sibling_flyout.scss +++ b/x-pack/plugins/lens/public/shared_components/setting_with_sibling_flyout.scss @@ -19,8 +19,8 @@ } .lnsSettingWithSiblingFlyout__content { - @include euiYScroll; flex: 1; + @include euiYScroll; } .lnsSettingWithSiblingFlyout__footer { diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss index 6c83b43a60508..ae9a21f3f63f7 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss @@ -1,12 +1,12 @@ // styles needed to display extra drop targets that are outside of the config panel main area while also allowing to scroll vertically .lnsConfigPanel__overlay { clip-path: polygon(-100% 0, 100% 0, 100% 100%, -100% 100%); - @include euiBreakpoint('xs', 's', 'm') { - clip-path: none; - } max-inline-size: $euiSizeXXL * 20; min-inline-size: $euiSizeXXL * 8; background: $euiColorLightestShade; + @include euiBreakpoint('xs', 's', 'm') { + clip-path: none; + } .kbnOverlayMountWrapper { padding-left: $euiFormMaxWidth; margin-left: -$euiFormMaxWidth; diff --git a/x-pack/plugins/lens/public/visualization_container.scss b/x-pack/plugins/lens/public/visualization_container.scss index 028b8aa8a3a14..3eb4061f8b931 100644 --- a/x-pack/plugins/lens/public/visualization_container.scss +++ b/x-pack/plugins/lens/public/visualization_container.scss @@ -1,11 +1,10 @@ .lnsVisualizationContainer { - @include euiScrollBar; overflow: auto hidden; user-select: text; + @include euiScrollBar; } .lnsExpressionRenderer { - @include euiScrollBar; position: relative; width: 100%; height: 100%; @@ -13,7 +12,7 @@ overflow: auto; // important for visualizations with no padding border-radius: $euiBorderRadius; - + @include euiScrollBar; .lnsExpressionRenderer__component { position: static; // Let the progress indicator position itself against the outer parent } From 00789609ad663efffd7b3997ca773fe3ea5511e2 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Mon, 30 Sep 2024 20:55:23 +0200 Subject: [PATCH 033/107] [Threat Hunting Investigations] Migrate all timeline routes to OpenAPI types (#190238) ## Summary fixes: https://github.com/elastic/security-team/issues/10235 fixes: https://github.com/elastic/security-team/issues/10237 This is the final PR for migrating over all timeline-related schemas and types to the new generated zod schemas from our OpenAPI specs. (see https://github.com/elastic/security-team/issues/10110) On top of moving to the new schemas/types, this PR also cleans up usage of now outdated types. I'm aware of the size of this PR but rest assured, the changes are easy to review and for most teams, only a handful of files need to be reviewed: ```markdown ### elastic/security-defend-workflows * x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts ### elastic/security-detection-rule-management * x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts * x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/perform_timelines_installation.ts ### elastic/security-detections-response * x-pack/test/security_solution_cypress/cypress/objects/timeline.ts ### elastic/security-engineering-productivity * x-pack/test/security_solution_cypress/cypress/objects/timeline.ts * x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts ``` ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 1 + .../output/kibana.serverless.staging.yaml | 425 +++++++------ oas_docs/output/kibana.staging.yaml | 425 +++++++------ .../common/api/quickstart_client.gen.ts | 24 + .../clean_draft_timelines_route.gen.ts | 10 +- .../clean_draft_timelines_route.schema.yaml | 21 +- .../copy_timeline/copy_timeline_route.gen.ts | 29 + .../copy_timeline_route.schema.yaml | 34 + .../copy_timeline/copy_timeline_route.ts | 15 - .../create_timelines_route.gen.ts | 14 +- .../create_timelines_route.schema.yaml | 27 +- .../create_timelines_route.ts | 36 -- .../delete_note/delete_note_route.schema.yaml | 7 - .../delete_timelines_route.schema.yaml | 7 - .../export_timelines_route.schema.yaml | 7 - .../get_draft_timelines_route.gen.ts | 10 +- .../get_draft_timelines_route.schema.yaml | 21 +- .../get_draft_timelines_route.ts | 14 - .../get_notes/get_notes_route.schema.yaml | 7 - .../get_timeline/get_timeline_route.gen.ts | 11 +- .../get_timeline_route.schema.yaml | 27 +- .../get_timeline/get_timeline_route.ts | 15 - .../get_timelines/get_timelines_route.gen.ts | 16 +- .../get_timelines_route.schema.yaml | 57 +- .../get_timelines/get_timelines_route.ts | 28 - .../import_timelines_route.gen.ts | 17 +- .../import_timelines_route.schema.yaml | 39 +- .../import_timelines_route.ts | 60 -- .../common/api/timeline/index.ts | 10 - .../install_prepackaged_timelines.ts | 19 - ...install_prepackaged_timelines_route.gen.ts | 12 +- ...ll_prepackaged_timelines_route.schema.yaml | 16 +- .../common/api/timeline/model/api.ts | 593 ++---------------- .../api/timeline/model/components.gen.ts | 172 +++-- .../api/timeline/model/components.schema.yaml | 220 +++++-- .../patch_timeline_route.gen.ts | 10 +- .../patch_timeline_route.schema.yaml | 21 +- .../patch_timelines/patch_timelines_schema.ts | 24 - .../persist_favorite_route.schema.yaml | 7 - .../persist_note_route.schema.yaml | 7 - .../pinned_events_route.schema.yaml | 7 - .../pinned_events/pinned_events_route.ts | 34 - .../resolve_timeline_route.gen.ts | 11 +- .../resolve_timeline_route.schema.yaml | 24 +- .../common/api/timeline/routes.ts | 50 +- .../common/search_strategy/timeline/index.ts | 124 +--- .../common/timelines/zod_errors.ts | 29 + ...imeline_api_2023_10_31.bundled.schema.yaml | 404 ++++++------ ...imeline_api_2023_10_31.bundled.schema.yaml | 404 ++++++------ .../public/common/mock/timeline_results.ts | 9 +- .../components/alerts_table/actions.tsx | 14 +- .../components/open_timeline/helpers.test.ts | 22 +- .../components/open_timeline/helpers.ts | 24 +- .../components/open_timeline/types.ts | 8 +- .../public/timelines/containers/all/index.tsx | 22 +- .../public/timelines/containers/api.ts | 157 ++--- .../public/timelines/containers/helpers.ts | 4 +- .../middlewares/timeline_pinned_event.test.ts | 1 + .../middlewares/timeline_pinned_event.ts | 2 +- .../store/middlewares/timeline_save.test.ts | 4 +- .../store/middlewares/timeline_save.ts | 23 +- ...ebuilt_rules_and_timelines_status_route.ts | 9 +- .../logic/perform_timelines_installation.ts | 10 +- .../timeline/__mocks__/request_responses.ts | 13 +- .../timeline/__mocks__/resolve_timeline.ts | 4 +- .../clean_draft_timelines/index.ts | 7 +- .../get_draft_timelines/index.ts | 15 +- .../server/lib/timeline/routes/index.ts | 28 +- .../lib/timeline/routes/notes/delete_note.ts | 10 +- .../lib/timeline/routes/notes/get_notes.ts | 10 +- .../lib/timeline/routes/notes/persist_note.ts | 7 +- .../pinned_events/persist_pinned_event.ts | 22 +- .../helpers.test.ts | 6 +- .../install_prepackaged_timelines/helpers.ts | 6 +- .../install_prepackaged_timelines/index.ts | 32 +- .../routes/timelines/copy_timeline/index.ts | 16 +- .../timelines/create_timelines/helpers.ts | 7 +- .../timelines/create_timelines/index.ts | 14 +- .../timelines/delete_timelines/index.ts | 6 +- .../timelines/export_timelines/helpers.ts | 6 +- .../timelines/get_timeline/index.test.ts | 8 +- .../routes/timelines/get_timeline/index.ts | 23 +- .../timelines/get_timelines/index.test.ts | 8 +- .../routes/timelines/get_timelines/index.ts | 45 +- .../create_timelines_stream_from_ndjson.ts | 24 +- .../timelines/import_timelines/helpers.ts | 20 +- .../timelines/import_timelines/index.test.ts | 47 +- .../timelines/import_timelines/index.ts | 32 +- .../routes/timelines/patch_timelines/index.ts | 16 +- .../timelines/persist_favorite/index.ts | 11 +- .../timelines/resolve_timeline/index.ts | 24 +- .../saved_object/notes/persist_notes.ts | 2 +- .../convert_saved_object_to_savedtimeline.ts | 4 +- .../saved_object/timelines/index.test.ts | 8 +- .../timeline/saved_object/timelines/index.ts | 87 +-- .../timelines/pick_saved_timeline.ts | 6 +- .../timeline/utils/check_timelines_status.ts | 24 +- .../server/lib/timeline/utils/common.ts | 9 +- .../lib/timeline/utils/failure_cases.test.ts | 40 +- .../lib/timeline/utils/failure_cases.ts | 38 +- .../lib/timeline/utils/timeline_object.ts | 4 +- .../services/security_solution_api.gen.ts | 16 + .../trial_license_complete_tier/timeline.ts | 6 +- .../cypress/objects/timeline.ts | 8 +- .../cypress/tasks/api_calls/timelines.ts | 13 +- .../endpoint_solution_integrations.ts | 4 +- .../services/timeline/index.ts | 28 +- 107 files changed, 2014 insertions(+), 2661 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.gen.ts create mode 100644 x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.schema.yaml delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timelines_schema.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts create mode 100644 x-pack/plugins/security_solution/common/timelines/zod_errors.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0988c59ab7d23..7811e4409d905 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1532,6 +1532,7 @@ x-pack/test/security_solution_api_integration/test_suites/sources @elastic/secur x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout @elastic/security-threat-hunting-investigations x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/security-threat-hunting-investigations +/x-pack/plugins/security_solution/common/timelines @elastic/security-threat-hunting-investigations /x-pack/plugins/security_solution/public/common/components/alerts_viewer @elastic/security-threat-hunting-investigations /x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_action @elastic/security-threat-hunting-investigations /x-pack/plugins/security_solution/public/common/components/event_details @elastic/security-threat-hunting-investigations diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index f4ed7a9767924..621efdc026eea 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -16356,19 +16356,21 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - nullable: true + data: + type: object + properties: + getOneTimeline: + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineResponse + required: + - getOneTimeline required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -16405,23 +16407,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -16483,21 +16470,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: Indicates the Timeline was successfully created. '405': content: @@ -16514,6 +16488,37 @@ paths: tags: - Security Timeline API - access:securitySolution + /api/timeline/_copy: + get: + description: | + Copies and returns a timeline or timeline template. + operationId: CopyTimeline + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + timeline: + $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + timelineIdToCopy: + type: string + required: + - timeline + - timelineIdToCopy + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse + description: Indicates that the timeline has been successfully copied. + summary: Copies timeline or timeline template + tags: + - Security Timeline API + - access:securitySolution /api/timeline/_draft: get: description: >- @@ -16532,23 +16537,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: Indicates that the draft Timeline was successfully retrieved. '403': content: @@ -16610,23 +16600,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -16782,28 +16757,14 @@ paths: schema: type: object properties: - file: - allOf: - - $ref: '#/components/schemas/Security_Timeline_API_Readable' - - type: object - properties: - hapi: - type: object - properties: - filename: - type: string - headers: - type: object - isImmutable: - enum: - - 'true' - - 'false' - type: string - required: - - filename - - headers - required: - - hapi + file: {} + isImmutable: + enum: + - 'true' + - 'false' + type: string + required: + - file description: The Timelines to import as a readable stream. required: true responses: @@ -16811,13 +16772,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - $ref: >- - #/components/schemas/Security_Timeline_API_ImportTimelineResult - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_ImportTimelineResult description: Indicates the import of Timelines was successful. '400': content: @@ -16876,7 +16832,9 @@ paths: properties: prepackagedTimelines: items: - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineSavedToReturnObject + nullable: true type: array timelinesToInstall: items: @@ -16899,13 +16857,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - $ref: >- - #/components/schemas/Security_Timeline_API_ImportTimelineResult - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_ImportTimelineResult description: Indicates the installation of prepackaged Timelines was successful. '500': content: @@ -16943,19 +16896,16 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: + data: $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - nullable: true + #/components/schemas/Security_Timeline_API_ResolvedTimeline required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -17024,36 +16974,26 @@ paths: schema: type: object properties: - data: - type: object - properties: - customTemplateTimelineCount: - type: number - defaultTimelineCount: - type: number - elasticTemplateTimelineCount: - type: number - favoriteCount: - type: number - templateTimelineCount: - type: number - timelines: - items: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - type: array - totalCount: - type: number - required: - - timelines - - totalCount - - defaultTimelineCount - - templateTimelineCount - - favoriteCount - - elasticTemplateTimelineCount - - customTemplateTimelineCount + customTemplateTimelineCount: + type: number + defaultTimelineCount: + type: number + elasticTemplateTimelineCount: + type: number + favoriteCount: + type: number + templateTimelineCount: + type: number + timeline: + items: + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineResponse + type: array + totalCount: + type: number required: - - data + - timeline + - totalCount description: Indicates that the (template) Timelines were found and returned. '400': content: @@ -31335,30 +31275,39 @@ components: type: object properties: aggregatable: + nullable: true type: boolean category: + nullable: true type: string columnHeaderType: + nullable: true type: string description: + nullable: true type: string example: - oneOf: - - type: string - - type: number + nullable: true + type: string id: + nullable: true type: string indexes: items: type: string + nullable: true type: array name: + nullable: true type: string placeholder: + nullable: true type: string searchable: + nullable: true type: boolean type: + nullable: true type: string Security_Timeline_API_DataProviderQueryMatch: type: object @@ -31380,6 +31329,10 @@ components: type: string queryMatch: $ref: '#/components/schemas/Security_Timeline_API_QueryMatchResult' + nullable: true + type: + $ref: '#/components/schemas/Security_Timeline_API_DataProviderType' + nullable: true Security_Timeline_API_DataProviderResult: type: object properties: @@ -31467,41 +31420,59 @@ components: type: object properties: exists: - type: boolean + nullable: true + type: string match_all: + nullable: true type: string meta: + nullable: true type: object properties: alias: + nullable: true type: string controlledBy: + nullable: true type: string disabled: + nullable: true type: boolean field: + nullable: true type: string formattedValue: + nullable: true type: string index: + nullable: true type: string key: + nullable: true type: string negate: + nullable: true type: boolean params: + nullable: true type: string type: + nullable: true type: string value: + nullable: true type: string missing: + nullable: true type: string query: + nullable: true type: string range: + nullable: true type: string script: + nullable: true type: string Security_Timeline_API_GetNotesResult: type: object @@ -31566,6 +31537,12 @@ components: version: nullable: true type: string + required: + - savedObjectId + - version + - pinnedEventIds + - eventNotes + - globalNotes Security_Timeline_API_Note: allOf: - $ref: '#/components/schemas/Security_Timeline_API_BareNote' @@ -31586,6 +31563,23 @@ components: #/components/schemas/Security_Timeline_API_PinnedEventBaseResponseBody - nullable: true type: object + Security_Timeline_API_PersistTimelineResponse: + type: object + properties: + data: + type: object + properties: + persistTimeline: + type: object + properties: + timeline: + $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' + required: + - timeline + required: + - persistTimeline + required: + - data Security_Timeline_API_PinnedEvent: allOf: - $ref: '#/components/schemas/Security_Timeline_API_BarePinnedEvent' @@ -31623,34 +31617,29 @@ components: nullable: true type: string value: - nullable: true - type: string - Security_Timeline_API_Readable: + oneOf: + - nullable: true + type: string + - items: + type: string + nullable: true + type: array + Security_Timeline_API_ResolvedTimeline: type: object properties: - _data: - additionalProperties: true - type: object - _encoding: + alias_purpose: + $ref: >- + #/components/schemas/Security_Timeline_API_SavedObjectResolveAliasPurpose + alias_target_id: type: string - _events: - additionalProperties: true - type: object - _eventsCount: - type: number - _maxListeners: - additionalProperties: true - type: object - _position: - type: number - _read: - additionalProperties: true - type: object - _readableState: - additionalProperties: true - type: object - readable: - type: boolean + outcome: + $ref: '#/components/schemas/Security_Timeline_API_SavedObjectResolveOutcome' + timeline: + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineSavedToReturnObject + required: + - timeline + - outcome Security_Timeline_API_ResponseNote: type: object properties: @@ -31685,6 +31674,17 @@ components: - threat_match - zeek type: string + Security_Timeline_API_SavedObjectResolveAliasPurpose: + enum: + - savedObjectConversion + - savedObjectImport + type: string + Security_Timeline_API_SavedObjectResolveOutcome: + enum: + - exactMatch + - aliasMatch + - conflict + type: string Security_Timeline_API_SavedTimeline: type: object properties: @@ -31713,12 +31713,16 @@ components: properties: end: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number start: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number description: nullable: true type: string @@ -31808,6 +31812,18 @@ components: updatedBy: nullable: true type: string + Security_Timeline_API_SavedTimelineWithSavedObjectId: + allOf: + - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + - type: object + properties: + savedObjectId: + type: string + version: + type: string + required: + - savedObjectId + - version Security_Timeline_API_SerializedFilterQueryResult: type: object properties: @@ -31857,27 +31873,64 @@ components: Security_Timeline_API_TimelineResponse: allOf: - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + - $ref: >- + #/components/schemas/Security_Timeline_API_SavedTimelineWithSavedObjectId - type: object properties: eventIdToNoteIds: items: $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true type: array noteIds: items: type: string + nullable: true type: array notes: items: $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true type: array pinnedEventIds: items: type: string + nullable: true type: array pinnedEventsSaveObject: items: $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' + nullable: true + type: array + Security_Timeline_API_TimelineSavedToReturnObject: + allOf: + - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + - type: object + properties: + eventIdToNoteIds: + items: + $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true + type: array + noteIds: + items: + type: string + nullable: true + type: array + notes: + items: + $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true + type: array + pinnedEventIds: + items: + type: string + nullable: true + type: array + pinnedEventsSaveObject: + items: + $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' + nullable: true type: array savedObjectId: type: string diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index 618bd42ab1f72..79960c7287336 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -20445,19 +20445,21 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - nullable: true + data: + type: object + properties: + getOneTimeline: + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineResponse + required: + - getOneTimeline required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -20494,23 +20496,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -20572,21 +20559,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: Indicates the Timeline was successfully created. '405': content: @@ -20603,6 +20577,37 @@ paths: tags: - Security Timeline API - access:securitySolution + /api/timeline/_copy: + get: + description: | + Copies and returns a timeline or timeline template. + operationId: CopyTimeline + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + type: object + properties: + timeline: + $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + timelineIdToCopy: + type: string + required: + - timeline + - timelineIdToCopy + required: true + responses: + '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse + description: Indicates that the timeline has been successfully copied. + summary: Copies timeline or timeline template + tags: + - Security Timeline API + - access:securitySolution /api/timeline/_draft: get: description: >- @@ -20621,23 +20626,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: Indicates that the draft Timeline was successfully retrieved. '403': content: @@ -20699,23 +20689,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_PersistTimelineResponse description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -20871,28 +20846,14 @@ paths: schema: type: object properties: - file: - allOf: - - $ref: '#/components/schemas/Security_Timeline_API_Readable' - - type: object - properties: - hapi: - type: object - properties: - filename: - type: string - headers: - type: object - isImmutable: - enum: - - 'true' - - 'false' - type: string - required: - - filename - - headers - required: - - hapi + file: {} + isImmutable: + enum: + - 'true' + - 'false' + type: string + required: + - file description: The Timelines to import as a readable stream. required: true responses: @@ -20900,13 +20861,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - $ref: >- - #/components/schemas/Security_Timeline_API_ImportTimelineResult - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_ImportTimelineResult description: Indicates the import of Timelines was successful. '400': content: @@ -20965,7 +20921,9 @@ paths: properties: prepackagedTimelines: items: - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineSavedToReturnObject + nullable: true type: array timelinesToInstall: items: @@ -20988,13 +20946,8 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - $ref: >- - #/components/schemas/Security_Timeline_API_ImportTimelineResult - required: - - data + $ref: >- + #/components/schemas/Security_Timeline_API_ImportTimelineResult description: Indicates the installation of prepackaged Timelines was successful. '500': content: @@ -21032,19 +20985,16 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: + data: $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - nullable: true + #/components/schemas/Security_Timeline_API_ResolvedTimeline required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -21113,36 +21063,26 @@ paths: schema: type: object properties: - data: - type: object - properties: - customTemplateTimelineCount: - type: number - defaultTimelineCount: - type: number - elasticTemplateTimelineCount: - type: number - favoriteCount: - type: number - templateTimelineCount: - type: number - timelines: - items: - $ref: >- - #/components/schemas/Security_Timeline_API_TimelineResponse - type: array - totalCount: - type: number - required: - - timelines - - totalCount - - defaultTimelineCount - - templateTimelineCount - - favoriteCount - - elasticTemplateTimelineCount - - customTemplateTimelineCount + customTemplateTimelineCount: + type: number + defaultTimelineCount: + type: number + elasticTemplateTimelineCount: + type: number + favoriteCount: + type: number + templateTimelineCount: + type: number + timeline: + items: + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineResponse + type: array + totalCount: + type: number required: - - data + - timeline + - totalCount description: Indicates that the (template) Timelines were found and returned. '400': content: @@ -39344,30 +39284,39 @@ components: type: object properties: aggregatable: + nullable: true type: boolean category: + nullable: true type: string columnHeaderType: + nullable: true type: string description: + nullable: true type: string example: - oneOf: - - type: string - - type: number + nullable: true + type: string id: + nullable: true type: string indexes: items: type: string + nullable: true type: array name: + nullable: true type: string placeholder: + nullable: true type: string searchable: + nullable: true type: boolean type: + nullable: true type: string Security_Timeline_API_DataProviderQueryMatch: type: object @@ -39389,6 +39338,10 @@ components: type: string queryMatch: $ref: '#/components/schemas/Security_Timeline_API_QueryMatchResult' + nullable: true + type: + $ref: '#/components/schemas/Security_Timeline_API_DataProviderType' + nullable: true Security_Timeline_API_DataProviderResult: type: object properties: @@ -39476,41 +39429,59 @@ components: type: object properties: exists: - type: boolean + nullable: true + type: string match_all: + nullable: true type: string meta: + nullable: true type: object properties: alias: + nullable: true type: string controlledBy: + nullable: true type: string disabled: + nullable: true type: boolean field: + nullable: true type: string formattedValue: + nullable: true type: string index: + nullable: true type: string key: + nullable: true type: string negate: + nullable: true type: boolean params: + nullable: true type: string type: + nullable: true type: string value: + nullable: true type: string missing: + nullable: true type: string query: + nullable: true type: string range: + nullable: true type: string script: + nullable: true type: string Security_Timeline_API_GetNotesResult: type: object @@ -39575,6 +39546,12 @@ components: version: nullable: true type: string + required: + - savedObjectId + - version + - pinnedEventIds + - eventNotes + - globalNotes Security_Timeline_API_Note: allOf: - $ref: '#/components/schemas/Security_Timeline_API_BareNote' @@ -39595,6 +39572,23 @@ components: #/components/schemas/Security_Timeline_API_PinnedEventBaseResponseBody - nullable: true type: object + Security_Timeline_API_PersistTimelineResponse: + type: object + properties: + data: + type: object + properties: + persistTimeline: + type: object + properties: + timeline: + $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' + required: + - timeline + required: + - persistTimeline + required: + - data Security_Timeline_API_PinnedEvent: allOf: - $ref: '#/components/schemas/Security_Timeline_API_BarePinnedEvent' @@ -39632,34 +39626,29 @@ components: nullable: true type: string value: - nullable: true - type: string - Security_Timeline_API_Readable: + oneOf: + - nullable: true + type: string + - items: + type: string + nullable: true + type: array + Security_Timeline_API_ResolvedTimeline: type: object properties: - _data: - additionalProperties: true - type: object - _encoding: + alias_purpose: + $ref: >- + #/components/schemas/Security_Timeline_API_SavedObjectResolveAliasPurpose + alias_target_id: type: string - _events: - additionalProperties: true - type: object - _eventsCount: - type: number - _maxListeners: - additionalProperties: true - type: object - _position: - type: number - _read: - additionalProperties: true - type: object - _readableState: - additionalProperties: true - type: object - readable: - type: boolean + outcome: + $ref: '#/components/schemas/Security_Timeline_API_SavedObjectResolveOutcome' + timeline: + $ref: >- + #/components/schemas/Security_Timeline_API_TimelineSavedToReturnObject + required: + - timeline + - outcome Security_Timeline_API_ResponseNote: type: object properties: @@ -39694,6 +39683,17 @@ components: - threat_match - zeek type: string + Security_Timeline_API_SavedObjectResolveAliasPurpose: + enum: + - savedObjectConversion + - savedObjectImport + type: string + Security_Timeline_API_SavedObjectResolveOutcome: + enum: + - exactMatch + - aliasMatch + - conflict + type: string Security_Timeline_API_SavedTimeline: type: object properties: @@ -39722,12 +39722,16 @@ components: properties: end: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number start: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number description: nullable: true type: string @@ -39817,6 +39821,18 @@ components: updatedBy: nullable: true type: string + Security_Timeline_API_SavedTimelineWithSavedObjectId: + allOf: + - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + - type: object + properties: + savedObjectId: + type: string + version: + type: string + required: + - savedObjectId + - version Security_Timeline_API_SerializedFilterQueryResult: type: object properties: @@ -39866,27 +39882,64 @@ components: Security_Timeline_API_TimelineResponse: allOf: - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + - $ref: >- + #/components/schemas/Security_Timeline_API_SavedTimelineWithSavedObjectId - type: object properties: eventIdToNoteIds: items: $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true type: array noteIds: items: type: string + nullable: true type: array notes: items: $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true type: array pinnedEventIds: items: type: string + nullable: true type: array pinnedEventsSaveObject: items: $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' + nullable: true + type: array + Security_Timeline_API_TimelineSavedToReturnObject: + allOf: + - $ref: '#/components/schemas/Security_Timeline_API_SavedTimeline' + - type: object + properties: + eventIdToNoteIds: + items: + $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true + type: array + noteIds: + items: + type: string + nullable: true + type: array + notes: + items: + $ref: '#/components/schemas/Security_Timeline_API_Note' + nullable: true + type: array + pinnedEventIds: + items: + type: string + nullable: true + type: array + pinnedEventsSaveObject: + items: + $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' + nullable: true type: array savedObjectId: type: string diff --git a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts index 9b057bb19d7e2..255b56c485b9b 100644 --- a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts +++ b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts @@ -296,6 +296,10 @@ import type { CleanDraftTimelinesRequestBodyInput, CleanDraftTimelinesResponse, } from './timeline/clean_draft_timelines/clean_draft_timelines_route.gen'; +import type { + CopyTimelineRequestBodyInput, + CopyTimelineResponse, +} from './timeline/copy_timeline/copy_timeline_route.gen'; import type { CreateTimelinesRequestBodyInput, CreateTimelinesResponse, @@ -556,6 +560,23 @@ If asset criticality records already exist for the specified entities, those rec }) .catch(catchAxiosErrorFormatAndThrow); } + /** + * Copies and returns a timeline or timeline template. + + */ + async copyTimeline(props: CopyTimelineProps) { + this.log.info(`${new Date().toISOString()} Calling API CopyTimeline`); + return this.kbnClient + .request({ + path: '/api/timeline/_copy', + headers: { + [ELASTIC_HTTP_VERSION_HEADER]: '2023-10-31', + }, + method: 'GET', + body: props.body, + }) + .catch(catchAxiosErrorFormatAndThrow); + } async createAlertsIndex() { this.log.info(`${new Date().toISOString()} Calling API CreateAlertsIndex`); return this.kbnClient @@ -1993,6 +2014,9 @@ export interface BulkUpsertAssetCriticalityRecordsProps { export interface CleanDraftTimelinesProps { body: CleanDraftTimelinesRequestBodyInput; } +export interface CopyTimelineProps { + body: CopyTimelineRequestBodyInput; +} export interface CreateAlertsMigrationProps { body: CreateAlertsMigrationRequestBodyInput; } diff --git a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.gen.ts index 514a06ceec328..f3858b1cb8f34 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.gen.ts @@ -16,7 +16,7 @@ import { z } from '@kbn/zod'; -import { TimelineType, TimelineResponse } from '../model/components.gen'; +import { TimelineType, PersistTimelineResponse } from '../model/components.gen'; export type CleanDraftTimelinesRequestBody = z.infer; export const CleanDraftTimelinesRequestBody = z.object({ @@ -25,10 +25,4 @@ export const CleanDraftTimelinesRequestBody = z.object({ export type CleanDraftTimelinesRequestBodyInput = z.input; export type CleanDraftTimelinesResponse = z.infer; -export const CleanDraftTimelinesResponse = z.object({ - data: z.object({ - persistTimeline: z.object({ - timeline: TimelineResponse, - }), - }), -}); +export const CleanDraftTimelinesResponse = PersistTimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml index 5e1fbff1f296d..7ff1e397c1d18 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Draft Timeline API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/_draft: post: @@ -39,19 +32,7 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistTimeline] - properties: - persistTimeline: - type: object - required: [timeline] - properties: - timeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' + $ref: '../model/components.schema.yaml#/components/schemas/PersistTimelineResponse' '403': description: Indicates that the user does not have the required permissions to create a draft Timeline. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.gen.ts new file mode 100644 index 0000000000000..6e75f0baaf7ef --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.gen.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. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Elastic Security - Timeline - Copy Timeline API + * version: 2023-10-31 + */ + +import { z } from '@kbn/zod'; + +import { SavedTimeline, PersistTimelineResponse } from '../model/components.gen'; + +export type CopyTimelineRequestBody = z.infer; +export const CopyTimelineRequestBody = z.object({ + timeline: SavedTimeline, + timelineIdToCopy: z.string(), +}); +export type CopyTimelineRequestBodyInput = z.input; + +export type CopyTimelineResponse = z.infer; +export const CopyTimelineResponse = PersistTimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.schema.yaml new file mode 100644 index 0000000000000..743de4c334fe5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.schema.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +info: + title: Elastic Security - Timeline - Copy Timeline API + version: '2023-10-31' +paths: + /api/timeline/_copy: + get: + x-labels: [serverless, ess] + x-codegen-enabled: true + operationId: CopyTimeline + summary: Copies timeline or timeline template + description: | + Copies and returns a timeline or timeline template. + tags: + - access:securitySolution + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [timeline, timelineIdToCopy] + properties: + timeline: + $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' + timelineIdToCopy: + type: string + responses: + '200': + description: Indicates that the timeline has been successfully copied. + content: + application/json: + schema: + $ref: '../model/components.schema.yaml#/components/schemas/PersistTimelineResponse' diff --git a/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.ts b/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.ts deleted file mode 100644 index 1b7dc1d4c3566..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/copy_timeline/copy_timeline_route.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 * as rt from 'io-ts'; - -import { SavedTimelineRuntimeType } from '../model/api'; - -export const copyTimelineSchema = rt.type({ - timeline: SavedTimelineRuntimeType, - timelineIdToCopy: rt.string, -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.gen.ts index 51af791fbc3f0..33fc1855f390a 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.gen.ts @@ -17,29 +17,23 @@ import { z } from '@kbn/zod'; import { + SavedTimeline, TimelineStatus, TimelineType, - SavedTimeline, - TimelineResponse, + PersistTimelineResponse, } from '../model/components.gen'; export type CreateTimelinesRequestBody = z.infer; export const CreateTimelinesRequestBody = z.object({ + timeline: SavedTimeline, status: TimelineStatus.nullable().optional(), timelineId: z.string().nullable().optional(), templateTimelineId: z.string().nullable().optional(), templateTimelineVersion: z.number().nullable().optional(), timelineType: TimelineType.nullable().optional(), version: z.string().nullable().optional(), - timeline: SavedTimeline, }); export type CreateTimelinesRequestBodyInput = z.input; export type CreateTimelinesResponse = z.infer; -export const CreateTimelinesResponse = z.object({ - data: z.object({ - persistTimeline: z.object({ - timeline: TimelineResponse.optional(), - }), - }), -}); +export const CreateTimelinesResponse = PersistTimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml index 9dce2658694ab..8f369fde6e9e9 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/timeline-api-create.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline: post: @@ -29,9 +22,10 @@ paths: application/json: schema: type: object - required: - - timeline + required: [timeline] properties: + timeline: + $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' status: $ref: '../model/components.schema.yaml#/components/schemas/TimelineStatus' nullable: true @@ -50,26 +44,13 @@ paths: version: type: string nullable: true - timeline: - $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' responses: '200': description: Indicates the Timeline was successfully created. content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistTimeline] - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' + $ref: '../model/components.schema.yaml#/components/schemas/PersistTimelineResponse' '405': description: Indicates that there was an error in the Timeline creation. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.ts deleted file mode 100644 index 1911df3941a35..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/create_timelines/create_timelines_route.ts +++ /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 * as rt from 'io-ts'; - -import type { ResponseTimeline } from '../model/api'; -import { - SavedTimelineRuntimeType, - TimelineStatusLiteralRt, - TimelineTypeLiteralRt, -} from '../model/api'; -import { unionWithNullType } from '../../../utility_types'; - -export const createTimelineSchema = rt.intersection([ - rt.type({ - timeline: SavedTimelineRuntimeType, - }), - rt.partial({ - status: unionWithNullType(TimelineStatusLiteralRt), - timelineId: unionWithNullType(rt.string), - templateTimelineId: unionWithNullType(rt.string), - templateTimelineVersion: unionWithNullType(rt.number), - timelineType: unionWithNullType(TimelineTypeLiteralRt), - version: unionWithNullType(rt.string), - }), -]); - -export interface CreateTimelinesResponse { - data: { - persistTimeline: ResponseTimeline; - }; -} diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml index 380029bff8070..e79cb9aab65ac 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Notes API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/note: delete: diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml index 7a0a168747d47..bb6674fa65877 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/timeline-api-delete.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline: delete: diff --git a/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml index 44ef7d0f3abe0..24387adf1f2a5 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/timeline-api-import.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/_export: post: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.gen.ts index edbbc37744d03..327f02a8fb6f5 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.gen.ts @@ -16,7 +16,7 @@ import { z } from '@kbn/zod'; -import { TimelineType, TimelineResponse } from '../model/components.gen'; +import { TimelineType, PersistTimelineResponse } from '../model/components.gen'; export type GetDraftTimelinesRequestQuery = z.infer; export const GetDraftTimelinesRequestQuery = z.object({ @@ -25,10 +25,4 @@ export const GetDraftTimelinesRequestQuery = z.object({ export type GetDraftTimelinesRequestQueryInput = z.input; export type GetDraftTimelinesResponse = z.infer; -export const GetDraftTimelinesResponse = z.object({ - data: z.object({ - persistTimeline: z.object({ - timeline: TimelineResponse, - }), - }), -}); +export const GetDraftTimelinesResponse = PersistTimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml index 21cabb87cd335..4a8af1c77f40d 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Get Draft Timelines API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/_draft: get: @@ -31,19 +24,7 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistTimeline] - properties: - persistTimeline: - type: object - required: [timeline] - properties: - timeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' + $ref: '../model/components.schema.yaml#/components/schemas/PersistTimelineResponse' '403': description: If a draft Timeline was not found and we attempted to create one, it indicates that the user does not have the required permissions to create a draft Timeline. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.ts deleted file mode 100644 index 13625715289f6..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/get_draft_timelines/get_draft_timelines_route.ts +++ /dev/null @@ -1,14 +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 * as rt from 'io-ts'; - -import { TimelineTypeLiteralRt } from '../model/api'; - -export const getDraftTimelineSchema = rt.type({ - timelineType: TimelineTypeLiteralRt, -}); 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 5942fd76c5d51..793eeac5e7c71 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 @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Notes API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/note: get: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts index 622545e22b37a..7a41788077524 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts @@ -32,8 +32,11 @@ export const GetTimelineRequestQuery = z.object({ export type GetTimelineRequestQueryInput = z.input; export type GetTimelineResponse = z.infer; -export const GetTimelineResponse = z.object({ - data: z.object({ - getOneTimeline: TimelineResponse.nullable(), +export const GetTimelineResponse = z.union([ + z.object({ + data: z.object({ + getOneTimeline: TimelineResponse, + }), }), -}); + z.object({}).strict(), +]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml index d0944bc0fcb10..9b5d3fedfd59e 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/_get_timeline_or_timeline_template_by_savedobjectid.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline: get: @@ -39,13 +32,15 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [getOneTimeline] + oneOf: + - type: object + required: [data] properties: - getOneTimeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' - nullable: true + data: + type: object + required: [getOneTimeline] + properties: + getOneTimeline: + $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' + - type: object + additionalProperties: false diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.ts b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.ts deleted file mode 100644 index cca6886f42025..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.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 * as rt from 'io-ts'; - -export const getTimelineQuerySchema = rt.partial({ - template_timeline_id: rt.string, - id: rt.string, -}); - -export type GetTimelineQuery = rt.TypeOf; diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.gen.ts index 5ce3256ae48be..714746875599b 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.gen.ts @@ -41,13 +41,11 @@ export type GetTimelinesRequestQueryInput = z.input; export const GetTimelinesResponse = z.object({ - data: z.object({ - timelines: z.array(TimelineResponse), - totalCount: z.number(), - defaultTimelineCount: z.number(), - templateTimelineCount: z.number(), - favoriteCount: z.number(), - elasticTemplateTimelineCount: z.number(), - customTemplateTimelineCount: z.number(), - }), + timeline: z.array(TimelineResponse), + totalCount: z.number(), + defaultTimelineCount: z.number().optional(), + templateTimelineCount: z.number().optional(), + favoriteCount: z.number().optional(), + elasticTemplateTimelineCount: z.number().optional(), + customTemplateTimelineCount: z.number().optional(), }); diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml index f889af73e10d7..36a7b853b3823 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/timeline-api-get.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timelines: get: @@ -75,37 +68,27 @@ paths: application/json: schema: type: object - required: [data] + required: [ + timeline, + totalCount, + ] properties: - data: - type: object - required: - [ - timelines, - totalCount, - defaultTimelineCount, - templateTimelineCount, - favoriteCount, - elasticTemplateTimelineCount, - customTemplateTimelineCount, - ] - properties: - timelines: - type: array - items: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' - totalCount: - type: number - defaultTimelineCount: - type: number - templateTimelineCount: - type: number - favoriteCount: - type: number - elasticTemplateTimelineCount: - type: number - customTemplateTimelineCount: - type: number + timeline: + type: array + items: + $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' + totalCount: + type: number + defaultTimelineCount: + type: number + templateTimelineCount: + type: number + favoriteCount: + type: number + elasticTemplateTimelineCount: + type: number + customTemplateTimelineCount: + type: number '400': description: Bad request. The user supplied invalid data. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.ts deleted file mode 100644 index 9f35197358aea..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timelines/get_timelines_route.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as rt from 'io-ts'; -import { - direction, - sortFieldTimeline, - TimelineStatusLiteralRt, - TimelineTypeLiteralRt, -} from '../model/api'; -import { unionWithNullType } from '../../../utility_types'; - -const BoolFromString = rt.union([rt.literal('true'), rt.literal('false')]); - -export const getTimelinesQuerySchema = rt.partial({ - only_user_favorite: unionWithNullType(BoolFromString), - page_index: unionWithNullType(rt.string), - page_size: unionWithNullType(rt.string), - search: unionWithNullType(rt.string), - sort_field: sortFieldTimeline, - sort_order: direction, - status: unionWithNullType(TimelineStatusLiteralRt), - timeline_type: unionWithNullType(TimelineTypeLiteralRt), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.gen.ts index 4624ffd713430..660f8bc287665 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.gen.ts @@ -16,23 +16,14 @@ import { z } from '@kbn/zod'; -import { Readable, ImportTimelineResult } from '../model/components.gen'; +import { ImportTimelineResult } from '../model/components.gen'; export type ImportTimelinesRequestBody = z.infer; export const ImportTimelinesRequestBody = z.object({ - file: Readable.merge( - z.object({ - hapi: z.object({ - filename: z.string(), - headers: z.object({}), - isImmutable: z.enum(['true', 'false']).optional(), - }), - }) - ), + isImmutable: z.enum(['true', 'false']).optional(), + file: z.unknown(), }); export type ImportTimelinesRequestBodyInput = z.input; export type ImportTimelinesResponse = z.infer; -export const ImportTimelinesResponse = z.object({ - data: ImportTimelineResult, -}); +export const ImportTimelinesResponse = ImportTimelineResult; diff --git a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml index 34a35aa59db0e..d0d2691f2ac7e 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/timeline-api-import.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/_import: post: @@ -29,37 +22,21 @@ paths: application/json: schema: type: object + required: [file] properties: - file: - allOf: - - $ref: '../model/components.schema.yaml#/components/schemas/Readable' - - type: object - required: [hapi] - properties: - hapi: - type: object - required: [filename, headers] - properties: - filename: - type: string - headers: - type: object - isImmutable: - type: string - enum: - - 'true' - - 'false' + isImmutable: + type: string + enum: + - 'true' + - 'false' + file: {} responses: '200': description: Indicates the import of Timelines was successful. content: application/json: schema: - type: object - required: [data] - properties: - data: - $ref: '../model/components.schema.yaml#/components/schemas/ImportTimelineResult' + $ref: '../model/components.schema.yaml#/components/schemas/ImportTimelineResult' '400': description: Indicates the import of Timelines was unsuccessful because of an invalid file extension. diff --git a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts deleted file mode 100644 index 2ad6f3f8c7333..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts +++ /dev/null @@ -1,60 +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 * as rt from 'io-ts'; - -import { BareNoteSchema, SavedTimelineRuntimeType } from '../model/api'; -import { unionWithNullType } from '../../../utility_types'; - -const pinnedEventIds = unionWithNullType(rt.array(rt.string)); - -export const eventNotes = unionWithNullType(rt.array(BareNoteSchema)); -export const globalNotes = unionWithNullType(rt.array(BareNoteSchema)); - -export const ImportTimelinesSchemaRt = rt.intersection([ - SavedTimelineRuntimeType, - rt.type({ - savedObjectId: unionWithNullType(rt.string), - version: unionWithNullType(rt.string), - }), - rt.type({ - globalNotes, - eventNotes, - pinnedEventIds, - }), -]); - -export type ImportTimelinesSchema = rt.TypeOf; - -const ReadableRt = rt.partial({ - _maxListeners: rt.unknown, - _readableState: rt.unknown, - _read: rt.unknown, - readable: rt.boolean, - _events: rt.unknown, - _eventsCount: rt.number, - _data: rt.unknown, - _position: rt.number, - _encoding: rt.string, -}); - -const booleanInString = rt.union([rt.literal('true'), rt.literal('false')]); - -export const ImportTimelinesPayloadSchemaRt = rt.intersection([ - rt.type({ - file: rt.intersection([ - ReadableRt, - rt.type({ - hapi: rt.type({ - filename: rt.string, - headers: rt.unknown, - }), - }), - ]), - }), - rt.partial({ isImmutable: booleanInString }), -]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/index.ts b/x-pack/plugins/security_solution/common/api/timeline/index.ts index 806c0c8539d97..0a148bcc59797 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/index.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/index.ts @@ -7,13 +7,3 @@ export * from './model/api'; export * from './routes'; - -export * from './get_draft_timelines/get_draft_timelines_route'; -export * from './create_timelines/create_timelines_route'; -export * from './get_timeline/get_timeline_route'; -export * from './get_timelines/get_timelines_route'; -export * from './import_timelines/import_timelines_route'; -export * from './patch_timelines/patch_timelines_schema'; -export * from './pinned_events/pinned_events_route'; -export * from './install_prepackaged_timelines/install_prepackaged_timelines'; -export * from './copy_timeline/copy_timeline_route'; diff --git a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines.ts b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines.ts deleted file mode 100644 index 0d9b2d3e81121..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines.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 * as rt from 'io-ts'; - -import { unionWithNullType } from '../../../utility_types'; -import { ImportTimelinesSchemaRt, TimelineSavedToReturnObjectRuntimeType } from '..'; - -export const checkTimelineStatusRt = rt.type({ - timelinesToInstall: rt.array(unionWithNullType(ImportTimelinesSchemaRt)), - timelinesToUpdate: rt.array(unionWithNullType(ImportTimelinesSchemaRt)), - prepackagedTimelines: rt.array(unionWithNullType(TimelineSavedToReturnObjectRuntimeType)), -}); - -export type CheckTimelineStatusRt = rt.TypeOf; diff --git a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.gen.ts index add1e2ffa94b8..f2f09c0257e87 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.gen.ts @@ -16,7 +16,11 @@ import { z } from '@kbn/zod'; -import { ImportTimelines, SavedTimeline, ImportTimelineResult } from '../model/components.gen'; +import { + ImportTimelines, + TimelineSavedToReturnObject, + ImportTimelineResult, +} from '../model/components.gen'; export type InstallPrepackedTimelinesRequestBody = z.infer< typeof InstallPrepackedTimelinesRequestBody @@ -24,13 +28,11 @@ export type InstallPrepackedTimelinesRequestBody = z.infer< export const InstallPrepackedTimelinesRequestBody = z.object({ timelinesToInstall: z.array(ImportTimelines.nullable()), timelinesToUpdate: z.array(ImportTimelines.nullable()), - prepackagedTimelines: z.array(SavedTimeline), + prepackagedTimelines: z.array(TimelineSavedToReturnObject.nullable()), }); export type InstallPrepackedTimelinesRequestBodyInput = z.input< typeof InstallPrepackedTimelinesRequestBody >; export type InstallPrepackedTimelinesResponse = z.infer; -export const InstallPrepackedTimelinesResponse = z.object({ - data: ImportTimelineResult, -}); +export const InstallPrepackedTimelinesResponse = ImportTimelineResult; diff --git a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml index 7dfa5afbbe5ed..876bf499e385b 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/install_prepackaged_timelines/install_prepackaged_timelines_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Install Prepackaged Timelines API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/_prepackaged: post: @@ -41,18 +34,15 @@ paths: prepackagedTimelines: type: array items: - $ref: '../model/components.schema.yaml#/components/schemas/SavedTimeline' + $ref: '../model/components.schema.yaml#/components/schemas/TimelineSavedToReturnObject' + nullable: true responses: '200': description: Indicates the installation of prepackaged Timelines was successful. content: application/json: schema: - type: object - required: [data] - properties: - data: - $ref: '../model/components.schema.yaml#/components/schemas/ImportTimelineResult' + $ref: '../model/components.schema.yaml#/components/schemas/ImportTimelineResult' '500': description: Indicates the installation of prepackaged Timelines was unsuccessful. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/api.ts b/x-pack/plugins/security_solution/common/api/timeline/model/api.ts index ff6707b700626..250daaf3077eb 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/api.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/model/api.ts @@ -5,30 +5,35 @@ * 2.0. */ -import * as runtimeTypes from 'io-ts'; -import { PositiveInteger } from '@kbn/securitysolution-io-ts-types'; - -import { stringEnum, unionWithNullType } from '../../../utility_types'; - -import type { Maybe } from '../../../search_strategy'; -import { Direction } from '../../../search_strategy'; -import { PinnedEventRuntimeType } from '../pinned_events/pinned_events_route'; -import { ErrorSchema } from './error_schema'; import type { DataProviderType } from './components.gen'; import { BareNote, BarePinnedEvent, + ColumnHeaderResult, DataProviderTypeEnum, + DataProviderResult, FavoriteTimelineResponse, - type FavoriteTimelineResult, + FilterTimelineResult, + ImportTimelineResult, + ImportTimelines, type Note, PinnedEvent, + PersistTimelineResponse, + QueryMatchResult, + ResolvedTimeline, RowRendererId, RowRendererIdEnum, + SavedTimeline, + SavedTimelineWithSavedObjectId, + Sort, + SortDirection, SortFieldTimeline, SortFieldTimelineEnum, TemplateTimelineType, TemplateTimelineTypeEnum, + TimelineErrorResponse, + TimelineResponse, + TimelineSavedToReturnObject, TimelineStatus, TimelineStatusEnum, TimelineType, @@ -38,62 +43,45 @@ import { export { BareNote, BarePinnedEvent, + ColumnHeaderResult, + DataProviderResult, DataProviderType, DataProviderTypeEnum, FavoriteTimelineResponse, + FilterTimelineResult, + ImportTimelineResult, + ImportTimelines, Note, PinnedEvent, + PersistTimelineResponse, + QueryMatchResult, + ResolvedTimeline, RowRendererId, RowRendererIdEnum, + SavedTimeline, + SavedTimelineWithSavedObjectId, + Sort, + SortDirection, SortFieldTimeline, SortFieldTimelineEnum, TemplateTimelineType, + TimelineErrorResponse, + TimelineResponse, TemplateTimelineTypeEnum, + TimelineSavedToReturnObject, TimelineStatus, TimelineStatusEnum, TimelineType, TimelineTypeEnum, }; -export type BarePinnedEventWithoutExternalRefs = Omit; - /** - * Outcome is a property of the saved object resolve api - * will tell us info about the rule after 8.0 migrations + * This type represents a timeline type stored in a saved object that does not include any fields that reference + * other saved objects. */ -export type SavedObjectResolveOutcome = runtimeTypes.TypeOf; -export const SavedObjectResolveOutcome = runtimeTypes.union([ - runtimeTypes.literal('exactMatch'), - runtimeTypes.literal('aliasMatch'), - runtimeTypes.literal('conflict'), -]); - -export type SavedObjectResolveAliasTargetId = runtimeTypes.TypeOf< - typeof SavedObjectResolveAliasTargetId ->; -export const SavedObjectResolveAliasTargetId = runtimeTypes.string; - -export type SavedObjectResolveAliasPurpose = runtimeTypes.TypeOf< - typeof SavedObjectResolveAliasPurpose ->; -export const SavedObjectResolveAliasPurpose = runtimeTypes.union([ - runtimeTypes.literal('savedObjectConversion'), - runtimeTypes.literal('savedObjectImport'), -]); +export type TimelineWithoutExternalRefs = Omit; -export const BareNoteSchema = runtimeTypes.intersection([ - runtimeTypes.type({ - timelineId: runtimeTypes.string, - }), - runtimeTypes.partial({ - eventId: unionWithNullType(runtimeTypes.string), - note: unionWithNullType(runtimeTypes.string), - created: unionWithNullType(runtimeTypes.number), - createdBy: unionWithNullType(runtimeTypes.string), - updated: unionWithNullType(runtimeTypes.number), - updatedBy: unionWithNullType(runtimeTypes.string), - }), -]); +export type BarePinnedEventWithoutExternalRefs = Omit; /** * This type represents a note type stored in a saved object that does not include any fields that reference @@ -101,350 +89,9 @@ export const BareNoteSchema = runtimeTypes.intersection([ */ export type BareNoteWithoutExternalRefs = Omit; -export const NoteRuntimeType = runtimeTypes.intersection([ - BareNoteSchema, - runtimeTypes.type({ - noteId: runtimeTypes.string, - version: runtimeTypes.string, - }), -]); - -/* - * ColumnHeader Types - */ -const SavedColumnHeaderRuntimeType = runtimeTypes.partial({ - aggregatable: unionWithNullType(runtimeTypes.boolean), - category: unionWithNullType(runtimeTypes.string), - columnHeaderType: unionWithNullType(runtimeTypes.string), - description: unionWithNullType(runtimeTypes.string), - example: unionWithNullType(runtimeTypes.string), - indexes: unionWithNullType(runtimeTypes.array(runtimeTypes.string)), - id: unionWithNullType(runtimeTypes.string), - name: unionWithNullType(runtimeTypes.string), - placeholder: unionWithNullType(runtimeTypes.string), - searchable: unionWithNullType(runtimeTypes.boolean), - type: unionWithNullType(runtimeTypes.string), -}); - -/* - * DataProvider Types - */ -const SavedDataProviderQueryMatchBasicRuntimeType = runtimeTypes.partial({ - field: unionWithNullType(runtimeTypes.string), - displayField: unionWithNullType(runtimeTypes.string), - value: runtimeTypes.union([ - runtimeTypes.null, - runtimeTypes.string, - runtimeTypes.array(runtimeTypes.string), - ]), - displayValue: unionWithNullType(runtimeTypes.string), - operator: unionWithNullType(runtimeTypes.string), -}); - -const SavedDataProviderQueryMatchRuntimeType = runtimeTypes.partial({ - id: unionWithNullType(runtimeTypes.string), - name: unionWithNullType(runtimeTypes.string), - enabled: unionWithNullType(runtimeTypes.boolean), - excluded: unionWithNullType(runtimeTypes.boolean), - kqlQuery: unionWithNullType(runtimeTypes.string), - queryMatch: unionWithNullType(SavedDataProviderQueryMatchBasicRuntimeType), -}); - -export const DataProviderTypeLiteralRt = runtimeTypes.union([ - runtimeTypes.literal(DataProviderTypeEnum.default), - runtimeTypes.literal(DataProviderTypeEnum.template), -]); - -const SavedDataProviderRuntimeType = runtimeTypes.partial({ - id: unionWithNullType(runtimeTypes.string), - name: unionWithNullType(runtimeTypes.string), - enabled: unionWithNullType(runtimeTypes.boolean), - excluded: unionWithNullType(runtimeTypes.boolean), - kqlQuery: unionWithNullType(runtimeTypes.string), - queryMatch: unionWithNullType(SavedDataProviderQueryMatchBasicRuntimeType), - and: unionWithNullType(runtimeTypes.array(SavedDataProviderQueryMatchRuntimeType)), - type: unionWithNullType(DataProviderTypeLiteralRt), -}); - -/* - * Filters Types - */ -const SavedFilterMetaRuntimeType = runtimeTypes.partial({ - alias: unionWithNullType(runtimeTypes.string), - controlledBy: unionWithNullType(runtimeTypes.string), - disabled: unionWithNullType(runtimeTypes.boolean), - field: unionWithNullType(runtimeTypes.string), - formattedValue: unionWithNullType(runtimeTypes.string), - index: unionWithNullType(runtimeTypes.string), - key: unionWithNullType(runtimeTypes.string), - negate: unionWithNullType(runtimeTypes.boolean), - params: unionWithNullType(runtimeTypes.string), - type: unionWithNullType(runtimeTypes.string), - value: unionWithNullType(runtimeTypes.string), -}); - -const SavedFilterRuntimeType = runtimeTypes.partial({ - exists: unionWithNullType(runtimeTypes.string), - meta: unionWithNullType(SavedFilterMetaRuntimeType), - match_all: unionWithNullType(runtimeTypes.string), - missing: unionWithNullType(runtimeTypes.string), - query: unionWithNullType(runtimeTypes.string), - range: unionWithNullType(runtimeTypes.string), - script: unionWithNullType(runtimeTypes.string), -}); - -/* - * eqlOptionsQuery -> filterQuery Types - */ -const EqlOptionsRuntimeType = runtimeTypes.partial({ - eventCategoryField: unionWithNullType(runtimeTypes.string), - query: unionWithNullType(runtimeTypes.string), - tiebreakerField: unionWithNullType(runtimeTypes.string), - timestampField: unionWithNullType(runtimeTypes.string), - size: unionWithNullType(runtimeTypes.union([runtimeTypes.string, runtimeTypes.number])), -}); - -/* - * kqlQuery -> filterQuery Types - */ -const SavedKueryFilterQueryRuntimeType = runtimeTypes.partial({ - kind: unionWithNullType(runtimeTypes.string), - expression: unionWithNullType(runtimeTypes.string), -}); - -const SavedSerializedFilterQueryQueryRuntimeType = runtimeTypes.partial({ - kuery: unionWithNullType(SavedKueryFilterQueryRuntimeType), - serializedQuery: unionWithNullType(runtimeTypes.string), -}); - -const SavedFilterQueryQueryRuntimeType = runtimeTypes.partial({ - filterQuery: unionWithNullType(SavedSerializedFilterQueryQueryRuntimeType), -}); - -/* - * DatePicker Range Types - */ -const SavedDateRangePickerRuntimeType = runtimeTypes.partial({ - /* Before the change of all timestamp to ISO string the values of start and from - * attributes where a number. Specifically UNIX timestamps. - * To support old timeline's saved object we need to add the number io-ts type - */ - start: unionWithNullType(runtimeTypes.union([runtimeTypes.string, runtimeTypes.number])), - end: unionWithNullType(runtimeTypes.union([runtimeTypes.string, runtimeTypes.number])), -}); - -/* - * Favorite Types - */ -const SavedFavoriteRuntimeType = runtimeTypes.partial({ - keySearch: unionWithNullType(runtimeTypes.string), - favoriteDate: unionWithNullType(runtimeTypes.number), - fullName: unionWithNullType(runtimeTypes.string), - userName: unionWithNullType(runtimeTypes.string), -}); - -/* - * Sort Types - */ - -const SavedSortObject = runtimeTypes.partial({ - columnId: unionWithNullType(runtimeTypes.string), - columnType: unionWithNullType(runtimeTypes.string), - sortDirection: unionWithNullType(runtimeTypes.string), -}); -const SavedSortRuntimeType = runtimeTypes.union([ - runtimeTypes.array(SavedSortObject), - SavedSortObject, -]); - -export type Sort = runtimeTypes.TypeOf; - -/* - * Timeline Statuses - */ - -export const TimelineStatusLiteralRt = runtimeTypes.union([ - runtimeTypes.literal(TimelineStatusEnum.active), - runtimeTypes.literal(TimelineStatusEnum.draft), - runtimeTypes.literal(TimelineStatusEnum.immutable), -]); - export const RowRendererCount = Object.keys(RowRendererIdEnum).length; export const RowRendererValues = Object.values(RowRendererId.Values); -const RowRendererIdRuntimeType = stringEnum(RowRendererIdEnum, 'RowRendererId'); - -/** - * Timeline types - */ - -export const TimelineTypeLiteralRt = runtimeTypes.union([ - runtimeTypes.literal(TimelineTypeEnum.template), - runtimeTypes.literal(TimelineTypeEnum.default), -]); - -/** - * This is the response type - */ -export const SavedTimelineRuntimeType = runtimeTypes.partial({ - columns: unionWithNullType(runtimeTypes.array(SavedColumnHeaderRuntimeType)), - dataProviders: unionWithNullType(runtimeTypes.array(SavedDataProviderRuntimeType)), - dataViewId: unionWithNullType(runtimeTypes.string), - description: unionWithNullType(runtimeTypes.string), - eqlOptions: unionWithNullType(EqlOptionsRuntimeType), - eventType: unionWithNullType(runtimeTypes.string), - excludedRowRendererIds: unionWithNullType(runtimeTypes.array(RowRendererIdRuntimeType)), - favorite: unionWithNullType(runtimeTypes.array(SavedFavoriteRuntimeType)), - filters: unionWithNullType(runtimeTypes.array(SavedFilterRuntimeType)), - indexNames: unionWithNullType(runtimeTypes.array(runtimeTypes.string)), - kqlMode: unionWithNullType(runtimeTypes.string), - kqlQuery: unionWithNullType(SavedFilterQueryQueryRuntimeType), - title: unionWithNullType(runtimeTypes.string), - templateTimelineId: unionWithNullType(runtimeTypes.string), - templateTimelineVersion: unionWithNullType(runtimeTypes.number), - timelineType: unionWithNullType(TimelineTypeLiteralRt), - dateRange: unionWithNullType(SavedDateRangePickerRuntimeType), - savedQueryId: unionWithNullType(runtimeTypes.string), - sort: unionWithNullType(SavedSortRuntimeType), - status: unionWithNullType(TimelineStatusLiteralRt), - created: unionWithNullType(runtimeTypes.number), - createdBy: unionWithNullType(runtimeTypes.string), - updated: unionWithNullType(runtimeTypes.number), - updatedBy: unionWithNullType(runtimeTypes.string), - savedSearchId: unionWithNullType(runtimeTypes.string), -}); - -export type SavedTimeline = runtimeTypes.TypeOf; - -export type SavedTimelineWithSavedObjectId = SavedTimeline & { - savedObjectId?: string | null; -}; - -/** - * This type represents a timeline type stored in a saved object that does not include any fields that reference - * other saved objects. - */ -export type TimelineWithoutExternalRefs = Omit; - -export const TimelineSavedToReturnObjectRuntimeType = runtimeTypes.intersection([ - SavedTimelineRuntimeType, - runtimeTypes.type({ - savedObjectId: runtimeTypes.string, - version: runtimeTypes.string, - }), - runtimeTypes.partial({ - eventIdToNoteIds: runtimeTypes.array(NoteRuntimeType), - noteIds: runtimeTypes.array(runtimeTypes.string), - notes: runtimeTypes.array(NoteRuntimeType), - pinnedEventIds: runtimeTypes.array(runtimeTypes.string), - pinnedEventsSaveObject: runtimeTypes.array(PinnedEventRuntimeType), - }), -]); - -export type TimelineSavedObject = runtimeTypes.TypeOf< - typeof TimelineSavedToReturnObjectRuntimeType ->; - -export const SingleTimelineResponseType = runtimeTypes.type({ - data: runtimeTypes.type({ - getOneTimeline: TimelineSavedToReturnObjectRuntimeType, - }), -}); - -export type SingleTimelineResponse = runtimeTypes.TypeOf; - -/** Resolved Timeline Response */ -export const ResolvedTimelineSavedObjectToReturnObjectRuntimeType = runtimeTypes.intersection([ - runtimeTypes.type({ - timeline: TimelineSavedToReturnObjectRuntimeType, - outcome: SavedObjectResolveOutcome, - }), - runtimeTypes.partial({ - alias_target_id: SavedObjectResolveAliasTargetId, - alias_purpose: SavedObjectResolveAliasPurpose, - }), -]); - -export type ResolvedTimelineWithOutcomeSavedObject = runtimeTypes.TypeOf< - typeof ResolvedTimelineSavedObjectToReturnObjectRuntimeType ->; - -export const ResolvedSingleTimelineResponseType = runtimeTypes.type({ - data: ResolvedTimelineSavedObjectToReturnObjectRuntimeType, -}); - -export type SingleTimelineResolveResponse = runtimeTypes.TypeOf< - typeof ResolvedSingleTimelineResponseType ->; - -const responseTimelines = runtimeTypes.type({ - timeline: runtimeTypes.array(TimelineSavedToReturnObjectRuntimeType), - totalCount: runtimeTypes.number, -}); - -export type ResponseTimelines = runtimeTypes.TypeOf; - -export const allTimelinesResponse = runtimeTypes.intersection([ - responseTimelines, - runtimeTypes.type({ - defaultTimelineCount: runtimeTypes.number, - templateTimelineCount: runtimeTypes.number, - elasticTemplateTimelineCount: runtimeTypes.number, - customTemplateTimelineCount: runtimeTypes.number, - favoriteCount: runtimeTypes.number, - }), -]); - -export type AllTimelinesResponse = runtimeTypes.TypeOf; - -/** - * All Timeline Saved object type with metadata - */ -export const TimelineResponseType = runtimeTypes.type({ - data: runtimeTypes.type({ - persistTimeline: runtimeTypes.intersection([ - runtimeTypes.partial({ - code: unionWithNullType(runtimeTypes.number), - message: unionWithNullType(runtimeTypes.string), - }), - runtimeTypes.type({ - timeline: TimelineSavedToReturnObjectRuntimeType, - }), - ]), - }), -}); - -export const TimelineErrorResponseType = runtimeTypes.union([ - runtimeTypes.type({ - status_code: runtimeTypes.number, - message: runtimeTypes.string, - }), - runtimeTypes.type({ - statusCode: runtimeTypes.number, - message: runtimeTypes.string, - }), -]); - -export type TimelineErrorResponse = runtimeTypes.TypeOf; -export type TimelineResponse = runtimeTypes.TypeOf; - -export const sortFieldTimeline = runtimeTypes.union([ - runtimeTypes.literal(SortFieldTimelineEnum.title), - runtimeTypes.literal(SortFieldTimelineEnum.description), - runtimeTypes.literal(SortFieldTimelineEnum.updated), - runtimeTypes.literal(SortFieldTimelineEnum.created), -]); - -export const direction = runtimeTypes.union([ - runtimeTypes.literal(Direction.asc), - runtimeTypes.literal(Direction.desc), -]); - -export const sortTimeline = runtimeTypes.type({ - sortField: sortFieldTimeline, - sortOrder: direction, -}); - /** * Import/export timelines */ @@ -457,187 +104,17 @@ export interface ExportedNotes { globalNotes: ExportedGlobalNotes; } -export type ExportedTimelines = SavedTimeline & - ExportedNotes & { - pinnedEventIds: string[]; - }; - export interface ExportTimelineNotFoundError { statusCode: number; message: string; } -export const importTimelineResultSchema = runtimeTypes.exact( - runtimeTypes.type({ - success: runtimeTypes.boolean, - success_count: PositiveInteger, - timelines_installed: PositiveInteger, - timelines_updated: PositiveInteger, - errors: runtimeTypes.array(ErrorSchema), - }) -); - -export type ImportTimelineResultSchema = runtimeTypes.TypeOf; - -export const pageInfoTimeline = runtimeTypes.type({ - pageIndex: runtimeTypes.number, - pageSize: runtimeTypes.number, -}); - export interface PageInfoTimeline { pageIndex: number; pageSize: number; } -export const getTimelinesArgs = runtimeTypes.partial({ - onlyUserFavorite: unionWithNullType(runtimeTypes.boolean), - pageInfo: unionWithNullType(pageInfoTimeline), - search: unionWithNullType(runtimeTypes.string), - sort: unionWithNullType(sortTimeline), - status: unionWithNullType(TimelineStatusLiteralRt), - timelineType: unionWithNullType(TimelineTypeLiteralRt), -}); - -export type GetTimelinesArgs = runtimeTypes.TypeOf; - -export interface ColumnHeaderResult { - aggregatable?: Maybe; - category?: Maybe; - columnHeaderType?: Maybe; - description?: Maybe; - example?: Maybe; - indexes?: Maybe; - id?: Maybe; - name?: Maybe; - placeholder?: Maybe; - searchable?: Maybe; - type?: Maybe; -} - -export interface DataProviderResult { - id?: Maybe; - name?: Maybe; - enabled?: Maybe; - excluded?: Maybe; - kqlQuery?: Maybe; - queryMatch?: Maybe; - type?: Maybe; - and?: Maybe; -} - -export interface QueryMatchResult { - field?: Maybe; - displayField?: Maybe; - value?: Maybe; - displayValue?: Maybe; - operator?: Maybe; -} - -export interface DateRangePickerResult { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - start?: Maybe; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - end?: Maybe; -} - -export interface EqlOptionsResult { - eventCategoryField?: Maybe; - tiebreakerField?: Maybe; - timestampField?: Maybe; - query?: Maybe; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - size?: Maybe; -} - -export interface FilterTimelineResult { - exists?: Maybe; - meta?: Maybe; - match_all?: Maybe; - missing?: Maybe; - query?: Maybe; - range?: Maybe; - script?: Maybe; -} - -export interface FilterMetaTimelineResult { - alias?: Maybe; - controlledBy?: Maybe; - disabled?: Maybe; - field?: Maybe; - formattedValue?: Maybe; - index?: Maybe; - key?: Maybe; - negate?: Maybe; - params?: Maybe; - type?: Maybe; - value?: Maybe; -} - -export interface SerializedFilterQueryResult { - filterQuery?: Maybe; -} - -export interface KueryFilterQueryResult { - kind?: Maybe; - expression?: Maybe; -} - -export interface SerializedKueryQueryResult { - kuery?: Maybe; - serializedQuery?: Maybe; -} - -export interface TimelineResult { - columns?: Maybe; - created?: Maybe; - createdBy?: Maybe; - dataProviders?: Maybe; - dataViewId?: Maybe; - dateRange?: Maybe; - description?: Maybe; - eqlOptions?: Maybe; - eventIdToNoteIds?: Maybe; - eventType?: Maybe; - excludedRowRendererIds?: Maybe; - favorite?: Maybe; - filters?: Maybe; - kqlMode?: Maybe; - kqlQuery?: Maybe; - indexNames?: Maybe; - notes?: Maybe; - noteIds?: Maybe; - pinnedEventIds?: Maybe; - pinnedEventsSaveObject?: Maybe; - savedQueryId?: Maybe; - savedObjectId: string; - sort?: Maybe; - status?: Maybe; - title?: Maybe; - templateTimelineId?: Maybe; - templateTimelineVersion?: Maybe; - timelineType?: Maybe; - updated?: Maybe; - updatedBy?: Maybe; - version: string; - savedSearchId?: Maybe; -} - -export interface ResponseTimeline { - code?: Maybe; - message?: Maybe; - timeline: TimelineResult; -} - export interface SortTimeline { sortField: SortFieldTimeline; - sortOrder: Direction; -} - -export interface GetAllTimelineVariables { - pageInfo: PageInfoTimeline; - search?: Maybe; - sort?: Maybe; - onlyUserFavorite?: Maybe; - timelineType?: Maybe; - status?: Maybe; + sortOrder: SortDirection; } diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts index 990b19d6f3bab..93d627f53263b 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts @@ -42,24 +42,24 @@ export const TemplateTimelineTypeEnum = TemplateTimelineType.enum; export type ColumnHeaderResult = z.infer; export const ColumnHeaderResult = z.object({ - aggregatable: z.boolean().optional(), - category: z.string().optional(), - columnHeaderType: z.string().optional(), - description: z.string().optional(), - example: z.union([z.string(), z.number()]).optional(), - indexes: z.array(z.string()).optional(), - id: z.string().optional(), - name: z.string().optional(), - placeholder: z.string().optional(), - searchable: z.boolean().optional(), - type: z.string().optional(), + aggregatable: z.boolean().nullable().optional(), + category: z.string().nullable().optional(), + columnHeaderType: z.string().nullable().optional(), + description: z.string().nullable().optional(), + example: z.string().nullable().optional(), + indexes: z.array(z.string()).nullable().optional(), + id: z.string().nullable().optional(), + name: z.string().nullable().optional(), + placeholder: z.string().nullable().optional(), + searchable: z.boolean().nullable().optional(), + type: z.string().nullable().optional(), }); export type QueryMatchResult = z.infer; export const QueryMatchResult = z.object({ field: z.string().nullable().optional(), displayField: z.string().nullable().optional(), - value: z.string().nullable().optional(), + value: z.union([z.string().nullable(), z.array(z.string()).nullable()]).optional(), displayValue: z.string().nullable().optional(), operator: z.string().nullable().optional(), }); @@ -71,7 +71,8 @@ export const DataProviderQueryMatch = z.object({ id: z.string().nullable().optional(), kqlQuery: z.string().nullable().optional(), name: z.string().nullable().optional(), - queryMatch: QueryMatchResult.optional(), + queryMatch: QueryMatchResult.nullable().optional(), + type: DataProviderType.nullable().optional(), }); export type DataProviderResult = z.infer; @@ -119,27 +120,28 @@ export const FavoriteTimelineResult = z.object({ export type FilterTimelineResult = z.infer; export const FilterTimelineResult = z.object({ - exists: z.boolean().optional(), + exists: z.string().nullable().optional(), meta: z .object({ - alias: z.string().optional(), - controlledBy: z.string().optional(), - disabled: z.boolean().optional(), - field: z.string().optional(), - formattedValue: z.string().optional(), - index: z.string().optional(), - key: z.string().optional(), - negate: z.boolean().optional(), - params: z.string().optional(), - type: z.string().optional(), - value: z.string().optional(), + alias: z.string().nullable().optional(), + controlledBy: z.string().nullable().optional(), + disabled: z.boolean().nullable().optional(), + field: z.string().nullable().optional(), + formattedValue: z.string().nullable().optional(), + index: z.string().nullable().optional(), + key: z.string().nullable().optional(), + negate: z.boolean().nullable().optional(), + params: z.string().nullable().optional(), + type: z.string().nullable().optional(), + value: z.string().nullable().optional(), }) + .nullable() .optional(), - match_all: z.string().optional(), - missing: z.string().optional(), - query: z.string().optional(), - range: z.string().optional(), - script: z.string().optional(), + match_all: z.string().nullable().optional(), + missing: z.string().nullable().optional(), + query: z.string().nullable().optional(), + range: z.string().nullable().optional(), + script: z.string().nullable().optional(), }); export type SerializedFilterQueryResult = z.infer; @@ -178,8 +180,8 @@ export const SavedTimeline = z.object({ dataViewId: z.string().nullable().optional(), dateRange: z .object({ - end: z.union([z.string(), z.number()]).optional(), - start: z.union([z.string(), z.number()]).optional(), + end: z.union([z.string().nullable(), z.number().nullable()]).optional(), + start: z.union([z.string().nullable(), z.number().nullable()]).optional(), }) .nullable() .optional(), @@ -213,6 +215,14 @@ export const SavedTimeline = z.object({ updatedBy: z.string().nullable().optional(), }); +export type SavedTimelineWithSavedObjectId = z.infer; +export const SavedTimelineWithSavedObjectId = SavedTimeline.merge( + z.object({ + savedObjectId: z.string(), + version: z.string(), + }) +); + export type BareNote = z.infer; export const BareNote = z.object({ eventId: z.string().nullable().optional(), @@ -251,18 +261,50 @@ export const PinnedEvent = BarePinnedEvent.merge( ); export type TimelineResponse = z.infer; -export const TimelineResponse = SavedTimeline.merge( +export const TimelineResponse = SavedTimeline.merge(SavedTimelineWithSavedObjectId).merge( + z.object({ + eventIdToNoteIds: z.array(Note).nullable().optional(), + notes: z.array(Note).nullable().optional(), + noteIds: z.array(z.string()).nullable().optional(), + pinnedEventIds: z.array(z.string()).nullable().optional(), + pinnedEventsSaveObject: z.array(PinnedEvent).nullable().optional(), + }) +); + +export type TimelineSavedToReturnObject = z.infer; +export const TimelineSavedToReturnObject = SavedTimeline.merge( z.object({ - eventIdToNoteIds: z.array(Note).optional(), - notes: z.array(Note).optional(), - noteIds: z.array(z.string()).optional(), - pinnedEventIds: z.array(z.string()).optional(), - pinnedEventsSaveObject: z.array(PinnedEvent).optional(), savedObjectId: z.string(), version: z.string(), + eventIdToNoteIds: z.array(Note).nullable().optional(), + notes: z.array(Note).nullable().optional(), + noteIds: z.array(z.string()).nullable().optional(), + pinnedEventIds: z.array(z.string()).nullable().optional(), + pinnedEventsSaveObject: z.array(PinnedEvent).nullable().optional(), }) ); +export type SavedObjectResolveOutcome = z.infer; +export const SavedObjectResolveOutcome = z.enum(['exactMatch', 'aliasMatch', 'conflict']); +export type SavedObjectResolveOutcomeEnum = typeof SavedObjectResolveOutcome.enum; +export const SavedObjectResolveOutcomeEnum = SavedObjectResolveOutcome.enum; + +export type SavedObjectResolveAliasPurpose = z.infer; +export const SavedObjectResolveAliasPurpose = z.enum([ + 'savedObjectConversion', + 'savedObjectImport', +]); +export type SavedObjectResolveAliasPurposeEnum = typeof SavedObjectResolveAliasPurpose.enum; +export const SavedObjectResolveAliasPurposeEnum = SavedObjectResolveAliasPurpose.enum; + +export type ResolvedTimeline = z.infer; +export const ResolvedTimeline = z.object({ + timeline: TimelineSavedToReturnObject, + outcome: SavedObjectResolveOutcome, + alias_target_id: z.string().optional(), + alias_purpose: SavedObjectResolveAliasPurpose.optional(), +}); + export type FavoriteTimelineResponse = z.infer; export const FavoriteTimelineResponse = z.object({ savedObjectId: z.string(), @@ -275,6 +317,15 @@ export const FavoriteTimelineResponse = z.object({ favorite: z.array(FavoriteTimelineResult).optional(), }); +export type PersistTimelineResponse = z.infer; +export const PersistTimelineResponse = z.object({ + data: z.object({ + persistTimeline: z.object({ + timeline: TimelineResponse, + }), + }), +}); + export type BareNoteWithoutExternalRefs = z.infer; export const BareNoteWithoutExternalRefs = z.object({ eventId: z.string().nullable().optional(), @@ -306,6 +357,11 @@ export const SortFieldTimeline = z.enum(['title', 'description', 'updated', 'cre export type SortFieldTimelineEnum = typeof SortFieldTimeline.enum; export const SortFieldTimelineEnum = SortFieldTimeline.enum; +export type SortDirection = z.infer; +export const SortDirection = z.enum(['asc', 'desc']); +export type SortDirectionEnum = typeof SortDirection.enum; +export const SortDirectionEnum = SortDirection.enum; + /** * The status of the timeline. Valid values are `active`, `draft`, and `immutable`. */ @@ -317,11 +373,11 @@ export const TimelineStatusEnum = TimelineStatus.enum; export type ImportTimelines = z.infer; export const ImportTimelines = SavedTimeline.merge( z.object({ - savedObjectId: z.string().nullable().optional(), - version: z.string().nullable().optional(), - globalNotes: z.array(BareNote).nullable().optional(), - eventNotes: z.array(BareNote).nullable().optional(), - pinnedEventIds: z.array(z.string()).nullable().optional(), + savedObjectId: z.string().nullable(), + version: z.string().nullable(), + pinnedEventIds: z.array(z.string()).nullable(), + eventNotes: z.array(BareNote).nullable(), + globalNotes: z.array(BareNote).nullable(), }) ); @@ -346,24 +402,14 @@ export const ImportTimelineResult = z.object({ .optional(), }); -export type ExportedTimelines = z.infer; -export const ExportedTimelines = SavedTimeline.merge( +export type TimelineErrorResponse = z.infer; +export const TimelineErrorResponse = z.union([ z.object({ - globalNotes: z.array(Note).optional(), - eventNotes: z.array(Note).optional(), - pinnedEventIds: z.array(z.string()).optional(), - }) -); - -export type Readable = z.infer; -export const Readable = z.object({ - _maxListeners: z.object({}).catchall(z.unknown()).optional(), - _readableState: z.object({}).catchall(z.unknown()).optional(), - _read: z.object({}).catchall(z.unknown()).optional(), - readable: z.boolean().optional(), - _events: z.object({}).catchall(z.unknown()).optional(), - _eventsCount: z.number().optional(), - _data: z.object({}).catchall(z.unknown()).optional(), - _position: z.number().optional(), - _encoding: z.string().optional(), -}); + message: z.string(), + status_code: z.number(), + }), + z.object({ + message: z.string(), + statusCode: z.number(), + }), +]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml index c8ba2e6019f16..568eec1975769 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml @@ -56,11 +56,15 @@ components: end: oneOf: - type: string + nullable: true - type: number + nullable: true start: oneOf: - type: string + nullable: true - type: number + nullable: true description: type: string nullable: true @@ -149,43 +153,73 @@ components: updatedBy: type: string nullable: true + SavedTimelineWithSavedObjectId: + allOf: + - $ref: '#/components/schemas/SavedTimeline' + - type: object + required: [savedObjectId, version] + properties: + savedObjectId: + type: string + version: + type: string TimelineResponse: allOf: - $ref: '#/components/schemas/SavedTimeline' + - $ref: '#/components/schemas/SavedTimelineWithSavedObjectId' - type: object - required: - - savedObjectId - - version properties: eventIdToNoteIds: type: array + nullable: true items: $ref: '#/components/schemas/Note' notes: type: array + nullable: true items: $ref: '#/components/schemas/Note' noteIds: type: array + nullable: true items: type: string pinnedEventIds: type: array + nullable: true items: type: string pinnedEventsSaveObject: type: array + nullable: true items: $ref: '#/components/schemas/PinnedEvent' - savedObjectId: - type: string - version: - type: string + ResolvedTimeline: + type: object + required: [timeline, outcome] + properties: + timeline: + $ref: '#/components/schemas/TimelineSavedToReturnObject' + outcome: + $ref: '#/components/schemas/SavedObjectResolveOutcome' + alias_target_id: + type: string + alias_purpose: + $ref: '#/components/schemas/SavedObjectResolveAliasPurpose' + SavedObjectResolveOutcome: + type: string + enum: + - exactMatch + - aliasMatch + - conflict + SavedObjectResolveAliasPurpose: + type: string + enum: + - savedObjectConversion + - savedObjectImport FavoriteTimelineResponse: type: object - required: - - savedObjectId - - version + required: [savedObjectId, version] properties: savedObjectId: type: string @@ -209,35 +243,58 @@ components: type: array items: $ref: '#/components/schemas/FavoriteTimelineResult' + PersistTimelineResponse: + type: object + required: [data] + properties: + data: + type: object + required: [persistTimeline] + properties: + persistTimeline: + type: object + required: [timeline] + properties: + timeline: + $ref: '#/components/schemas/TimelineResponse' ColumnHeaderResult: type: object properties: aggregatable: type: boolean + nullable: true category: type: string + nullable: true columnHeaderType: type: string + nullable: true description: type: string + nullable: true example: - oneOf: - - type: string - - type: number + type: string + nullable: true indexes: type: array + nullable: true items: type: string id: type: string + nullable: true name: type: string + nullable: true placeholder: type: string + nullable: true searchable: type: boolean + nullable: true type: type: string + nullable: true QueryMatchResult: type: object properties: @@ -248,8 +305,13 @@ components: type: string nullable: true value: - type: string - nullable: true + oneOf: + - type: string + nullable: true + - type: array + nullable: true + items: + type: string displayValue: type: string nullable: true @@ -305,6 +367,10 @@ components: nullable: true queryMatch: $ref: '#/components/schemas/QueryMatchResult' + nullable: true + type: + $ref: '#/components/schemas/DataProviderType' + nullable: true BareNoteWithoutExternalRefs: type: object properties: @@ -419,42 +485,60 @@ components: type: object properties: exists: - type: boolean + type: string + nullable: true meta: type: object + nullable: true properties: alias: type: string + nullable: true controlledBy: type: string + nullable: true disabled: type: boolean + nullable: true field: type: string + nullable: true formattedValue: type: string + nullable: true index: type: string + nullable: true key: type: string + nullable: true negate: type: boolean + nullable: true params: type: string + nullable: true type: type: string + nullable: true value: type: string + nullable: true match_all: type: string + nullable: true missing: type: string + nullable: true query: type: string + nullable: true range: type: string + nullable: true script: type: string + nullable: true SerializedFilterQueryResult: type: object properties: @@ -531,6 +615,11 @@ components: - description - updated - created + SortDirection: + type: string + enum: + - asc + - desc TimelineStatus: type: string enum: @@ -544,6 +633,7 @@ components: allOf: - $ref: '#/components/schemas/SavedTimeline' - type: object + required: [savedObjectId, version, pinnedEventIds, eventNotes, globalNotes] properties: savedObjectId: type: string @@ -551,21 +641,56 @@ components: version: type: string nullable: true - globalNotes: - nullable: true + pinnedEventIds: type: array + nullable: true items: - $ref: '#/components/schemas/BareNote' + type: string eventNotes: + type: array nullable: true + items: + $ref: '#/components/schemas/BareNote' + globalNotes: type: array + nullable: true items: $ref: '#/components/schemas/BareNote' - pinnedEventIds: + TimelineSavedToReturnObject: + allOf: + - $ref: '#/components/schemas/SavedTimeline' + - type: object + required: [savedObjectId, version] + properties: + savedObjectId: + type: string + version: + type: string + eventIdToNoteIds: + type: array nullable: true + items: + $ref: '#/components/schemas/Note' + notes: + type: array + nullable: true + items: + $ref: '#/components/schemas/Note' + noteIds: + type: array + nullable: true + items: + type: string + pinnedEventIds: type: array + nullable: true items: type: string + pinnedEventsSaveObject: + type: array + nullable: true + items: + $ref: '#/components/schemas/PinnedEvent' ImportTimelineResult: type: object properties: @@ -591,46 +716,19 @@ components: type: string status_code: type: number - ExportedTimelines: - allOf: - - $ref: '#/components/schemas/SavedTimeline' + TimelineErrorResponse: + oneOf: - type: object + required: [message, status_code] properties: - globalNotes: - type: array - items: - $ref: '#/components/schemas/Note' - eventNotes: - type: array - items: - $ref: '#/components/schemas/Note' - pinnedEventIds: - type: array - items: - type: string - Readable: - type: object - properties: - _maxListeners: - type: object - additionalProperties: true - _readableState: - type: object - additionalProperties: true - _read: - type: object - additionalProperties: true - readable: - type: boolean - _events: - type: object - additionalProperties: true - _eventsCount: - type: number - _data: - type: object - additionalProperties: true - _position: - type: number - _encoding: - type: string + message: + type: string + status_code: + type: number + - type: object + required: [message, statusCode] + properties: + message: + type: string + statusCode: + type: number diff --git a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.gen.ts index d0f2befe6b338..622c56312e21a 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.gen.ts @@ -16,7 +16,7 @@ import { z } from '@kbn/zod'; -import { SavedTimeline, TimelineResponse } from '../model/components.gen'; +import { SavedTimeline, PersistTimelineResponse } from '../model/components.gen'; export type PatchTimelineRequestBody = z.infer; export const PatchTimelineRequestBody = z.object({ @@ -27,10 +27,4 @@ export const PatchTimelineRequestBody = z.object({ export type PatchTimelineRequestBodyInput = z.input; export type PatchTimelineResponse = z.infer; -export const PatchTimelineResponse = z.object({ - data: z.object({ - persistTimeline: z.object({ - timeline: TimelineResponse, - }), - }), -}); +export const PatchTimelineResponse = PersistTimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml index 31ff7d8312673..6b1c05d32995c 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timeline_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Patch Timeline API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline: patch: @@ -42,19 +35,7 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistTimeline] - properties: - persistTimeline: - type: object - required: [timeline] - properties: - timeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' + $ref: '../model/components.schema.yaml#/components/schemas/PersistTimelineResponse' '405': description: Indicates that the user does not have the required access to create a draft Timeline. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timelines_schema.ts b/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timelines_schema.ts deleted file mode 100644 index 149dc24480d2d..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/patch_timelines/patch_timelines_schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as rt from 'io-ts'; - -import type { ResponseTimeline } from '../model/api'; -import { SavedTimelineRuntimeType } from '../model/api'; -import { unionWithNullType } from '../../../utility_types'; - -export const patchTimelineSchema = rt.type({ - timeline: SavedTimelineRuntimeType, - timelineId: unionWithNullType(rt.string), - version: unionWithNullType(rt.string), -}); - -export interface PatchTimelinesResponse { - data: { - persistTimeline: ResponseTimeline; - }; -} diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml index 9ad4d03901d70..3a57dd066d3b3 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Favorite API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/_favorite: patch: diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml index 4ca14d2b15b13..640e75171c613 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/timeline-api-update.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/note: patch: diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml index 4ef83ebe04183..3b697e957ad89 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml @@ -5,13 +5,6 @@ info: externalDocs: url: https://www.elastic.co/guide/en/security/current/_pin_an_event_to_an_existing_timeline.html description: Documentation -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/pinned_event: patch: diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts deleted file mode 100644 index 31c3233e9b8ca..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts +++ /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 * as runtimeTypes from 'io-ts'; -import { unionWithNullType } from '../../../utility_types'; - -/* - * Pinned Event Types - * TODO: remove these when the timeline types are moved to zod - */ -const BarePinnedEventType = runtimeTypes.intersection([ - runtimeTypes.type({ - timelineId: runtimeTypes.string, - eventId: runtimeTypes.string, - }), - runtimeTypes.partial({ - created: unionWithNullType(runtimeTypes.number), - createdBy: unionWithNullType(runtimeTypes.string), - updated: unionWithNullType(runtimeTypes.number), - updatedBy: unionWithNullType(runtimeTypes.string), - }), -]); - -export const PinnedEventRuntimeType = runtimeTypes.intersection([ - runtimeTypes.type({ - pinnedEventId: runtimeTypes.string, - version: runtimeTypes.string, - }), - BarePinnedEventType, -]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts index 2c3b966bfb1b4..d4c79eec50b26 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts @@ -16,7 +16,7 @@ import { z } from '@kbn/zod'; -import { TimelineResponse } from '../model/components.gen'; +import { ResolvedTimeline } from '../model/components.gen'; export type ResolveTimelineRequestQuery = z.infer; export const ResolveTimelineRequestQuery = z.object({ @@ -32,8 +32,9 @@ export const ResolveTimelineRequestQuery = z.object({ export type ResolveTimelineRequestQueryInput = z.input; export type ResolveTimelineResponse = z.infer; -export const ResolveTimelineResponse = z.object({ - data: z.object({ - getOneTimeline: TimelineResponse.nullable(), +export const ResolveTimelineResponse = z.union([ + z.object({ + data: ResolvedTimeline, }), -}); + z.object({}).strict(), +]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml index ee26ac4a97896..b06969e28cad4 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml @@ -2,13 +2,6 @@ openapi: 3.0.0 info: title: Elastic Security - Timeline - Resolve Timeline API version: '2023-10-31' -servers: - - url: 'http://{kibana_host}:{port}' - variables: - kibana_host: - default: localhost - port: - default: '5601' paths: /api/timeline/resolve: get: @@ -35,16 +28,15 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [getOneTimeline] + oneOf: + - type: object + required: [data] properties: - getOneTimeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' - nullable: true + data: + $ref: '../model/components.schema.yaml#/components/schemas/ResolvedTimeline' + - type: object + additionalProperties: false + '400': description: The request is missing parameters '404': diff --git a/x-pack/plugins/security_solution/common/api/timeline/routes.ts b/x-pack/plugins/security_solution/common/api/timeline/routes.ts index 9d3aec839a5c1..70b339c92f197 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/routes.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/routes.ts @@ -17,7 +17,10 @@ export { } from './persist_note/persist_note_route.gen'; export { DeleteNoteRequestBody, DeleteNoteResponse } from './delete_note/delete_note_route.gen'; -export { CleanDraftTimelinesRequestBody } from './clean_draft_timelines/clean_draft_timelines_route.gen'; +export { + CleanDraftTimelinesResponse, + CleanDraftTimelinesRequestBody, +} from './clean_draft_timelines/clean_draft_timelines_route.gen'; export { ExportTimelinesRequestQuery, @@ -40,3 +43,48 @@ export { GetNotesResponse, GetNotesResult, } from './get_notes/get_notes_route.gen'; + +export { + CopyTimelineRequestBody, + CopyTimelineResponse, +} from './copy_timeline/copy_timeline_route.gen'; + +export { + CreateTimelinesRequestBody, + CreateTimelinesResponse, +} from './create_timelines/create_timelines_route.gen'; + +export { + PatchTimelineRequestBody, + PatchTimelineResponse, +} from './patch_timelines/patch_timeline_route.gen'; + +export { + ImportTimelinesRequestBody, + ImportTimelinesResponse, +} from './import_timelines/import_timelines_route.gen'; + +export { + InstallPrepackedTimelinesRequestBody, + InstallPrepackedTimelinesResponse, +} from './install_prepackaged_timelines/install_prepackaged_timelines_route.gen'; + +export { + GetDraftTimelinesRequestQuery, + GetDraftTimelinesResponse, +} from './get_draft_timelines/get_draft_timelines_route.gen'; + +export { + ResolveTimelineRequestQuery, + ResolveTimelineResponse, +} from './resolve_timeline/resolve_timeline_route.gen'; + +export { + GetTimelineRequestQuery, + GetTimelineResponse, +} from './get_timeline/get_timeline_route.gen'; + +export { + GetTimelinesRequestQuery, + GetTimelinesResponse, +} from './get_timelines/get_timelines_route.gen'; diff --git a/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts b/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts index ff9613503e8e3..7fe70febe4e2c 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts @@ -5,13 +5,7 @@ * 2.0. */ -import type { SortField, Maybe } from '../common'; -import type { - DataProviderType, - TimelineType, - TimelineStatus, - RowRendererId, -} from '../../api/timeline'; +import type { SortField } from '../common'; export * from './events'; @@ -20,122 +14,6 @@ export interface TimelineRequestSortField extends SortField; - category?: Maybe; - columnHeaderType?: Maybe; - description?: Maybe; - example?: Maybe; - indexes?: Maybe; - id?: Maybe; - name?: Maybe; - placeholder?: Maybe; - searchable?: Maybe; - type?: Maybe; -} - -export interface QueryMatchInput { - field?: Maybe; - - displayField?: Maybe; - - value?: Maybe; - - displayValue?: Maybe; - - operator?: Maybe; -} - -export interface DataProviderInput { - id?: Maybe; - name?: Maybe; - enabled?: Maybe; - excluded?: Maybe; - kqlQuery?: Maybe; - queryMatch?: Maybe; - and?: Maybe; - type?: Maybe; -} - -export interface EqlOptionsInput { - eventCategoryField?: Maybe; - tiebreakerField?: Maybe; - timestampField?: Maybe; - query?: Maybe; - size?: Maybe; -} - -export interface FilterMetaTimelineInput { - alias?: Maybe; - controlledBy?: Maybe; - disabled?: Maybe; - field?: Maybe; - formattedValue?: Maybe; - index?: Maybe; - key?: Maybe; - negate?: Maybe; - params?: Maybe; - type?: Maybe; - value?: Maybe; -} - -export interface FilterTimelineInput { - exists?: Maybe; - meta?: Maybe; - match_all?: Maybe; - missing?: Maybe; - query?: Maybe; - range?: Maybe; - script?: Maybe; -} - -export interface SerializedFilterQueryInput { - filterQuery?: Maybe; -} - -export interface SerializedKueryQueryInput { - kuery?: Maybe; - serializedQuery?: Maybe; -} - -export interface KueryFilterQueryInput { - kind?: Maybe; - expression?: Maybe; -} - -export interface DateRangePickerInput { - start?: Maybe; - end?: Maybe; -} - -export interface SortTimelineInput { - columnId?: Maybe; - sortDirection?: Maybe; -} - -export interface TimelineInput { - columns?: Maybe; - dataProviders?: Maybe; - dataViewId?: Maybe; - description?: Maybe; - eqlOptions?: Maybe; - eventType?: Maybe; - excludedRowRendererIds?: Maybe; - filters?: Maybe; - kqlMode?: Maybe; - kqlQuery?: Maybe; - indexNames?: Maybe; - title?: Maybe; - templateTimelineId?: Maybe; - templateTimelineVersion?: Maybe; - timelineType?: Maybe; - dateRange?: Maybe; - savedQueryId?: Maybe; - sort?: Maybe; - status?: Maybe; - savedSearchId: Maybe; -} - export enum FlowDirection { uniDirectional = 'uniDirectional', biDirectional = 'biDirectional', diff --git a/x-pack/plugins/security_solution/common/timelines/zod_errors.ts b/x-pack/plugins/security_solution/common/timelines/zod_errors.ts new file mode 100644 index 0000000000000..7ef5606a4dcfb --- /dev/null +++ b/x-pack/plugins/security_solution/common/timelines/zod_errors.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 type { ZodError, ZodType } from '@kbn/zod'; +import { stringifyZodError } from '@kbn/zod-helpers'; +import { type Either, fold, left, right } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; +import { pipe } from 'fp-ts/lib/pipeable'; + +type ErrorFactory = (message: string) => Error; + +const throwErrors = (createError: ErrorFactory) => (errors: ZodError) => { + throw createError(stringifyZodError(errors)); +}; + +const parseRuntimeType = + (zodType: ZodType) => + (v: unknown): Either, T> => { + const result = zodType.safeParse(v); + return result.success ? right(result.data) : left(result.error); + }; + +export const parseOrThrowErrorFactory = + (createError: ErrorFactory) => (runtimeType: ZodType) => (inputValue: unknown) => + pipe(parseRuntimeType(runtimeType)(inputValue), fold(throwErrors(createError), identity)); 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 2adc4e7009b1d..e36af57a2b3e9 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 @@ -268,18 +268,20 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: - $ref: '#/components/schemas/TimelineResponse' - nullable: true + data: + type: object + properties: + getOneTimeline: + $ref: '#/components/schemas/TimelineResponse' + required: + - getOneTimeline required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -316,22 +318,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -393,20 +380,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: Indicates the Timeline was successfully created. '405': content: @@ -423,6 +397,36 @@ paths: tags: - Security Timeline API - access:securitySolution + /api/timeline/_copy: + get: + description: | + Copies and returns a timeline or timeline template. + operationId: CopyTimeline + requestBody: + content: + application/json: + schema: + type: object + properties: + timeline: + $ref: '#/components/schemas/SavedTimeline' + timelineIdToCopy: + type: string + required: + - timeline + - timelineIdToCopy + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PersistTimelineResponse' + description: Indicates that the timeline has been successfully copied. + summary: Copies timeline or timeline template + tags: + - Security Timeline API + - access:securitySolution /api/timeline/_draft: get: description: >- @@ -441,22 +445,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: Indicates that the draft Timeline was successfully retrieved. '403': content: @@ -518,22 +507,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -688,28 +662,14 @@ paths: schema: type: object properties: - file: - allOf: - - $ref: '#/components/schemas/Readable' - - type: object - properties: - hapi: - type: object - properties: - filename: - type: string - headers: - type: object - isImmutable: - enum: - - 'true' - - 'false' - type: string - required: - - filename - - headers - required: - - hapi + file: {} + isImmutable: + enum: + - 'true' + - 'false' + type: string + required: + - file description: The Timelines to import as a readable stream. required: true responses: @@ -717,12 +677,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - $ref: '#/components/schemas/ImportTimelineResult' - required: - - data + $ref: '#/components/schemas/ImportTimelineResult' description: Indicates the import of Timelines was successful. '400': content: @@ -781,7 +736,8 @@ paths: properties: prepackagedTimelines: items: - $ref: '#/components/schemas/SavedTimeline' + $ref: '#/components/schemas/TimelineSavedToReturnObject' + nullable: true type: array timelinesToInstall: items: @@ -804,12 +760,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - $ref: '#/components/schemas/ImportTimelineResult' - required: - - data + $ref: '#/components/schemas/ImportTimelineResult' description: Indicates the installation of prepackaged Timelines was successful. '500': content: @@ -847,18 +798,15 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: - $ref: '#/components/schemas/TimelineResponse' - nullable: true + data: + $ref: '#/components/schemas/ResolvedTimeline' required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -927,35 +875,25 @@ paths: schema: type: object properties: - data: - type: object - properties: - customTemplateTimelineCount: - type: number - defaultTimelineCount: - type: number - elasticTemplateTimelineCount: - type: number - favoriteCount: - type: number - templateTimelineCount: - type: number - timelines: - items: - $ref: '#/components/schemas/TimelineResponse' - type: array - totalCount: - type: number - required: - - timelines - - totalCount - - defaultTimelineCount - - templateTimelineCount - - favoriteCount - - elasticTemplateTimelineCount - - customTemplateTimelineCount + customTemplateTimelineCount: + type: number + defaultTimelineCount: + type: number + elasticTemplateTimelineCount: + type: number + favoriteCount: + type: number + templateTimelineCount: + type: number + timeline: + items: + $ref: '#/components/schemas/TimelineResponse' + type: array + totalCount: + type: number required: - - data + - timeline + - totalCount description: Indicates that the (template) Timelines were found and returned. '400': content: @@ -1025,30 +963,39 @@ components: type: object properties: aggregatable: + nullable: true type: boolean category: + nullable: true type: string columnHeaderType: + nullable: true type: string description: + nullable: true type: string example: - oneOf: - - type: string - - type: number + nullable: true + type: string id: + nullable: true type: string indexes: items: type: string + nullable: true type: array name: + nullable: true type: string placeholder: + nullable: true type: string searchable: + nullable: true type: boolean type: + nullable: true type: string DataProviderQueryMatch: type: object @@ -1070,6 +1017,10 @@ components: type: string queryMatch: $ref: '#/components/schemas/QueryMatchResult' + nullable: true + type: + $ref: '#/components/schemas/DataProviderType' + nullable: true DataProviderResult: type: object properties: @@ -1157,41 +1108,59 @@ components: type: object properties: exists: - type: boolean + nullable: true + type: string match_all: + nullable: true type: string meta: + nullable: true type: object properties: alias: + nullable: true type: string controlledBy: + nullable: true type: string disabled: + nullable: true type: boolean field: + nullable: true type: string formattedValue: + nullable: true type: string index: + nullable: true type: string key: + nullable: true type: string negate: + nullable: true type: boolean params: + nullable: true type: string type: + nullable: true type: string value: + nullable: true type: string missing: + nullable: true type: string query: + nullable: true type: string range: + nullable: true type: string script: + nullable: true type: string GetNotesResult: type: object @@ -1256,6 +1225,12 @@ components: version: nullable: true type: string + required: + - savedObjectId + - version + - pinnedEventIds + - eventNotes + - globalNotes Note: allOf: - $ref: '#/components/schemas/BareNote' @@ -1275,6 +1250,23 @@ components: - $ref: '#/components/schemas/PinnedEventBaseResponseBody' - nullable: true type: object + PersistTimelineResponse: + type: object + properties: + data: + type: object + properties: + persistTimeline: + type: object + properties: + timeline: + $ref: '#/components/schemas/TimelineResponse' + required: + - timeline + required: + - persistTimeline + required: + - data PinnedEvent: allOf: - $ref: '#/components/schemas/BarePinnedEvent' @@ -1312,34 +1304,27 @@ components: nullable: true type: string value: - nullable: true - type: string - Readable: + oneOf: + - nullable: true + type: string + - items: + type: string + nullable: true + type: array + ResolvedTimeline: type: object properties: - _data: - additionalProperties: true - type: object - _encoding: + alias_purpose: + $ref: '#/components/schemas/SavedObjectResolveAliasPurpose' + alias_target_id: type: string - _events: - additionalProperties: true - type: object - _eventsCount: - type: number - _maxListeners: - additionalProperties: true - type: object - _position: - type: number - _read: - additionalProperties: true - type: object - _readableState: - additionalProperties: true - type: object - readable: - type: boolean + outcome: + $ref: '#/components/schemas/SavedObjectResolveOutcome' + timeline: + $ref: '#/components/schemas/TimelineSavedToReturnObject' + required: + - timeline + - outcome ResponseNote: type: object properties: @@ -1374,6 +1359,17 @@ components: - threat_match - zeek type: string + SavedObjectResolveAliasPurpose: + enum: + - savedObjectConversion + - savedObjectImport + type: string + SavedObjectResolveOutcome: + enum: + - exactMatch + - aliasMatch + - conflict + type: string SavedTimeline: type: object properties: @@ -1402,12 +1398,16 @@ components: properties: end: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number start: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number description: nullable: true type: string @@ -1496,6 +1496,18 @@ components: updatedBy: nullable: true type: string + SavedTimelineWithSavedObjectId: + allOf: + - $ref: '#/components/schemas/SavedTimeline' + - type: object + properties: + savedObjectId: + type: string + version: + type: string + required: + - savedObjectId + - version SerializedFilterQueryResult: type: object properties: @@ -1545,27 +1557,63 @@ components: TimelineResponse: allOf: - $ref: '#/components/schemas/SavedTimeline' + - $ref: '#/components/schemas/SavedTimelineWithSavedObjectId' - type: object properties: eventIdToNoteIds: items: $ref: '#/components/schemas/Note' + nullable: true type: array noteIds: items: type: string + nullable: true type: array notes: items: $ref: '#/components/schemas/Note' + nullable: true type: array pinnedEventIds: items: type: string + nullable: true type: array pinnedEventsSaveObject: items: $ref: '#/components/schemas/PinnedEvent' + nullable: true + type: array + TimelineSavedToReturnObject: + allOf: + - $ref: '#/components/schemas/SavedTimeline' + - type: object + properties: + eventIdToNoteIds: + items: + $ref: '#/components/schemas/Note' + nullable: true + type: array + noteIds: + items: + type: string + nullable: true + type: array + notes: + items: + $ref: '#/components/schemas/Note' + nullable: true + type: array + pinnedEventIds: + items: + type: string + nullable: true + type: array + pinnedEventsSaveObject: + items: + $ref: '#/components/schemas/PinnedEvent' + nullable: true type: array savedObjectId: 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 633a0fd041969..818b83d7b85dd 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 @@ -268,18 +268,20 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: - $ref: '#/components/schemas/TimelineResponse' - nullable: true + data: + type: object + properties: + getOneTimeline: + $ref: '#/components/schemas/TimelineResponse' + required: + - getOneTimeline required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -316,22 +318,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -393,20 +380,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: Indicates the Timeline was successfully created. '405': content: @@ -423,6 +397,36 @@ paths: tags: - Security Timeline API - access:securitySolution + /api/timeline/_copy: + get: + description: | + Copies and returns a timeline or timeline template. + operationId: CopyTimeline + requestBody: + content: + application/json: + schema: + type: object + properties: + timeline: + $ref: '#/components/schemas/SavedTimeline' + timelineIdToCopy: + type: string + required: + - timeline + - timelineIdToCopy + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PersistTimelineResponse' + description: Indicates that the timeline has been successfully copied. + summary: Copies timeline or timeline template + tags: + - Security Timeline API + - access:securitySolution /api/timeline/_draft: get: description: >- @@ -441,22 +445,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: Indicates that the draft Timeline was successfully retrieved. '403': content: @@ -518,22 +507,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline - required: - - persistTimeline - required: - - data + $ref: '#/components/schemas/PersistTimelineResponse' description: >- Indicates that the draft Timeline was successfully created. In the event the user already has a draft Timeline, the existing draft @@ -688,28 +662,14 @@ paths: schema: type: object properties: - file: - allOf: - - $ref: '#/components/schemas/Readable' - - type: object - properties: - hapi: - type: object - properties: - filename: - type: string - headers: - type: object - isImmutable: - enum: - - 'true' - - 'false' - type: string - required: - - filename - - headers - required: - - hapi + file: {} + isImmutable: + enum: + - 'true' + - 'false' + type: string + required: + - file description: The Timelines to import as a readable stream. required: true responses: @@ -717,12 +677,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - $ref: '#/components/schemas/ImportTimelineResult' - required: - - data + $ref: '#/components/schemas/ImportTimelineResult' description: Indicates the import of Timelines was successful. '400': content: @@ -781,7 +736,8 @@ paths: properties: prepackagedTimelines: items: - $ref: '#/components/schemas/SavedTimeline' + $ref: '#/components/schemas/TimelineSavedToReturnObject' + nullable: true type: array timelinesToInstall: items: @@ -804,12 +760,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - $ref: '#/components/schemas/ImportTimelineResult' - required: - - data + $ref: '#/components/schemas/ImportTimelineResult' description: Indicates the installation of prepackaged Timelines was successful. '500': content: @@ -847,18 +798,15 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object + oneOf: + - type: object properties: - getOneTimeline: - $ref: '#/components/schemas/TimelineResponse' - nullable: true + data: + $ref: '#/components/schemas/ResolvedTimeline' required: - - getOneTimeline - required: - - data + - data + - additionalProperties: false + type: object description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -927,35 +875,25 @@ paths: schema: type: object properties: - data: - type: object - properties: - customTemplateTimelineCount: - type: number - defaultTimelineCount: - type: number - elasticTemplateTimelineCount: - type: number - favoriteCount: - type: number - templateTimelineCount: - type: number - timelines: - items: - $ref: '#/components/schemas/TimelineResponse' - type: array - totalCount: - type: number - required: - - timelines - - totalCount - - defaultTimelineCount - - templateTimelineCount - - favoriteCount - - elasticTemplateTimelineCount - - customTemplateTimelineCount + customTemplateTimelineCount: + type: number + defaultTimelineCount: + type: number + elasticTemplateTimelineCount: + type: number + favoriteCount: + type: number + templateTimelineCount: + type: number + timeline: + items: + $ref: '#/components/schemas/TimelineResponse' + type: array + totalCount: + type: number required: - - data + - timeline + - totalCount description: Indicates that the (template) Timelines were found and returned. '400': content: @@ -1025,30 +963,39 @@ components: type: object properties: aggregatable: + nullable: true type: boolean category: + nullable: true type: string columnHeaderType: + nullable: true type: string description: + nullable: true type: string example: - oneOf: - - type: string - - type: number + nullable: true + type: string id: + nullable: true type: string indexes: items: type: string + nullable: true type: array name: + nullable: true type: string placeholder: + nullable: true type: string searchable: + nullable: true type: boolean type: + nullable: true type: string DataProviderQueryMatch: type: object @@ -1070,6 +1017,10 @@ components: type: string queryMatch: $ref: '#/components/schemas/QueryMatchResult' + nullable: true + type: + $ref: '#/components/schemas/DataProviderType' + nullable: true DataProviderResult: type: object properties: @@ -1157,41 +1108,59 @@ components: type: object properties: exists: - type: boolean + nullable: true + type: string match_all: + nullable: true type: string meta: + nullable: true type: object properties: alias: + nullable: true type: string controlledBy: + nullable: true type: string disabled: + nullable: true type: boolean field: + nullable: true type: string formattedValue: + nullable: true type: string index: + nullable: true type: string key: + nullable: true type: string negate: + nullable: true type: boolean params: + nullable: true type: string type: + nullable: true type: string value: + nullable: true type: string missing: + nullable: true type: string query: + nullable: true type: string range: + nullable: true type: string script: + nullable: true type: string GetNotesResult: type: object @@ -1256,6 +1225,12 @@ components: version: nullable: true type: string + required: + - savedObjectId + - version + - pinnedEventIds + - eventNotes + - globalNotes Note: allOf: - $ref: '#/components/schemas/BareNote' @@ -1275,6 +1250,23 @@ components: - $ref: '#/components/schemas/PinnedEventBaseResponseBody' - nullable: true type: object + PersistTimelineResponse: + type: object + properties: + data: + type: object + properties: + persistTimeline: + type: object + properties: + timeline: + $ref: '#/components/schemas/TimelineResponse' + required: + - timeline + required: + - persistTimeline + required: + - data PinnedEvent: allOf: - $ref: '#/components/schemas/BarePinnedEvent' @@ -1312,34 +1304,27 @@ components: nullable: true type: string value: - nullable: true - type: string - Readable: + oneOf: + - nullable: true + type: string + - items: + type: string + nullable: true + type: array + ResolvedTimeline: type: object properties: - _data: - additionalProperties: true - type: object - _encoding: + alias_purpose: + $ref: '#/components/schemas/SavedObjectResolveAliasPurpose' + alias_target_id: type: string - _events: - additionalProperties: true - type: object - _eventsCount: - type: number - _maxListeners: - additionalProperties: true - type: object - _position: - type: number - _read: - additionalProperties: true - type: object - _readableState: - additionalProperties: true - type: object - readable: - type: boolean + outcome: + $ref: '#/components/schemas/SavedObjectResolveOutcome' + timeline: + $ref: '#/components/schemas/TimelineSavedToReturnObject' + required: + - timeline + - outcome ResponseNote: type: object properties: @@ -1374,6 +1359,17 @@ components: - threat_match - zeek type: string + SavedObjectResolveAliasPurpose: + enum: + - savedObjectConversion + - savedObjectImport + type: string + SavedObjectResolveOutcome: + enum: + - exactMatch + - aliasMatch + - conflict + type: string SavedTimeline: type: object properties: @@ -1402,12 +1398,16 @@ components: properties: end: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number start: oneOf: - - type: string - - type: number + - nullable: true + type: string + - nullable: true + type: number description: nullable: true type: string @@ -1496,6 +1496,18 @@ components: updatedBy: nullable: true type: string + SavedTimelineWithSavedObjectId: + allOf: + - $ref: '#/components/schemas/SavedTimeline' + - type: object + properties: + savedObjectId: + type: string + version: + type: string + required: + - savedObjectId + - version SerializedFilterQueryResult: type: object properties: @@ -1545,27 +1557,63 @@ components: TimelineResponse: allOf: - $ref: '#/components/schemas/SavedTimeline' + - $ref: '#/components/schemas/SavedTimelineWithSavedObjectId' - type: object properties: eventIdToNoteIds: items: $ref: '#/components/schemas/Note' + nullable: true type: array noteIds: items: type: string + nullable: true type: array notes: items: $ref: '#/components/schemas/Note' + nullable: true type: array pinnedEventIds: items: type: string + nullable: true type: array pinnedEventsSaveObject: items: $ref: '#/components/schemas/PinnedEvent' + nullable: true + type: array + TimelineSavedToReturnObject: + allOf: + - $ref: '#/components/schemas/SavedTimeline' + - type: object + properties: + eventIdToNoteIds: + items: + $ref: '#/components/schemas/Note' + nullable: true + type: array + noteIds: + items: + type: string + nullable: true + type: array + notes: + items: + $ref: '#/components/schemas/Note' + nullable: true + type: array + pinnedEventIds: + items: + type: string + nullable: true + type: array + pinnedEventsSaveObject: + items: + $ref: '#/components/schemas/PinnedEvent' + nullable: true type: array savedObjectId: type: string diff --git a/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts b/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts index 427285c5f9233..d32891333c7f0 100644 --- a/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts +++ b/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts @@ -9,9 +9,10 @@ import { FilterStateStore } from '@kbn/es-query'; import type { DataTableModel } from '@kbn/securitysolution-data-table'; import { VIEW_SELECTION } from '../../../common/constants'; -import type { TimelineResult } from '../../../common/api/timeline'; import { TimelineId, TimelineTabs } from '../../../common/types/timeline'; +import type { TimelineResponse } from '../../../common/api/timeline'; import { + type ColumnHeaderResult, RowRendererIdEnum, TimelineTypeEnum, TimelineStatusEnum, @@ -1986,9 +1987,11 @@ export const mockDataTableModel: DataTableModel = { }, }; -export const mockGetOneTimelineResult: TimelineResult = { +export const mockGetOneTimelineResult: TimelineResponse = { savedObjectId: 'ef579e40-jibber-jabber', - columns: timelineDefaults.columns.filter((column) => column.id !== 'event.action'), + columns: timelineDefaults.columns.filter( + (column) => column.id !== 'event.action' + ) as ColumnHeaderResult[], dateRange: { start: '2020-03-18T13:46:38.929Z', end: '2020-03-18T13:52:38.929Z' }, description: 'This is a sample rule description', eventType: 'all', diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx index c83fa2bf22211..a2dfef2c43e9f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx @@ -50,8 +50,8 @@ import { isNewTermsRule, isThresholdRule, } from '../../../../common/detection_engine/utils'; -import type { TimelineResult } from '../../../../common/api/timeline'; import { TimelineId } from '../../../../common/types/timeline'; +import type { TimelineResponse } from '../../../../common/api/timeline'; import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline'; import type { SendAlertToTimelineActionProps, @@ -69,7 +69,7 @@ import { TimelineEventsQueries } from '../../../../common/search_strategy/timeli import { timelineDefaults } from '../../../timelines/store/defaults'; import { omitTypenameInTimeline, - formatTimelineResultToModel, + formatTimelineResponseToModel, } from '../../../timelines/components/open_timeline/helpers'; import { convertKueryToElasticSearchQuery } from '../../../common/lib/kuery'; import { getField, getFieldKey } from '../../../helpers'; @@ -983,11 +983,15 @@ export const sendAlertToTimelineAction = async ({ ), ]); - const resultingTimeline: TimelineResult = getOr({}, 'data.getOneTimeline', responseTimeline); + const resultingTimeline: TimelineResponse = getOr( + {}, + 'data.getOneTimeline', + responseTimeline + ); const eventData: TimelineEventsDetailsItem[] = eventDataResp.data ?? []; if (!isEmpty(resultingTimeline)) { - const timelineTemplate: TimelineResult = omitTypenameInTimeline(resultingTimeline); - const { timeline, notes } = formatTimelineResultToModel( + const timelineTemplate = omitTypenameInTimeline(resultingTimeline); + const { timeline, notes } = formatTimelineResponseToModel( timelineTemplate, true, timelineTemplate.timelineType ?? TimelineTypeEnum.default diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts index 397e632a5c04c..a3428ae6f2e1d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts @@ -20,12 +20,16 @@ import { isUntitled, omitTypenameInTimeline, useQueryTimelineById, - formatTimelineResultToModel, + formatTimelineResponseToModel, } from './helpers'; import type { OpenTimelineResult } from './types'; import { TimelineId } from '../../../../common/types/timeline'; -import type { RowRendererId } from '../../../../common/api/timeline'; -import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../common/api/timeline'; +import { + TimelineTypeEnum, + TimelineStatusEnum, + type ColumnHeaderResult, + type RowRendererId, +} from '../../../../common/api/timeline'; import { mockTimeline as mockSelectedTimeline, mockTemplate as mockSelectedTemplate, @@ -379,7 +383,7 @@ describe('helpers', () => { ); const timeline = { savedObjectId: 'savedObject-1', - columns: columnsWithoutEventAction, + columns: columnsWithoutEventAction as ColumnHeaderResult[], version: '1', }; @@ -396,7 +400,7 @@ describe('helpers', () => { ); const timeline = { savedObjectId: 'savedObject-1', - columns: columnsWithoutEventAction, + columns: columnsWithoutEventAction as ColumnHeaderResult[], filters: [ { meta: { @@ -568,7 +572,7 @@ describe('helpers', () => { version: '1', status: TimelineStatusEnum.active, timelineType: TimelineTypeEnum.default, - columns: customColumns, + columns: customColumns as ColumnHeaderResult[], }; const newTimeline = defaultTimelineToTimelineModel( @@ -691,7 +695,7 @@ describe('helpers', () => { }); test('Do not override daterange if TimelineStatus is active', () => { - const { timeline } = formatTimelineResultToModel( + const { timeline } = formatTimelineResponseToModel( omitTypenameInTimeline(getOr({}, 'data.timeline', selectedTimeline)), args.duplicate, args.timelineType @@ -744,7 +748,7 @@ describe('helpers', () => { }); test('should not override daterange if TimelineStatus is active', () => { - const { timeline } = formatTimelineResultToModel( + const { timeline } = formatTimelineResponseToModel( omitTypenameInTimeline(getOr({}, 'data.timeline', selectedTimeline)), args.duplicate, args.timelineType @@ -818,7 +822,7 @@ describe('helpers', () => { }); test('override daterange if TimelineStatus is immutable', () => { - const { timeline } = formatTimelineResultToModel( + const { timeline } = formatTimelineResponseToModel( omitTypenameInTimeline(getOr({}, 'data.timeline', template)), args.duplicate, args.timelineType diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts index 81114901c216d..000a7b226561e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts @@ -14,8 +14,8 @@ import { useCallback } from 'react'; import { useDiscoverInTimelineContext } from '../../../common/components/discover_in_timeline/use_discover_in_timeline_context'; import type { ColumnHeaderOptions } from '../../../../common/types/timeline'; import type { - TimelineResult, - SingleTimelineResolveResponse, + TimelineResponse, + ResolvedTimeline, ColumnHeaderResult, FilterTimelineResult, DataProviderResult, @@ -80,7 +80,7 @@ export const isUntitled = ({ title }: OpenTimelineResult): boolean => const omitTypename = (key: string, value: keyof TimelineModel) => key === '__typename' ? undefined : value; -export const omitTypenameInTimeline = (timeline: TimelineResult): TimelineResult => +export const omitTypenameInTimeline = (timeline: TimelineResponse): TimelineResponse => JSON.parse(JSON.stringify(timeline), omitTypename); const parseString = (params: string) => { @@ -164,7 +164,7 @@ const setPinnedEventIds = (duplicate: boolean, pinnedEventIds: string[] | null | : {}; const getTemplateTimelineId = ( - timeline: TimelineResult, + timeline: TimelineResponse, duplicate: boolean, targetTimelineType?: TimelineType ) => { @@ -200,7 +200,7 @@ const convertToDefaultField = ({ and, ...dataProvider }: DataProviderResult) => const getDataProviders = ( duplicate: boolean, - dataProviders: TimelineResult['dataProviders'], + dataProviders: TimelineResponse['dataProviders'], timelineType?: TimelineType ) => { if (duplicate && dataProviders && timelineType === TimelineTypeEnum.default) { @@ -214,7 +214,7 @@ const getDataProviders = ( }; export const getTimelineTitle = ( - timeline: TimelineResult, + timeline: TimelineResponse, duplicate: boolean, timelineType?: TimelineType ) => { @@ -225,7 +225,7 @@ export const getTimelineTitle = ( }; export const getTimelineStatus = ( - timeline: TimelineResult, + timeline: TimelineResponse, duplicate: boolean, timelineType?: TimelineType ) => { @@ -236,7 +236,7 @@ export const getTimelineStatus = ( }; export const defaultTimelineToTimelineModel = ( - timeline: TimelineResult, + timeline: TimelineResponse, duplicate: boolean, timelineType?: TimelineType, unifiedComponentsInTimelineDisabled?: boolean @@ -291,8 +291,8 @@ export const defaultTimelineToTimelineModel = ( ); }; -export const formatTimelineResultToModel = ( - timelineToOpen: TimelineResult, +export const formatTimelineResponseToModel = ( + timelineToOpen: TimelineResponse, duplicate: boolean = false, timelineType?: TimelineType, unifiedComponentsInTimelineDisabled?: boolean @@ -376,12 +376,12 @@ export const useQueryTimelineById = () => { } else { return Promise.resolve(resolveTimeline(timelineId)) .then((result) => { - const data: SingleTimelineResolveResponse['data'] | null = getOr(null, 'data', result); + const data: ResolvedTimeline | null = getOr(null, 'data', result); if (!data) return; const timelineToOpen = omitTypenameInTimeline(data.timeline); - const { timeline, notes } = formatTimelineResultToModel( + const { timeline, notes } = formatTimelineResponseToModel( timelineToOpen, duplicate, timelineType, diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts index 1a47c22d0fb61..14ddedf5b9688 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts @@ -10,7 +10,7 @@ import type { IconType } from '@elastic/eui'; import type { TimelineModel } from '../../store/model'; import type { RowRendererId, - SingleTimelineResolveResponse, + ResolvedTimeline, TimelineType, TimelineStatus, TemplateTimelineType, @@ -210,9 +210,9 @@ export interface OpenTimelineProps { } export interface ResolveTimelineConfig { - alias_target_id: SingleTimelineResolveResponse['data']['alias_target_id']; - outcome: SingleTimelineResolveResponse['data']['outcome']; - alias_purpose: SingleTimelineResolveResponse['data']['alias_purpose']; + alias_target_id: ResolvedTimeline['alias_target_id']; + outcome: ResolvedTimeline['outcome']; + alias_purpose: ResolvedTimeline['alias_purpose']; } export interface UpdateTimeline { duplicate: boolean; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx index 7a2b3eca0f74b..9db2a0b8924d9 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx @@ -21,9 +21,9 @@ import type { TimelineType, TimelineStatus, PageInfoTimeline, - TimelineResult, + TimelineResponse, SortTimeline, - GetAllTimelineVariables, + GetTimelinesRequestQuery, } from '../../../../common/api/timeline'; import { TimelineTypeEnum } from '../../../../common/api/timeline'; import { getAllTimelines } from '../api'; @@ -59,7 +59,7 @@ export interface AllTimelinesVariables { export const ALL_TIMELINE_QUERY_ID = 'FETCH_ALL_TIMELINES'; export const getAllTimeline = memoizeOne( - (_variables: string, timelines: TimelineResult[]): OpenTimelineResult[] => + (_variables: string, timelines: TimelineResponse[]): OpenTimelineResult[] => timelines.map((timeline) => ({ created: timeline.created, description: timeline.description, @@ -132,13 +132,15 @@ export const useGetAllTimeline = (): AllTimelinesArgs => { loading: true, })); - const variables: GetAllTimelineVariables = { - onlyUserFavorite, - pageInfo, + const variables: GetTimelinesRequestQuery = { + only_user_favorite: onlyUserFavorite ? 'true' : 'false', + page_size: pageInfo.pageSize.toString(), + page_index: pageInfo.pageIndex.toString(), search, - sort, - status, - timelineType, + sort_field: sort.sortField, + sort_order: sort.sortOrder, + status: status || undefined, + timeline_type: timelineType, }; const getAllTimelineResponse = await getAllTimelines(variables, abortCtrl.signal); const totalCount = getAllTimelineResponse?.totalCount ?? 0; @@ -163,7 +165,7 @@ export const useGetAllTimeline = (): AllTimelinesArgs => { setAllTimelines({ loading: false, totalCount, - timelines: getAllTimeline(JSON.stringify(variables), timelines as TimelineResult[]), + timelines: getAllTimeline(JSON.stringify(variables), timelines as TimelineResponse[]), customTemplateTimelineCount, defaultTimelineCount, elasticTemplateTimelineCount, diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index 155d95c5acef2..fa006293719d5 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -5,34 +5,30 @@ * 2.0. */ -import { fold } from 'fp-ts/lib/Either'; -import { identity } from 'fp-ts/lib/function'; -import { pipe } from 'fp-ts/lib/pipeable'; import { isEmpty } from 'lodash'; -import { throwErrors } from '@kbn/cases-plugin/common'; import type { SavedSearch } from '@kbn/saved-search-plugin/common'; import type { - TimelineResponse, - TimelineErrorResponse, - ImportTimelineResultSchema, - AllTimelinesResponse, - SingleTimelineResponse, - SingleTimelineResolveResponse, - GetTimelinesArgs, + CleanDraftTimelinesResponse, + TimelineType, + PatchTimelineResponse, + CreateTimelinesResponse, + CopyTimelineResponse, + GetDraftTimelinesResponse, + GetTimelinesRequestQuery, + SavedTimeline, } from '../../../common/api/timeline'; import { - TimelineResponseType, + ImportTimelineResult, + TimelineErrorResponse, TimelineStatusEnum, - TimelineErrorResponseType, - importTimelineResultSchema, - allTimelinesResponse, PersistFavoriteRouteResponse, - SingleTimelineResponseType, - type TimelineType, TimelineTypeEnum, - ResolvedSingleTimelineResponseType, + GetTimelineResponse, + ResolveTimelineResponse, + GetTimelinesResponse, + PersistTimelineResponse, } from '../../../common/api/timeline'; import { TIMELINE_URL, @@ -48,15 +44,15 @@ import { import { KibanaServices } from '../../common/lib/kibana'; import { ToasterError } from '../../common/components/toasters'; +import { parseOrThrowErrorFactory } from '../../../common/timelines/zod_errors'; import type { ExportDocumentsProps, ImportDataProps, ImportDataResponse, } from '../../detection_engine/rule_management/logic'; -import type { TimelineInput } from '../../../common/search_strategy'; interface RequestPostTimeline { - timeline: TimelineInput; + timeline: SavedTimeline; signal?: AbortSignal; } @@ -68,48 +64,33 @@ interface RequestPatchTimeline extends RequestPostTimeline { type RequestPersistTimeline = RequestPostTimeline & Partial>; const createToasterPlainError = (message: string) => new ToasterError([message]); -const decodeTimelineResponse = (respTimeline?: TimelineResponse | TimelineErrorResponse) => - pipe( - TimelineResponseType.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); -const decodeSingleTimelineResponse = (respTimeline?: SingleTimelineResponse) => - pipe( - SingleTimelineResponseType.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); +const parseOrThrow = parseOrThrowErrorFactory(createToasterPlainError); -const decodeResolvedSingleTimelineResponse = (respTimeline?: SingleTimelineResolveResponse) => - pipe( - ResolvedSingleTimelineResponseType.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); +const decodeTimelineResponse = (respTimeline?: PersistTimelineResponse | TimelineErrorResponse) => + parseOrThrow(PersistTimelineResponse)(respTimeline); -const decodeAllTimelinesResponse = (respTimeline: AllTimelinesResponse) => - pipe( - allTimelinesResponse.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); +const decodeSingleTimelineResponse = (respTimeline?: GetTimelineResponse) => + parseOrThrow(GetTimelineResponse)(respTimeline); + +const decodeResolvedSingleTimelineResponse = (respTimeline?: ResolveTimelineResponse) => + parseOrThrow(ResolveTimelineResponse)(respTimeline); + +const decodeGetTimelinesResponse = (respTimeline: GetTimelinesResponse) => + parseOrThrow(GetTimelinesResponse)(respTimeline); const decodeTimelineErrorResponse = (respTimeline?: TimelineErrorResponse) => - pipe( - TimelineErrorResponseType.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); + parseOrThrow(TimelineErrorResponse)(respTimeline); -const decodePrepackedTimelineResponse = (respTimeline?: ImportTimelineResultSchema) => - pipe( - importTimelineResultSchema.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); +const decodePrepackedTimelineResponse = (respTimeline?: ImportTimelineResult) => + parseOrThrow(ImportTimelineResult)(respTimeline); const decodeResponseFavoriteTimeline = (respTimeline?: PersistFavoriteRouteResponse) => - PersistFavoriteRouteResponse.parse(respTimeline); + parseOrThrow(PersistFavoriteRouteResponse)(respTimeline); const postTimeline = async ({ timeline, -}: RequestPostTimeline): Promise => { +}: RequestPostTimeline): Promise => { let requestBody; try { requestBody = JSON.stringify({ timeline }); @@ -117,7 +98,7 @@ const postTimeline = async ({ return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); } - const response = await KibanaServices.get().http.post(TIMELINE_URL, { + const response = await KibanaServices.get().http.post(TIMELINE_URL, { method: 'POST', body: requestBody, version: '2023-10-31', @@ -131,7 +112,7 @@ const patchTimeline = async ({ timeline, version, savedSearch, -}: RequestPatchTimeline): Promise => { +}: RequestPatchTimeline): Promise => { let response = null; let requestBody = null; try { @@ -153,7 +134,7 @@ const patchTimeline = async ({ } try { - response = await KibanaServices.get().http.patch(TIMELINE_URL, { + response = await KibanaServices.get().http.patch(TIMELINE_URL, { method: 'PATCH', body: requestBody, version: '2023-10-31', @@ -175,7 +156,7 @@ export const copyTimeline = async ({ timelineId, timeline, savedSearch, -}: RequestPersistTimeline): Promise => { +}: RequestPersistTimeline): Promise => { let response = null; let requestBody = null; let newSavedSearchId = null; @@ -205,7 +186,7 @@ export const copyTimeline = async ({ } try { - response = await KibanaServices.get().http.post(TIMELINE_COPY_URL, { + response = await KibanaServices.get().http.post(TIMELINE_COPY_URL, { method: 'POST', body: requestBody, version: '1', @@ -224,10 +205,10 @@ export const persistTimeline = async ({ timeline, version, savedSearch, -}: RequestPersistTimeline): Promise => { +}: RequestPersistTimeline): Promise => { try { if (isEmpty(timelineId) && timeline.status === TimelineStatusEnum.draft && timeline) { - const temp: TimelineResponse | TimelineErrorResponse = await cleanDraftTimeline({ + const temp: CleanDraftTimelinesResponse | TimelineErrorResponse = await cleanDraftTimeline({ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion timelineType: timeline.timelineType!, templateTimelineId: timeline.templateTimelineId ?? undefined, @@ -330,13 +311,16 @@ export const getDraftTimeline = async ({ timelineType, }: { timelineType: TimelineType; -}): Promise => { - const response = await KibanaServices.get().http.get(TIMELINE_DRAFT_URL, { - query: { - timelineType, - }, - version: '2023-10-31', - }); +}): Promise => { + const response = await KibanaServices.get().http.get( + TIMELINE_DRAFT_URL, + { + query: { + timelineType, + }, + version: '2023-10-31', + } + ); return decodeTimelineResponse(response); }; @@ -349,7 +333,7 @@ export const cleanDraftTimeline = async ({ timelineType: TimelineType; templateTimelineId?: string; templateTimelineVersion?: number; -}): Promise => { +}): Promise => { let requestBody; const templateTimelineInfo = timelineType === TimelineTypeEnum.template @@ -366,16 +350,19 @@ export const cleanDraftTimeline = async ({ } catch (err) { return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); } - const response = await KibanaServices.get().http.post(TIMELINE_DRAFT_URL, { - body: requestBody, - version: '2023-10-31', - }); + const response = await KibanaServices.get().http.post( + TIMELINE_DRAFT_URL, + { + body: requestBody, + version: '2023-10-31', + } + ); return decodeTimelineResponse(response); }; -export const installPrepackedTimelines = async (): Promise => { - const response = await KibanaServices.get().http.post( +export const installPrepackedTimelines = async (): Promise => { + const response = await KibanaServices.get().http.post( TIMELINE_PREPACKAGED_URL, { version: '2023-10-31', @@ -386,7 +373,7 @@ export const installPrepackedTimelines = async (): Promise { - const response = await KibanaServices.get().http.get(TIMELINE_URL, { + const response = await KibanaServices.get().http.get(TIMELINE_URL, { query: { id, }, @@ -397,7 +384,7 @@ export const getTimeline = async (id: string) => { }; export const resolveTimeline = async (id: string) => { - const response = await KibanaServices.get().http.get( + const response = await KibanaServices.get().http.get( TIMELINE_RESOLVE_URL, { query: { @@ -411,7 +398,7 @@ export const resolveTimeline = async (id: string) => { }; export const getTimelineTemplate = async (templateTimelineId: string) => { - const response = await KibanaServices.get().http.get(TIMELINE_URL, { + const response = await KibanaServices.get().http.get(TIMELINE_URL, { query: { template_timeline_id: templateTimelineId, }, @@ -421,24 +408,18 @@ export const getTimelineTemplate = async (templateTimelineId: string) => { return decodeSingleTimelineResponse(response); }; -export const getAllTimelines = async (args: GetTimelinesArgs, abortSignal: AbortSignal) => { - const response = await KibanaServices.get().http.fetch(TIMELINES_URL, { +export const getAllTimelines = async ( + query: GetTimelinesRequestQuery, + abortSignal: AbortSignal +) => { + const response = await KibanaServices.get().http.fetch(TIMELINES_URL, { method: 'GET', - query: { - ...(args.onlyUserFavorite ? { only_user_favorite: args.onlyUserFavorite } : {}), - ...(args?.pageInfo?.pageSize ? { page_size: args.pageInfo.pageSize } : {}), - ...(args?.pageInfo?.pageIndex ? { page_index: args.pageInfo.pageIndex } : {}), - ...(args.search ? { search: args.search } : {}), - ...(args?.sort?.sortField ? { sort_field: args?.sort?.sortField } : {}), - ...(args?.sort?.sortOrder ? { sort_order: args?.sort?.sortOrder } : {}), - ...(args.status ? { status: args.status } : {}), - ...(args.timelineType ? { timeline_type: args.timelineType } : {}), - }, + query, signal: abortSignal, version: '2023-10-31', }); - return decodeAllTimelinesResponse(response); + return decodeGetTimelinesResponse(response); }; export const persistFavorite = async ({ diff --git a/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts b/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts index 17d0050488f5b..fef5fa22f0bfb 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts @@ -6,10 +6,10 @@ */ import { TableId } from '@kbn/securitysolution-data-table'; -import type { TimelineResult } from '../../../common/api/timeline'; +import type { TimelineResponse } from '../../../common/api/timeline'; import { DEFAULT_ALERTS_INDEX } from '../../../common/constants'; -export const getTimelineQueryTypes = (timeline: TimelineResult) => ({ +export const getTimelineQueryTypes = (timeline: TimelineResponse) => ({ hasQuery: (timeline.kqlQuery != null && timeline.kqlQuery.filterQuery != null && diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts index 4c303b1414515..67374a66019db 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts @@ -66,6 +66,7 @@ describe('Timeline pinned event middleware', () => { data: { persistPinnedEventOnTimeline: { code: 200, + eventId: testEventId, }, }, }); diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts index 8461ed3c2fc17..38e00af3f5f8e 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts @@ -74,7 +74,7 @@ export const addPinnedEventToTimelineMiddleware: (kibana: CoreStart) => Middlewa const currentTimeline = selectTimelineById(store.getState(), action.payload.id); // The response is null or empty in case we unpinned an event. // In that case we want to remove the locally pinned event. - if (!response || !('code' in response)) { + if (!response || !('eventId' in response)) { return store.dispatch( updateTimeline({ id: action.payload.id, diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts index 6051c9c1bb4e5..3c8bcf4b55f58 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts @@ -167,7 +167,7 @@ describe('Timeline save middleware', () => { }); it('should show an error message when the call is unauthorized', async () => { - (persistTimeline as jest.Mock).mockResolvedValue({ data: { persistTimeline: { code: 403 } } }); + (persistTimeline as jest.Mock).mockResolvedValue({ status_code: 403 }); await store.dispatch(saveTimeline({ id: TimelineId.test, saveAsNew: false })); expect(refreshTimelines as unknown as jest.Mock).not.toHaveBeenCalled(); @@ -175,7 +175,7 @@ describe('Timeline save middleware', () => { }); describe('#convertTimelineAsInput ', () => { - test('should return a TimelineInput instead of TimelineModel ', () => { + test('should return a SavedTimeline instead of TimelineModel ', () => { const columns: TimelineModel['columns'] = [ { columnHeaderType: 'not-filtered', diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts index dcbbc5cadb6d0..58e8aced4470b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts @@ -34,8 +34,11 @@ import { selectTimelineById } from '../selectors'; import * as i18n from '../../pages/translations'; import type { inputsModel } from '../../../common/store/inputs'; import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline'; -import type { TimelineErrorResponse, TimelineResponse } from '../../../../common/api/timeline'; -import type { TimelineInput } from '../../../../common/search_strategy'; +import type { + TimelineErrorResponse, + PersistTimelineResponse, + SavedTimeline, +} from '../../../../common/api/timeline'; import type { TimelineModel } from '../model'; import type { ColumnHeaderOptions } from '../../../../common/types/timeline'; import { refreshTimelines } from './helpers'; @@ -83,6 +86,9 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State if (isTimelineErrorResponse(result)) { const error = getErrorFromResponse(result); switch (error?.errorCode) { + case 403: + store.dispatch(showCallOutUnauthorizedMsg()); + break; // conflict case 409: kibana.notifications.toasts.addDanger({ @@ -108,11 +114,6 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State return; } - if (response && response.code === 403) { - store.dispatch(showCallOutUnauthorizedMsg()); - return; - } - refreshTimelines(store.getState()); store.dispatch( @@ -155,7 +156,7 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State return ret; }; -const timelineInput: TimelineInput = { +const timelineInput: SavedTimeline = { columns: null, dataProviders: null, dataViewId: null, @@ -181,8 +182,8 @@ const timelineInput: TimelineInput = { export const convertTimelineAsInput = ( timeline: TimelineModel, timelineTimeRange: inputsModel.TimeRange -): TimelineInput => - Object.keys(timelineInput).reduce((acc, key) => { +): SavedTimeline => + Object.keys(timelineInput).reduce((acc, key) => { if (has(key, timeline)) { if (key === 'kqlQuery') { return set(`${key}.filterQuery`, get(`${key}.filterQuery`, timeline), acc); @@ -270,7 +271,7 @@ const convertToString = (obj: unknown) => { } }; -type PossibleResponse = TimelineResponse | TimelineErrorResponse; +type PossibleResponse = PersistTimelineResponse | TimelineErrorResponse; function isTimelineErrorResponse(response: PossibleResponse): response is TimelineErrorResponse { return response && ('status_code' in response || 'statusCode' in response); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts index 6b88ec1923d0d..3713176e919c5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts @@ -6,8 +6,7 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; -import { validate } from '@kbn/securitysolution-io-ts-utils'; -import { checkTimelineStatusRt } from '../../../../../../common/api/timeline'; +import { InstallPrepackedTimelinesRequestBody } from '../../../../../../common/api/timeline'; import { buildSiemResponse } from '../../../routes/utils'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; @@ -69,10 +68,8 @@ export const getPrebuiltRulesAndTimelinesStatusRoute = (router: SecuritySolution const frameworkRequest = await buildFrameworkRequest(context, request); const prebuiltTimelineStatus = await checkTimelinesStatus(frameworkRequest); - const [validatedPrebuiltTimelineStatus] = validate( - prebuiltTimelineStatus, - checkTimelineStatusRt - ); + const validatedPrebuiltTimelineStatus = + InstallPrepackedTimelinesRequestBody.parse(prebuiltTimelineStatus); const responseBody: ReadPrebuiltRulesAndTimelinesStatusResponse = { rules_custom_installed: customRules.total, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/perform_timelines_installation.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/perform_timelines_installation.ts index 101883e8ccd9b..857c7a6b95814 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/perform_timelines_installation.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/perform_timelines_installation.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { validate } from '@kbn/securitysolution-io-ts-utils'; -import { importTimelineResultSchema } from '../../../../../common/api/timeline'; +import { stringifyZodError } from '@kbn/zod-helpers'; +import { ImportTimelineResult } from '../../../../../common/api/timeline'; import type { SecuritySolutionApiRequestHandlerContext } from '../../../../types'; import { installPrepackagedTimelines } from '../../../timeline/routes/prepackaged_timelines/install_prepackaged_timelines'; @@ -18,10 +18,10 @@ export const performTimelinesInstallation = async ( securitySolutionContext.getFrameworkRequest(), true ); - const [result, error] = validate(timeline, importTimelineResultSchema); + const parsed = ImportTimelineResult.safeParse(timeline); return { - result, - error, + result: parsed.data, + error: parsed.error && stringifyZodError(parsed.error), }; }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts index eb4649f941d11..70187dc9bf40a 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts @@ -6,7 +6,6 @@ */ import path, { join, resolve } from 'path'; -import type * as rt from 'io-ts'; import { TIMELINE_DRAFT_URL, @@ -17,9 +16,9 @@ import { } from '../../../../common/constants'; import type { SavedTimeline, - patchTimelineSchema, - createTimelineSchema, - GetTimelineQuery, + PatchTimelineRequestBody, + CreateTimelinesRequestBody, + GetTimelineRequestQuery, } from '../../../../common/api/timeline'; import { type TimelineType, @@ -135,14 +134,14 @@ export const updateTemplateTimelineWithTimelineId = { version: 'WzEyMjUsMV0=', }; -export const getCreateTimelinesRequest = (mockBody: rt.TypeOf) => +export const getCreateTimelinesRequest = (mockBody: CreateTimelinesRequestBody) => requestMock.create({ method: 'post', path: TIMELINE_URL, body: mockBody, }); -export const getUpdateTimelinesRequest = (mockBody: rt.TypeOf) => +export const getUpdateTimelinesRequest = (mockBody: PatchTimelineRequestBody) => requestMock.create({ method: 'patch', path: TIMELINE_URL, @@ -167,7 +166,7 @@ export const cleanDraftTimelinesRequest = (timelineType: TimelineType) => }, }); -export const getTimelineRequest = (query?: GetTimelineQuery) => +export const getTimelineRequest = (query?: GetTimelineRequestQuery) => requestMock.create({ method: 'get', path: TIMELINE_URL, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/resolve_timeline.ts b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/resolve_timeline.ts index ea875a71416c1..932e6f3ce904d 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/resolve_timeline.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/resolve_timeline.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { ResolvedTimelineWithOutcomeSavedObject } from '../../../../common/api/timeline'; +import type { ResolvedTimeline } from '../../../../common/api/timeline'; import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline'; export const mockResolvedSavedObject = { @@ -117,7 +117,7 @@ export const mockPopulatedTimeline = { pinnedEventsSaveObject: [], }; -export const mockResolveTimelineResponse: ResolvedTimelineWithOutcomeSavedObject = { +export const mockResolveTimelineResponse: ResolvedTimeline = { timeline: mockPopulatedTimeline, outcome: 'aliasMatch', alias_target_id: 'new-saved-object-id', diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts index 387720b4a3b4f..6515817f28e11 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts @@ -6,10 +6,10 @@ */ import { v4 as uuidv4 } from 'uuid'; +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; -import type { ConfigType } from '../../../../..'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { TIMELINE_DRAFT_URL } from '../../../../../../common/constants'; @@ -21,12 +21,13 @@ import { persistTimeline, } from '../../../saved_object/timelines'; import { draftTimelineDefaults } from '../../../utils/default_timeline'; +import type { CleanDraftTimelinesResponse } from '../../../../../../common/api/timeline'; import { CleanDraftTimelinesRequestBody, TimelineTypeEnum, } from '../../../../../../common/api/timeline'; -export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .post({ path: TIMELINE_DRAFT_URL, @@ -42,7 +43,7 @@ export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter, _ }, version: '2023-10-31', }, - async (context, request, response) => { + async (context, request, response): Promise> => { const frameworkRequest = await buildFrameworkRequest(context, request); const siemResponse = buildSiemResponse(response); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts index 6619e4a0eb18b..1ba3167cdefae 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts @@ -5,19 +5,22 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; -import type { ConfigType } from '../../../../..'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { TIMELINE_DRAFT_URL } from '../../../../../../common/constants'; import { buildFrameworkRequest } from '../../../utils/common'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; import { getDraftTimeline, persistTimeline } from '../../../saved_object/timelines'; import { draftTimelineDefaults } from '../../../utils/default_timeline'; -import { getDraftTimelineSchema } from '../../../../../../common/api/timeline'; +import { + GetDraftTimelinesRequestQuery, + type GetDraftTimelinesResponse, +} from '../../../../../../common/api/timeline'; -export const getDraftTimelinesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const getDraftTimelinesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .get({ path: TIMELINE_DRAFT_URL, @@ -29,11 +32,11 @@ export const getDraftTimelinesRoute = (router: SecuritySolutionPluginRouter, _: .addVersion( { validate: { - request: { query: buildRouteValidationWithExcess(getDraftTimelineSchema) }, + request: { query: buildRouteValidationWithZod(GetDraftTimelinesRequestQuery) }, }, version: '2023-10-31', }, - async (context, request, response) => { + async (context, request, response): Promise> => { const frameworkRequest = await buildFrameworkRequest(context, request); const siemResponse = buildSiemResponse(response); 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 6b44496b6c3c4..905e28872a5a4 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 @@ -28,25 +28,25 @@ import { persistNoteRoute, deleteNoteRoute, getNotesRoute } from './notes'; import { persistPinnedEventRoute } from './pinned_events'; export function registerTimelineRoutes(router: SecuritySolutionPluginRouter, config: ConfigType) { - createTimelinesRoute(router, config); - patchTimelinesRoute(router, config); + createTimelinesRoute(router); + patchTimelinesRoute(router); importTimelinesRoute(router, config); exportTimelinesRoute(router, config); - getDraftTimelinesRoute(router, config); - getTimelineRoute(router, config); - resolveTimelineRoute(router, config); - getTimelinesRoute(router, config); - cleanDraftTimelinesRoute(router, config); - deleteTimelinesRoute(router, config); - persistFavoriteRoute(router, config); - copyTimelineRoute(router, config); + getDraftTimelinesRoute(router); + getTimelineRoute(router); + resolveTimelineRoute(router); + getTimelinesRoute(router); + cleanDraftTimelinesRoute(router); + deleteTimelinesRoute(router); + persistFavoriteRoute(router); + copyTimelineRoute(router); installPrepackedTimelinesRoute(router, config); - persistNoteRoute(router, config); - deleteNoteRoute(router, config); - getNotesRoute(router, config); + persistNoteRoute(router); + deleteNoteRoute(router); + getNotesRoute(router); - persistPinnedEventRoute(router, config); + persistPinnedEventRoute(router); } diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts index 92be926453403..9e6aeb5473fc2 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts @@ -5,21 +5,20 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; -import type { ConfigType } from '../../../..'; - import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; import { DeleteNoteRequestBody, type DeleteNoteResponse } from '../../../../../common/api/timeline'; import { deleteNote } from '../../saved_object/notes'; -export const deleteNoteRoute = (router: SecuritySolutionPluginRouter, config: ConfigType) => { +export const deleteNoteRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .delete({ path: NOTE_URL, @@ -35,7 +34,7 @@ export const deleteNoteRoute = (router: SecuritySolutionPluginRouter, config: Co }, version: '2023-10-31', }, - async (context, request, response) => { + async (context, request, response): Promise> => { const siemResponse = buildSiemResponse(response); try { @@ -55,9 +54,8 @@ export const deleteNoteRoute = (router: SecuritySolutionPluginRouter, config: Co noteIds, }); - const body: DeleteNoteResponse = { data: {} }; return response.ok({ - body, + body: { data: {} }, }); } catch (err) { const error = transformError(err); 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 9cc8435d6aae0..920a7ef763dd5 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 @@ -5,21 +5,20 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; -import type { ConfigType } from '../../../..'; - import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; import { getAllSavedNote, MAX_UNASSOCIATED_NOTES } from '../../saved_object/notes'; import { noteSavedObjectType } from '../../saved_object_mappings/notes'; import { GetNotesRequestQuery, type GetNotesResponse } from '../../../../../common/api/timeline'; -export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const getNotesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .get({ path: NOTE_URL, @@ -35,7 +34,7 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigTyp }, version: '2023-10-31', }, - async (context, request, response) => { + async (context, request, response): Promise> => { try { const queryParams = request.query; const frameworkRequest = await buildFrameworkRequest(context, request); @@ -60,8 +59,7 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigTyp perPage: MAX_UNASSOCIATED_NOTES, }; const res = await getAllSavedNote(frameworkRequest, options); - const body: GetNotesResponse = res ?? {}; - return response.ok({ body }); + return response.ok({ body: res ?? {} }); } } else { const perPage = queryParams?.perPage ? parseInt(queryParams.perPage, 10) : 10; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts index 7ee0dc886a787..2e825b4ff3a15 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts @@ -5,14 +5,13 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; -import type { ConfigType } from '../../../..'; - import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; @@ -22,7 +21,7 @@ import { } from '../../../../../common/api/timeline'; import { persistNote } from '../../saved_object/notes'; -export const persistNoteRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const persistNoteRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .patch({ path: NOTE_URL, @@ -38,7 +37,7 @@ export const persistNoteRoute = (router: SecuritySolutionPluginRouter, _: Config }, version: '2023-10-31', }, - async (context, request, response) => { + async (context, request, response): Promise> => { const siemResponse = buildSiemResponse(response); try { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts index c1e245cda40fb..74db9e58d904b 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; @@ -12,8 +13,6 @@ import type { SecuritySolutionPluginRouter } from '../../../../types'; import { PINNED_EVENT_URL } from '../../../../../common/constants'; -import type { ConfigType } from '../../../..'; - import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; @@ -23,10 +22,7 @@ import { } from '../../../../../common/api/timeline'; import { persistPinnedEventOnTimeline } from '../../saved_object/pinned_events'; -export const persistPinnedEventRoute = ( - router: SecuritySolutionPluginRouter, - config: ConfigType -) => { +export const persistPinnedEventRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .patch({ path: PINNED_EVENT_URL, @@ -42,7 +38,11 @@ export const persistPinnedEventRoute = ( }, version: '2023-10-31', }, - async (context, request, response) => { + async ( + context, + request, + response + ): Promise> => { const siemResponse = buildSiemResponse(response); try { @@ -58,12 +58,10 @@ export const persistPinnedEventRoute = ( timelineId ); - const body: PersistPinnedEventRouteResponse = { - data: { persistPinnedEventOnTimeline: res }, - }; - return response.ok({ - body, + body: { + data: { persistPinnedEventOnTimeline: res }, + }, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.test.ts index 7a4e7a41a1ee7..6b8124f16aa91 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.test.ts @@ -20,7 +20,6 @@ import { import * as helpers from './helpers'; import { importTimelines } from '../../timelines/import_timelines/helpers'; import { buildFrameworkRequest } from '../../../utils/common'; -import type { ImportTimelineResultSchema } from '../../../../../../common/api/timeline'; jest.mock('../../timelines/import_timelines/helpers'); @@ -231,9 +230,8 @@ describe('installPrepackagedTimelines', () => { ); expect( - (result as ImportTimelineResultSchema).errors[0].error.message.includes( - 'read prepackaged timelines error:' - ) + 'errors' in result && + result.errors?.[0].error?.message?.includes('read prepackaged timelines error:') ).toBeTruthy(); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.ts index dee31d479e2da..f6f43435e5641 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/helpers.ts @@ -8,7 +8,7 @@ import path, { join, resolve } from 'path'; import { Readable } from 'stream'; -import type { ImportTimelineResultSchema } from '../../../../../../common/api/timeline'; +import type { ImportTimelineResult } from '../../../../../../common/api/timeline'; import type { FrameworkRequest } from '../../../../framework'; @@ -22,7 +22,7 @@ export const installPrepackagedTimelines = async ( isImmutable: boolean, filePath?: string, fileName?: string -): Promise => { +): Promise => { let readStream; const dir = resolve( join( @@ -47,7 +47,7 @@ export const installPrepackagedTimelines = async ( ], }; } - return loadData(readStream, (docs: T) => + return loadData(readStream, (docs: T) => docs instanceof Readable ? importTimelines(docs, maxTimelineImportExportSize, frameworkRequest, isImmutable) : Promise.reject(new Error(`read prepackaged timelines error`)) diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/index.ts index 0b150b4e47f56..b1a6e2f781f45 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/index.ts @@ -6,14 +6,17 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; -import { validate } from '@kbn/securitysolution-io-ts-utils'; -import { checkTimelineStatusRt } from '../../../../../../common/api/timeline'; +import type { IKibanaResponse } from '@kbn/core-http-server'; + import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_PREPACKAGED_URL } from '../../../../../../common/constants'; import type { ConfigType } from '../../../../../config'; - +import { + InstallPrepackedTimelinesRequestBody, + type InstallPrepackedTimelinesResponse, +} from '../../../../../../common/api/timeline'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { installPrepackagedTimelines } from './helpers'; @@ -45,23 +48,24 @@ export const installPrepackedTimelinesRoute = ( validate: {}, version: '2023-10-31', }, - async (context, request, response) => { + async ( + context, + request, + response + ): Promise> => { try { const frameworkRequest = await buildFrameworkRequest(context, request); const prepackagedTimelineStatus = await checkTimelinesStatus(frameworkRequest); - const [validatedprepackagedTimelineStatus, prepackagedTimelineStatusError] = validate( - prepackagedTimelineStatus, - checkTimelineStatusRt - ); - if (prepackagedTimelineStatusError != null) { - throw prepackagedTimelineStatusError; + const installResult = + InstallPrepackedTimelinesRequestBody.safeParse(prepackagedTimelineStatus); + + if (installResult.error) { + throw installResult.error; } - const timelinesToInstalled = - validatedprepackagedTimelineStatus?.timelinesToInstall.length ?? 0; - const timelinesNotUpdated = - validatedprepackagedTimelineStatus?.timelinesToUpdate.length ?? 0; + const timelinesToInstalled = installResult.data.timelinesToInstall.length ?? 0; + const timelinesNotUpdated = installResult.data.timelinesToUpdate.length ?? 0; let res = null; if (timelinesToInstalled > 0 || timelinesNotUpdated > 0) { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts index 5bdb4e0f93d67..e795ec89dd926 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts @@ -5,10 +5,13 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; -import type { ConfigType } from '../../../../..'; -import { copyTimelineSchema } from '../../../../../../common/api/timeline'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; +import { + CopyTimelineRequestBody, + type CopyTimelineResponse, +} from '../../../../../../common/api/timeline'; import { copyTimeline } from '../../../saved_object/timelines'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_COPY_URL } from '../../../../../../common/constants'; @@ -16,7 +19,7 @@ import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; -export const copyTimelineRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const copyTimelineRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .post({ path: TIMELINE_COPY_URL, @@ -29,17 +32,16 @@ export const copyTimelineRoute = (router: SecuritySolutionPluginRouter, _: Confi { version: '1', validate: { - request: { body: buildRouteValidationWithExcess(copyTimelineSchema) }, + request: { body: buildRouteValidationWithZod(CopyTimelineRequestBody) }, }, }, - async (context, request, response) => { + async (context, request, response): Promise> => { const siemResponse = buildSiemResponse(response); try { const frameworkRequest = await buildFrameworkRequest(context, request); const { timeline, timelineIdToCopy } = request.body; const copiedTimeline = await copyTimeline(frameworkRequest, timeline, timelineIdToCopy); - return response.ok({ body: { data: { persistTimeline: copiedTimeline } }, }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts index 1428f09d39560..ac05fe3f880e9 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts @@ -10,8 +10,9 @@ import { isEmpty } from 'lodash/fp'; import moment from 'moment'; import { timeline as timelineLib, pinnedEvent as pinnedEventLib } from '../../../saved_object'; import type { FrameworkRequest } from '../../../../framework'; -import type { ResponseTimeline, SavedTimeline, Note } from '../../../../../../common/api/timeline'; +import type { SavedTimeline, Note } from '../../../../../../common/api/timeline'; import { persistNotes } from '../../../saved_object/notes/persist_notes'; +import type { InternalTimelineResponse } from '../../../saved_object/timelines'; interface CreateTimelineProps { frameworkRequest: FrameworkRequest; @@ -21,7 +22,7 @@ interface CreateTimelineProps { overrideNotesOwner?: boolean; pinnedEventIds?: string[] | null; notes?: Note[]; - existingNoteIds?: string[]; + existingNoteIds?: string[] | null; isImmutable?: boolean; } @@ -40,7 +41,7 @@ export const createTimelines = async ({ existingNoteIds = [], isImmutable, overrideNotesOwner = true, -}: CreateTimelineProps): Promise => { +}: CreateTimelineProps): Promise => { const timerangeStart = isImmutable ? moment().subtract(24, 'hours').toISOString() : timeline.dateRange?.start; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts index 0fcf286661b96..95fb09fb28e56 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts @@ -7,16 +7,13 @@ import { transformError } from '@kbn/securitysolution-es-utils'; import type { IKibanaResponse } from '@kbn/core/server'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_URL } from '../../../../../../common/constants'; -import type { ConfigType } from '../../../../..'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; - import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; -import { createTimelineSchema } from '../../../../../../common/api/timeline'; import { buildFrameworkRequest, CompareTimelinesStatus, @@ -24,11 +21,14 @@ import { } from '../../../utils/common'; import { DEFAULT_ERROR } from '../../../utils/failure_cases'; import { createTimelines } from './helpers'; -import type { CreateTimelinesResponse } from '../../../../../../common/api/timeline'; +import { + CreateTimelinesRequestBody, + type CreateTimelinesResponse, +} from '../../../../../../common/api/timeline'; export * from './helpers'; -export const createTimelinesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const createTimelinesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .post({ path: TIMELINE_URL, @@ -42,7 +42,7 @@ export const createTimelinesRoute = (router: SecuritySolutionPluginRouter, _: Co version: '2023-10-31', validate: { request: { - body: buildRouteValidationWithExcess(createTimelineSchema), + body: buildRouteValidationWithZod(CreateTimelinesRequestBody), }, }, }, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts index a11b16c96fb1f..8dd476c9f4e44 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts @@ -5,9 +5,9 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; -import type { ConfigType } from '../../../../..'; import { DeleteTimelinesRequestBody, type DeleteTimelinesResponse, @@ -19,7 +19,7 @@ import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; import { deleteTimeline } from '../../../saved_object/timelines'; -export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter, config: ConfigType) => { +export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .delete({ path: TIMELINE_URL, @@ -35,7 +35,7 @@ export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter, confi request: { body: buildRouteValidationWithZod(DeleteTimelinesRequestBody) }, }, }, - async (context, request, response) => { + async (context, request, response): Promise> => { const siemResponse = buildSiemResponse(response); try { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/helpers.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/helpers.ts index 4974e6bd0edda..6e4f3d84da1ff 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/helpers.ts @@ -9,11 +9,11 @@ import { omit } from 'lodash/fp'; import { transformDataToNdjson } from '@kbn/securitysolution-utils'; import type { - ExportedTimelines, ExportedNotes, ExportTimelineNotFoundError, Note, PinnedEvent, + TimelineResponse, } from '../../../../../../common/api/timeline'; import type { FrameworkRequest } from '../../../../framework'; @@ -45,7 +45,7 @@ const getPinnedEventsIdsByTimelineId = (currentPinnedEvents: PinnedEvent[]): str const getTimelinesFromObjects = async ( request: FrameworkRequest, ids?: string[] | null -): Promise> => { +): Promise> => { const { timelines, errors } = await getSelectedTimelines(request, ids); const exportedIds = timelines.map((t) => t.savedObjectId); @@ -65,7 +65,7 @@ const getTimelinesFromObjects = async ( [] ); - const myResponse = exportedIds.reduce((acc, timelineId) => { + const myResponse = exportedIds.reduce((acc, timelineId) => { const myTimeline = timelines.find((t) => t.savedObjectId === timelineId); if (myTimeline != null) { const timelineNotes = myNotes.filter((n) => n.timelineId === timelineId); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts index 78df97fa441be..781da93355442 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { - serverMock, - requestContextMock, - createMockConfig, -} from '../../../../detection_engine/routes/__mocks__'; +import { serverMock, requestContextMock } from '../../../../detection_engine/routes/__mocks__'; import { getTimelineOrNull, getTimelineTemplateOrNull } from '../../../saved_object/timelines'; import { getTimelineRequest } from '../../../__mocks__/request_responses'; @@ -33,7 +29,7 @@ describe('get timeline', () => { server = serverMock.create(); context = requestContextMock.createTools().context; - getTimelineRoute(server.router, createMockConfig()); + getTimelineRoute(server.router); }); test('should call getTimelineTemplateOrNull if templateTimelineId is given', async () => { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts index 321e6aafe4903..870955f7e8691 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts @@ -5,25 +5,24 @@ * 2.0. */ +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_URL } from '../../../../../../common/constants'; -import type { ConfigType } from '../../../../..'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; - import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; -import { getTimelineQuerySchema } from '../../../../../../common/api/timeline'; -import { getTimelineTemplateOrNull, getTimelineOrNull } from '../../../saved_object/timelines'; -import type { - TimelineSavedObject, - ResolvedTimelineWithOutcomeSavedObject, +import { + GetTimelineRequestQuery, + type GetTimelineResponse, } from '../../../../../../common/api/timeline'; +import { getTimelineTemplateOrNull, getTimelineOrNull } from '../../../saved_object/timelines'; +import type { ResolvedTimeline, TimelineResponse } from '../../../../../../common/api/timeline'; -export const getTimelineRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const getTimelineRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .get({ path: TIMELINE_URL, @@ -36,16 +35,16 @@ export const getTimelineRoute = (router: SecuritySolutionPluginRouter, _: Config { version: '2023-10-31', validate: { - request: { query: buildRouteValidationWithExcess(getTimelineQuerySchema) }, + request: { query: buildRouteValidationWithZod(GetTimelineRequestQuery) }, }, }, - async (context, request, response) => { + async (context, request, response): Promise> => { try { const frameworkRequest = await buildFrameworkRequest(context, request); const query = request.query ?? {}; const { template_timeline_id: templateTimelineId, id } = query; - let res: TimelineSavedObject | ResolvedTimelineWithOutcomeSavedObject | null = null; + let res: TimelineResponse | ResolvedTimeline | null = null; if (templateTimelineId != null && id == null) { res = await getTimelineTemplateOrNull(frameworkRequest, templateTimelineId); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts index b006b77c9a595..753ac1eb15aea 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { - serverMock, - requestContextMock, - createMockConfig, -} from '../../../../detection_engine/routes/__mocks__'; +import { serverMock, requestContextMock } from '../../../../detection_engine/routes/__mocks__'; import { getAllTimeline } from '../../../saved_object/timelines'; import { getTimelineRequest } from '../../../__mocks__/request_responses'; import { getTimelinesRoute } from '.'; @@ -29,7 +25,7 @@ describe('get all timelines', () => { server = serverMock.create(); context = requestContextMock.createTools().context; - getTimelinesRoute(server.router, createMockConfig()); + getTimelinesRoute(server.router); }); test('should get the total count', async () => { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts index 97d9bf51a0876..52995efcf4be1 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts @@ -5,24 +5,23 @@ * 2.0. */ -import { pipe } from 'fp-ts/lib/pipeable'; -import { fold } from 'fp-ts/lib/Either'; -import { identity } from 'fp-ts/lib/function'; +import type { IKibanaResponse } from '@kbn/core-http-server'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import { transformError } from '@kbn/securitysolution-es-utils'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINES_URL } from '../../../../../../common/constants'; -import type { ConfigType } from '../../../../..'; - import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; -import { CustomHttpRequestError } from '../../../../../utils/custom_http_request_error'; -import { buildFrameworkRequest, escapeHatch, throwErrors } from '../../../utils/common'; +import { buildFrameworkRequest } from '../../../utils/common'; import { getAllTimeline } from '../../../saved_object/timelines'; -import { getTimelinesQuerySchema } from '../../../../../../common/api/timeline'; +import { + GetTimelinesRequestQuery, + type GetTimelinesResponse, +} from '../../../../../../common/api/timeline'; -export const getTimelinesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const getTimelinesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .get({ path: TIMELINES_URL, @@ -34,27 +33,23 @@ export const getTimelinesRoute = (router: SecuritySolutionPluginRouter, _: Confi .addVersion( { validate: { - request: { query: escapeHatch }, + request: { query: buildRouteValidationWithZod(GetTimelinesRequestQuery) }, }, version: '2023-10-31', }, - async (context, request, response) => { - const customHttpRequestError = (message: string) => - new CustomHttpRequestError(message, 400); + async (context, request, response): Promise> => { try { const frameworkRequest = await buildFrameworkRequest(context, request); - const queryParams = pipe( - getTimelinesQuerySchema.decode(request.query), - fold(throwErrors(customHttpRequestError), identity) - ); - const onlyUserFavorite = queryParams?.only_user_favorite === 'true' ? true : false; - const pageSize = queryParams?.page_size ? parseInt(queryParams.page_size, 10) : null; - const pageIndex = queryParams?.page_index ? parseInt(queryParams.page_index, 10) : null; - const search = queryParams?.search ?? null; - const sortField = queryParams?.sort_field ?? null; - const sortOrder = queryParams?.sort_order ?? null; - const status = queryParams?.status ?? null; - const timelineType = queryParams?.timeline_type ?? null; + const onlyUserFavorite = request.query?.only_user_favorite === 'true'; + const pageSize = request.query?.page_size ? parseInt(request.query.page_size, 10) : null; + const pageIndex = request.query?.page_index + ? parseInt(request.query.page_index, 10) + : null; + const search = request.query?.search ?? null; + const sortField = request.query?.sort_field ?? null; + const sortOrder = request.query?.sort_order ?? null; + const status = request.query?.status ?? null; + const timelineType = request.query?.timeline_type ?? null; const sort = sortField && sortOrder ? { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts index 65f3510c75f8c..83a25ee38cd63 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts @@ -5,11 +5,7 @@ * 2.0. */ -import type * as rt from 'io-ts'; import type { Transform } from 'stream'; -import { pipe } from 'fp-ts/lib/pipeable'; -import { fold } from 'fp-ts/lib/Either'; -import { identity } from 'fp-ts/lib/function'; import { createConcatStream, createSplitStream, createMapStream } from '@kbn/utils'; import { BadRequestError } from '@kbn/securitysolution-es-utils'; import { @@ -19,23 +15,15 @@ import { } from '../../../../../utils/read_stream/create_stream_from_ndjson'; import type { ImportTimelineResponse } from './types'; -import { ImportTimelinesSchemaRt } from '../../../../../../common/api/timeline'; -import { throwErrors } from '../../../utils/common'; +import { ImportTimelines } from '../../../../../../common/api/timeline'; +import { parseOrThrowErrorFactory } from '../../../../../../common/timelines/zod_errors'; -type ErrorFactory = (message: string) => Error; +const createPlainError = (message: string) => new Error(message); +const parseOrThrow = parseOrThrowErrorFactory(createPlainError); -export const createPlainError = (message: string) => new Error(message); - -export const decodeOrThrow = - (runtimeType: rt.Type, createError: ErrorFactory = createPlainError) => - (inputValue: I) => - pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); - -export const validateTimelines = (): Transform => +const validateTimelines = (): Transform => createMapStream((obj: ImportTimelineResponse) => - obj instanceof Error - ? new BadRequestError(obj.message) - : decodeOrThrow(ImportTimelinesSchemaRt)(obj) + obj instanceof Error ? new BadRequestError(obj.message) : parseOrThrow(ImportTimelines)(obj) ); export const createTimelinesStreamFromNdJson = (ruleLimit: number) => { return [ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts index 6f7767247396d..5539631c66a67 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts @@ -10,12 +10,8 @@ import type { Readable } from 'stream'; import { v4 as uuidv4 } from 'uuid'; import { createPromiseFromStreams } from '@kbn/utils'; -import { validate } from '@kbn/securitysolution-io-ts-utils'; -import type { ImportTimelineResultSchema } from '../../../../../../common/api/timeline'; -import { - importTimelineResultSchema, - TimelineStatusEnum, -} from '../../../../../../common/api/timeline'; +import { stringifyZodError } from '@kbn/zod-helpers'; +import { ImportTimelineResult, TimelineStatusEnum } from '../../../../../../common/api/timeline'; import type { BulkError } from '../../../../detection_engine/routes/utils'; import { createBulkErrorObject } from '../../../../detection_engine/routes/utils'; @@ -88,7 +84,7 @@ export const importTimelines = async ( maxTimelineImportExportSize: number, frameworkRequest: FrameworkRequest, isImmutable?: boolean -): Promise => { +): Promise => { const readStream = createTimelinesStreamFromNdJson(maxTimelineImportExportSize); const parsedObjects = await createPromiseFromStreams([file, ...readStream]); @@ -262,17 +258,17 @@ export const importTimelines = async ( const timelinesUpdated = importTimelineResponse.filter( (resp) => isImportRegular(resp) && resp.action === 'updateViaImport' ); - const importTimelinesRes: ImportTimelineResultSchema = { + const importTimelinesRes: ImportTimelineResult = { success: errorsResp.length === 0, success_count: successes.length, errors: errorsResp, timelines_installed: timelinesInstalled.length ?? 0, timelines_updated: timelinesUpdated.length ?? 0, }; - const [validated, errors] = validate(importTimelinesRes, importTimelineResultSchema); - if (errors != null || validated == null) { - return new Error(errors || 'Import timeline error'); + const parseResult = ImportTimelineResult.safeParse(importTimelinesRes); + if (parseResult.success && parseResult.data) { + return parseResult.data; } else { - return validated; + return new Error(stringifyZodError(parseResult.error) || 'Import timeline error'); } }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.test.ts index 3415df46e9ac4..5528d92d34240 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.test.ts @@ -39,7 +39,6 @@ import { describe('import timelines', () => { let server: ReturnType; - let request: ReturnType; let securitySetup: SecurityPluginSetup; let { context } = requestContextMock.createTools(); let mockGetTimeline: jest.Mock; @@ -452,48 +451,6 @@ describe('import timelines', () => { }); }); }); - - describe('request validation', () => { - beforeEach(() => { - jest.doMock('../../../saved_object/timelines', () => { - return { - getTimelineOrNull: mockGetTimeline.mockReturnValue(null), - persistTimeline: mockPersistTimeline.mockReturnValue({ - timeline: { savedObjectId: '79deb4c0-6bc1-11ea-9999-f5341fb7a189' }, - }), - }; - }); - - jest.doMock('../../../saved_object/pinned_events', () => { - return { - savePinnedEvents: mockPersistPinnedEventOnTimeline.mockReturnValue( - new Error('Test error') - ), - }; - }); - - jest.doMock('../../../saved_object/notes/saved_object', () => { - return { - persistNote: mockPersistNote, - }; - }); - }); - test('disallows invalid query', async () => { - request = requestMock.create({ - method: 'post', - path: TIMELINE_EXPORT_URL, - body: { id: 'someId' }, - }); - const importTimelinesRoute = jest.requireActual('.').importTimelinesRoute; - - importTimelinesRoute(server.router, createMockConfig(), securitySetup); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - 'Invalid value {"id":"someId"}, excess properties: ["id"]' - ); - }); - }); }); describe('import timeline templates', () => { @@ -904,7 +861,7 @@ describe('import timeline templates', () => { request = requestMock.create({ method: 'post', path: TIMELINE_EXPORT_URL, - body: { id: 'someId' }, + body: { isImmutable: 1 }, }); const importTimelinesRoute = jest.requireActual('.').importTimelinesRoute; @@ -912,7 +869,7 @@ describe('import timeline templates', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'Invalid value {"id":"someId"}, excess properties: ["id"]' + "isImmutable: Expected 'true' | 'false', received number" ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts index be5ebc44e7faa..59a86238941ab 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts @@ -7,18 +7,23 @@ import { extname } from 'path'; import type { Readable } from 'stream'; +import { get } from 'lodash/fp'; +import type { IKibanaResponse } from '@kbn/core-http-server'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import { transformError } from '@kbn/securitysolution-es-utils'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_IMPORT_URL } from '../../../../../../common/constants'; import type { ConfigType } from '../../../../../config'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { importTimelines } from './helpers'; -import { ImportTimelinesPayloadSchemaRt } from '../../../../../../common/api/timeline'; +import { + ImportTimelinesRequestBody, + type ImportTimelinesResponse, +} from '../../../../../../common/api/timeline'; import { buildFrameworkRequest } from '../../../utils/common'; export { importTimelines } from './helpers'; @@ -39,11 +44,13 @@ export const importTimelinesRoute = (router: SecuritySolutionPluginRouter, confi .addVersion( { validate: { - request: { body: buildRouteValidationWithExcess(ImportTimelinesPayloadSchemaRt) }, + request: { + body: buildRouteValidationWithZod(ImportTimelinesRequestBody), + }, }, version: '2023-10-31', }, - async (context, request, response) => { + async (context, request, response): Promise> => { try { const siemResponse = buildSiemResponse(response); const savedObjectsClient = (await context.core).savedObjects.client; @@ -52,7 +59,7 @@ export const importTimelinesRoute = (router: SecuritySolutionPluginRouter, confi } const { file, isImmutable } = request.body; - const { filename } = file.hapi; + const filename = extractFilename(file); const fileExtension = extname(filename).toLowerCase(); if (fileExtension !== '.ndjson') { @@ -69,8 +76,11 @@ export const importTimelinesRoute = (router: SecuritySolutionPluginRouter, confi frameworkRequest, isImmutable === 'true' ); - if (typeof res !== 'string') return response.ok({ body: res ?? {} }); - else throw res; + if (res instanceof Error || typeof res === 'string') { + throw res; + } else { + return response.ok({ body: res ?? {} }); + } } catch (err) { const error = transformError(err); const siemResponse = buildSiemResponse(response); @@ -82,3 +92,11 @@ export const importTimelinesRoute = (router: SecuritySolutionPluginRouter, confi } ); }; + +function extractFilename(fileObj: unknown) { + const filename = get('hapi.filename', fileObj); + if (filename && typeof filename === 'string') { + return filename; + } + throw new Error('`filename` missing in file'); +} diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts index 1c3cba9fdcb91..1297f0cb1a829 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts @@ -7,22 +7,22 @@ import { transformError } from '@kbn/securitysolution-es-utils'; import type { IKibanaResponse } from '@kbn/core/server'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_URL } from '../../../../../../common/constants'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; -import type { ConfigType } from '../../../../..'; - import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; -import { patchTimelineSchema } from '../../../../../../common/api/timeline'; +import { + PatchTimelineRequestBody, + type PatchTimelineResponse, +} from '../../../../../../common/api/timeline'; import { buildFrameworkRequest, TimelineStatusActions } from '../../../utils/common'; import { createTimelines } from '../create_timelines'; import { CompareTimelinesStatus } from '../../../utils/compare_timelines_status'; -import type { PatchTimelinesResponse } from '../../../../../../common/api/timeline'; -export const patchTimelinesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const patchTimelinesRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .patch({ path: TIMELINE_URL, @@ -34,11 +34,11 @@ export const patchTimelinesRoute = (router: SecuritySolutionPluginRouter, _: Con .addVersion( { validate: { - request: { body: buildRouteValidationWithExcess(patchTimelineSchema) }, + request: { body: buildRouteValidationWithZod(PatchTimelineRequestBody) }, }, version: '2023-10-31', }, - async (context, request, response): Promise> => { + async (context, request, response): Promise> => { const siemResponse = buildSiemResponse(response); try { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts index b8416b9ffe7bc..cf66c02cf9c97 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts @@ -5,14 +5,13 @@ * 2.0. */ +import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_FAVORITE_URL } from '../../../../../../common/constants'; -import type { ConfigType } from '../../../../..'; - import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; @@ -23,7 +22,7 @@ import { TimelineTypeEnum, } from '../../../../../../common/api/timeline'; -export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .patch({ path: TIMELINE_FAVORITE_URL, @@ -39,7 +38,11 @@ export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter, _: Co request: { body: buildRouteValidationWithZod(PersistFavoriteRouteRequestBody) }, }, }, - async (context, request, response) => { + async ( + context, + request, + response + ): Promise> => { const siemResponse = buildSiemResponse(response); try { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts index 09549f9b9034f..0afc7d21ae296 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts @@ -6,24 +6,24 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; +import type { IKibanaResponse } from '@kbn/core-http-server'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; + import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_RESOLVE_URL } from '../../../../../../common/constants'; -import type { ConfigType } from '../../../../..'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; - import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; -import { getTimelineQuerySchema } from '../../../../../../common/api/timeline'; -import { getTimelineTemplateOrNull, resolveTimelineOrNull } from '../../../saved_object/timelines'; -import type { - SavedTimeline, - ResolvedTimelineWithOutcomeSavedObject, +import { + ResolveTimelineRequestQuery, + type ResolveTimelineResponse, } from '../../../../../../common/api/timeline'; +import { getTimelineTemplateOrNull, resolveTimelineOrNull } from '../../../saved_object/timelines'; +import type { SavedTimeline, ResolvedTimeline } from '../../../../../../common/api/timeline'; -export const resolveTimelineRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { +export const resolveTimelineRoute = (router: SecuritySolutionPluginRouter) => { router.versioned .get({ path: TIMELINE_RESOLVE_URL, @@ -36,16 +36,16 @@ export const resolveTimelineRoute = (router: SecuritySolutionPluginRouter, _: Co { version: '2023-10-31', validate: { - request: { query: buildRouteValidationWithExcess(getTimelineQuerySchema) }, + request: { query: buildRouteValidationWithZod(ResolveTimelineRequestQuery) }, }, }, - async (context, request, response) => { + async (context, request, response): Promise> => { try { const frameworkRequest = await buildFrameworkRequest(context, request); const query = request.query ?? {}; const { template_timeline_id: templateTimelineId, id } = query; - let res: SavedTimeline | ResolvedTimelineWithOutcomeSavedObject | null = null; + let res: SavedTimeline | ResolvedTimeline | null = null; if (templateTimelineId != null && id == null) { // Template timelineId is not a SO id, so it does not need to be updated to use resolve diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts index a12aaeb010234..571e0f4da8616 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts @@ -13,7 +13,7 @@ import type { Note } from '../../../../../common/api/timeline'; export const persistNotes = async ( frameworkRequest: FrameworkRequest, timelineSavedObjectId: string, - existingNoteIds?: string[], + existingNoteIds?: string[] | null, newNotes?: Note[], overrideOwner: boolean = true ) => { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/convert_saved_object_to_savedtimeline.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/convert_saved_object_to_savedtimeline.ts index 2cde936f1c462..88054f0eb6953 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/convert_saved_object_to_savedtimeline.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/convert_saved_object_to_savedtimeline.ts @@ -16,7 +16,7 @@ import { SavedObjectTimelineType, SavedObjectTimelineStatus, } from '../../../../../common/types/timeline/saved_object'; -import type { TimelineSavedObject } from '../../../../../common/api/timeline'; +import type { TimelineResponse } from '../../../../../common/api/timeline'; import { type TimelineType, TimelineTypeEnum, @@ -49,7 +49,7 @@ const getTimelineTypeAndStatus = ( }; }; -export const convertSavedObjectToSavedTimeline = (savedObject: unknown): TimelineSavedObject => +export const convertSavedObjectToSavedTimeline = (savedObject: unknown): TimelineResponse => pipe( TimelineSavedObjectWithDraftRuntime.decode(savedObject), map((savedTimeline) => { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts index 20049a63bddba..7e25a38363e2a 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts @@ -23,8 +23,8 @@ import { getNotesByTimelineId, persistNote } from '../notes/saved_object'; import { getAllPinnedEventsByTimelineId, persistPinnedEventOnTimeline } from '../pinned_events'; import { TimelineTypeEnum } from '../../../../../common/api/timeline'; import type { - AllTimelinesResponse, - ResolvedTimelineWithOutcomeSavedObject, + GetTimelinesResponse, + ResolvedTimeline, SavedTimeline, } from '../../../../../common/api/timeline'; import { @@ -141,7 +141,7 @@ describe('saved_object', () => { pageSize: 10, pageIndex: 1, }; - let result = null as unknown as AllTimelinesResponse; + let result = null as unknown as GetTimelinesResponse; beforeEach(async () => { (convertSavedObjectToSavedTimeline as jest.Mock).mockReturnValue(mockGetTimelineValue); mockFindSavedObject = jest @@ -275,7 +275,7 @@ describe('saved_object', () => { describe('resolveTimelineOrNull', () => { let mockResolveSavedObject: jest.Mock; let mockRequest: FrameworkRequest; - let result: ResolvedTimelineWithOutcomeSavedObject | null = null; + let result: ResolvedTimeline | null = null; beforeEach(async () => { (convertSavedObjectToSavedTimeline as jest.Mock).mockReturnValue(mockResolvedTimeline); mockResolveSavedObject = jest.fn().mockReturnValue(mockResolvedSavedObject); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts index 08eeda3d8ab56..c3016164d4e7e 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts @@ -19,20 +19,17 @@ import type { Note, BareNote, PinnedEvent, - AllTimelinesResponse, + GetTimelinesResponse, ExportTimelineNotFoundError, PageInfoTimeline, - ResponseTimelines, FavoriteTimelineResponse, - ResponseTimeline, SortTimeline, - TimelineResult, + TimelineResponse, TimelineType, TimelineStatus, - ResolvedTimelineWithOutcomeSavedObject, - TimelineSavedObject, + ResolvedTimeline, SavedTimeline, - TimelineWithoutExternalRefs, + SavedTimelineWithSavedObjectId, } from '../../../../../common/api/timeline'; import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline'; import type { SavedObjectTimelineWithoutExternalRefs } from '../../../../../common/types/timeline/saved_object'; @@ -49,11 +46,13 @@ import { timelineFieldsMigrator } from './field_migrator'; export { pickSavedTimeline } from './pick_saved_timeline'; export { convertSavedObjectToSavedTimeline } from './convert_saved_object_to_savedtimeline'; +type TimelineWithoutExternalRefs = Omit; + export const getTimeline = async ( request: FrameworkRequest, timelineId: string, timelineType: TimelineType | null = TimelineTypeEnum.default -): Promise => { +): Promise => { let timelineIdToUse = timelineId; try { if (timelineType === TimelineTypeEnum.template) { @@ -77,7 +76,7 @@ export const getTimeline = async ( export const getTimelineOrNull = async ( frameworkRequest: FrameworkRequest, savedObjectId: string -): Promise => { +): Promise => { let timeline = null; try { timeline = await getTimeline(frameworkRequest, savedObjectId); @@ -89,23 +88,19 @@ export const getTimelineOrNull = async ( export const resolveTimelineOrNull = async ( frameworkRequest: FrameworkRequest, savedObjectId: string -): Promise => { - let resolvedTimeline = null; +): Promise => { try { - resolvedTimeline = await resolveSavedTimeline(frameworkRequest, savedObjectId); - // eslint-disable-next-line no-empty - } catch (e) {} - return resolvedTimeline; - // } + const resolvedTimeline = await resolveSavedTimeline(frameworkRequest, savedObjectId); + return resolvedTimeline; + } catch (e) { + return null; + } }; export const getTimelineByTemplateTimelineId = async ( request: FrameworkRequest, templateTimelineId: string -): Promise<{ - totalCount: number; - timeline: TimelineSavedObject[]; -}> => { +): Promise => { const options: SavedObjectsFindOptions = { type: timelineSavedObjectType, filter: `siem-ui-timeline.attributes.templateTimelineId: "${templateTimelineId}"`, @@ -117,7 +112,7 @@ export const getTimelineByTemplateTimelineId = async ( export const getTimelineTemplateOrNull = async ( frameworkRequest: FrameworkRequest, templateTimelineId: string -): Promise => { +): Promise => { let templateTimeline = null; try { templateTimeline = await getTimelineByTemplateTimelineId(frameworkRequest, templateTimelineId); @@ -190,10 +185,7 @@ export const getExistingPrepackagedTimelines = async ( request: FrameworkRequest, countsOnly?: boolean, pageInfo?: PageInfoTimeline -): Promise<{ - totalCount: number; - timeline: TimelineSavedObject[]; -}> => { +): Promise => { const queryPageInfo = countsOnly && pageInfo == null ? { @@ -218,7 +210,7 @@ export const getAllTimeline = async ( sort: SortTimeline | null, status: TimelineStatus | null, timelineType: TimelineType | null -): Promise => { +): Promise => { const searchTerm = search != null ? search : undefined; const searchFields = ['title', 'description']; const filter = combineFilters([ @@ -291,7 +283,7 @@ export const getAllTimeline = async ( export const getDraftTimeline = async ( request: FrameworkRequest, timelineType: TimelineType | null -): Promise => { +): Promise => { const filter = combineFilters([ getTimelineTypeFilter(timelineType ?? null, TimelineStatusEnum.draft), getTimelinesCreatedAndUpdatedByCurrentUser({ request }), @@ -385,13 +377,19 @@ export const persistFavorite = async ( } }; +export interface InternalTimelineResponse { + code: number; + message: string; + timeline: TimelineResponse; +} + export const persistTimeline = async ( request: FrameworkRequest, timelineId: string | null, version: string | null, timeline: SavedTimeline, isImmutable?: boolean -): Promise => { +): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; const userInfo = isImmutable ? ({ username: 'Elastic' } as AuthenticatedUser) : request.user; try { @@ -414,7 +412,7 @@ export const persistTimeline = async ( timeline: await getSavedTimeline(request, timelineId), }; } else if (getOr(null, 'output.statusCode', err) === 403) { - const timelineToReturn: TimelineResult = { + const timelineToReturn: TimelineResponse = { ...timeline, savedObjectId: '', version: '', @@ -439,7 +437,7 @@ export const createTimeline = async ({ timeline: SavedTimeline; savedObjectsClient: SavedObjectsClientContract; userInfo: AuthenticatedUser | null; -}) => { +}): Promise => { const { transformedFields: migratedAttributes, references } = timelineFieldsMigrator.extractFieldsToReferences({ data: pickSavedTimeline(timelineId, timeline, userInfo), @@ -479,7 +477,7 @@ const updateTimeline = async ({ savedObjectsClient: SavedObjectsClientContract; userInfo: AuthenticatedUser | null; version: string | null; -}) => { +}): Promise => { const rawTimelineSavedObject = await savedObjectsClient.get( timelineSavedObjectType, @@ -516,11 +514,12 @@ export const updatePartialSavedTimeline = async ( timelineId ); - const { transformedFields, references } = - timelineFieldsMigrator.extractFieldsToReferences({ - data: timeline, - existingReferences: currentSavedTimeline.references, - }); + const { transformedFields, references } = timelineFieldsMigrator.extractFieldsToReferences< + Omit + >({ + data: timeline, + existingReferences: currentSavedTimeline.references, + }); const timelineUpdateAttributes = pickSavedTimeline( null, @@ -588,7 +587,7 @@ export const copyTimeline = async ( request: FrameworkRequest, timeline: SavedTimeline, timelineId: string -): Promise => { +): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; // Fetch all objects that need to be copied @@ -658,7 +657,10 @@ const resolveBasicSavedTimeline = async (request: FrameworkRequest, timelineId: }; }; -const resolveSavedTimeline = async (request: FrameworkRequest, timelineId: string) => { +const resolveSavedTimeline = async ( + request: FrameworkRequest, + timelineId: string +): Promise => { const userName = request.user?.username ?? UNAUTHENTICATED_USER; const { resolvedTimelineSavedObject, ...resolveAttributes } = await resolveBasicSavedTimeline( @@ -673,7 +675,6 @@ const resolveSavedTimeline = async (request: FrameworkRequest, timelineId: strin ]); const [notes, pinnedEvents, timeline] = timelineWithNotesAndPinnedEvents; - return { timeline: timelineWithReduxProperties(notes, pinnedEvents, timeline, userName), ...resolveAttributes, @@ -742,9 +743,9 @@ export const convertStringToBase64 = (text: string): string => Buffer.from(text) export const timelineWithReduxProperties = ( notes: Note[], pinnedEvents: PinnedEvent[], - timeline: TimelineSavedObject, + timeline: TimelineResponse, userName: string -): TimelineSavedObject => ({ +): TimelineResponse => ({ ...timeline, favorite: timeline.favorite != null && userName != null @@ -789,7 +790,7 @@ export const getSelectedTimelines = async ( ); const timelineObjects: { - timelines: TimelineSavedObject[]; + timelines: TimelineResponse[]; errors: ExportTimelineNotFoundError[]; } = savedObjects.saved_objects.reduce( (acc, savedObject) => { @@ -805,7 +806,7 @@ export const getSelectedTimelines = async ( return { errors: [...acc.errors, savedObject.error], timelines: acc.timelines }; }, { - timelines: [] as TimelineSavedObject[], + timelines: [] as TimelineResponse[], errors: [] as ExportTimelineNotFoundError[], } ); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/pick_saved_timeline.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/pick_saved_timeline.ts index 50b57bf96bd5b..221e088bdab02 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/pick_saved_timeline.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/pick_saved_timeline.ts @@ -9,14 +9,14 @@ import { isEmpty } from 'lodash/fp'; import type { AuthenticatedUser } from '@kbn/security-plugin/common'; import { getUserDisplayName } from '@kbn/user-profile-components'; import { UNAUTHENTICATED_USER } from '../../../../../common/constants'; -import type { SavedTimelineWithSavedObjectId } from '../../../../../common/api/timeline'; +import type { SavedTimeline } from '../../../../../common/api/timeline'; import { TimelineTypeEnum, TimelineStatusEnum } from '../../../../../common/api/timeline'; export const pickSavedTimeline = ( timelineId: string | null, - savedTimeline: SavedTimelineWithSavedObjectId, + savedTimeline: SavedTimeline, userInfo: AuthenticatedUser | null -): SavedTimelineWithSavedObjectId => { +): SavedTimeline => { const dateNow = new Date().valueOf(); if (timelineId == null) { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/utils/check_timelines_status.ts b/x-pack/plugins/security_solution/server/lib/timeline/utils/check_timelines_status.ts index a5e88a3ea04d5..caf4bee68e70f 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/utils/check_timelines_status.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/utils/check_timelines_status.ts @@ -7,9 +7,9 @@ import path, { join, resolve } from 'path'; import type { - CheckTimelineStatusRt, - TimelineSavedObject, - ImportTimelinesSchema, + TimelineResponse, + ImportTimelines, + InstallPrepackedTimelinesRequestBody, } from '../../../../common/api/timeline'; import type { FrameworkRequest } from '../../framework'; @@ -19,9 +19,9 @@ import { getExistingPrepackagedTimelines } from '../saved_object/timelines'; import { loadData, getReadables } from './common'; export const getTimelinesToUpdate = ( - timelinesFromFileSystem: ImportTimelinesSchema[], - installedTimelines: TimelineSavedObject[] -): ImportTimelinesSchema[] => { + timelinesFromFileSystem: ImportTimelines[], + installedTimelines: TimelineResponse[] +): ImportTimelines[] => { return timelinesFromFileSystem.filter((timeline) => installedTimelines.some((installedTimeline) => { return ( @@ -34,9 +34,9 @@ export const getTimelinesToUpdate = ( }; export const getTimelinesToInstall = ( - timelinesFromFileSystem: ImportTimelinesSchema[], - installedTimelines: TimelineSavedObject[] -): ImportTimelinesSchema[] => { + timelinesFromFileSystem: ImportTimelines[], + installedTimelines: TimelineResponse[] +): ImportTimelines[] => { return timelinesFromFileSystem.filter( (timeline) => !installedTimelines.some( @@ -49,11 +49,11 @@ export const checkTimelinesStatus = async ( frameworkRequest: FrameworkRequest, filePath?: string, fileName?: string -): Promise => { +): Promise => { let readStream; let timeline: { totalCount: number; - timeline: TimelineSavedObject[]; + timeline: TimelineResponse[]; }; const dir = resolve( join( @@ -75,7 +75,7 @@ export const checkTimelinesStatus = async ( }; } - return loadData<'utf-8', CheckTimelineStatusRt>( + return loadData<'utf-8', InstallPrepackedTimelinesRequestBody>( readStream, (timelinesFromFileSystem: T) => { if (Array.isArray(timelinesFromFileSystem)) { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts b/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts index edee5ee4cd912..259719a18bdf0 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type * as rt from 'io-ts'; + import { set } from '@kbn/safer-lodash-set/fp'; import readline from 'readline'; import fs from 'fs'; @@ -13,7 +13,6 @@ import { createListStream } from '@kbn/utils'; import { schema } from '@kbn/config-schema'; import type { KibanaRequest, RequestHandlerContext } from '@kbn/core/server'; -import { formatErrors } from '@kbn/securitysolution-io-ts-utils'; import type { FrameworkRequest } from '../../framework'; @@ -38,12 +37,6 @@ export const buildFrameworkRequest = async ( export const escapeHatch = schema.object({}, { unknowns: 'allow' }); -type ErrorFactory = (message: string) => Error; - -export const throwErrors = (createError: ErrorFactory) => (errors: rt.Errors) => { - throw createError(formatErrors(errors).join('\n')); -}; - export const getReadables = (dataPath: string): Promise => new Promise((resolved, reject) => { const contents: string[] = []; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.test.ts index e5e247c1209fe..716bacaacf5ac 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.test.ts @@ -26,7 +26,7 @@ import { NOT_ALLOW_UPDATE_STATUS_ERROR_MESSAGE, TEMPLATE_TIMELINE_VERSION_CONFLICT_MESSAGE, } from './failure_cases'; -import type { TimelineSavedObject } from '../../../../common/api/timeline'; +import type { TimelineResponse } from '../../../../common/api/timeline'; import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline'; import { mockGetTimelineValue, mockGetTemplateTimelineValue } from '../__mocks__/import_timelines'; @@ -69,7 +69,7 @@ describe('failure cases', () => { const version = null; const templateTimelineVersion = null; const templateTimelineId = null; - const existTimeline = mockGetTimelineValue as TimelineSavedObject; + const existTimeline = mockGetTimelineValue as TimelineResponse; const existTemplateTimeline = null; const result = checkIsCreateFailureCases( isHandlingTemplateTimeline, @@ -94,7 +94,7 @@ describe('failure cases', () => { const templateTimelineVersion = 1; const templateTimelineId = 'template-timeline-id-one'; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsCreateFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -144,7 +144,7 @@ describe('failure cases', () => { const templateTimelineVersion = null; const templateTimelineId = null; const existTimeline = { - ...(mockGetTimelineValue as TimelineSavedObject), + ...(mockGetTimelineValue as TimelineResponse), status: TimelineStatusEnum.immutable, }; const existTemplateTimeline = null; @@ -172,7 +172,7 @@ describe('failure cases', () => { const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; const existTemplateTimeline = { - ...(mockGetTemplateTimelineValue as TimelineSavedObject), + ...(mockGetTemplateTimelineValue as TimelineResponse), status: TimelineStatusEnum.immutable, }; const result = checkIsUpdateFailureCases( @@ -198,7 +198,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -246,10 +246,10 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = { - ...(mockGetTemplateTimelineValue as TimelineSavedObject), + ...(mockGetTemplateTimelineValue as TimelineResponse), savedObjectId: 'someOtherId', }; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -273,7 +273,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -297,7 +297,7 @@ describe('failure cases', () => { const templateTimelineVersion = null; const templateTimelineId = null; const existTimeline = { - ...(mockGetTemplateTimelineValue as TimelineSavedObject), + ...(mockGetTemplateTimelineValue as TimelineResponse), savedObjectId: 'someOtherId', }; const existTemplateTimeline = null; @@ -326,7 +326,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsCreateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.draft, @@ -350,7 +350,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsCreateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -373,7 +373,7 @@ describe('failure cases', () => { const version = mockGetTimelineValue.version; const templateTimelineVersion = null; const templateTimelineId = null; - const existTimeline = mockGetTimelineValue as TimelineSavedObject; + const existTimeline = mockGetTimelineValue as TimelineResponse; const existTemplateTimeline = null; const result = checkIsCreateViaImportFailureCases( isHandlingTemplateTimeline, @@ -399,7 +399,7 @@ describe('failure cases', () => { const version = mockGetTimelineValue.version; const templateTimelineVersion = null; const templateTimelineId = null; - const existTimeline = mockGetTimelineValue as TimelineSavedObject; + const existTimeline = mockGetTimelineValue as TimelineResponse; const existTemplateTimeline = null; const result = checkIsUpdateViaImportFailureCases( isHandlingTemplateTimeline, @@ -424,7 +424,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -448,7 +448,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.immutable, @@ -496,10 +496,10 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = { - ...(mockGetTemplateTimelineValue as TimelineSavedObject), + ...(mockGetTemplateTimelineValue as TimelineResponse), savedObjectId: 'someOtherId', }; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -523,7 +523,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, @@ -547,7 +547,7 @@ describe('failure cases', () => { const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; const existTimeline = null; - const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineResponse; const result = checkIsUpdateViaImportFailureCases( isHandlingTemplateTimeline, TimelineStatusEnum.active, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.ts b/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.ts index 045793e2251ba..7dace57181239 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/utils/failure_cases.ts @@ -6,7 +6,7 @@ */ import { isEmpty } from 'lodash/fp'; -import type { TimelineType, TimelineSavedObject } from '../../../../common/api/timeline'; +import type { TimelineType, TimelineResponse } from '../../../../common/api/timeline'; import { type TimelineStatus, TimelineStatusEnum } from '../../../../common/api/timeline'; export const UPDATE_TIMELINE_ERROR_MESSAGE = @@ -42,8 +42,8 @@ export const DEFAULT_ERROR = `Something has gone wrong. We didn't handle somethi const isUpdatingStatus = ( isHandlingTemplateTimeline: boolean, status: TimelineStatus | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { const obj = isHandlingTemplateTimeline ? existTemplateTimeline : existTimeline; return obj?.status === TimelineStatusEnum.immutable ? UPDATE_STATUS_ERROR_MESSAGE : null; @@ -76,8 +76,8 @@ const commonUpdateTemplateTimelineCheck = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (isHandlingTemplateTimeline) { if ( @@ -129,8 +129,8 @@ const commonUpdateTimelineCheck = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (existTimeline == null) { // timeline !exists @@ -158,8 +158,8 @@ const commonUpdateCases = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (isHandlingTemplateTimeline) { return commonUpdateTemplateTimelineCheck( @@ -193,8 +193,8 @@ const createTemplateTimelineCheck = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (isHandlingTemplateTimeline && existTemplateTimeline != null) { // Throw error to create timeline template in patch @@ -219,8 +219,8 @@ export const checkIsUpdateViaImportFailureCases = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (!isHandlingTemplateTimeline) { if (existTimeline == null) { @@ -281,8 +281,8 @@ export const checkIsUpdateFailureCases = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { const error = isUpdatingStatus( isHandlingTemplateTimeline, @@ -315,8 +315,8 @@ export const checkIsCreateFailureCases = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (!isHandlingTemplateTimeline && existTimeline != null) { return { @@ -346,8 +346,8 @@ export const checkIsCreateViaImportFailureCases = ( version: string | null, templateTimelineVersion: number | null, templateTimelineId: string | null | undefined, - existTimeline: TimelineSavedObject | null, - existTemplateTimeline: TimelineSavedObject | null + existTimeline: TimelineResponse | null, + existTemplateTimeline: TimelineResponse | null ) => { if (status === TimelineStatusEnum.draft) { return { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/utils/timeline_object.ts b/x-pack/plugins/security_solution/server/lib/timeline/utils/timeline_object.ts index 360125e450764..44afe078f9104 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/utils/timeline_object.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/utils/timeline_object.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { TimelineSavedObject } from '../../../../common/api/timeline'; +import type { TimelineResponse } from '../../../../common/api/timeline'; import { type TimelineType, TimelineTypeEnum, @@ -27,7 +27,7 @@ export class TimelineObject { public readonly version: string | number | null; private frameworkRequest: FrameworkRequest; - public data: TimelineSavedObject | null; + public data: TimelineResponse | null; constructor({ id = null, diff --git a/x-pack/test/api_integration/services/security_solution_api.gen.ts b/x-pack/test/api_integration/services/security_solution_api.gen.ts index 95644a6d8db2e..aba6550ea9c3b 100644 --- a/x-pack/test/api_integration/services/security_solution_api.gen.ts +++ b/x-pack/test/api_integration/services/security_solution_api.gen.ts @@ -28,6 +28,7 @@ import { BulkPatchRulesRequestBodyInput } from '@kbn/security-solution-plugin/co import { BulkUpdateRulesRequestBodyInput } from '@kbn/security-solution-plugin/common/api/detection_engine/rule_management/bulk_crud/bulk_update_rules/bulk_update_rules_route.gen'; import { BulkUpsertAssetCriticalityRecordsRequestBodyInput } from '@kbn/security-solution-plugin/common/api/entity_analytics/asset_criticality/bulk_upload_asset_criticality.gen'; import { CleanDraftTimelinesRequestBodyInput } from '@kbn/security-solution-plugin/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.gen'; +import { CopyTimelineRequestBodyInput } from '@kbn/security-solution-plugin/common/api/timeline/copy_timeline/copy_timeline_route.gen'; import { CreateAlertsMigrationRequestBodyInput } from '@kbn/security-solution-plugin/common/api/detection_engine/signals_migration/create_signals_migration/create_signals_migration.gen'; import { CreateAssetCriticalityRecordRequestBodyInput } from '@kbn/security-solution-plugin/common/api/entity_analytics/asset_criticality/create_asset_criticality.gen'; import { CreateRuleRequestBodyInput } from '@kbn/security-solution-plugin/common/api/detection_engine/rule_management/crud/create_rule/create_rule_route.gen'; @@ -272,6 +273,18 @@ If asset criticality records already exist for the specified entities, those rec .set(ELASTIC_HTTP_VERSION_HEADER, '1') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); }, + /** + * Copies and returns a timeline or timeline template. + + */ + copyTimeline(props: CopyTimelineProps, kibanaSpace: string = 'default') { + return supertest + .get(routeWithNamespace('/api/timeline/_copy', kibanaSpace)) + .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send(props.body as object); + }, createAlertsIndex(kibanaSpace: string = 'default') { return supertest .post(routeWithNamespace('/api/detection_engine/index', kibanaSpace)) @@ -1350,6 +1363,9 @@ export interface BulkUpsertAssetCriticalityRecordsProps { export interface CleanDraftTimelinesProps { body: CleanDraftTimelinesRequestBodyInput; } +export interface CopyTimelineProps { + body: CopyTimelineRequestBodyInput; +} export interface CreateAlertsMigrationProps { body: CreateAlertsMigrationRequestBodyInput; } diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/timeline.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/timeline.ts index 6895d79c5aa8e..3206c14eee04d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/timeline.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/timeline.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { - TimelineResult, + TimelineResponse, TimelineTypeEnum, } from '@kbn/security-solution-plugin/common/api/timeline'; import { FtrProviderContext } from '../../../../../api_integration/ftr_provider_context'; @@ -419,8 +419,8 @@ export default function ({ getService }: FtrProviderContext) { }); } -const omitTypename = (key: string, value: keyof TimelineResult) => +const omitTypename = (key: string, value: keyof TimelineResponse) => key === '__typename' ? undefined : value; -const omitTypenameInTimeline = (timeline: TimelineResult) => +const omitTypenameInTimeline = (timeline: TimelineResponse) => JSON.parse(JSON.stringify(timeline), omitTypename); diff --git a/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts b/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts index a5e732c86b65f..1dcaae65a3392 100644 --- a/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { TimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; +import type { PersistTimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; export interface Timeline { title: string; @@ -69,7 +69,7 @@ export const getTimelineNonValidQuery = (): CompleteTimeline => ({ }); export const expectedExportedTimelineTemplate = ( - templateResponse: Cypress.Response + templateResponse: Cypress.Response ) => { const timelineTemplateBody = templateResponse.body.data.persistTimeline.timeline; @@ -113,7 +113,9 @@ export const expectedExportedTimelineTemplate = ( }; }; -export const expectedExportedTimeline = (timelineResponse: Cypress.Response) => { +export const expectedExportedTimeline = ( + timelineResponse: Cypress.Response +) => { const timelineBody = timelineResponse.body.data.persistTimeline.timeline; return { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts index 864767d0504f9..055d98a2efcfd 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts @@ -6,8 +6,9 @@ */ import type { - AllTimelinesResponse, - TimelineResponse, + DeleteTimelinesResponse, + GetTimelinesResponse, + PatchTimelineResponse, } from '@kbn/security-solution-plugin/common/api/timeline'; import type { CompleteTimeline } from '../../objects/timeline'; import { getTimeline } from '../../objects/timeline'; @@ -21,7 +22,7 @@ const mockTimeline = getTimeline(); * @returns undefined */ export const createTimeline = (timeline: CompleteTimeline = mockTimeline) => - rootRequest({ + rootRequest({ method: 'POST', url: 'api/timeline', body: { @@ -75,7 +76,7 @@ export const createTimeline = (timeline: CompleteTimeline = mockTimeline) => * @returns undefined */ export const createTimelineTemplate = (timeline: CompleteTimeline = mockTimeline) => - rootRequest({ + rootRequest({ method: 'POST', url: 'api/timeline', body: { @@ -159,7 +160,7 @@ export const favoriteTimeline = ({ }); export const getAllTimelines = () => - rootRequest({ + rootRequest({ method: 'GET', url: 'api/timelines?page_size=100&page_index=1&sort_field=updated&sort_order=desc&timeline_type=default', }); @@ -167,7 +168,7 @@ export const getAllTimelines = () => export const deleteTimelines = () => { getAllTimelines().then(($timelines) => { const savedObjectIds = $timelines.body.timeline.map((timeline) => timeline.savedObjectId); - rootRequest({ + rootRequest({ method: 'DELETE', url: 'api/timeline', body: { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts index 16fb1bb48808a..580b96bfd2340 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts @@ -6,7 +6,7 @@ */ import { IndexedHostsAndAlertsResponse } from '@kbn/security-solution-plugin/common/endpoint/index_data'; -import { TimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; +import { PatchTimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; // @ts-expect-error we have to check types with "allowJs: false" for now, causing this import to fail import { kibanaPackageJson } from '@kbn/repo-info'; import { type IndexedEndpointRuleAlerts } from '@kbn/security-solution-plugin/common/endpoint/data_loaders/index_endpoint_rule_alerts'; @@ -64,7 +64,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { // failing tests: https://github.com/elastic/kibana/issues/170705 describe.skip('from Timeline', () => { - let timeline: TimelineResponse; + let timeline: PatchTimelineResponse; before(async () => { log.info( diff --git a/x-pack/test/security_solution_ftr/services/timeline/index.ts b/x-pack/test/security_solution_ftr/services/timeline/index.ts index ebf6497567d81..8195f63ffc246 100644 --- a/x-pack/test/security_solution_ftr/services/timeline/index.ts +++ b/x-pack/test/security_solution_ftr/services/timeline/index.ts @@ -8,8 +8,12 @@ import { Response } from 'superagent'; import { EndpointError } from '@kbn/security-solution-plugin/common/endpoint/errors'; import { TIMELINE_DRAFT_URL, TIMELINE_URL } from '@kbn/security-solution-plugin/common/constants'; -import { TimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; -import { TimelineInput } from '@kbn/security-solution-plugin/common/search_strategy'; +import { + DeleteTimelinesResponse, + GetDraftTimelinesResponse, + PatchTimelineResponse, + SavedTimeline, +} from '@kbn/security-solution-plugin/common/api/timeline'; import moment from 'moment'; import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; import { FtrService } from '../../../functional/ftr_provider_context'; @@ -52,7 +56,7 @@ export class TimelineTestService extends FtrService { * for display (not sure why). TO get around this, just select a date range from the user date * picker and that seems to trigger the events to be fetched. */ - async createTimeline(title: string): Promise { + async createTimeline(title: string): Promise { // Create a new timeline draft const createdTimeline = ( await this.supertest @@ -61,7 +65,7 @@ export class TimelineTestService extends FtrService { .set('elastic-api-version', '2023-10-31') .send({ timelineType: 'default' }) .then(this.getHttpResponseFailureHandler()) - .then((response) => response.body as TimelineResponse) + .then((response) => response.body as GetDraftTimelinesResponse) ).data.persistTimeline.timeline; this.log.info('Draft timeline:'); @@ -71,7 +75,7 @@ export class TimelineTestService extends FtrService { const { savedObjectId: timelineId, version } = createdTimeline; - const timelineUpdate: TimelineInput = { + const timelineUpdate: SavedTimeline = { title, // Set date range to the last 1 year dateRange: { @@ -79,7 +83,7 @@ export class TimelineTestService extends FtrService { end: moment().toISOString(), // Not sure why `start`/`end` are defined as numbers in the type, but looking at the // UI's use of it, I can see they are being set to strings, so I'm forcing a cast here - } as unknown as TimelineInput['dateRange'], + } as unknown as SavedTimeline['dateRange'], // Not sure why, but the following fields are not in the created timeline, which causes // the timeline to not be able to pull in the event for display @@ -107,9 +111,9 @@ export class TimelineTestService extends FtrService { async updateTimeline( timelineId: string, - updates: TimelineInput, + updates: SavedTimeline, version: string - ): Promise { + ): Promise { return await this.supertest .patch(TIMELINE_URL) .set('kbn-xsrf', 'true') @@ -120,11 +124,11 @@ export class TimelineTestService extends FtrService { timeline: updates, }) .then(this.getHttpResponseFailureHandler()) - .then((response) => response.body as TimelineResponse); + .then((response) => response.body as PatchTimelineResponse); } /** Deletes a timeline using it timeline id */ - async deleteTimeline(id: string | string[]): Promise { + async deleteTimeline(id: string | string[]) { await this.supertest .delete(TIMELINE_URL) .set('kbn-xsrf', 'true') @@ -133,7 +137,7 @@ export class TimelineTestService extends FtrService { savedObjectIds: Array.isArray(id) ? id : [id], }) .then(this.getHttpResponseFailureHandler()) - .then((response) => response.body as TimelineResponse); + .then((response) => response.body as DeleteTimelinesResponse); } /** @@ -173,7 +177,7 @@ export class TimelineTestService extends FtrService { /** If defined, then only alerts from the specific `agent.id` will be displayed */ endpointAgentId: string; }> - ): Promise { + ): Promise { const newTimeline = await this.createTimeline(title); const { expression, esQuery } = this.getEndpointAlertsKqlQuery(endpointAgentId); From 6f4fa579d6d3e578622ebedc62f47a9af8e13dae Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 30 Sep 2024 21:16:49 +0200 Subject: [PATCH 034/107] [SLO] set form index max width (#194463) ## Summary fixes https://github.com/elastic/kibana/issues/191845 !! image --- .../slo_edit/components/custom_common/index_selection.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx index 1a33685a6f019..7332c94103c7e 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx @@ -16,6 +16,8 @@ import { SloPublicPluginsStart } from '../../../..'; import { useKibana } from '../../../../utils/kibana_react'; import { CreateSLOForm } from '../../types'; +const BTN_MAX_WIDTH = 515; + export const DATA_VIEW_FIELD = 'indicator.params.dataViewId'; const INDEX_FIELD = 'indicator.params.index'; const TIMESTAMP_FIELD = 'indicator.params.timestampField'; @@ -67,7 +69,7 @@ export function IndexSelection({ selectedDataView }: { selectedDataView?: DataVi color: fieldState.invalid ? 'danger' : 'primary', isLoading: isDataViewsLoading, 'data-test-subj': 'indexSelection', - style: { width: '100%', maxWidth: '100%' }, + style: { width: '100%', maxWidth: BTN_MAX_WIDTH }, }} onChangeDataView={(newId: string) => { setValue( From 283f6e64c9656c97fa37be34f3e6fab2e8ad459f Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 30 Sep 2024 12:35:13 -0700 Subject: [PATCH 035/107] Revert "[Fleet][Cloud] Enrollment token table may show an empty last page #167663 (#188049)" (#194343) ## Summary Resolves #194339. This PR reverts #188049 as it inadvertently broke pagination of the enrollment tokens page. This means that #167663 will need to be re-opened and fixed in a different way. --- .../fleet/sections/agents/enrollment_token_list_page/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx index a9adc6140c7c5..3a21103503ae5 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx @@ -128,7 +128,6 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { const agentPolicy = agentPoliciesById[enrollmentKey.policy_id]; return !agentPolicy?.is_managed; }) || []; - const filteredTotal = rowItems.length; const columns = [ { @@ -295,7 +294,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { pagination={{ pageIndex: pagination.currentPage - 1, pageSize: pagination.pageSize, - totalItemCount: filteredTotal, + totalItemCount: total, pageSizeOptions, }} onChange={({ page }: { page: { index: number; size: number } }) => { From 0d421e537c7a302d88dd75cd54cae2f2b8bcfb19 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 30 Sep 2024 13:22:36 -0700 Subject: [PATCH 036/107] [Spaces Management] Fix issue with enabled features selection when space solution is unselected (#194352) ## Summary Resolves https://github.com/elastic/kibana/issues/192812 The feature PR for the new UX in Spaces Management introduced a new editing screen for Spaces. Inadvertently, it introduced a bug where the user's selection of visible features is ignored unless the user has explicitly selected a solution view. This PR fixes that issue as well as adds tests to prevent any future regressions. Also, this PR fixes an issue where the space initials could be left blank, which was another regression. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --------- Co-authored-by: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> --- .../enabled_features/feature_table.tsx | 5 +- .../edit_space_general_tab.test.tsx | 70 +++++++++++++++++++ .../edit_space/edit_space_general_tab.tsx | 34 ++++++--- .../create_edit_space.ts | 52 ++++++++++++++ .../page_objects/space_selector_page.ts | 4 ++ 5 files changed, 156 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/components/enabled_features/feature_table.tsx b/x-pack/plugins/spaces/public/management/components/enabled_features/feature_table.tsx index bc4b586c6cd1d..4fb5786454eed 100644 --- a/x-pack/plugins/spaces/public/management/components/enabled_features/feature_table.tsx +++ b/x-pack/plugins/spaces/public/management/components/enabled_features/feature_table.tsx @@ -130,7 +130,10 @@ export class FeatureTable extends Component { const accordion = ( - + { expect(navigateSpy).toHaveBeenCalledTimes(1); }); + it('submits the disabled features list when the solution view is undefined', async () => { + const features = [ + new KibanaFeature({ + id: 'feature-1', + name: 'feature 1', + app: [], + category: DEFAULT_APP_CATEGORIES.kibana, + privileges: null, + }), + ]; + + const spaceToUpdate = { + id: 'existing-space', + name: 'Existing Space', + description: 'hey an existing space', + color: '#aabbcc', + initials: 'AB', + disabledFeatures: [], + solution: undefined, + }; + + render( + + + + ); + + // update the space visible features + const feature1Checkbox = screen.getByTestId('featureCheckbox_feature-1'); + expect(feature1Checkbox).toBeChecked(); + await act(async () => { + await userEvent.click(feature1Checkbox); + }); + await waitFor(() => { + expect(feature1Checkbox).not.toBeChecked(); + }); + + expect(screen.getByTestId('space-edit-page-user-impact-warning')).toBeInTheDocument(); + expect(screen.queryByTestId('confirmModalTitleText')).not.toBeInTheDocument(); + + const updateButton = screen.getByTestId('save-space-button'); + await act(async () => { + await userEvent.click(updateButton); + }); + + expect(screen.getByTestId('confirmModalTitleText')).toBeInTheDocument(); + + const confirmButton = screen.getByTestId('confirmModalConfirmButton'); + await act(async () => { + await userEvent.click(confirmButton); + }); + + await waitFor(() => { + expect(updateSpaceSpy).toHaveBeenCalledWith({ + ...spaceToUpdate, + imageUrl: '', + disabledFeatures: ['feature-1'], + }); + }); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + }); + it('empties the disabled features list when the solution view non-classic', async () => { const features = [ new KibanaFeature({ diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx index 2b7f04e4d9417..24269528916f8 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx @@ -6,7 +6,7 @@ */ import { EuiCallOut, EuiSpacer } from '@elastic/eui'; -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import type { ScopedHistory } from '@kbn/core-application-browser'; import type { KibanaFeature } from '@kbn/features-plugin/common'; @@ -18,6 +18,7 @@ import { EditSpaceTabFooter } from './footer'; import { useEditSpaceServices } from './provider'; import type { Space } from '../../../common'; import { SOLUTION_VIEW_CLASSIC } from '../../../common/constants'; +import { getSpaceInitials } from '../../space_avatar'; import { ConfirmDeleteModal } from '../components'; import { ConfirmAlterActiveSpaceModal } from '../components/confirm_alter_active_space_modal'; import { CustomizeSpace } from '../components/customize_space'; @@ -42,6 +43,11 @@ export const EditSpaceSettingsTab: React.FC = ({ space, features, history imageUrl: imageAvatarSelected ? space.imageUrl : '', }); + // space initials are blank by default, they must be calculated + const getSpaceFromFormValues = (newFormValues: CustomizeSpaceFormValues) => { + return { ...newFormValues, initials: getSpaceInitials(newFormValues) }; + }; + const [isDirty, setIsDirty] = useState(false); // track if unsaved changes have been made const [isLoading, setIsLoading] = useState(false); // track if user has just clicked the Update button const [showUserImpactWarning, setShowUserImpactWarning] = useState(false); @@ -137,7 +143,7 @@ export const EditSpaceSettingsTab: React.FC = ({ space, features, history setIsLoading(true); let disabledFeatures: string[] | undefined; - if (spaceClone.solution === SOLUTION_VIEW_CLASSIC) { + if (!spaceClone.solution || spaceClone.solution === SOLUTION_VIEW_CLASSIC) { disabledFeatures = spaceClone.disabledFeatures; } @@ -181,13 +187,27 @@ export const EditSpaceSettingsTab: React.FC = ({ space, features, history [backToSpacesList, notifications.toasts, formValues, spacesManager, logger, props] ); + const validator = useMemo(() => new SpaceValidator(), []); + const onClickSubmit = useCallback(() => { + validator.enableValidation(); + const validationResult = validator.validateForSave( + formValues, + true, + props.allowSolutionVisibility + ); + + if (validationResult.isInvalid) { + // invalid form input fields will show the error message + return; + } + if (showUserImpactWarning) { setShowAlteringActiveSpaceDialog(true); } else { performSave({ requiresReload: false }); } - }, [performSave, showUserImpactWarning]); + }, [validator, formValues, props.allowSolutionVisibility, performSave, showUserImpactWarning]); const doShowAlteringActiveSpaceDialog = () => { return ( @@ -245,15 +265,13 @@ export const EditSpaceSettingsTab: React.FC = ({ space, features, history ); }; - const validator = new SpaceValidator(); - return ( <> {doShowAlteringActiveSpaceDialog()} {doShowConfirmDeleteSpaceDialog()} = ({ space, features, history <> = ({ space, features, history diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts index f6f69ada3c0c1..8695077eae74e 100644 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts +++ b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts @@ -5,12 +5,14 @@ * 2.0. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects(['common', 'settings', 'security', 'spaceSelector']); const testSubjects = getService('testSubjects'); + const spacesService = getService('spaces'); const find = getService('find'); describe('edit space', () => { @@ -69,5 +71,55 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.missingOrFail('searchSideNav'); }); }); + + describe('API-created Space', () => { + before(async () => { + await spacesService.create({ + id: 'foo-space', + name: 'Foo Space', + disabledFeatures: [], + color: '#AABBCC', + }); + }); + + after(async () => { + await spacesService.delete('foo-space'); + }); + + it('enabled features can be changed while the solution view remains unselected', async () => { + const securityFeatureCheckboxId = 'featureCategoryCheckbox_securitySolution'; + + await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/foo-space', { + shouldUseHashForSubUrl: false, + }); + + await testSubjects.existOrFail('spaces-view-page'); + + // ensure security feature is selected by default + expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(true); + + // Do not set a solution view first! + + await PageObjects.spaceSelector.toggleFeatureCategoryCheckbox('securitySolution'); + // + // ensure security feature now unselected + expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(false); + + await testSubjects.existOrFail('space-edit-page-user-impact-warning'); + + await PageObjects.spaceSelector.clickSaveSpaceCreation(); + + await testSubjects.click('confirmModalConfirmButton'); + + await testSubjects.existOrFail('spaces-view-page'); + + await testSubjects.click('foo-space-hyperlink'); + + await testSubjects.existOrFail('spaces-view-page'); + + // ensure security feature is still unselected + expect(await testSubjects.isChecked(securityFeatureCheckboxId)).to.be(false); + }); + }); }); } diff --git a/x-pack/test/functional/page_objects/space_selector_page.ts b/x-pack/test/functional/page_objects/space_selector_page.ts index e5afbd78fe767..987b03533b480 100644 --- a/x-pack/test/functional/page_objects/space_selector_page.ts +++ b/x-pack/test/functional/page_objects/space_selector_page.ts @@ -204,6 +204,10 @@ export class SpaceSelectorPageObject extends FtrService { await this.testSubjects.click(`featureCategoryButton_${categoryName}`); } + async toggleFeatureCategoryCheckbox(categoryName: string) { + await this.testSubjects.click(`featureCategoryCheckbox_${categoryName}`); + } + async clickOnDescriptionOfSpace() { await this.testSubjects.click('descriptionSpaceText'); } From d89cac22d243d4461fcba3ce87b913ac582f4a44 Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Mon, 30 Sep 2024 22:35:21 +0200 Subject: [PATCH 037/107] [Alert details page] Add view logs to each condition for the custom threshold rule (#193839) Closes #188091 ## Summary This PR moves the view log link to each condition chart: |Before|After| |---|---| |![image](https://github.com/user-attachments/assets/534f607b-a780-4d1e-b6e2-f5db3220547d)|![image](https://github.com/user-attachments/assets/b413234f-0ee8-48fd-83d2-8ad20e35f1c9))| --- .../alert_details_app_section.test.tsx.snap | 1 + .../alert_details_app_section.test.tsx | 39 ++-- .../alert_details_app_section.tsx | 178 ++++++++---------- .../mocks/custom_threshold_rule.ts | 1 + .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 7 files changed, 97 insertions(+), 128 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/__snapshots__/alert_details_app_section.test.tsx.snap b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/__snapshots__/alert_details_app_section.test.tsx.snap index efa0222912f4f..79c58c84a1f30 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/__snapshots__/alert_details_app_section.test.tsx.snap +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/__snapshots__/alert_details_app_section.test.tsx.snap @@ -49,6 +49,7 @@ Array [ "metrics": Array [ Object { "aggType": "count", + "filter": "host.name: host-1", "name": "A", }, ], diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx index 553ca19787d4f..d16df6b6120df 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx @@ -6,7 +6,6 @@ */ import React from 'react'; -import { EuiLink } from '@elastic/eui'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { coreMock as mockCoreMock } from '@kbn/core/public/mocks'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; @@ -77,7 +76,6 @@ jest.mock('../../../../utils/kibana_react', () => ({ describe('AlertDetailsAppSection', () => { const queryClient = new QueryClient(); - const mockedSetAlertSummaryFields = jest.fn(); const mockedSetRelatedAlertsKuery = jest.fn(); const renderComponent = ( @@ -90,7 +88,6 @@ describe('AlertDetailsAppSection', () => { @@ -109,27 +106,6 @@ describe('AlertDetailsAppSection', () => { expect(result.getByTestId('thresholdRule-2000-2500')).toBeTruthy(); }); - it('should render additional alert summary fields', async () => { - renderComponent(); - - expect(mockedSetAlertSummaryFields).toBeCalledTimes(2); - expect(mockedSetAlertSummaryFields).toBeCalledWith([ - { - label: 'Related logs', - value: ( - - - View related logs - - - ), - }, - ]); - }); - it('should render annotations', async () => { const mockedRuleConditionChart = jest.fn(() =>
); (RuleConditionChart as jest.Mock).mockImplementation(mockedRuleConditionChart); @@ -145,7 +121,7 @@ describe('AlertDetailsAppSection', () => { it('should set relatedAlertsKuery', async () => { renderComponent(); - expect(mockedSetAlertSummaryFields).toBeCalledTimes(2); + expect(mockedSetRelatedAlertsKuery).toBeCalledTimes(1); expect(mockedSetRelatedAlertsKuery).toHaveBeenLastCalledWith( '(tags: "tag 1" or tags: "tag 2") or (host.name: "host-1" or kibana.alert.group.value: "host-1")' ); @@ -155,22 +131,33 @@ describe('AlertDetailsAppSection', () => { const result = renderComponent(); expect(result.getByTestId('chartTitle-0').textContent).toBe( - 'Equation result for count (all documents)' + 'Equation result for count (host.name: host-1)' ); + expect((result.getByTestId('viewLogs-0') as any).href).toBe('http://localhost/view-in-app-url'); + expect(result.getByTestId('chartTitle-1').textContent).toBe( 'Equation result for max (system.cpu.user.pct)' ); + expect((result.getByTestId('viewLogs-1') as any).href).toBe('http://localhost/view-in-app-url'); + expect(result.getByTestId('chartTitle-2').textContent).toBe( 'Equation result for min (system.memory.used.pct)' ); + expect((result.getByTestId('viewLogs-2') as any).href).toBe('http://localhost/view-in-app-url'); + expect(result.getByTestId('chartTitle-3').textContent).toBe( 'Equation result for min (system.memory.used.pct) + min (system.memory.used.pct) + min (system.memory.used.pct) + min (system.memory.used.pct...' ); + expect((result.getByTestId('viewLogs-3') as any).href).toBe('http://localhost/view-in-app-url'); + expect(result.getByTestId('chartTitle-4').textContent).toBe( 'Equation result for min (system.memory.used.pct) + min (system.memory.used.pct)' ); + expect((result.getByTestId('viewLogs-4') as any).href).toBe('http://localhost/view-in-app-url'); + expect(result.getByTestId('chartTitle-5').textContent).toBe( 'Equation result for min (system.memory.used.pct) + min (system.memory.used.pct) + min (system.memory.used.pct)' ); + expect((result.getByTestId('viewLogs-5') as any).href).toBe('http://localhost/view-in-app-url'); }); }); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx index cb7cbd6fca914..a7ec41f4ab660 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx @@ -11,6 +11,7 @@ import React, { useEffect, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, + EuiIcon, EuiLink, EuiPanel, EuiSpacer, @@ -36,7 +37,6 @@ import { getRelatedAlertKuery } from '../../../../../common/utils/alerting/get_r import { useLicense } from '../../../../hooks/use_license'; import { useKibana } from '../../../../utils/kibana_react'; import { metricValueFormatter } from '../../../../../common/custom_threshold_rule/metric_value_formatter'; -import { AlertSummaryField } from '../../../..'; import { AlertParams } from '../../types'; import { Threshold } from '../custom_threshold'; import { CustomThresholdRule, CustomThresholdAlert } from '../types'; @@ -49,7 +49,6 @@ import { generateChartTitleAndTooltip } from './helpers/generate_chart_title_and interface AppSectionProps { alert: CustomThresholdAlert; rule: CustomThresholdRule; - setAlertSummaryFields: React.Dispatch>; setRelatedAlertsKuery: React.Dispatch>; } @@ -57,7 +56,6 @@ interface AppSectionProps { export default function AlertDetailsAppSection({ alert, rule, - setAlertSummaryFields, setRelatedAlertsKuery, }: AppSectionProps) { const services = useKibana().services; @@ -73,7 +71,6 @@ export default function AlertDetailsAppSection({ const hasLogRateAnalysisLicense = hasAtLeast('platinum'); const [dataView, setDataView] = useState(); const [, setDataViewError] = useState(); - const [viewInAppUrl, setViewInAppUrl] = useState(); const [timeRange, setTimeRange] = useState({ from: 'now-15m', to: 'now' }); const ruleParams = rule.params as RuleTypeParams & AlertParams; const chartProps = { @@ -123,48 +120,6 @@ export default function AlertDetailsAppSection({ setTimeRange(getPaddedAlertTimeRange(alertStart!, alertEnd)); }, [alertStart, alertEnd]); - useEffect(() => { - const appUrl = getViewInAppUrl({ - dataViewId: dataView?.id, - groups, - logsExplorerLocator: locators.get(LOGS_EXPLORER_LOCATOR_ID), - metrics: ruleParams.criteria[0]?.metrics, - searchConfiguration: - ruleParams.searchConfiguration as SearchConfigurationWithExtractedReferenceType, - startedAt: alertStart, - endedAt: alertEnd, - }); - - setViewInAppUrl(appUrl); - }, [dataView, alertStart, alertEnd, groups, ruleParams, locators]); - - useEffect(() => { - const alertSummaryFields = []; - - alertSummaryFields.push({ - label: i18n.translate( - 'xpack.observability.customThreshold.rule.alertDetailsAppSection.summaryField.relatedLogs', - { - defaultMessage: 'Related logs', - } - ), - value: ( - - - {i18n.translate('xpack.observability.alertDetailsAppSection.a.viewRelatedLogsLabel', { - defaultMessage: 'View related logs', - })} - - - ), - }); - - setAlertSummaryFields(alertSummaryFields); - }, [viewInAppUrl, setAlertSummaryFields]); - useEffect(() => { const initDataView = async () => { const ruleSearchConfiguration = ruleParams.searchConfiguration; @@ -186,57 +141,88 @@ export default function AlertDetailsAppSection({ return ( - {ruleParams.criteria.map((criterion, index) => ( - - - - -

{chartTitleAndTooltip[index].title}

-
-
- - - - - metricValueFormatter( - d, - criterion.metrics[0] ? criterion.metrics[0].name : undefined - ) - } - title={i18n.translate( - 'xpack.observability.customThreshold.rule.alertDetailsAppSection.thresholdTitle', - { - defaultMessage: 'Threshold breached', + {ruleParams.criteria.map((criterion, index) => { + const appUrl = getViewInAppUrl({ + dataViewId: dataView?.id, + groups, + logsExplorerLocator: locators.get(LOGS_EXPLORER_LOCATOR_ID), + metrics: criterion?.metrics, + searchConfiguration: + ruleParams.searchConfiguration as SearchConfigurationWithExtractedReferenceType, + startedAt: alertStart, + endedAt: alertEnd, + }); + + return ( + + + + + + +

+ {chartTitleAndTooltip[index].title} +

+
+
+
+ + + +   + {i18n.translate( + 'xpack.observability.customThreshold.rule.alertDetailsAppSection.openInDiscoverLabel', + { + defaultMessage: 'Open in Discover', + } + )} + + +
+ + + + + metricValueFormatter( + d, + criterion.metrics[0] ? criterion.metrics[0].name : undefined + ) } - )} - comparator={criterion.comparator} - /> - - - - - -
-
- ))} + title={i18n.translate( + 'xpack.observability.customThreshold.rule.alertDetailsAppSection.thresholdTitle', + { + defaultMessage: 'Threshold breached', + } + )} + comparator={criterion.comparator} + /> +
+ + + +
+
+
+ ); + })} {hasLogRateAnalysisLicense && ( )} diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts index efa32473e0b44..c1db31d991c28 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts @@ -66,6 +66,7 @@ export const buildCustomThresholdRule = ( { name: 'A', aggType: Aggregators.COUNT, + filter: 'host.name: host-1', }, ], threshold: [2000], diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f012f3cdf627e..d1d4e79320a21 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -32085,7 +32085,6 @@ "xpack.observability.alertDetails.tab.overviewLabel": "Aperçu", "xpack.observability.alertDetails.untrackAlert": "Marquer comme non suivi", "xpack.observability.alertDetails.viewRuleDetails": "Accéder aux détails de la règle", - "xpack.observability.alertDetailsAppSection.a.viewRelatedLogsLabel": "Afficher les logs associés", "xpack.observability.alertDetailsPage.alertHistory.alertsTriggered": "Alertes déclenchées", "xpack.observability.alertDetailsPage.alertHistory.avgTimeToRecover": "Temps moyen de récupération", "xpack.observability.alertDetailsPage.alertHistory.chartTitle": "Historique des alertes", @@ -32198,7 +32197,6 @@ "xpack.observability.customThreshold.rule.aggregators.p99": "99e centile de {metric}", "xpack.observability.customThreshold.rule.aggregators.rate": "Taux de {metric}", "xpack.observability.customThreshold.rule.aggregators.sum": "Somme de {metric}", - "xpack.observability.customThreshold.rule.alertDetailsAppSection.summaryField.relatedLogs": "Logs associés", "xpack.observability.customThreshold.rule.alertDetailsAppSection.thresholdTitle": "Seuil dépassé", "xpack.observability.customThreshold.rule.alertDetailUrlActionVariableDescription": "Lien vers l’affichage de résolution des problèmes d’alerte pour voir plus de contextes et de détails. La chaîne sera vide si server.publicBaseUrl n'est pas configuré.", "xpack.observability.customThreshold.rule.alertFlyout.addCondition": "Ajouter une condition", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 71e2496a7d526..75cf864832ceb 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -31829,7 +31829,6 @@ "xpack.observability.alertDetails.tab.overviewLabel": "概要", "xpack.observability.alertDetails.untrackAlert": "未追跡に設定", "xpack.observability.alertDetails.viewRuleDetails": "ルール詳細に移動", - "xpack.observability.alertDetailsAppSection.a.viewRelatedLogsLabel": "関連ログを表示", "xpack.observability.alertDetailsPage.alertHistory.alertsTriggered": "アラートがトリガーされました", "xpack.observability.alertDetailsPage.alertHistory.avgTimeToRecover": "回復までの平均時間", "xpack.observability.alertDetailsPage.alertHistory.chartTitle": "アラート履歴", @@ -31942,7 +31941,6 @@ "xpack.observability.customThreshold.rule.aggregators.p99": "{metric}の99パーセンタイル", "xpack.observability.customThreshold.rule.aggregators.rate": "{metric}の比率", "xpack.observability.customThreshold.rule.aggregators.sum": "{metric}の合計", - "xpack.observability.customThreshold.rule.alertDetailsAppSection.summaryField.relatedLogs": "関連ログ", "xpack.observability.customThreshold.rule.alertDetailsAppSection.thresholdTitle": "しきい値を超えました", "xpack.observability.customThreshold.rule.alertDetailUrlActionVariableDescription": "アラートトラブルシューティングビューにリンクして、さらに詳しい状況や詳細を確認できます。server.publicBaseUrlが構成されていない場合は、空の文字列になります。", "xpack.observability.customThreshold.rule.alertFlyout.addCondition": "条件を追加", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 272cc11bfa08b..d7f138cdc84a2 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -31872,7 +31872,6 @@ "xpack.observability.alertDetails.tab.overviewLabel": "概览", "xpack.observability.alertDetails.untrackAlert": "标记为已取消跟踪", "xpack.observability.alertDetails.viewRuleDetails": "前往规则详情", - "xpack.observability.alertDetailsAppSection.a.viewRelatedLogsLabel": "查看相关日志", "xpack.observability.alertDetailsPage.alertHistory.alertsTriggered": "已触发告警", "xpack.observability.alertDetailsPage.alertHistory.avgTimeToRecover": "恢复的平均时间", "xpack.observability.alertDetailsPage.alertHistory.chartTitle": "告警历史记录", @@ -31985,7 +31984,6 @@ "xpack.observability.customThreshold.rule.aggregators.p99": "{metric} 的第 99 个百分位", "xpack.observability.customThreshold.rule.aggregators.rate": "{metric} 的比率", "xpack.observability.customThreshold.rule.aggregators.sum": "{metric} 的总和", - "xpack.observability.customThreshold.rule.alertDetailsAppSection.summaryField.relatedLogs": "相关日志", "xpack.observability.customThreshold.rule.alertDetailsAppSection.thresholdTitle": "超出阈值", "xpack.observability.customThreshold.rule.alertDetailUrlActionVariableDescription": "链接到告警故障排除视图获取进一步的上下文和详情。如果未配置 server.publicBaseUrl,这将为空字符串。", "xpack.observability.customThreshold.rule.alertFlyout.addCondition": "添加条件", From 6792cb4dca5adecf1a48a4d052dae603db5772e3 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 30 Sep 2024 14:22:37 -0700 Subject: [PATCH 038/107] Revert "[UII] Fix client-side validation for agent policy timeout fields (#191674)" (#194338) ## Summary Resolves #194221. This PR reverts commit f29bf1c3113de90fc0ca08bf7a59a33d53638940. Timeout fields should be clearable with undefined value or zero. --- .../agent_policy/components/agent_policy_validation.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_validation.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_validation.tsx index 109e62b0e0de4..1e81e9fc6bbc3 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_validation.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_validation.tsx @@ -38,20 +38,20 @@ export const agentPolicyFormValidation = ( errors.namespace = [namespaceValidation.error]; } - if (agentPolicy.unenroll_timeout !== undefined && agentPolicy.unenroll_timeout <= 0) { + if (agentPolicy.unenroll_timeout && agentPolicy.unenroll_timeout < 0) { errors.unenroll_timeout = [ , ]; } - if (agentPolicy.inactivity_timeout !== undefined && agentPolicy.inactivity_timeout <= 0) { + if (agentPolicy.inactivity_timeout && agentPolicy.inactivity_timeout < 0) { errors.inactivity_timeout = [ , ]; } From 6ed731cad5e4f06e985c0521873054adfe2d327c Mon Sep 17 00:00:00 2001 From: Sandra G Date: Mon, 30 Sep 2024 19:07:01 -0400 Subject: [PATCH 039/107] [Obs AI Assistant] Serverless API integration tests (#192219) Tests for serverless - copies over and modifies all tests from stateful to work in serverless. ~~deployment agnostic tests do not yet support enterprise license for stateful, so are tests don't yet qualify as being deployment agnostic~~. Given how difficult it is to see differences from the stateful tests, I've added PR comments where I've changed something that might be of interest. - changes to `createObservabilityAIAssistantApiClient` to use supertest without basic auth and accept headers for serverless and use roles - removes creating persisted users when tests start and [use roles](https://github.com/elastic/kibana/blob/main/x-pack/test_serverless/README.md#roles-based-testing) within tests. its not possible to create custom users with the serverless test framework at the moment. See https://github.com/elastic/kibana/issues/192711 Skipped tests - knowledge base tests https://github.com/elastic/kibana/issues/192886 - any test suite that uses the LLM proxy has been skipped on MKI https://github.com/elastic/kibana/issues/192751 - all tests that depend on the config.modelId skipped in MKI https://github.com/elastic/kibana/issues/192757 TODO: - [x] move over remaining tests - [x] test in MKI environment before merging - [x] create issues for skipped tests - [ ] this will not run on MKI (after merging) unless we ping the appex-qa team to add it to the pipeline. this is due to creating a separate config. ask appex-qa team to add our config. Followup / related issues to be tracked in a newly created issue: - [ ] https://github.com/elastic/kibana/issues/192757 - [ ] https://github.com/elastic/kibana/issues/192886 - [ ] https://github.com/elastic/kibana/issues/192751 - [ ] https://github.com/elastic/kibana/issues/192701 - [ ] https://github.com/elastic/kibana/issues/192497 - [ ] https://github.com/elastic/kibana/issues/192711 - [ ] https://github.com/elastic/kibana/issues/192718 - [ ] serverless functional tests - [ ] inquire with ml-ui-team to have the ability to delete system indices which we do after uninstalling tiny elser with .ml indices --- .buildkite/ftr_oblt_serverless_configs.yml | 1 + .github/CODEOWNERS | 1 + .../common/conversation_complete.ts | 3 +- .../service/knowledge_base_service/index.ts | 16 +- .../tests/knowledge_base/helpers.ts | 3 +- .../ai_assistant/common/action_connectors.ts | 77 +++ .../common/ftr_provider_context.ts | 18 + .../observability_ai_assistant_api_client.ts | 191 +++++++ .../observability/ai_assistant/config.ts | 34 ++ .../ai_assistant/tests/chat/chat.spec.ts | 215 +++++++ .../tests/complete/complete.spec.ts | 528 ++++++++++++++++++ .../complete/functions/elasticsearch.spec.ts | 126 +++++ .../tests/complete/functions/helpers.ts | 75 +++ .../complete/functions/summarize.spec.ts | 96 ++++ .../tests/connectors/connectors.spec.ts | 117 ++++ .../tests/conversations/conversations.spec.ts | 291 ++++++++++ .../tests/conversations/helpers.ts | 106 ++++ .../observability/ai_assistant/tests/index.ts | 26 + .../tests/knowledge_base/helpers.ts | 20 + .../knowledge_base/knowledge_base.spec.ts | 278 +++++++++ .../knowledge_base_setup.spec.ts | 54 ++ .../knowledge_base_status.spec.ts | 75 +++ .../knowledge_base_user_instructions.spec.ts | 354 ++++++++++++ .../public_complete/public_complete.spec.ts | 319 +++++++++++ 24 files changed, 3014 insertions(+), 10 deletions(-) create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/action_connectors.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/ftr_provider_context.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/observability_ai_assistant_api_client.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/config.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/chat/chat.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/elasticsearch.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/helpers.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/summarize.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/connectors/connectors.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/conversations.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/helpers.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/index.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/helpers.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_setup.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_status.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_user_instructions.spec.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/public_complete/public_complete.spec.ts diff --git a/.buildkite/ftr_oblt_serverless_configs.yml b/.buildkite/ftr_oblt_serverless_configs.yml index cb03e060b86e7..fbf0406f37be4 100644 --- a/.buildkite/ftr_oblt_serverless_configs.yml +++ b/.buildkite/ftr_oblt_serverless_configs.yml @@ -12,6 +12,7 @@ enabled: - x-pack/test_serverless/api_integration/test_suites/observability/config.feature_flags.ts - x-pack/test_serverless/api_integration/test_suites/observability/common_configs/config.group1.ts - x-pack/test_serverless/api_integration/test_suites/observability/fleet/config.ts + - x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/config.ts - x-pack/test_serverless/functional/test_suites/observability/config.ts - x-pack/test_serverless/functional/test_suites/observability/config.examples.ts - x-pack/test_serverless/functional/test_suites/observability/config.feature_flags.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7811e4409d905..35d8fa1caedab 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1109,6 +1109,7 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql # Observability AI Assistant x-pack/test/observability_ai_assistant_api_integration @elastic/obs-ai-assistant x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant +x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai-assistant # Infra Monitoring ## This plugin mostly contains the codebase for the infra services, but also includes some code for the Logs UI app. diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts index c1bd72e285c72..3c4e2cd609f8b 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts @@ -104,7 +104,8 @@ export type StreamingChatResponseEvent = | ConversationUpdateEvent | MessageAddEvent | ChatCompletionErrorEvent - | TokenCountEvent; + | TokenCountEvent + | BufferFlushEvent; export type StreamingChatResponseEventWithoutError = Exclude< StreamingChatResponseEvent, 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 679d59a57dbc8..ee977b30f5cc7 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 @@ -47,8 +47,8 @@ export interface RecalledEntry { function isModelMissingOrUnavailableError(error: Error) { return ( error instanceof errors.ResponseError && - (error.body.error.type === 'resource_not_found_exception' || - error.body.error.type === 'status_exception') + (error.body?.error?.type === 'resource_not_found_exception' || + error.body?.error?.type === 'status_exception') ); } function isCreateModelValidationError(error: Error) { @@ -127,7 +127,7 @@ export class KnowledgeBaseService { }; const installModel = async () => { - this.dependencies.logger.info('Installing ELSER model'); + this.dependencies.logger.info(`Installing ${elserModelId} model`); try { await this.dependencies.esClient.asInternalUser.ml.putTrainedModel( { @@ -146,12 +146,12 @@ export class KnowledgeBaseService { throw error; } } - this.dependencies.logger.info('Finished installing ELSER model'); + this.dependencies.logger.info(`Finished installing ${elserModelId} model`); }; const pollForModelInstallCompleted = async () => { await pRetry(async () => { - this.dependencies.logger.info('Polling installation of ELSER model'); + this.dependencies.logger.info(`Polling installation of ${elserModelId} model`); const modelInstalledAndReady = await isModelInstalledAndReady(); if (!modelInstalledAndReady) { throwKnowledgeBaseNotReady({ @@ -169,7 +169,7 @@ export class KnowledgeBaseService { wait_for: 'fully_allocated', }); } catch (error) { - this.dependencies.logger.debug('Error starting model deployment'); + this.dependencies.logger.debug(`Error starting ${elserModelId} model deployment`); this.dependencies.logger.debug(error); if (!isModelMissingOrUnavailableError(error)) { throw error; @@ -191,13 +191,13 @@ export class KnowledgeBaseService { return Promise.resolve(); } - this.dependencies.logger.debug('Model is not allocated yet'); + this.dependencies.logger.debug(`${elserModelId} model is not allocated yet`); this.dependencies.logger.debug(() => JSON.stringify(response)); throw gatewayTimeout(); }, retryOptions); - this.dependencies.logger.info('Model is ready'); + this.dependencies.logger.info(`${elserModelId} model is ready`); this.ensureTaskScheduled(); }; diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/helpers.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/helpers.ts index 1818203f737c0..91286dab811fc 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/helpers.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/helpers.ts @@ -21,8 +21,9 @@ export async function createKnowledgeBaseModel(ml: ReturnType) { diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/action_connectors.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/action_connectors.ts new file mode 100644 index 0000000000000..297a110ad2211 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/action_connectors.ts @@ -0,0 +1,77 @@ +/* + * Copyright 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 { ToolingLog } from '@kbn/tooling-log'; +import type { + InternalRequestHeader, + RoleCredentials, + SupertestWithoutAuthProviderType, +} from '../../../../../shared/services'; + +export async function deleteActionConnector({ + supertest, + connectorId, + log, + roleAuthc, + internalReqHeader, +}: { + supertest: SupertestWithoutAuthProviderType; + connectorId: string; + log: ToolingLog; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; +}) { + try { + await supertest + .delete(`/api/actions/connector/${connectorId}`) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .expect(204); + } catch (e) { + log.error(`Failed to delete action connector with id ${connectorId} due to: ${e}`); + throw e; + } +} + +export async function createProxyActionConnector({ + log, + supertest, + port, + roleAuthc, + internalReqHeader, +}: { + log: ToolingLog; + supertest: SupertestWithoutAuthProviderType; + port: number; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; +}) { + try { + const res = await supertest + .post('/api/actions/connector') + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .send({ + name: 'OpenAI Proxy', + connector_type_id: '.gen-ai', + config: { + apiProvider: 'OpenAI', + apiUrl: `http://localhost:${port}`, + }, + secrets: { + apiKey: 'my-api-key', + }, + }) + .expect(200); + + const connectorId = res.body.id as string; + return connectorId; + } catch (e) { + log.error(`Failed to create action connector due to: ${e}`); + throw e; + } +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/ftr_provider_context.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/ftr_provider_context.ts new file mode 100644 index 0000000000000..dc8dbbed7536e --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/ftr_provider_context.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. + */ + +import { GenericFtrProviderContext } from '@kbn/test'; +import { InheritedServices, InheritedFtrProviderContext } from '../../../../services'; +import { ObservabilityAIAssistantApiClient } from './observability_ai_assistant_api_client'; + +export type ObservabilityAIAssistantServices = InheritedServices & { + observabilityAIAssistantAPIClient: ( + context: InheritedFtrProviderContext + ) => Promise; +}; + +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/observability_ai_assistant_api_client.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/observability_ai_assistant_api_client.ts new file mode 100644 index 0000000000000..bd54243ab93f6 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/common/observability_ai_assistant_api_client.ts @@ -0,0 +1,191 @@ +/* + * Copyright 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 { + APIReturnType, + ObservabilityAIAssistantAPIClientRequestParamsOf, + ObservabilityAIAssistantAPIEndpoint, +} from '@kbn/observability-ai-assistant-plugin/public'; +import { formatRequest } from '@kbn/server-route-repository'; +import supertest from 'supertest'; +import { Subtract } from 'utility-types'; +import { format } from 'url'; +import { Config } from '@kbn/test'; +import { InheritedFtrProviderContext } from '../../../../services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; + +export function getObservabilityAIAssistantApiClient({ + svlSharedConfig, +}: { + svlSharedConfig: Config; +}) { + const kibanaServer = svlSharedConfig.get('servers.kibana'); + const cAuthorities = svlSharedConfig.get('servers.kibana.certificateAuthorities'); + + const url = format({ + ...kibanaServer, + auth: false, // don't use auth in serverless + }); + + return createObservabilityAIAssistantApiClient(supertest.agent(url, { ca: cAuthorities })); +} + +type ObservabilityAIAssistantApiClientKey = 'slsUser'; +export type ObservabilityAIAssistantApiClient = Record< + ObservabilityAIAssistantApiClientKey, + Awaited> +>; +export function createObservabilityAIAssistantApiClient(st: supertest.Agent) { + return ( + options: { + type?: 'form-data'; + endpoint: TEndpoint; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; + } & ObservabilityAIAssistantAPIClientRequestParamsOf & { + params?: { query?: { _inspect?: boolean } }; + } + ): SupertestReturnType => { + const { endpoint, type, roleAuthc, internalReqHeader } = options; + + const params = 'params' in options ? (options.params as Record) : {}; + + const { method, pathname, version } = formatRequest(endpoint, params.path); + const url = format({ pathname, query: params?.query }); + + const headers: Record = { ...internalReqHeader, ...roleAuthc.apiKeyHeader }; + + if (version) { + headers['Elastic-Api-Version'] = version; + } + + let res: supertest.Test; + if (type === 'form-data') { + const fields: Array<[string, any]> = Object.entries(params.body); + const formDataRequest = st[method](url) + .set(headers) + .set('Content-type', 'multipart/form-data'); + for (const field of fields) { + void formDataRequest.field(field[0], field[1]); + } + + res = formDataRequest; + } else if (params.body) { + res = st[method](url).send(params.body).set(headers); + } else { + res = st[method](url).set(headers); + } + + return res as unknown as SupertestReturnType; + }; +} + +export type ObservabilityAIAssistantAPIClient = ReturnType< + typeof createObservabilityAIAssistantApiClient +>; + +type WithoutPromise> = Subtract>; + +// this is a little intense, but without it, method overrides are lost +// e.g., { +// end(one:string) +// end(one:string, two:string) +// } +// would lose the first signature. This keeps up to eight signatures. +type OverloadedParameters = T extends { + (...args: infer A1): any; + (...args: infer A2): any; + (...args: infer A3): any; + (...args: infer A4): any; + (...args: infer A5): any; + (...args: infer A6): any; + (...args: infer A7): any; + (...args: infer A8): any; +} + ? A1 | A2 | A3 | A4 | A5 | A6 | A7 | A8 + : T extends { + (...args: infer A1): any; + (...args: infer A2): any; + (...args: infer A3): any; + (...args: infer A4): any; + (...args: infer A5): any; + (...args: infer A6): any; + (...args: infer A7): any; + } + ? A1 | A2 | A3 | A4 | A5 | A6 | A7 + : T extends { + (...args: infer A1): any; + (...args: infer A2): any; + (...args: infer A3): any; + (...args: infer A4): any; + (...args: infer A5): any; + (...args: infer A6): any; + } + ? A1 | A2 | A3 | A4 | A5 | A6 + : T extends { + (...args: infer A1): any; + (...args: infer A2): any; + (...args: infer A3): any; + (...args: infer A4): any; + (...args: infer A5): any; + } + ? A1 | A2 | A3 | A4 | A5 + : T extends { + (...args: infer A1): any; + (...args: infer A2): any; + (...args: infer A3): any; + (...args: infer A4): any; + } + ? A1 | A2 | A3 | A4 + : T extends { + (...args: infer A1): any; + (...args: infer A2): any; + (...args: infer A3): any; + } + ? A1 | A2 | A3 + : T extends { + (...args: infer A1): any; + (...args: infer A2): any; + } + ? A1 | A2 + : T extends (...args: infer A) => any + ? A + : any; + +type OverrideReturnType any, TNextReturnType> = ( + ...args: OverloadedParameters +) => WithoutPromise> & TNextReturnType; + +type OverwriteThisMethods, TNextReturnType> = TNextReturnType & { + [key in keyof T]: T[key] extends (...args: infer TArgs) => infer TReturnType + ? TReturnType extends Promise + ? OverrideReturnType + : (...args: TArgs) => TReturnType + : T[key]; +}; + +export type SupertestReturnType = + OverwriteThisMethods< + WithoutPromise, + Promise<{ + text: string; + status: number; + body: APIReturnType; + }> + >; + +export async function getObservabilityAIAssistantApiClientService({ + getService, +}: InheritedFtrProviderContext): Promise { + const svlSharedConfig = getService('config'); + // defaults to elastic_admin user when used without auth + return { + slsUser: await getObservabilityAIAssistantApiClient({ + svlSharedConfig, + }), + }; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/config.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/config.ts new file mode 100644 index 0000000000000..36a60f29cb6ce --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/config.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SUPPORTED_TRAINED_MODELS } from '@kbn/test-suites-xpack/functional/services/ml/api'; +import { createTestConfig } from '../../../config.base'; +import { ObservabilityAIAssistantServices } from './common/ftr_provider_context'; +import { services as inheritedServices } from '../../../services'; +import { getObservabilityAIAssistantApiClientService } from './common/observability_ai_assistant_api_client'; + +export const services: ObservabilityAIAssistantServices = { + ...inheritedServices, + observabilityAIAssistantAPIClient: getObservabilityAIAssistantApiClientService, +}; + +export default createTestConfig({ + serverlessProject: 'oblt', + testFiles: [require.resolve('./tests')], + junit: { + reportName: 'Observability AI Assistant API Integration tests', + }, + suiteTags: { exclude: ['skipSvlOblt'] }, + services, + + // include settings from project controller + // https://github.com/elastic/project-controller/blob/main/internal/project/observability/config/elasticsearch.yml + esServerArgs: ['xpack.ml.dfa.enabled=false'], + kbnServerArgs: [ + `--xpack.observabilityAIAssistant.modelId=${SUPPORTED_TRAINED_MODELS.TINY_ELSER.name}`, + ], +}); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/chat/chat.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/chat/chat.spec.ts new file mode 100644 index 0000000000000..d30839b60b0f1 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/chat/chat.spec.ts @@ -0,0 +1,215 @@ +/* + * Copyright 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 { MessageRole, type Message } from '@kbn/observability-ai-assistant-plugin/common'; +import { PassThrough } from 'stream'; +import { + LlmProxy, + createLlmProxy, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_llm_proxy'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { createProxyActionConnector, deleteActionConnector } from '../../common/action_connectors'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const log = getService('log'); + + const CHAT_API_URL = `/internal/observability_ai_assistant/chat`; + + const messages: Message[] = [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: 'You are a helpful assistant', + }, + }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: 'Good morning!', + }, + }, + ]; + + describe('/internal/observability_ai_assistant/chat', function () { + // TODO: https://github.com/elastic/kibana/issues/192751 + this.tags(['skipMKI']); + let proxy: LlmProxy; + let connectorId: string; + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + proxy = await createLlmProxy(log); + connectorId = await createProxyActionConnector({ + supertest: supertestWithoutAuth, + log, + port: proxy.getPort(), + roleAuthc, + internalReqHeader, + }); + }); + + after(async () => { + proxy.close(); + await deleteActionConnector({ + supertest: supertestWithoutAuth, + connectorId, + log, + roleAuthc, + internalReqHeader, + }); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it("returns a 4xx if the connector doesn't exist", async () => { + await supertestWithoutAuth + .post(CHAT_API_URL) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .send({ + name: 'my_api_call', + messages, + connectorId: 'does not exist', + functions: [], + scope: 'all', + }) + .expect(404); + }); + + it('returns a streaming response from the server', async () => { + const NUM_RESPONSES = 5; + + await Promise.race([ + new Promise((resolve, reject) => { + setTimeout(() => { + reject(new Error('Test timed out')); + }, 5000); + }), + new Promise((resolve, reject) => { + async function runTest() { + const interceptor = proxy.intercept('conversation', () => true); + const receivedChunks: Array> = []; + + const passThrough = new PassThrough(); + supertestWithoutAuth + .post(CHAT_API_URL) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .on('error', reject) + .send({ + name: 'my_api_call', + messages, + connectorId, + functions: [], + scope: 'all', + }) + .pipe(passThrough); + + const simulator = await interceptor.waitForIntercept(); + + passThrough.on('data', (chunk) => { + receivedChunks.push(JSON.parse(chunk.toString())); + }); + + for (let i = 0; i < NUM_RESPONSES; i++) { + await simulator.next(`Part: i\n`); + } + + await simulator.complete(); + + await new Promise((innerResolve) => passThrough.on('end', () => innerResolve())); + + const chatCompletionChunks = receivedChunks.filter( + (chunk) => chunk.type === 'chatCompletionChunk' + ); + expect(chatCompletionChunks).to.have.length( + NUM_RESPONSES, + `received number of chat completion chunks did not match expected. This might be because of a 4xx or 5xx: ${JSON.stringify( + chatCompletionChunks, + null, + 2 + )}` + ); + + const tokenCountChunk = receivedChunks.find((chunk) => chunk.type === 'tokenCount'); + expect(tokenCountChunk).to.eql( + { + type: 'tokenCount', + tokens: { completion: 20, prompt: 33, total: 53 }, + }, + `received token count chunk did not match expected` + ); + } + + runTest().then(resolve, reject); + }), + ]); + }); + + it('returns a useful error if the request fails', async () => { + const interceptor = proxy.intercept('conversation', () => true); + + const passThrough = new PassThrough(); + + supertestWithoutAuth + .post(CHAT_API_URL) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .set('kbn-xsrf', 'foo') + .send({ + name: 'my_api_call', + messages, + connectorId, + functions: [], + scope: 'all', + }) + .expect(200) + .pipe(passThrough); + + let data: string = ''; + + passThrough.on('data', (chunk) => { + data += chunk.toString('utf-8'); + }); + + const simulator = await interceptor.waitForIntercept(); + + await simulator.status(400); + + await simulator.rawWrite( + JSON.stringify({ + error: { + code: 'context_length_exceeded', + message: + "This model's maximum context length is 8192 tokens. However, your messages resulted in 11036 tokens. Please reduce the length of the messages.", + param: 'messages', + type: 'invalid_request_error', + }, + }) + ); + + await simulator.rawEnd(); + + await new Promise((resolve) => passThrough.on('end', () => resolve())); + + const response = JSON.parse(data.trim()); + + expect(response.error.message).to.be( + `Token limit reached. Token limit is 8192, but the current conversation has 11036 tokens.` + ); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts new file mode 100644 index 0000000000000..970b99ab35613 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts @@ -0,0 +1,528 @@ +/* + * Copyright 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 { Response } from 'supertest'; +import { MessageRole, type Message } from '@kbn/observability-ai-assistant-plugin/common'; +import { omit, pick } from 'lodash'; +import { PassThrough } from 'stream'; +import expect from '@kbn/expect'; +import { + ChatCompletionChunkEvent, + ConversationCreateEvent, + ConversationUpdateEvent, + MessageAddEvent, + StreamingChatResponseEvent, + StreamingChatResponseEventType, +} from '@kbn/observability-ai-assistant-plugin/common/conversation_complete'; +import { ObservabilityAIAssistantScreenContextRequest } from '@kbn/observability-ai-assistant-plugin/common/types'; +import { + createLlmProxy, + isFunctionTitleRequest, + LlmProxy, + LlmResponseSimulator, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_llm_proxy'; +import { createOpenAiChunk } from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_openai_chunk'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + decodeEvents, + getConversationCreatedEvent, + getConversationUpdatedEvent, +} from '../conversations/helpers'; +import { createProxyActionConnector, deleteActionConnector } from '../../common/action_connectors'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const log = getService('log'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + + const COMPLETE_API_URL = `/internal/observability_ai_assistant/chat/complete`; + + const messages: Message[] = [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: 'You are a helpful assistant', + }, + }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: 'Good morning, bot!', + // make sure it doesn't 400 on `data` being set + data: '{}', + }, + }, + ]; + + describe('/internal/observability_ai_assistant/chat/complete', function () { + // TODO: https://github.com/elastic/kibana/issues/192751 + this.tags(['skipMKI']); + let proxy: LlmProxy; + let connectorId: string; + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + + async function getEvents( + params: { screenContexts?: ObservabilityAIAssistantScreenContextRequest[] }, + cb: (conversationSimulator: LlmResponseSimulator) => Promise + ) { + const titleInterceptor = proxy.intercept('title', (body) => isFunctionTitleRequest(body)); + + const conversationInterceptor = proxy.intercept( + 'conversation', + (body) => !isFunctionTitleRequest(body) + ); + const responsePromise = new Promise((resolve, reject) => { + supertestWithoutAuth + .post(COMPLETE_API_URL) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .send({ + messages, + connectorId, + persist: true, + screenContexts: params.screenContexts || [], + scope: 'all', + }) + .then((response: Response) => resolve(response)) + .catch((err: Error) => reject(err)); + }); + + const [conversationSimulator, titleSimulator] = await Promise.all([ + conversationInterceptor.waitForIntercept(), + titleInterceptor.waitForIntercept(), + ]); + + await titleSimulator.status(200); + await titleSimulator.next('My generated title'); + await titleSimulator.complete(); + + await conversationSimulator.status(200); + await cb(conversationSimulator); + + const response = await responsePromise; + + return ( + String(response.body) + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line) as StreamingChatResponseEvent) + // Filter BufferFlush events that appear if isCloudEnabled is true which is the case in serverless tests + .filter((event) => event.type !== StreamingChatResponseEventType.BufferFlush) + .slice(2) + ); // ignore context request/response, we're testing this elsewhere + } + + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + proxy = await createLlmProxy(log); + connectorId = await createProxyActionConnector({ + supertest: supertestWithoutAuth, + log, + port: proxy.getPort(), + roleAuthc, + internalReqHeader, + }); + }); + + after(async () => { + proxy.close(); + await deleteActionConnector({ + supertest: supertestWithoutAuth, + connectorId, + log, + roleAuthc, + internalReqHeader, + }); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it('returns a streaming response from the server', async () => { + const interceptor = proxy.intercept('conversation', () => true); + + const receivedChunks: any[] = []; + + const passThrough = new PassThrough(); + + supertestWithoutAuth + .post(COMPLETE_API_URL) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader) + .send({ + messages, + connectorId, + persist: false, + screenContexts: [], + scope: 'all', + }) + .pipe(passThrough); + + passThrough.on('data', (chunk) => { + receivedChunks.push(chunk.toString()); + }); + + const simulator = await interceptor.waitForIntercept(); + + await simulator.status(200); + const chunk = JSON.stringify(createOpenAiChunk('Hello')); + + await simulator.rawWrite(`data: ${chunk.substring(0, 10)}`); + await simulator.rawWrite(`${chunk.substring(10)}\n\n`); + await simulator.complete(); + + await new Promise((resolve) => passThrough.on('end', () => resolve())); + + const parsedEvents = decodeEvents(receivedChunks.join('')); + + expect(parsedEvents.map((event) => event.type)).to.eql([ + StreamingChatResponseEventType.MessageAdd, + StreamingChatResponseEventType.MessageAdd, + StreamingChatResponseEventType.ChatCompletionChunk, + StreamingChatResponseEventType.MessageAdd, + ]); + + const messageEvents = parsedEvents.filter( + (msg): msg is MessageAddEvent => msg.type === StreamingChatResponseEventType.MessageAdd + ); + + const chunkEvents = parsedEvents.filter( + (msg): msg is ChatCompletionChunkEvent => + msg.type === StreamingChatResponseEventType.ChatCompletionChunk + ); + + expect(omit(messageEvents[0], 'id', 'message.@timestamp')).to.eql({ + type: StreamingChatResponseEventType.MessageAdd, + message: { + message: { + content: '', + role: MessageRole.Assistant, + function_call: { + name: 'context', + trigger: MessageRole.Assistant, + }, + }, + }, + }); + + expect(omit(messageEvents[1], 'id', 'message.@timestamp')).to.eql({ + type: StreamingChatResponseEventType.MessageAdd, + message: { + message: { + role: MessageRole.User, + name: 'context', + content: JSON.stringify({ screen_description: '', learnings: [] }), + }, + }, + }); + + expect(omit(chunkEvents[0], 'id')).to.eql({ + type: StreamingChatResponseEventType.ChatCompletionChunk, + message: { + content: 'Hello', + }, + }); + + expect(omit(messageEvents[2], 'id', 'message.@timestamp')).to.eql({ + type: StreamingChatResponseEventType.MessageAdd, + message: { + message: { + content: 'Hello', + role: MessageRole.Assistant, + function_call: { + name: '', + arguments: '', + trigger: MessageRole.Assistant, + }, + }, + }, + }); + }); + describe('when creating a new conversation', () => { + let events: StreamingChatResponseEvent[]; + + before(async () => { + events = await getEvents({}, async (conversationSimulator) => { + await conversationSimulator.next('Hello'); + await conversationSimulator.next(' again'); + await conversationSimulator.complete(); + }); + }); + + it('creates a new conversation', async () => { + expect(omit(events[0], 'id')).to.eql({ + type: StreamingChatResponseEventType.ChatCompletionChunk, + message: { + content: 'Hello', + }, + }); + expect(omit(events[1], 'id')).to.eql({ + type: StreamingChatResponseEventType.ChatCompletionChunk, + message: { + content: ' again', + }, + }); + expect(omit(events[2], 'id', 'message.@timestamp')).to.eql({ + type: StreamingChatResponseEventType.MessageAdd, + message: { + message: { + content: 'Hello again', + function_call: { + arguments: '', + name: '', + trigger: MessageRole.Assistant, + }, + role: MessageRole.Assistant, + }, + }, + }); + + expect( + omit( + events[3], + 'conversation.id', + 'conversation.last_updated', + 'conversation.token_count' + ) + ).to.eql({ + type: StreamingChatResponseEventType.ConversationCreate, + conversation: { + title: 'My generated title', + }, + }); + + const tokenCount = (events[3] as ConversationCreateEvent).conversation.token_count!; + + expect(tokenCount.completion).to.be.greaterThan(0); + expect(tokenCount.prompt).to.be.greaterThan(0); + + expect(tokenCount.total).to.eql(tokenCount.completion + tokenCount.prompt); + }); + + after(async () => { + const createdConversationId = events.filter( + (line): line is ConversationCreateEvent => + line.type === StreamingChatResponseEventType.ConversationCreate + )[0]?.conversation.id; + + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'DELETE /internal/observability_ai_assistant/conversation/{conversationId}', + roleAuthc, + internalReqHeader, + params: { + path: { + conversationId: createdConversationId, + }, + }, + }) + .expect(200); + }); + }); + + describe('after executing a screen context action', () => { + let events: StreamingChatResponseEvent[]; + + before(async () => { + events = await getEvents( + { + screenContexts: [ + { + actions: [ + { + name: 'my_action', + description: 'My action', + parameters: { + type: 'object', + properties: { + foo: { + type: 'string', + }, + }, + }, + }, + ], + }, + ], + }, + async (conversationSimulator) => { + await conversationSimulator.next({ + function_call: { name: 'my_action', arguments: JSON.stringify({ foo: 'bar' }) }, + }); + await conversationSimulator.complete(); + } + ); + }); + + it('closes the stream without persisting the conversation', () => { + expect( + pick( + events[events.length - 1], + 'message.message.content', + 'message.message.function_call', + 'message.message.role' + ) + ).to.eql({ + message: { + message: { + content: '', + function_call: { + name: 'my_action', + arguments: JSON.stringify({ foo: 'bar' }), + trigger: MessageRole.Assistant, + }, + role: MessageRole.Assistant, + }, + }, + }); + }); + + it('does not store the conversation', async () => { + expect( + events.filter((event) => event.type === StreamingChatResponseEventType.ConversationCreate) + .length + ).to.eql(0); + + const conversations = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/conversations', + roleAuthc, + internalReqHeader, + }) + .expect(200); + + expect(conversations.body.conversations.length).to.be(0); + }); + }); + + describe('when updating an existing conversation', () => { + let conversationCreatedEvent: ConversationCreateEvent; + let conversationUpdatedEvent: ConversationUpdateEvent; + + before(async () => { + void proxy + .intercept('conversation_title', (body) => isFunctionTitleRequest(body), [ + { + function_call: { + name: 'title_conversation', + arguments: JSON.stringify({ title: 'LLM-generated title' }), + }, + }, + ]) + .completeAfterIntercept(); + + void proxy + .intercept('conversation', (body) => !isFunctionTitleRequest(body), 'Good morning, sir!') + .completeAfterIntercept(); + + const createResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/chat/complete', + roleAuthc, + internalReqHeader, + params: { + body: { + messages, + connectorId, + persist: true, + screenContexts: [], + scope: 'all', + }, + }, + }) + .expect(200); + + await proxy.waitForAllInterceptorsSettled(); + + conversationCreatedEvent = getConversationCreatedEvent(createResponse.body); + + const conversationId = conversationCreatedEvent.conversation.id; + const fullConversation = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId, + }, + }, + }); + + void proxy + .intercept('conversation', (body) => !isFunctionTitleRequest(body), 'Good night, sir!') + .completeAfterIntercept(); + + const updatedResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/chat/complete', + internalReqHeader, + roleAuthc, + params: { + body: { + messages: [ + ...fullConversation.body.messages, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: 'Good night, bot!', + }, + }, + ], + connectorId, + persist: true, + screenContexts: [], + conversationId, + scope: 'all', + }, + }, + }) + .expect(200); + + await proxy.waitForAllInterceptorsSettled(); + + conversationUpdatedEvent = getConversationUpdatedEvent(updatedResponse.body); + }); + + after(async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'DELETE /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: conversationCreatedEvent.conversation.id, + }, + }, + }) + .expect(200); + }); + + it('has correct token count for a new conversation', async () => { + expect(conversationCreatedEvent.conversation.token_count?.completion).to.be.greaterThan(0); + expect(conversationCreatedEvent.conversation.token_count?.prompt).to.be.greaterThan(0); + expect(conversationCreatedEvent.conversation.token_count?.total).to.be.greaterThan(0); + }); + + it('has correct token count for the updated conversation', async () => { + expect(conversationUpdatedEvent.conversation.token_count!.total).to.be.greaterThan( + conversationCreatedEvent.conversation.token_count!.total + ); + }); + }); + + // todo + it.skip('executes a function', async () => {}); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/elasticsearch.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/elasticsearch.spec.ts new file mode 100644 index 0000000000000..4ba276333cc55 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/elasticsearch.spec.ts @@ -0,0 +1,126 @@ +/* + * Copyright 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 { MessageAddEvent, MessageRole } from '@kbn/observability-ai-assistant-plugin/common'; +import expect from '@kbn/expect'; +import { apm, timerange } from '@kbn/apm-synthtrace-client'; +import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { ELASTICSEARCH_FUNCTION_NAME } from '@kbn/observability-ai-assistant-plugin/server/functions/elasticsearch'; +import { + LlmProxy, + createLlmProxy, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_llm_proxy'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { getMessageAddedEvents, invokeChatCompleteWithFunctionRequest } from './helpers'; +import { + createProxyActionConnector, + deleteActionConnector, +} from '../../../common/action_connectors'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const log = getService('log'); + const synthtrace = getService('synthtrace'); + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + describe('when calling elasticsearch', function () { + // TODO: https://github.com/elastic/kibana/issues/192751 + this.tags(['skipMKI']); + let proxy: LlmProxy; + let connectorId: string; + let events: MessageAddEvent[]; + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + apmSynthtraceEsClient = await synthtrace.createSynthtraceEsClient(); + proxy = await createLlmProxy(log); + connectorId = await createProxyActionConnector({ + supertest, + log, + port: proxy.getPort(), + roleAuthc, + internalReqHeader, + }); + + // intercept the LLM request and return a fixed response + void proxy + .intercept('conversation', () => true, 'Hello from LLM Proxy') + .completeAfterIntercept(); + + await generateApmData(apmSynthtraceEsClient); + + const responseBody = await invokeChatCompleteWithFunctionRequest({ + connectorId, + observabilityAIAssistantAPIClient, + internalReqHeader, + roleAuthc, + functionCall: { + name: ELASTICSEARCH_FUNCTION_NAME, + trigger: MessageRole.User, + arguments: JSON.stringify({ + method: 'POST', + path: 'traces*/_search', + body: { + size: 0, + aggs: { + services: { + terms: { + field: 'service.name', + }, + }, + }, + }, + }), + }, + }); + + await proxy.waitForAllInterceptorsSettled(); + + events = getMessageAddedEvents(responseBody); + }); + + after(async () => { + proxy.close(); + await deleteActionConnector({ supertest, connectorId, log, roleAuthc, internalReqHeader }); + await apmSynthtraceEsClient.clean(); + }); + + it('returns elasticsearch function response', async () => { + const esFunctionResponse = events[0]; + const parsedEsResponse = JSON.parse(esFunctionResponse.message.message.content!).response; + + expect(esFunctionResponse.message.message.name).to.be('elasticsearch'); + expect(parsedEsResponse.hits.total.value).to.be(15); + expect(parsedEsResponse.aggregations.services.buckets).to.eql([ + { key: 'java-backend', doc_count: 15 }, + ]); + expect(events.length).to.be(2); + }); + }); +} + +export async function generateApmData(apmSynthtraceEsClient: ApmSynthtraceEsClient) { + const serviceA = apm + .service({ name: 'java-backend', environment: 'production', agentName: 'java' }) + .instance('a'); + + const events = timerange('now-15m', 'now') + .interval('1m') + .rate(1) + .generator((timestamp) => { + return serviceA.transaction({ transactionName: 'tx' }).timestamp(timestamp).duration(1000); + }); + + return apmSynthtraceEsClient.index(events); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/helpers.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/helpers.ts new file mode 100644 index 0000000000000..b9e1ec0865013 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/helpers.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + Message, + MessageAddEvent, + MessageRole, + StreamingChatResponseEvent, +} from '@kbn/observability-ai-assistant-plugin/common'; +import { AssistantScope } from '@kbn/observability-ai-assistant-plugin/common/types'; +import { Readable } from 'stream'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../../shared/services'; +import { ObservabilityAIAssistantApiClient } from '../../../common/observability_ai_assistant_api_client'; + +function decodeEvents(body: Readable | string) { + return String(body) + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line) as StreamingChatResponseEvent); +} + +export function getMessageAddedEvents(body: Readable | string) { + return decodeEvents(body).filter( + (event): event is MessageAddEvent => event.type === 'messageAdd' + ); +} + +export async function invokeChatCompleteWithFunctionRequest({ + connectorId, + observabilityAIAssistantAPIClient, + functionCall, + roleAuthc, + internalReqHeader, + scope, +}: { + connectorId: string; + observabilityAIAssistantAPIClient: ObservabilityAIAssistantApiClient; + functionCall: Message['message']['function_call']; + scope?: AssistantScope; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; +}) { + const { body } = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/chat/complete', + internalReqHeader, + roleAuthc, + params: { + body: { + messages: [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.Assistant, + content: '', + function_call: functionCall, + }, + }, + ], + connectorId, + persist: false, + screenContexts: [], + scope: 'observability', + }, + }, + }) + .expect(200); + + return body; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/summarize.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/summarize.spec.ts new file mode 100644 index 0000000000000..6be39a36c62a5 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/functions/summarize.spec.ts @@ -0,0 +1,96 @@ +/* + * Copyright 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 { MessageRole } from '@kbn/observability-ai-assistant-plugin/common'; +import expect from '@kbn/expect'; +import { + LlmProxy, + createLlmProxy, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_llm_proxy'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { invokeChatCompleteWithFunctionRequest } from './helpers'; +import { + createProxyActionConnector, + deleteActionConnector, +} from '../../../common/action_connectors'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const log = getService('log'); + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + // Skipped until Elser is available in tests + describe.skip('when calling summarize function', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + let proxy: LlmProxy; + let connectorId: string; + + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + proxy = await createLlmProxy(log); + connectorId = await createProxyActionConnector({ + supertest, + log, + port: proxy.getPort(), + roleAuthc, + internalReqHeader, + }); + + // intercept the LLM request and return a fixed response + void proxy + .intercept('conversation', () => true, 'Hello from LLM Proxy') + .completeAfterIntercept(); + + await invokeChatCompleteWithFunctionRequest({ + connectorId, + observabilityAIAssistantAPIClient, + internalReqHeader, + roleAuthc, + functionCall: { + name: 'summarize', + trigger: MessageRole.User, + arguments: JSON.stringify({ + id: 'my-id', + text: 'Hello world', + is_correction: false, + confidence: 1, + public: false, + }), + }, + }); + + await proxy.waitForAllInterceptorsSettled(); + }); + + after(async () => { + proxy.close(); + await deleteActionConnector({ supertest, connectorId, log, roleAuthc, internalReqHeader }); + }); + + it('persists entry in knowledge base', async () => { + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + internalReqHeader, + roleAuthc, + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + }); + + expect(res.body.entries).to.have.length(1); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/connectors/connectors.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/connectors/connectors.spec.ts new file mode 100644 index 0000000000000..9305c0d1e14e9 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/connectors/connectors.spec.ts @@ -0,0 +1,117 @@ +/* + * Copyright 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 '../../common/ftr_provider_context'; +import { createProxyActionConnector, deleteActionConnector } from '../../common/action_connectors'; +import type { + InternalRequestHeader, + RoleCredentials, + SupertestWithoutAuthProviderType, +} from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const log = getService('log'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + describe('List connectors', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await deleteAllActionConnectors({ + supertest: supertestWithoutAuth, + roleAuthc, + internalReqHeader, + }); + }); + + after(async () => { + await deleteAllActionConnectors({ + supertest: supertestWithoutAuth, + roleAuthc, + internalReqHeader, + }); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it('Returns a 2xx for enterprise license', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/connectors', + roleAuthc, + internalReqHeader, + }) + .expect(200); + }); + + it('returns an empty list of connectors', async () => { + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/connectors', + roleAuthc, + internalReqHeader, + }); + + expect(res.body.length).to.be(0); + }); + + it("returns the gen ai connector if it's been created", async () => { + const connectorId = await createProxyActionConnector({ + supertest: supertestWithoutAuth, + log, + port: 1234, + internalReqHeader, + roleAuthc, + }); + + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/connectors', + internalReqHeader, + roleAuthc, + }); + + expect(res.body.length).to.be(1); + + await deleteActionConnector({ + supertest: supertestWithoutAuth, + connectorId, + log, + internalReqHeader, + roleAuthc, + }); + }); + }); +} + +export async function deleteAllActionConnectors({ + supertest, + roleAuthc, + internalReqHeader, +}: { + supertest: SupertestWithoutAuthProviderType; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; +}): Promise { + const res = await supertest + .get(`/api/actions/connectors`) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader); + + const body = res.body as Array<{ id: string; connector_type_id: string; name: string }>; + return Promise.all( + body.map(({ id }) => { + return supertest + .delete(`/api/actions/connector/${id}`) + .set(roleAuthc.apiKeyHeader) + .set(internalReqHeader); + }) + ); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/conversations.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/conversations.spec.ts new file mode 100644 index 0000000000000..b4426744e4082 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/conversations.spec.ts @@ -0,0 +1,291 @@ +/* + * Copyright 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 { merge, omit } from 'lodash'; +import { + type ConversationCreateRequest, + type ConversationUpdateRequest, + MessageRole, +} from '@kbn/observability-ai-assistant-plugin/common/types'; +import type { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { SupertestReturnType } from '../../common/observability_ai_assistant_api_client'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + const conversationCreate: ConversationCreateRequest = { + '@timestamp': new Date().toISOString(), + conversation: { + title: 'My title', + }, + labels: {}, + numeric_labels: {}, + messages: [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: 'My message', + }, + }, + ], + public: false, + }; + + const conversationUpdate: ConversationUpdateRequest = merge({}, conversationCreate, { + conversation: { + id: '', + title: 'My updated title', + }, + }); + + describe('Conversations', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + describe('without conversations', () => { + it('returns no conversations when listing', async () => { + const response = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/conversations', + internalReqHeader, + roleAuthc, + }) + .expect(200); + + expect(response.body).to.eql({ conversations: [] }); + }); + + it('returns a 404 for updating conversations', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: 'non-existing-conversation-id', + }, + body: { + conversation: conversationUpdate, + }, + }, + }) + .expect(404); + }); + + it('returns a 404 for retrieving a conversation', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: 'my-conversation-id', + }, + }, + }) + .expect(404); + }); + }); + + describe('when creating a conversation with the write user', function () { + let createResponse: Awaited< + SupertestReturnType<'POST /internal/observability_ai_assistant/conversation'> + >; + before(async () => { + createResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/conversation', + roleAuthc, + internalReqHeader, + params: { + body: { + conversation: conversationCreate, + }, + }, + }) + .expect(200); + }); + + after(async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'DELETE /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: createResponse.body.conversation.id, + }, + }, + }) + .expect(200); + + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: createResponse.body.conversation.id, + }, + }, + }) + .expect(404); + }); + it('returns the conversation', function () { + // delete user from response to avoid comparing it as it will be different in MKI + delete createResponse.body.user; + expect(createResponse.body).to.eql({ + '@timestamp': createResponse.body['@timestamp'], + conversation: { + id: createResponse.body.conversation.id, + last_updated: createResponse.body.conversation.last_updated, + title: conversationCreate.conversation.title, + }, + labels: conversationCreate.labels, + numeric_labels: conversationCreate.numeric_labels, + messages: conversationCreate.messages, + namespace: 'default', + public: conversationCreate.public, + }); + }); + + it('returns a 404 for updating a non-existing conversation', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/conversation/{conversationId}', + roleAuthc, + internalReqHeader, + params: { + path: { + conversationId: 'non-existing-conversation-id', + }, + body: { + conversation: conversationUpdate, + }, + }, + }) + .expect(404); + }); + + it('returns a 404 for retrieving a non-existing conversation', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + roleAuthc, + internalReqHeader, + params: { + path: { + conversationId: 'non-existing-conversation-id', + }, + }, + }) + .expect(404); + }); + + it('returns the conversation that was created', async () => { + const response = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: createResponse.body.conversation.id, + }, + }, + }) + .expect(200); + + // delete user from response to avoid comparing it as it will be different in MKI + delete response.body.user; + expect(response.body).to.eql(createResponse.body); + }); + + it('returns the created conversation when listing', async () => { + const response = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/conversations', + roleAuthc, + internalReqHeader, + }) + .expect(200); + // delete user from response to avoid comparing it as it will be different in MKI + delete response.body.conversations[0].user; + expect(response.body.conversations[0]).to.eql(createResponse.body); + }); + + // TODO + it.skip('returns a 404 when reading it with another user', () => {}); + + describe('after updating', () => { + let updateResponse: Awaited< + SupertestReturnType<'PUT /internal/observability_ai_assistant/conversation/{conversationId}'> + >; + + before(async () => { + updateResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: createResponse.body.conversation.id, + }, + body: { + conversation: merge(omit(conversationUpdate, 'conversation.id'), { + conversation: { id: createResponse.body.conversation.id }, + }), + }, + }, + }) + .expect(200); + }); + + it('returns the updated conversation as response', async () => { + expect(updateResponse.body.conversation.title).to.eql( + conversationUpdate.conversation.title + ); + }); + + it('returns the updated conversation after get', async () => { + const updateAfterCreateResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: createResponse.body.conversation.id, + }, + }, + }) + .expect(200); + + expect(updateAfterCreateResponse.body.conversation.title).to.eql( + conversationUpdate.conversation.title + ); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/helpers.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/helpers.ts new file mode 100644 index 0000000000000..7e72b4ed57bf9 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/conversations/helpers.ts @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Readable } from 'stream'; +import { ToolingLog } from '@kbn/tooling-log'; +import { + ConversationCreateEvent, + ConversationUpdateEvent, + StreamingChatResponseEvent, + StreamingChatResponseEventType, +} from '@kbn/observability-ai-assistant-plugin/common/conversation_complete'; +import { ObservabilityAIAssistantApiClient } from '../../common/observability_ai_assistant_api_client'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export function decodeEvents(body: Readable | string) { + return String(body) + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line) as StreamingChatResponseEvent); +} + +export function getConversationCreatedEvent(body: Readable | string) { + const decodedEvents = decodeEvents(body); + const conversationCreatedEvent = decodedEvents.find( + (event) => event.type === StreamingChatResponseEventType.ConversationCreate + ) as ConversationCreateEvent; + + if (!conversationCreatedEvent) { + throw new Error( + `No conversation created event found: ${JSON.stringify(decodedEvents, null, 2)}` + ); + } + + return conversationCreatedEvent; +} + +export function getConversationUpdatedEvent(body: Readable | string) { + const decodedEvents = decodeEvents(body); + const conversationUpdatedEvent = decodedEvents.find( + (event) => event.type === StreamingChatResponseEventType.ConversationUpdate + ) as ConversationUpdateEvent; + + if (!conversationUpdatedEvent) { + throw new Error( + `No conversation created event found: ${JSON.stringify(decodedEvents, null, 2)}` + ); + } + + return conversationUpdatedEvent; +} + +export async function deleteAllConversations({ + observabilityAIAssistantAPIClient, + internalReqHeader, + roleAuthc, + log, +}: { + observabilityAIAssistantAPIClient: ObservabilityAIAssistantApiClient; + internalReqHeader: InternalRequestHeader; + roleAuthc: RoleCredentials; + log: ToolingLog; +}) { + const findConversationsResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/conversations', + internalReqHeader, + roleAuthc, + params: { + body: { + query: '', + }, + }, + }) + .expect(200); + const conversations = findConversationsResponse.body.conversations; + + if (!conversations || conversations.length === 0) { + return; + } + + await Promise.all( + conversations.map(async (conversation) => { + try { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'DELETE /internal/observability_ai_assistant/conversation/{conversationId}', + internalReqHeader, + roleAuthc, + params: { + path: { + conversationId: conversation.conversation.id, + }, + }, + }) + .expect(200); + } catch (error) { + log.error(`Failed to delete conversation with ID: ${conversation.conversation.id}`); + } + }) + ); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/index.ts new file mode 100644 index 0000000000000..26c8a7b2839a9 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import globby from 'globby'; +import path from 'path'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +const cwd = path.join(__dirname); + +export default function observabilityAIAssistantApiIntegrationTests({ + loadTestFile, +}: FtrProviderContext) { + describe('Observability AI Assistant API tests', function () { + const filePattern = '**/*.spec.ts'; + const tests = globby.sync(filePattern, { cwd }); + + tests.forEach((testName) => { + describe(testName, () => { + loadTestFile(require.resolve(`./${testName}`)); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/helpers.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/helpers.ts new file mode 100644 index 0000000000000..6affeeb861295 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/helpers.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 { MachineLearningProvider } from '@kbn/test-suites-xpack/api_integration/services/ml'; +import { SUPPORTED_TRAINED_MODELS } from '@kbn/test-suites-xpack/functional/services/ml/api'; + +export const TINY_ELSER = { + ...SUPPORTED_TRAINED_MODELS.TINY_ELSER, + id: SUPPORTED_TRAINED_MODELS.TINY_ELSER.name, +}; + +export async function deleteKnowledgeBaseModel(ml: ReturnType) { + await ml.api.stopTrainedModelDeploymentES(TINY_ELSER.id, true); + await ml.api.deleteTrainedModelES(TINY_ELSER.id); + await ml.testResources.cleanMLSavedObjects(); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base.spec.ts new file mode 100644 index 0000000000000..b540ee5829e59 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base.spec.ts @@ -0,0 +1,278 @@ +/* + * Copyright 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 { + clearKnowledgeBase, + createKnowledgeBaseModel, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/tests/knowledge_base/helpers'; +import { deleteKnowledgeBaseModel } from './helpers'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const ml = getService('ml'); + const es = getService('es'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + + // TODO: https://github.com/elastic/kibana/issues/192886 + describe.skip('Knowledge base', function () { + // TODO: https://github.com/elastic/kibana/issues/192757 + this.tags(['skipMKI']); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await createKnowledgeBaseModel(ml); + }); + + after(async () => { + await deleteKnowledgeBaseModel(ml); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it('returns 200 on knowledge base setup', async () => { + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/setup', + roleAuthc, + internalReqHeader, + }) + .expect(200); + expect(res.body).to.eql({}); + }); + describe('when managing a single entry', () => { + const knowledgeBaseEntry = { + id: 'my-doc-id-1', + text: 'My content', + }; + it('returns 200 on create', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/entries/save', + params: { body: knowledgeBaseEntry }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + roleAuthc, + internalReqHeader, + }); + const entry = res.body.entries[0]; + expect(entry.id).to.equal(knowledgeBaseEntry.id); + expect(entry.text).to.equal(knowledgeBaseEntry.text); + }); + + it('returns 200 on get entries and entry exists', async () => { + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + const entry = res.body.entries[0]; + expect(entry.id).to.equal(knowledgeBaseEntry.id); + expect(entry.text).to.equal(knowledgeBaseEntry.text); + }); + + it('returns 200 on delete', async () => { + const entryId = 'my-doc-id-1'; + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'DELETE /internal/observability_ai_assistant/kb/entries/{entryId}', + params: { + path: { entryId }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + expect(res.body.entries.filter((entry) => entry.id.startsWith('my-doc-id')).length).to.eql( + 0 + ); + }); + + it('returns 500 on delete not found', async () => { + const entryId = 'my-doc-id-1'; + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'DELETE /internal/observability_ai_assistant/kb/entries/{entryId}', + params: { + path: { entryId }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(500); + }); + }); + describe('when managing multiple entries', () => { + before(async () => { + await clearKnowledgeBase(es); + }); + afterEach(async () => { + await clearKnowledgeBase(es); + }); + const knowledgeBaseEntries = [ + { + id: 'my_doc_a', + text: 'My content a', + }, + { + id: 'my_doc_b', + text: 'My content b', + }, + { + id: 'my_doc_c', + text: 'My content c', + }, + ]; + it('returns 200 on create', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/entries/import', + params: { body: { entries: knowledgeBaseEntries } }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + expect(res.body.entries.filter((entry) => entry.id.startsWith('my_doc')).length).to.eql(3); + }); + + it('allows sorting', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/entries/import', + params: { body: { entries: knowledgeBaseEntries } }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'desc', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + const entries = res.body.entries.filter((entry) => entry.id.startsWith('my_doc')); + expect(entries[0].id).to.eql('my_doc_c'); + expect(entries[1].id).to.eql('my_doc_b'); + expect(entries[2].id).to.eql('my_doc_a'); + + // asc + const resAsc = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: '', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + const entriesAsc = resAsc.body.entries.filter((entry) => entry.id.startsWith('my_doc')); + expect(entriesAsc[0].id).to.eql('my_doc_a'); + expect(entriesAsc[1].id).to.eql('my_doc_b'); + expect(entriesAsc[2].id).to.eql('my_doc_c'); + }); + it('allows searching', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/entries/import', + params: { body: { entries: knowledgeBaseEntries } }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/entries', + params: { + query: { + query: 'my_doc_a', + sortBy: 'doc_id', + sortDirection: 'asc', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + expect(res.body.entries.length).to.eql(1); + expect(res.body.entries[0].id).to.eql('my_doc_a'); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_setup.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_setup.spec.ts new file mode 100644 index 0000000000000..ad5dd32f5c0b4 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_setup.spec.ts @@ -0,0 +1,54 @@ +/* + * Copyright 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 { createKnowledgeBaseModel } from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/tests/knowledge_base/helpers'; +import { deleteKnowledgeBaseModel } from './helpers'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const ml = getService('ml'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + + describe('/internal/observability_ai_assistant/kb/setup', function () { + // TODO: https://github.com/elastic/kibana/issues/192757 + this.tags(['skipMKI']); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + it('returns empty object when successful', async () => { + await createKnowledgeBaseModel(ml); + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/setup', + roleAuthc, + internalReqHeader, + }) + .expect(200); + expect(res.body).to.eql({}); + await deleteKnowledgeBaseModel(ml); + }); + it('returns bad request if model cannot be installed', async () => { + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/setup', + roleAuthc, + internalReqHeader, + }) + .expect(400); + }); + }); +} 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 new file mode 100644 index 0000000000000..60e02152fd4ac --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_status.spec.ts @@ -0,0 +1,75 @@ +/* + * Copyright 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 { + createKnowledgeBaseModel, + TINY_ELSER, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/tests/knowledge_base/helpers'; +import { deleteKnowledgeBaseModel } from './helpers'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const ml = getService('ml'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + + describe('/internal/observability_ai_assistant/kb/status', function () { + // TODO: https://github.com/elastic/kibana/issues/192757 + this.tags(['skipMKI']); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await createKnowledgeBaseModel(ml); + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/setup', + roleAuthc, + internalReqHeader, + }) + .expect(200); + }); + + after(async () => { + await deleteKnowledgeBaseModel(ml); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + it('returns correct status after knowledge base is setup', async () => { + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/status', + roleAuthc, + internalReqHeader, + }) + .expect(200); + expect(res.body.deployment_state).to.eql('started'); + expect(res.body.model_name).to.eql(TINY_ELSER.id); + }); + + it('returns correct status after elser is stopped', async () => { + await ml.api.stopTrainedModelDeploymentES(TINY_ELSER.id, true); + + const res = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/status', + roleAuthc, + internalReqHeader, + }) + .expect(200); + + expect(res.body).to.eql({ + ready: false, + model_name: TINY_ELSER.id, + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_user_instructions.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_user_instructions.spec.ts new file mode 100644 index 0000000000000..86232035d0c58 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_user_instructions.spec.ts @@ -0,0 +1,354 @@ +/* + * Copyright 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 { sortBy } from 'lodash'; +import { Message, MessageRole } from '@kbn/observability-ai-assistant-plugin/common'; +import { CONTEXT_FUNCTION_NAME } from '@kbn/observability-ai-assistant-plugin/server/functions/context'; +import { + clearConversations, + clearKnowledgeBase, + createKnowledgeBaseModel, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/tests/knowledge_base/helpers'; +import { getConversationCreatedEvent } from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/tests/conversations/helpers'; +import { + LlmProxy, + createLlmProxy, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_llm_proxy'; +import { deleteKnowledgeBaseModel } from './helpers'; +import { createProxyActionConnector, deleteActionConnector } from '../../common/action_connectors'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const es = getService('es'); + const ml = getService('ml'); + const log = getService('log'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + + // TODO: https://github.com/elastic/kibana/issues/192711 cannot create custom users in serverless + // trying using built in users by using cookie auth + // TODO: https://github.com/elastic/kibana/issues/192757 + describe.skip('Knowledge base user instructions', function () { + this.tags(['skipMKI']); + let editorRoleAuthc: RoleCredentials; + let johnRoleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { + // Create API keys for 'editor' role, simulating different users + johnRoleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); + editorRoleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('editor'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await createKnowledgeBaseModel(ml); + + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/kb/setup', + roleAuthc: editorRoleAuthc, + internalReqHeader, + }) + .expect(200); + }); + + after(async () => { + await deleteKnowledgeBaseModel(ml); + await clearKnowledgeBase(es); + await clearConversations(es); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(johnRoleAuthc); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(editorRoleAuthc); + }); + + describe('when creating private and public user instructions', () => { + before(async () => { + await clearKnowledgeBase(es); + + const promises = [ + { roleAuthc: editorRoleAuthc, username: 'editor', isPublic: true }, + { roleAuthc: editorRoleAuthc, username: 'editor', isPublic: false }, + { roleAuthc: johnRoleAuthc, username: 'john', isPublic: true }, + { roleAuthc: johnRoleAuthc, username: 'john', isPublic: false }, + ].map(async ({ roleAuthc, username, isPublic }) => { + const visibility = isPublic ? 'Public' : 'Private'; + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/kb/user_instructions', + params: { + body: { + id: `${visibility.toLowerCase()}-doc-from-${username}`, + text: `${visibility} user instruction from "${username}"`, + public: isPublic, + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + }); + + await Promise.all(promises); + }); + + it('"editor" can retrieve their own private instructions and the public instruction', async () => { + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/user_instructions', + roleAuthc: editorRoleAuthc, + internalReqHeader, + }); + const instructions = res.body.userInstructions; + + const sortByDocId = (data: any) => sortBy(data, 'doc_id'); + expect(sortByDocId(instructions)).to.eql( + sortByDocId([ + { + doc_id: 'private-doc-from-editor', + public: false, + text: 'Private user instruction from "editor"', + }, + { + doc_id: 'public-doc-from-editor', + public: true, + text: 'Public user instruction from "editor"', + }, + { + doc_id: 'public-doc-from-john', + public: true, + text: 'Public user instruction from "john"', + }, + ]) + ); + }); + + it('"john" can retrieve their own private instructions and the public instruction', async () => { + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/user_instructions', + roleAuthc: johnRoleAuthc, + internalReqHeader, + }); + const instructions = res.body.userInstructions; + + const sortByDocId = (data: any) => sortBy(data, 'doc_id'); + expect(sortByDocId(instructions)).to.eql( + sortByDocId([ + { + doc_id: 'public-doc-from-editor', + public: true, + text: 'Public user instruction from "editor"', + }, + { + doc_id: 'public-doc-from-john', + public: true, + text: 'Public user instruction from "john"', + }, + { + doc_id: 'private-doc-from-john', + public: false, + text: 'Private user instruction from "john"', + }, + ]) + ); + }); + }); + + describe('when updating an existing user instructions', () => { + before(async () => { + await clearKnowledgeBase(es); + + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/kb/user_instructions', + params: { + body: { + id: 'doc-to-update', + text: 'Initial text', + public: true, + }, + }, + roleAuthc: editorRoleAuthc, + internalReqHeader, + }) + .expect(200); + + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/kb/user_instructions', + params: { + body: { + id: 'doc-to-update', + text: 'Updated text', + public: false, + }, + }, + roleAuthc: editorRoleAuthc, + internalReqHeader, + }) + .expect(200); + }); + + it('updates the user instruction', async () => { + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/kb/user_instructions', + roleAuthc: editorRoleAuthc, + internalReqHeader, + }); + const instructions = res.body.userInstructions; + + expect(instructions).to.eql([ + { + doc_id: 'doc-to-update', + text: 'Updated text', + public: false, + }, + ]); + }); + }); + + describe('when a user instruction exists and a conversation is created', () => { + let proxy: LlmProxy; + let connectorId: string; + + const userInstructionText = + 'Be polite and use language that is easy to understand. Never disagree with the user.'; + + async function getConversationForUser(roleAuthc: RoleCredentials) { + // the user instruction is always created by "editor" user + await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'PUT /internal/observability_ai_assistant/kb/user_instructions', + params: { + body: { + id: 'private-instruction-about-language', + text: userInstructionText, + public: false, + }, + }, + roleAuthc: editorRoleAuthc, + internalReqHeader, + }) + .expect(200); + + const interceptPromises = [ + proxy.interceptConversationTitle('LLM-generated title').completeAfterIntercept(), + proxy + .interceptConversation({ name: 'conversation', response: 'I, the LLM, hear you!' }) + .completeAfterIntercept(), + ]; + + const messages: Message[] = [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: 'You are a helpful assistant', + }, + }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: 'Today we will be testing user instructions!', + }, + }, + ]; + + const createResponse = await observabilityAIAssistantAPIClient + .slsUser({ + endpoint: 'POST /internal/observability_ai_assistant/chat/complete', + params: { + body: { + messages, + connectorId, + persist: true, + screenContexts: [], + scope: 'observability', + }, + }, + roleAuthc, + internalReqHeader, + }) + .expect(200); + + await proxy.waitForAllInterceptorsSettled(); + const conversationCreatedEvent = getConversationCreatedEvent(createResponse.body); + const conversationId = conversationCreatedEvent.conversation.id; + + const res = await observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'GET /internal/observability_ai_assistant/conversation/{conversationId}', + params: { + path: { + conversationId, + }, + }, + roleAuthc, + internalReqHeader, + }); + + // wait for all interceptors to be settled + await Promise.all(interceptPromises); + + const conversation = res.body; + return conversation; + } + + before(async () => { + proxy = await createLlmProxy(log); + connectorId = await createProxyActionConnector({ + supertest: supertestWithoutAuth, + log, + port: proxy.getPort(), + roleAuthc: editorRoleAuthc, + internalReqHeader, + }); + }); + + after(async () => { + proxy.close(); + await deleteActionConnector({ + supertest: supertestWithoutAuth, + connectorId, + log, + roleAuthc: editorRoleAuthc, + internalReqHeader, + }); + }); + + it('adds the instruction to the system prompt', async () => { + const conversation = await getConversationForUser(editorRoleAuthc); + const systemMessage = conversation.messages.find( + (message) => message.message.role === MessageRole.System + )!; + expect(systemMessage.message.content).to.contain(userInstructionText); + }); + + it('does not add the instruction to the context', async () => { + const conversation = await getConversationForUser(editorRoleAuthc); + const contextMessage = conversation.messages.find( + (message) => message.message.name === CONTEXT_FUNCTION_NAME + ); + + // there should be no suggestions with the user instruction + expect(contextMessage?.message.content).to.not.contain(userInstructionText); + expect(contextMessage?.message.data).to.not.contain(userInstructionText); + + // there should be no suggestions at all + expect(JSON.parse(contextMessage?.message.data!).suggestions.length).to.be(0); + }); + + it('does not add the instruction conversation for other users', async () => { + const conversation = await getConversationForUser(johnRoleAuthc); + const systemMessage = conversation.messages.find( + (message) => message.message.role === MessageRole.System + )!; + + expect(systemMessage.message.content).to.not.contain(userInstructionText); + expect(conversation.messages.length).to.be(5); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/public_complete/public_complete.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/public_complete/public_complete.spec.ts new file mode 100644 index 0000000000000..4f61634d8d6e6 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/public_complete/public_complete.spec.ts @@ -0,0 +1,319 @@ +/* + * Copyright 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 { + FunctionDefinition, + MessageRole, + type Message, +} from '@kbn/observability-ai-assistant-plugin/common'; +import { type StreamingChatResponseEvent } from '@kbn/observability-ai-assistant-plugin/common/conversation_complete'; +import { pick } from 'lodash'; +import type OpenAI from 'openai'; +import { type AdHocInstruction } from '@kbn/observability-ai-assistant-plugin/common/types'; +import { + createLlmProxy, + isFunctionTitleRequest, + LlmProxy, + LlmResponseSimulator, +} from '@kbn/test-suites-xpack/observability_ai_assistant_api_integration/common/create_llm_proxy'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { createProxyActionConnector, deleteActionConnector } from '../../common/action_connectors'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; +import { deleteAllConversations } from '../conversations/helpers'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertestWithoutAuth'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const log = getService('log'); + const observabilityAIAssistantAPIClient = getService('observabilityAIAssistantAPIClient'); + + const messages: Message[] = [ + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.System, + content: 'You are a helpful assistant', + }, + }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: 'Good morning, bot!', + }, + }, + ]; + describe('/api/observability_ai_assistant/chat/complete', function () { + // TODO: https://github.com/elastic/kibana/issues/192751 + this.tags(['skipMKI']); + + let proxy: LlmProxy; + let connectorId: string; + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + + interface RequestOptions { + actions?: Array>; + instructions?: AdHocInstruction[]; + format?: 'openai' | 'default'; + } + + type ConversationSimulatorCallback = ( + conversationSimulator: LlmResponseSimulator + ) => Promise; + + async function getResponseBody( + { actions, instructions, format = 'default' }: RequestOptions, + conversationSimulatorCallback: ConversationSimulatorCallback + ) { + const titleInterceptor = proxy.intercept('title', (body) => isFunctionTitleRequest(body)); + + const conversationInterceptor = proxy.intercept( + 'conversation', + (body) => !isFunctionTitleRequest(body) + ); + + const responsePromise = observabilityAIAssistantAPIClient.slsUser({ + endpoint: 'POST /api/observability_ai_assistant/chat/complete 2023-10-31', + roleAuthc, + internalReqHeader, + params: { + query: { format }, + body: { + messages, + connectorId, + persist: true, + actions, + instructions, + }, + }, + }); + + const [conversationSimulator, titleSimulator] = await Promise.race([ + Promise.all([ + conversationInterceptor.waitForIntercept(), + titleInterceptor.waitForIntercept(), + ]), + // make sure any request failures (like 400s) are properly propagated + responsePromise.then(() => []), + ]); + + await titleSimulator.status(200); + await titleSimulator.next('My generated title'); + await titleSimulator.complete(); + + await conversationSimulator.status(200); + if (conversationSimulatorCallback) { + await conversationSimulatorCallback(conversationSimulator); + } + + const response = await responsePromise; + + return String(response.body); + } + + async function getEvents( + options: RequestOptions, + conversationSimulatorCallback: ConversationSimulatorCallback + ) { + const responseBody = await getResponseBody(options, conversationSimulatorCallback); + + return responseBody + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .map((line) => JSON.parse(line) as StreamingChatResponseEvent) + .slice(2); // ignore context request/response, we're testing this elsewhere + } + + async function getOpenAIResponse(conversationSimulatorCallback: ConversationSimulatorCallback) { + const responseBody = await getResponseBody( + { + format: 'openai', + }, + conversationSimulatorCallback + ); + + return responseBody; + } + + before(async () => { + proxy = await createLlmProxy(log); + roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + connectorId = await createProxyActionConnector({ + supertest, + log, + port: proxy.getPort(), + internalReqHeader, + roleAuthc, + }); + }); + + after(async () => { + await deleteAllConversations({ + observabilityAIAssistantAPIClient, + internalReqHeader, + roleAuthc, + log, + }); + await deleteActionConnector({ supertest, connectorId, log, roleAuthc, internalReqHeader }); + proxy.close(); + await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + describe('after executing an action', () => { + let events: StreamingChatResponseEvent[]; + + before(async () => { + events = await getEvents( + { + actions: [ + { + name: 'my_action', + description: 'My action', + parameters: { + type: 'object', + properties: { + foo: { + type: 'string', + }, + }, + }, + }, + ], + }, + async (conversationSimulator) => { + await conversationSimulator.next({ + function_call: { name: 'my_action', arguments: JSON.stringify({ foo: 'bar' }) }, + }); + await conversationSimulator.complete(); + } + ); + }); + + it('closes the stream without persisting the conversation', () => { + expect( + pick( + events[events.length - 1], + 'message.message.content', + 'message.message.function_call', + 'message.message.role' + ) + ).to.eql({ + message: { + message: { + content: '', + function_call: { + name: 'my_action', + arguments: JSON.stringify({ foo: 'bar' }), + trigger: MessageRole.Assistant, + }, + role: MessageRole.Assistant, + }, + }, + }); + }); + }); + + describe('after adding an instruction', () => { + let body: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming; + + before(async () => { + await getEvents( + { + instructions: [ + { + text: 'This is a random instruction', + instruction_type: 'user_instruction', + }, + ], + }, + async (conversationSimulator) => { + body = conversationSimulator.body; + + await conversationSimulator.next({ + function_call: { name: 'my_action', arguments: JSON.stringify({ foo: 'bar' }) }, + }); + await conversationSimulator.complete(); + } + ); + }); + + it('includes the instruction in the system message', async () => { + expect(body.messages[0].content).to.contain('This is a random instruction'); + }); + }); + + describe('with openai format', () => { + let responseBody: string; + + before(async () => { + responseBody = await getOpenAIResponse(async (conversationSimulator) => { + await conversationSimulator.next('Hello'); + await conversationSimulator.complete(); + }); + }); + + function extractDataParts(lines: string[]) { + return lines.map((line) => { + // .replace is easier, but we want to verify here whether + // it matches the SSE syntax (`data: ...`) + const [, dataPart] = line.match(/^data: (.*)$/) || ['', '']; + return dataPart.trim(); + }); + } + + function getLines() { + return responseBody.split('\n\n').filter(Boolean); + } + + it('outputs each line an SSE-compatible format (data: ...)', () => { + const lines = getLines(); + + lines.forEach((line) => { + expect(line.match(/^data: /)); + }); + }); + + it('ouputs one chunk, and one [DONE] event', () => { + const dataParts = extractDataParts(getLines()); + + expect(dataParts[0]).not.to.be.empty(); + expect(dataParts[1]).to.be('[DONE]'); + }); + + it('outuputs an OpenAI-compatible chunk', () => { + const [dataLine] = extractDataParts(getLines()); + + expect(() => { + JSON.parse(dataLine); + }).not.to.throwException(); + + const parsedChunk = JSON.parse(dataLine); + + expect(parsedChunk).to.eql({ + model: 'unknown', + choices: [ + { + delta: { + content: 'Hello', + }, + finish_reason: null, + index: 0, + }, + ], + object: 'chat.completion.chunk', + // just test that these are a string and a number + id: String(parsedChunk.id), + created: Number(parsedChunk.created), + }); + }); + }); + }); +} From 8a89c8576df104c16ae3abf39b9db766e56d4e3b Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:25:47 -0700 Subject: [PATCH 040/107] Upgrade EUI to v95.12.0 (#193805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `v95.11.0`⏩`v95.12.0-backport.0` > [!note] > A few fun highlights from this release: > - Content within `EuiDataGrid`, `EuiBasicTable`, and `EuiInMemoryTable`, when manually selected/highlighted by users, should now more cleanly copy and paste into various spreadsheet apps > - `EuiProvider` will now detect the user's system-level dark or light mode and default to that if no `colorMode` prop is passed manually _[Questions? Please see our Kibana upgrade FAQ.](https://github.com/elastic/eui/blob/main/wiki/eui-team-processes/upgrading-kibana.md#faq-for-kibana-teams)_ --- ## [`v95.12.0`](https://github.com/elastic/eui/releases/v95.12.0) - Enhanced `EuiDataGrid` and `EuiBasic/InMemoryTable` to clean content newlines/tabs when users copy and paste from their tabular data ([#8019](https://github.com/elastic/eui/pull/8019)) - Updated `EuiResizableButton` with a new `accountForScrollbars` prop ([#8021](https://github.com/elastic/eui/pull/8021)) - Updated `EuiProvider` to inherit from the user's OS/system light/dark mode setting if a `colorMode` prop has not been passed ([#8026](https://github.com/elastic/eui/pull/8026)) **Bug fixes** - Fixed `EuiDatePicker`'s `onClear` button to not appear when the input is `disabled` ([#8020](https://github.com/elastic/eui/pull/8020)) - Fixed several `EuiDataGrid` row height bugs: ([#8025](https://github.com/elastic/eui/pull/8025)) - Fixed row heights not recalculating when `rowHeightOptions.lineHeight`, `gridStyles.fontSize`, or `gridStyles.cellPadding` changed - Fixed incorrect height calculations for `rowHeightOptions.rowHeights` with `lineCount`s - Fixed control column content to align better with multi-line row heights, as well as custom line-heights ## [`v95.12.0-backport.0`](https://github.com/elastic/eui/releases/v95.12.0-backport.0) **This is a backport release only intended for use by Kibana.** **Bug fixes** - Fixed `EuiProvider`'s system color mode detection causing errors during server-side rendering ([#8040](https://github.com/elastic/eui/pull/8040)) - Fixed an `EuiDataGrid` rendering bug that was causing bouncing scrollbar issues ([#8041](https://github.com/elastic/eui/pull/8041)) --- package.json | 2 +- .../src/jest/setup/polyfills.jsdom.js | 20 +++------ packages/kbn-unified-data-table/index.ts | 1 - .../row_control_column.tsx | 37 ++++++++-------- .../row_menu_control_column.tsx | 34 ++++++-------- .../src/components/data_table.scss | 17 +++---- .../data_table_document_selection.tsx | 38 ++++++---------- .../components/data_table_expand_button.tsx | 44 ++++++++++--------- .../src/components/data_table_row_control.tsx | 26 ----------- src/dev/license_checker/config.ts | 2 +- .../apps/discover/esql/_esql_view.ts | 2 +- test/functional/services/data_grid.ts | 29 ++++++++---- .../cypress/e2e/all/packs_create_edit.cy.ts | 4 +- .../cypress/tasks/response_actions.ts | 11 +++-- ...stom_timeline_data_grid_body.test.tsx.snap | 5 --- .../custom_timeline_data_grid_body.tsx | 3 -- .../services/ml/common_data_grid.ts | 2 +- .../services/ml/data_frame_analytics_table.ts | 2 +- .../hosts/hosts_risk_column.cy.ts | 4 +- .../cypress/screens/alerts_details.ts | 2 +- .../common/discover/esql/_esql_view.ts | 2 +- yarn.lock | 8 ++-- 22 files changed, 126 insertions(+), 169 deletions(-) delete mode 100644 packages/kbn-unified-data-table/src/components/data_table_row_control.tsx diff --git a/package.json b/package.json index cad364998e3c8..110b8ec23a6bf 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.15.0", "@elastic/ems-client": "8.5.3", - "@elastic/eui": "95.11.0", + "@elastic/eui": "95.12.0-backport.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", diff --git a/packages/kbn-test/src/jest/setup/polyfills.jsdom.js b/packages/kbn-test/src/jest/setup/polyfills.jsdom.js index 308bf18a9ffbd..e6616c2bccfa1 100644 --- a/packages/kbn-test/src/jest/setup/polyfills.jsdom.js +++ b/packages/kbn-test/src/jest/setup/polyfills.jsdom.js @@ -53,22 +53,16 @@ if (!Object.hasOwn(global, 'Worker')) { if (!Object.hasOwn(global, 'matchMedia')) { Object.defineProperty(global, 'matchMedia', { writable: true, - // eslint-disable-next-line no-undef - value: jest.fn().mockImplementation((query) => ({ + value: (query) => ({ matches: false, media: query, onchange: null, - // eslint-disable-next-line no-undef - addListener: jest.fn(), // deprecated - // eslint-disable-next-line no-undef - removeListener: jest.fn(), // deprecated - // eslint-disable-next-line no-undef - addEventListener: jest.fn(), - // eslint-disable-next-line no-undef - removeEventListener: jest.fn(), - // eslint-disable-next-line no-undef - dispatchEvent: jest.fn(), - })), + addListener: () => {}, + removeListener: () => {}, + addEventListener: () => {}, + removeEventListener: () => {}, + dispatchEvent: () => {}, + }), }); } } diff --git a/packages/kbn-unified-data-table/index.ts b/packages/kbn-unified-data-table/index.ts index 8f7e711bebcad..40a3dcc23dda8 100644 --- a/packages/kbn-unified-data-table/index.ts +++ b/packages/kbn-unified-data-table/index.ts @@ -28,7 +28,6 @@ export { popularizeField } from './src/utils/popularize_field'; export { useColumns, type UseColumnsProps } from './src/hooks/use_data_grid_columns'; export { OPEN_DETAILS, SELECT_ROW } from './src/components/data_table_columns'; // TODO: deprecate? -export { DataTableRowControl } from './src/components/data_table_row_control'; export type { UnifiedDataTableRenderCustomToolbar, diff --git a/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_control_column.tsx b/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_control_column.tsx index 3519bef843c4a..d1fec11906df4 100644 --- a/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_control_column.tsx +++ b/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_control_column.tsx @@ -16,7 +16,6 @@ import { EuiToolTip, } from '@elastic/eui'; import { RowControlColumn, RowControlProps } from '@kbn/discover-utils'; -import { DataTableRowControl, Size } from '../../data_table_row_control'; import { DEFAULT_CONTROL_COLUMN_WIDTH } from '../../../constants'; import { useControlColumn } from '../../../hooks/use_control_column'; @@ -40,23 +39,25 @@ export const RowControlCell = ({ tooltipContent, }) => { return ( - - - { - if (record) { - onClick?.({ record, rowIndex }); - } - }} - /> - - + + { + if (record) { + onClick?.({ record, rowIndex }); + } + }} + /> + ); }, [props.columnId, record, rowIndex] diff --git a/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_menu_control_column.tsx b/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_menu_control_column.tsx index 3d6cd19a53b1e..cc600df002502 100644 --- a/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_menu_control_column.tsx +++ b/packages/kbn-unified-data-table/src/components/custom_control_columns/additional_row_control/row_menu_control_column.tsx @@ -19,9 +19,7 @@ import { EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { css } from '@emotion/react'; import { RowControlColumn, RowControlProps } from '@kbn/discover-utils'; -import { DataTableRowControl, Size } from '../../data_table_row_control'; import { DEFAULT_CONTROL_COLUMN_WIDTH } from '../../../constants'; import { useControlColumn } from '../../../hooks/use_control_column'; @@ -80,26 +78,20 @@ export const RowMenuControlCell = ({ return ( - - { - setIsMoreActionsPopoverOpen(!isMoreActionsPopoverOpen); - }} - /> - - + + { + setIsMoreActionsPopoverOpen(!isMoreActionsPopoverOpen); + }} + /> + } isOpen={isMoreActionsPopoverOpen} closePopover={() => setIsMoreActionsPopoverOpen(false)} diff --git a/packages/kbn-unified-data-table/src/components/data_table.scss b/packages/kbn-unified-data-table/src/components/data_table.scss index 5bf8773db9c0b..263cc1a801083 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.scss +++ b/packages/kbn-unified-data-table/src/components/data_table.scss @@ -125,16 +125,17 @@ .unifiedDataTable__rowControl { // fine-tuning the vertical alignment with the text for any row height setting - margin-top: -$euiSizeXS; - .euiDataGridRowCell__content--defaultHeight & { // "Single line" row height setting - margin-top: 0; + margin-top: -1px; + + // Compact density - 'auto & custom' row height + .euiDataGrid--fontSizeSmall .euiDataGridRowCell__content:not(.euiDataGridRowCell__content--defaultHeight) & { + margin-top: -2.5px; } - &--size-normal { - display: inline-block; - width: $euiSizeL; - height: $euiSizeL; - overflow: hidden; + // Compact density - 'single' row height + .euiDataGrid--fontSizeSmall .euiDataGridRowCell__content--defaultHeight & { + align-self: flex-start; + margin-top: -3px; } } diff --git a/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx b/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx index c101d8c20f751..7395763e3de34 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx @@ -50,32 +50,22 @@ export const SelectButton = (props: EuiDataGridCellValueElementProps) => { } return ( - { + if ((event.nativeEvent as MouseEvent)?.shiftKey) { + toggleMultipleDocsSelection(record.id); + } else { + toggleDocSelection(record.id); + } + }} css={css` - padding-block: ${euiTheme.size.xs}; // to have the same height as "openDetails" control - padding-left: ${euiTheme.size.xs}; // space between controls + margin-left: ${euiTheme.size.xs}; /* fine tune horizontal alignment */ `} - > - - { - if ((event.nativeEvent as MouseEvent)?.shiftKey) { - toggleMultipleDocsSelection(record.id); - } else { - toggleDocSelection(record.id); - } - }} - /> - - + /> ); }; diff --git a/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx b/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx index f5bb21bc0c95d..ab98696ed685d 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx @@ -11,7 +11,6 @@ import React, { useContext, useEffect, useRef, useState } from 'react'; import { EuiButtonIcon, EuiDataGridCellValueElementProps, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { UnifiedDataTableContext } from '../table_context'; -import { DataTableRowControl, Size } from './data_table_row_control'; import { useControlColumn } from '../hooks/use_control_column'; /** @@ -49,25 +48,28 @@ export const ExpandButton = (props: EuiDataGridCellValueElementProps) => { } return ( - - - { - const nextHit = isCurrentRowExpanded ? undefined : record; - toolTipRef.current?.hideToolTip(); - setPressed(Boolean(nextHit)); - setExpanded?.(nextHit); - }} - color={isCurrentRowExpanded ? 'primary' : 'text'} - iconType={isCurrentRowExpanded ? 'minimize' : 'expand'} - isSelected={isCurrentRowExpanded} - /> - - + + { + const nextHit = isCurrentRowExpanded ? undefined : record; + toolTipRef.current?.hideToolTip(); + setPressed(Boolean(nextHit)); + setExpanded?.(nextHit); + }} + color={isCurrentRowExpanded ? 'primary' : 'text'} + iconType={isCurrentRowExpanded ? 'minimize' : 'expand'} + isSelected={isCurrentRowExpanded} + /> + ); }; diff --git a/packages/kbn-unified-data-table/src/components/data_table_row_control.tsx b/packages/kbn-unified-data-table/src/components/data_table_row_control.tsx deleted file mode 100644 index 68bf3174975b8..0000000000000 --- a/packages/kbn-unified-data-table/src/components/data_table_row_control.tsx +++ /dev/null @@ -1,26 +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 React from 'react'; -import classnames from 'classnames'; - -export enum Size { - normal = 'normal', -} - -export const DataTableRowControl: React.FC> = ({ - size, - children, -}) => { - const classes = classnames('unifiedDataTable__rowControl', { - // normalize the size of the control - [`unifiedDataTable__rowControl--size-${size}`]: size, - }); - return {children}; -}; diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index df5da2aff7183..15d08e194c4df 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -87,7 +87,7 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.5.3': ['Elastic License 2.0'], - '@elastic/eui@95.11.0': ['Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0'], + '@elastic/eui@95.12.0-backport.0': ['Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index 98bf29b187402..01660925db799 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -199,7 +199,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be(' - '); expect(await dataGrid.getHeaders()).to.eql([ - "Select columnPress the Enter key to interact with this cell's contents.", // contains screen reader help text + 'Select column', 'Control column', 'Access to degraded docs', 'Access to available stacktraces', diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index 903e38427181b..07a723857088c 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -9,7 +9,7 @@ import { chunk } from 'lodash'; import { Key } from 'selenium-webdriver'; -import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; +import { WebElementWrapper, CustomCheerioStatic } from '@kbn/ftr-common-functional-ui-services'; import { FtrService } from '../ftr_provider_context'; export interface TabbedGridData { @@ -34,12 +34,10 @@ export class DataGridService extends FtrService { const table = await this.find.byCssSelector('.euiDataGrid'); const $ = await table.parseDomContent(); - const columns = $('.euiDataGridHeaderCell') - .toArray() - .map((cell) => $(cell).text()); + const columns = this.getHeaderText($); const cells = $.findTestSubjects('dataGridRowCell') .toArray() - .map((cell) => $(cell).text()); + .map((cell) => $(cell).find('.euiDataGridRowCell__content').text()); const rows = chunk(cells, columns.length); @@ -76,12 +74,25 @@ export class DataGridService extends FtrService { /** * Returns an array of data grid headers names */ - public async getHeaders() { - const header = await this.testSubjects.find('euiDataGridBody > dataGridHeader'); - const $ = await header.parseDomContent(); + public getHeaderText(parsedDomContent: CustomCheerioStatic) { + const $ = parsedDomContent; return $('.euiDataGridHeaderCell') .toArray() - .map((cell) => $(cell).text()); + .map((cell) => { + const content = $(cell).find('.euiDataGridHeaderCell__content'); + if (content.length) { + return content.text(); + } else { + // Control columns will need hidden text manually stripped + $(cell).find('[hidden], [data-tabular-copy-marker]').remove(); + return $(cell).text(); + } + }); + } + + public async getHeaders() { + const header = await this.testSubjects.find('euiDataGridBody > dataGridHeader'); + return this.getHeaderText(await header.parseDomContent()); } public getHeaderElement(field: string) { diff --git a/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts index d3047656ad16a..dbed4e56f88a0 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts @@ -577,7 +577,9 @@ describe('Packs - Create and Edit', { tags: ['@ess', '@serverless'] }, () => { cy.getBySel('docsLoading').should('exist'); cy.getBySel('docsLoading').should('not.exist'); - return cy.get('tbody .euiTableRow > td:nth-child(5)').invoke('text'); + return cy + .get('tbody .euiTableRow > td:nth-child(5) > .euiTableCellContent') + .invoke('text'); }, (response) => response !== '-', { diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts index 715f8adc972f5..03d9ab6590167 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts @@ -114,13 +114,12 @@ export const getRunningProcesses = (command: string): Cypress.Chainable .getByTestSubj('processesOutput-processListTable', { timeout: 120000 }) .findByTestSubj('processesOutput-command') .contains(command) - .parents('td') - .siblings('td') - .eq(1) - .find('span') - .then((span) => { + .parents('tr') + .findByTestSubj('processesOutput-pid') + .find('.euiTableCellContent') + .then((cellContent) => { // get pid - return Number(span.text()); + return Number(cellContent.text()); }); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap index eaac9cb5dada6..d54175194b748 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap @@ -40,11 +40,6 @@ exports[`CustomTimelineDataGridBody should render exactly as snapshots 1`] = ` min-height: 34px; } -.c1 .euiDataGridRowCell .unifiedDataTable__rowControl, -.c1 .euiDataGridRowCell__content .unifiedDataTable__rowControl { - margin-top: -4px; -} -
{ - const cellText = $(cell).text(); + const cellText = $(cell).find('.euiDataGridRowCell__content').text(); const columnData = $(cell).attr('data-gridcell-column-index'); const rowData = $(cell).attr('data-gridcell-row-index'); return { text: cellText, column: Number(columnData) + 1, row: Number(rowData) }; diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_table.ts b/x-pack/test/functional/services/ml/data_frame_analytics_table.ts index 3279013f98069..77041a5bf12d3 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_table.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_table.ts @@ -436,7 +436,7 @@ export function MachineLearningDataFrameAnalyticsTableProvider({ const vars: Record = {}; for (const row of $('tr').toArray()) { - const [name, value] = $(row).find('td').toArray(); + const [name, value] = $(row).find('td').find('.euiTableCellContent').toArray(); vars[$(name).text().trim()] = $(value).text().trim(); } diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/hosts/hosts_risk_column.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/hosts/hosts_risk_column.cy.ts index cf52585f9bbea..179dbb0277a11 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/hosts/hosts_risk_column.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/hosts/hosts_risk_column.cy.ts @@ -32,7 +32,7 @@ describe('All hosts table', { tags: ['@ess'] }, () => { kqlSearch('host.name: "siem-kibana" {enter}'); cy.get('[data-test-subj="tableHeaderCell_node.risk_4"]').should('exist'); - cy.get(`${TABLE_CELL} .euiTableCellContent`).eq(4).should('have.text', 'Low'); + cy.get(TABLE_CELL).eq(4).should('have.text', 'Low'); }); }); @@ -55,7 +55,7 @@ describe('All hosts table', { tags: ['@ess'] }, () => { kqlSearch('host.name: "siem-kibana" {enter}'); cy.get('[data-test-subj="tableHeaderCell_node.risk_4"]').should('exist'); - cy.get(`${TABLE_CELL} .euiTableCellContent`).eq(4).should('have.text', 'Critical'); + cy.get(TABLE_CELL).eq(4).should('have.text', 'Critical'); }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts b/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts index bbae387497af7..aeca3f232588c 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/alerts_details.ts @@ -30,7 +30,7 @@ export const OVERVIEW_STATUS = '[data-test-subj="eventDetails"] [data-test-subj= export const EVENT_DETAILS_ALERT_STATUS_POPOVER = '[data-test-subj="event-details-alertStatusPopover"]'; -export const TABLE_CELL = '.euiTableRowCell'; +export const TABLE_CELL = '.euiTableRowCell .euiTableCellContent'; export const CELL_EXPAND_VALUE = '[data-test-subj="euiDataGridCellExpandButton"]'; diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 7881f5545388f..1bedd0acd0cc4 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -202,7 +202,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be(' - '); expect(await dataGrid.getHeaders()).to.eql([ - "Select columnPress the Enter key to interact with this cell's contents.", // contains screen reader help text + 'Select column', 'Control column', 'Access to degraded docs', 'Access to available stacktraces', diff --git a/yarn.lock b/yarn.lock index a3d54dbd3f1bd..ea20375155074 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1741,10 +1741,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@95.11.0": - version "95.11.0" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-95.11.0.tgz#40e8124ac54c625ba7160cb84a378507abdeaf40" - integrity sha512-O688EbhrgSrV9j54mnK4xLyhv+imkBv5ti7isqLxJtd0L7Fe2A1d6EaA11Qv5plOwwC+cGsrkrDnlSqi1MtNoQ== +"@elastic/eui@95.12.0-backport.0": + version "95.12.0-backport.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-95.12.0-backport.0.tgz#de862ded9f23053b24e1f1939de1ff8f8109be60" + integrity sha512-hqhqWdAGw5tQwWTP/hn2VoM8YQE2k9IdMmGh0RdkG+JcD1GZySvSDWdTQgr9iA4/XaulJp9R3OenwDjkLLmjPw== dependencies: "@hello-pangea/dnd" "^16.6.0" "@types/lodash" "^4.14.202" From c5d75b98577bafba9773747b19d787a43b9599ad Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:51:20 -0500 Subject: [PATCH 041/107] Update actions/checkout action to v4.2.0 (main) (#194078) 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 | |---|---|---|---| | [actions/checkout](https://togithub.com/actions/checkout) | action | minor | `v4.1.7` -> `v4.2.0` | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes
actions/checkout (actions/checkout) ### [`v4.2.0`](https://togithub.com/actions/checkout/blob/HEAD/CHANGELOG.md#v420) [Compare Source](https://togithub.com/actions/checkout/compare/v4.1.7...v4.2.0) - Add Ref and Commit outputs by [@​lucacome](https://togithub.com/lucacome) in [https://github.com/actions/checkout/pull/1180](https://togithub.com/actions/checkout/pull/1180) - Dependency updates by [@​dependabot-](https://togithub.com/dependabot-) [https://github.com/actions/checkout/pull/1777](https://togithub.com/actions/checkout/pull/1777), [https://github.com/actions/checkout/pull/1872](https://togithub.com/actions/checkout/pull/1872)
--- ### 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> Co-authored-by: Jon --- .github/workflows/alert-failed-test.yml | 2 +- .github/workflows/codeql-stats.yml | 2 +- .github/workflows/codeql.yml | 4 ++-- .github/workflows/label-failed-test.yml | 2 +- .github/workflows/launchdarkly-code-references.yml | 2 +- .github/workflows/on-merge.yml | 2 +- .github/workflows/skip-failed-test.yml | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/alert-failed-test.yml b/.github/workflows/alert-failed-test.yml index 4d465b03dd43f..90e7ef6371d1a 100644 --- a/.github/workflows/alert-failed-test.yml +++ b/.github/workflows/alert-failed-test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout kibana-operations - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-operations' ref: main diff --git a/.github/workflows/codeql-stats.yml b/.github/workflows/codeql-stats.yml index fc01cdd969295..e6b10f028dffc 100644 --- a/.github/workflows/codeql-stats.yml +++ b/.github/workflows/codeql-stats.yml @@ -11,7 +11,7 @@ jobs: if: github.repository == 'elastic/kibana' # Hack: Do not run on forks steps: - name: Checkout kibana-operations - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-operations' ref: main diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 82080dd9235f9..5a93858e2d4a8 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ matrix.branch }} @@ -61,7 +61,7 @@ jobs: if: github.repository == 'elastic/kibana' # Hack: Do not run on forks steps: - name: Checkout kibana-operations - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-operations' ref: main diff --git a/.github/workflows/label-failed-test.yml b/.github/workflows/label-failed-test.yml index 358ff08edecd1..b3732eff3b2e5 100644 --- a/.github/workflows/label-failed-test.yml +++ b/.github/workflows/label-failed-test.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout kibana-operations - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-operations' ref: main diff --git a/.github/workflows/launchdarkly-code-references.yml b/.github/workflows/launchdarkly-code-references.yml index eb32608d74928..1034d25b29e85 100644 --- a/.github/workflows/launchdarkly-code-references.yml +++ b/.github/workflows/launchdarkly-code-references.yml @@ -16,7 +16,7 @@ jobs: if: github.event.repository.fork == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: fetch-depth: 11 # This value must be set if the lookback configuration option is not disabled for find-code-references. Read more: https://github.com/launchdarkly/ld-find-code-refs#searching-for-unused-flags-extinctions - name: LaunchDarkly Code References diff --git a/.github/workflows/on-merge.yml b/.github/workflows/on-merge.yml index b41d04bf85174..7ab6aa106d7f6 100644 --- a/.github/workflows/on-merge.yml +++ b/.github/workflows/on-merge.yml @@ -29,7 +29,7 @@ jobs: contains(github.event.pull_request.labels.*.name, 'auto-backport')))) steps: - name: Checkout Actions - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-github-actions' ref: main diff --git a/.github/workflows/skip-failed-test.yml b/.github/workflows/skip-failed-test.yml index 913ba7b9648d4..46c569aeeef08 100644 --- a/.github/workflows/skip-failed-test.yml +++ b/.github/workflows/skip-failed-test.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Actions - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-github-actions' ref: main @@ -30,7 +30,7 @@ jobs: token: ${{secrets.KIBANAMACHINE_TOKEN}} - name: Checkout kibana-operations - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: repository: 'elastic/kibana-operations' ref: main From 48b2099e0dbc2f05a1ce151e0f68b8841e286d52 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:15:14 +1000 Subject: [PATCH 042/107] skip failing test suite (#184600) --- test/functional/apps/discover/group3/_lens_vis.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index 30918f91ff2fb..b5907a97bb5ab 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -102,7 +102,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return seriesType; } - describe('discover lens vis', function () { + // Failing: See https://github.com/elastic/kibana/issues/184600 + describe.skip('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'); From cc02343d36fa3fa273e476d32c776f84164f6770 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:17:13 +1000 Subject: [PATCH 043/107] skip failing test suite (#193868) --- test/functional/apps/console/_misc_console_behavior.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/apps/console/_misc_console_behavior.ts b/test/functional/apps/console/_misc_console_behavior.ts index 03f38980bcfa6..9da5ea362fde3 100644 --- a/test/functional/apps/console/_misc_console_behavior.ts +++ b/test/functional/apps/console/_misc_console_behavior.ts @@ -18,6 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const PageObjects = getPageObjects(['common', 'console', 'header']); + // Failing: See https://github.com/elastic/kibana/issues/193868 // Failing: See https://github.com/elastic/kibana/issues/193868 describe.skip('misc console behavior', function testMiscConsoleBehavior() { before(async () => { From 5ed0426ef6657af24437d1931fc99c7094dc1e35 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 30 Sep 2024 17:33:31 -0700 Subject: [PATCH 044/107] [DOCS] Add TheHive connector to case settings (#193802) --- docs/management/action-types.asciidoc | 4 +-- .../cases/manage-cases-settings.asciidoc | 3 +- .../connectors/action-types/thehive.asciidoc | 34 +++++++++---------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/docs/management/action-types.asciidoc b/docs/management/action-types.asciidoc index a39b5a996dca3..30bf4f791e5d8 100644 --- a/docs/management/action-types.asciidoc +++ b/docs/management/action-types.asciidoc @@ -92,9 +92,9 @@ a| <> | Create an incident in {swimlane}. -a| <> +a| <> -| Create cases and alerts in TheHive. +| Create cases and alerts in {hive}. a| <> diff --git a/docs/management/cases/manage-cases-settings.asciidoc b/docs/management/cases/manage-cases-settings.asciidoc index b0764c495101a..13079d35a27a0 100644 --- a/docs/management/cases/manage-cases-settings.asciidoc +++ b/docs/management/cases/manage-cases-settings.asciidoc @@ -31,6 +31,7 @@ management systems: * {sn-itsm} * {sn-sir} * {swimlane} +* {hive} * {webhook-cm} NOTE: To create connectors and send cases to external systems, you must have the @@ -45,7 +46,7 @@ Alternatively, you can create them in *{stack-manage-app} > Cases > Settings*: . Enter your required settings. Refer to <>, <>, <>, <>, -<>, or <> for connector +<>, <>, or <> for connector configuration details. You can subsequently choose the connector when you create cases and use it in case templates. diff --git a/docs/management/connectors/action-types/thehive.asciidoc b/docs/management/connectors/action-types/thehive.asciidoc index d218833527ee3..e847d0b621eca 100644 --- a/docs/management/connectors/action-types/thehive.asciidoc +++ b/docs/management/connectors/action-types/thehive.asciidoc @@ -1,18 +1,18 @@ [[thehive-action-type]] -== TheHive connector and action +== {hive} connector and action ++++ -TheHive +{hive} ++++ -:frontmatter-description: Add a connector that can create cases and alerts in TheHive. +:frontmatter-description: Add a connector that can create cases and alerts in {hive}. :frontmatter-tags-products: [kibana] :frontmatter-tags-content-type: [how-to] :frontmatter-tags-user-goals: [configure] -TheHive connector uses the https://docs.strangebee.com/thehive/api-docs/[TheHive (v1) REST API] to create cases and alerts. added:[8.16.0] +{hive} connector uses the https://docs.strangebee.com/thehive/api-docs/[{hive} (v1) REST API] to create cases and alerts. added:[8.16.0] [NOTE] ==== -If you use this connector with <>, the status values differ in {kib} and TheHive. +If you use this connector with <>, the status values differ in {kib} and {hive}. The status values are not synchronized when you update a case. ==== @@ -24,19 +24,19 @@ You can create connectors in *{stack-manage-app} > {connectors-ui}* or as needed when you're creating a rule. For example: [role="screenshot"] -image::management/connectors/images/thehive-connector.png[TheHive connector] +image::management/connectors/images/thehive-connector.png[{hive} connector] // NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[thehive-connector-configuration]] ==== Connector configuration -TheHive connectors have the following configuration properties: +{hive} connectors have the following configuration properties: Name:: The name of the connector. -Organisation:: The organisation in TheHive that will contain the cases or alerts. -URL:: The instance URL in TheHive. -API key:: The API key for authentication in TheHive. +Organisation:: The organisation in {hive} that will contain the cases or alerts. +URL:: The instance URL in {hive}. +API key:: The API key for authentication in {hive}. [float] [[thehive-action-configuration]] @@ -46,16 +46,16 @@ You can test connectors for creating a case or an alert with the <> to customize connecto [float] [[configure-thehive]] -=== Configure TheHive +=== Configure {hive} -To generate an API key in TheHive: +To generate an API key in {hive}: -1. Log in to your TheHive instance. +1. Log in to your {hive} instance. 2. Open profile tab and select the settings. 3. Go to *API Key*. 4. Click *Create* if no API key has been created previously; otherwise, you can view the API key by clicking on *Reveal*. From 35233ba890558a8251b71a0fba33d8f42fae662d Mon Sep 17 00:00:00 2001 From: Andrew Macri Date: Mon, 30 Sep 2024 20:49:52 -0400 Subject: [PATCH 045/107] [Security Solution] [Security Assistant] Fixes an unable to load page error in the Security assistant (#194488) ### [Security Solution] [Security Assistant] Fixes an unable to load page error in the Security assistant This PR fixes an `Unable to load page error` in the Security Assistant, introduced in , where a check that appeared to be optional was removed. - The issue occurs when the assistant is asked a question that is likely to require anonymization, for example: `which alerts should I look at first?` - After the error occurs, re-opening the assistant for the same conversation may re-trigger the error - As a workaround, clear Kibana local storage for the current user, or via the browser's dev tools, specifically delete the `elasticAssistantDefault.lastConversationId` setting illustrated by the screenshot below: ![local_storage_key](https://github.com/user-attachments/assets/882f68e2-a253-49d7-84ad-fe2326bbfe20) ### Steps to reproduce To reproduce: 1) Ask the assistant a question that is likely to cause anonymized alerts to be returned, for example: `which alerts should I look at first?` **Expected result** - Anonymized alerts are displayed **Actual result** - An `Unable to load page` error is displayed, as illustrated by the screenshot below: ![unable_to_load_page](https://github.com/user-attachments/assets/54006a07-5a79-45d6-97cb-f36e0a71361f) - The error details include text similar to the output below: ``` TypeError: Cannot convert undefined or null to object at Function.keys () at replaceAnonymizedValuesWithOriginalValues (http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:60965:14) at transformMessageWithReplacements (http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:100511:158) at transformMessage (http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:100612:41) at http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:100638:32 at Array.map () at getComments (http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:100595:45) at http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:68997:15 at updateMemo (http://localhost:5601/XXXXXXXXXXXX/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.dll.js:369829:19) at Object.useMemo (http://localhost:5601/XXXXXXXXXXXX/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.dll.js:370375:16) The above error occurred in AssistantComponent: at AssistantComponent (http://localhost:5601/XXXXXXXXXXXX/bundles/plugin/securitySolution/1.0.0/securitySolution.chunk.lazy_application_dependencies.js:68776:3) at div at http://localhost:5601/XXXXXXXXXXXX/bundles/kbn-ui-shared-deps-npm/kbn-ui-shared-deps-npm.dll.js:160008:73 at div at http://loc ``` - The following video illustrates the error: --- .../data_anonymization/helpers/index.test.ts | 24 +++++++++++++++++++ .../impl/data_anonymization/helpers/index.ts | 12 ++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.test.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.test.ts index 02294bdd870f5..7048ab442cafa 100644 --- a/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.test.ts +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.test.ts @@ -123,6 +123,30 @@ describe('helpers', () => { expect(result).toEqual(messageContent); }); + it('returns the original messageContent if replacements is null', () => { + const messageContent = + 'User {{ user.name 3541b730-1dce-4937-b63f-0d618ea1cc5f }} added a member to the Administrators group on host {{ host.name b222e892-431e-4e4f-9295-2ba92ef9d12d }}'; + + const result = replaceAnonymizedValuesWithOriginalValues({ + messageContent, + replacements: null, // <-- null + }); + + expect(result).toEqual(messageContent); + }); + + it('returns the original messageContent if replacements is undefined', () => { + const messageContent = + 'User {{ user.name 3541b730-1dce-4937-b63f-0d618ea1cc5f }} added a member to the Administrators group on host {{ host.name b222e892-431e-4e4f-9295-2ba92ef9d12d }}'; + + const result = replaceAnonymizedValuesWithOriginalValues({ + messageContent, + replacements: undefined, // <-- undefined + }); + + expect(result).toEqual(messageContent); + }); + it('replaces multiple occurrences of the same replacement key', () => { const messageContent = 'User {{ user.name 3541b730-1dce-4937-b63f-0d618ea1cc5f }} added a member to the Administrators group on host {{ host.name b222e892-431e-4e4f-9295-2ba92ef9d12d }}, which is unusual because {{ user.name 3541b730-1dce-4937-b63f-0d618ea1cc5f }} is not a member of the Administrators group.'; diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.ts b/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.ts index 62f190f3d37e4..6b17b2891635a 100644 --- a/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.ts +++ b/x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.ts @@ -40,13 +40,15 @@ export const replaceAnonymizedValuesWithOriginalValues = ({ replacements, }: { messageContent: string; - replacements: Replacements; + replacements: Replacements | null | undefined; }): string => - Object.keys(replacements).reduce((acc, key) => { - const value = replacements[key]; + replacements != null + ? Object.keys(replacements).reduce((acc, key) => { + const value = replacements[key]; - return acc.replaceAll(key, value); - }, messageContent); + return acc.replaceAll(key, value); + }, messageContent) + : messageContent; export const replaceOriginalValuesWithUuidValues = ({ messageContent, From 50e730a43c0330d4fbebc77987221b64706ecde0 Mon Sep 17 00:00:00 2001 From: Davis McPhee Date: Mon, 30 Sep 2024 22:00:47 -0300 Subject: [PATCH 046/107] Fix flaky test #193400 (#194346) ## Summary This PR unskips the flaky test from #193400. It wasn't clear exactly why this was flaky and I couldn't reproduce it, but I made some minor changes to the default profile app state code that could address some potential race conditions. However, both my original 100x flaky test run without the changes and my 100x flaky test run after the changes succeeded, so it's hard to tell if the tests are still flaky or if the changes actually had any impact. Flaky test runs: - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7027 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7028 Resolves #193400. Resolves #193367. ### 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 - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Elastic Machine --- .../discover_data_state_container.ts | 36 +++++++++++-------- .../utils/change_data_view.ts | 2 +- .../_get_additional_cell_actions.ts | 3 +- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts b/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts index 344dd92eaa04d..ce7f820aa3cdd 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts @@ -275,25 +275,33 @@ export function getDataStateContainer({ const { resetDefaultProfileState, dataView } = internalStateContainer.getState(); const { esqlQueryColumns } = dataSubjects.documents$.getValue(); const defaultColumns = uiSettings.get(DEFAULT_COLUMNS_SETTING, []); - - if (dataView) { - const stateUpdate = getDefaultProfileState({ - profilesManager, - resetDefaultProfileState, - defaultColumns, - dataView, - esqlQueryColumns, + const clearResetProfileState = () => { + internalStateContainer.transitions.setResetDefaultProfileState({ + columns: false, + rowHeight: false, }); + }; - if (stateUpdate) { - await appStateContainer.replaceUrlState(stateUpdate); - } + if (!dataView) { + clearResetProfileState(); + return; } - internalStateContainer.transitions.setResetDefaultProfileState({ - columns: false, - rowHeight: false, + const stateUpdate = getDefaultProfileState({ + profilesManager, + resetDefaultProfileState, + defaultColumns, + dataView, + esqlQueryColumns, }); + + if (!stateUpdate) { + clearResetProfileState(); + return; + } + + await appStateContainer.replaceUrlState(stateUpdate); + clearResetProfileState(); } ); diff --git a/src/plugins/discover/public/application/main/state_management/utils/change_data_view.ts b/src/plugins/discover/public/application/main/state_management/utils/change_data_view.ts index 55738d75f785e..54885c5de9bfd 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/change_data_view.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/change_data_view.ts @@ -43,6 +43,7 @@ export async function changeDataView( let nextDataView: DataView | null = null; internalState.transitions.setIsDataViewLoading(true); + internalState.transitions.setResetDefaultProfileState({ columns: true, rowHeight: true }); try { nextDataView = typeof id === 'string' ? await dataViews.get(id, false) : id; @@ -70,5 +71,4 @@ export async function changeDataView( } internalState.transitions.setIsDataViewLoading(false); - internalState.transitions.setResetDefaultProfileState({ columns: true, rowHeight: true }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts index 6e84d54661901..738785357fb5e 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts @@ -21,8 +21,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const browser = getService('browser'); - // Failing: See https://github.com/elastic/kibana/issues/193400 - describe.skip('extension getAdditionalCellActions', () => { + describe('extension getAdditionalCellActions', () => { before(async () => { await PageObjects.svlCommonPage.loginAsAdmin(); }); From d8dac724eb4a452921a27ec5336fbc6725738935 Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:04:41 -0500 Subject: [PATCH 047/107] Update ftr (main) (#193422) 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 | |---|---|---|---|---| | [chromedriver](https://togithub.com/giggio/node-chromedriver) | devDependencies | patch | [`^128.0.1` -> `^128.0.3`](https://renovatebot.com/diffs/npm/chromedriver/128.0.1/128.0.3) | `129.0.0` | | [selenium-webdriver](https://togithub.com/SeleniumHQ/selenium/tree/trunk/javascript/node/selenium-webdriver#readme) ([source](https://togithub.com/SeleniumHQ/selenium)) | devDependencies | patch | [`^4.24.0` -> `^4.24.1`](https://renovatebot.com/diffs/npm/selenium-webdriver/4.24.0/4.24.1) | `4.25.0` | --- ### Release Notes
giggio/node-chromedriver (chromedriver) ### [`v128.0.3`](https://togithub.com/giggio/node-chromedriver/compare/128.0.2...128.0.3) [Compare Source](https://togithub.com/giggio/node-chromedriver/compare/128.0.2...128.0.3) ### [`v128.0.2`](https://togithub.com/giggio/node-chromedriver/compare/128.0.1...128.0.2) [Compare Source](https://togithub.com/giggio/node-chromedriver/compare/128.0.1...128.0.2)
SeleniumHQ/selenium (selenium-webdriver) ### [`v4.24.1`](https://togithub.com/SeleniumHQ/selenium/compare/748ffc9bc3cf40211b27d1b27e238b26aae93f46...603f4a4a5944e9de8e5f8ee77ddbefc8560da6b7) [Compare Source](https://togithub.com/SeleniumHQ/selenium/compare/748ffc9bc3cf40211b27d1b27e238b26aae93f46...603f4a4a5944e9de8e5f8ee77ddbefc8560da6b7)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Co-authored-by: Jon --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 110b8ec23a6bf..aadda3070ecc6 100644 --- a/package.json +++ b/package.json @@ -1672,7 +1672,7 @@ "buildkite-test-collector": "^1.7.0", "callsites": "^3.1.0", "chance": "1.0.18", - "chromedriver": "^128.0.1", + "chromedriver": "^128.0.3", "clean-webpack-plugin": "^3.0.0", "cli-progress": "^3.12.0", "cli-table3": "^0.6.1", @@ -1797,7 +1797,7 @@ "rxjs-marbles": "^7.0.1", "sass-embedded": "^1.78.0", "sass-loader": "^10.5.1", - "selenium-webdriver": "^4.24.0", + "selenium-webdriver": "^4.24.1", "sharp": "0.32.6", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/yarn.lock b/yarn.lock index ea20375155074..c545c7a8f64af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14250,10 +14250,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^128.0.1: - version "128.0.1" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-128.0.1.tgz#971fb267cc6893a712808cea6c977473ba167145" - integrity sha512-UmWqZXXAyuRa37pE+lnU46vJcCM/y0ddF015LHxycEOYfuqsK7k9ZxJuXCQNWbws9e7FAMQj/GJZT92WPgis0g== +chromedriver@^128.0.3: + version "128.0.3" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-128.0.3.tgz#7c2cd2d160f269e78f40840ee7a043dac3687148" + integrity sha512-Xn/bknOpGlY9tKinwS/hVWeNblSeZvbbJbF8XZ73X1jeWfAFPRXx3fMLdNNz8DqruDbx3cKEJ5wR3mnst6G3iw== dependencies: "@testim/chrome-version" "^1.1.4" axios "^1.7.4" @@ -28408,10 +28408,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@^4.24.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.24.0.tgz#bf7563f9e0b1ef29d55f215a8fb187b21e4de26e" - integrity sha512-qrqoHhHPZuKLiz5VAQUxrn3ILs7/cYqn2/x96r35g5JjkLUjOS1lX+F+tEJKhRMlQ/MGJ+N1016JF5g2xZUFzw== +selenium-webdriver@^4.24.1: + version "4.25.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.25.0.tgz#3562b49668817974bb1d13d25a50e8bc0264fcf3" + integrity sha512-zl9IX93caOT8wbcCpZzAkEtYa+hNgJ4C5GUN8uhpzggqRLvsg1asfKi0p1uNZC8buYVvsBZbx8S+9MjVAjs4oA== dependencies: "@bazel/runfiles" "^5.8.1" jszip "^3.10.1" From 8694a6dfc4debc92e308b992ab01758d951cb71b Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:03:37 +1000 Subject: [PATCH 048/107] [api-docs] 2024-10-01 Daily api_docs build (#194513) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/847 --- 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.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 | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/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.devdocs.json | 2 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_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 | 110 ++- .../kbn_cloud_security_posture_common.mdx | 7 +- 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 | 36 +- 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 | 36 +- 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 +- ...e_http_router_server_internal.devdocs.json | 60 +- .../kbn_core_http_router_server_internal.mdx | 2 +- ...core_http_router_server_mocks.devdocs.json | 12 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 863 ++++++++++++++++-- api_docs/kbn_core_http_server.mdx | 4 +- 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 +- api_docs/kbn_discover_utils.devdocs.json | 22 +- 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 +- .../kbn_elastic_assistant_common.devdocs.json | 4 +- 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 +- .../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_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_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_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_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_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_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_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.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 +- ...ritysolution_io_ts_list_types.devdocs.json | 8 +- .../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_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.devdocs.json | 356 +++++++- api_docs/kbn_unified_data_table.mdx | 4 +- 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 | 2 +- .../observability_a_i_assistant.devdocs.json | 20 +- 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.devdocs.json | 130 +++ api_docs/observability_shared.mdx | 4 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 12 +- 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 +- 757 files changed, 2301 insertions(+), 867 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index c2981462a3dde..e19f0a36853c9 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-09-30 +date: 2024-10-01 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 b130cdc81b5e5..a3bf748aad326 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-09-30 +date: 2024-10-01 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 c41d32eaa284e..2a3a249cc5930 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-09-30 +date: 2024-10-01 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 717f17b25b20e..3d1156cee457f 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-09-30 +date: 2024-10-01 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 9fed55dc03c91..0eb8a1e05b356 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-09-30 +date: 2024-10-01 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 a797cbec70b55..a714c1d587005 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-09-30 +date: 2024-10-01 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 36617a8f09fd4..dc7275dadaf75 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-09-30 +date: 2024-10-01 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 e9dfb8e37e110..ca34d4982b920 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-09-30 +date: 2024-10-01 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 657450f2041d3..7cc518b0c1507 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-09-30 +date: 2024-10-01 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 5a7bc30cbd009..cae84e39aaca4 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-09-30 +date: 2024-10-01 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 08e6d5f26b9e4..58978bdb98fe5 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-09-30 +date: 2024-10-01 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 0666b497b9358..18da84da335ec 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-09-30 +date: 2024-10-01 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 9a74d456f3d26..40f6d88be4953 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-09-30 +date: 2024-10-01 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 c5f10e95b9087..9cdf8e8844355 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-09-30 +date: 2024-10-01 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 c7b4fd16b8647..7947d1f8c3c85 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-09-30 +date: 2024-10-01 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 ef011394dc959..8632afdd38b82 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-09-30 +date: 2024-10-01 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 536404ffec768..7b4be885990c1 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-09-30 +date: 2024-10-01 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 d041b4004c47e..fcdd5213ba6c5 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-09-30 +date: 2024-10-01 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 2579dc78f3b94..d21ed59f7a3fd 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-09-30 +date: 2024-10-01 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 a47d50d6a7d81..99c0dc5938a58 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-09-30 +date: 2024-10-01 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 ad380cb8469f5..aa0d6ec753213 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-09-30 +date: 2024-10-01 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 f0373a65fbe71..fe9f903aef46f 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-09-30 +date: 2024-10-01 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 3ded579e126c6..2980b3a038866 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-09-30 +date: 2024-10-01 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 983bb8427b472..9fa64990a3465 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-09-30 +date: 2024-10-01 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 f5bd254f00b99..6706a52b70c65 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-09-30 +date: 2024-10-01 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 b81fd0a1279f1..67a982e2a441b 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-09-30 +date: 2024-10-01 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 d9355de82919b..41a9229c29bc0 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-09-30 +date: 2024-10-01 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 a7aad8fe59633..d0aac23bae84b 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-09-30 +date: 2024-10-01 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 383e9189a6317..2372c9dadcdb8 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-09-30 +date: 2024-10-01 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 a88573e22e4e6..a98647849e10a 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-09-30 +date: 2024-10-01 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 36b68475982f0..7d3df3aade9f3 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-09-30 +date: 2024-10-01 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 dd7974a423c76..343fa28ad1ca2 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-09-30 +date: 2024-10-01 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 72011bfdf7ba1..822196c269de0 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-09-30 +date: 2024-10-01 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 c76ccc0239ef7..23adfc5efa65a 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index a1d3ff1be5e70..d84bc1c468ee6 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0563484b82101..728f448d53255 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 514ea5ade3b96..4b5f4950bf116 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-09-30 +date: 2024-10-01 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 c2efac47dbcd1..fce799f4d4840 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-09-30 +date: 2024-10-01 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 2f2fbad030272..b1896fb867ee2 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-09-30 +date: 2024-10-01 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 a4aeef7e436e9..0705a6b0d4292 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-09-30 +date: 2024-10-01 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 182a643444a26..5d7e9a371568b 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-09-30 +date: 2024-10-01 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 95e55d08f284a..acb89fa9d4ec4 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-09-30 +date: 2024-10-01 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 68952669476d2..2b41648402d00 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-09-30 +date: 2024-10-01 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 901e874703dba..a2e86dbeac429 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-09-30 +date: 2024-10-01 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 5b4997612bcdf..1a0561c270a30 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-09-30 +date: 2024-10-01 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 5917bd1db3990..98c25fc5ecc02 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-09-30 +date: 2024-10-01 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 a08ca763529db..69c8b325b5069 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-09-30 +date: 2024-10-01 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 5861988f99f7f..c3e58e1d578a2 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-09-30 +date: 2024-10-01 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 fa88431336826..cf60a4ca6125c 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-09-30 +date: 2024-10-01 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 c7e57cf778be5..2ebdb6c75d9fc 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-09-30 +date: 2024-10-01 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 29b953cf61034..5fdf075745f31 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-09-30 +date: 2024-10-01 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 4250a9188d2d0..d414fbf1e5d7c 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-09-30 +date: 2024-10-01 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 687832c84621f..e444777ab2ecc 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-09-30 +date: 2024-10-01 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 0543b1d8cf8d4..2babf07041cb2 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-09-30 +date: 2024-10-01 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 94f190e135ce1..6a4e253a221de 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-09-30 +date: 2024-10-01 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 f2c34114a6c7c..650b8d836b6da 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-09-30 +date: 2024-10-01 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 74dcee645d27c..e557b3a20d9ea 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-09-30 +date: 2024-10-01 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 bcd850cae3eef..e9e1f55a55433 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-09-30 +date: 2024-10-01 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 b4372e691098a..19781fee1f7da 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-09-30 +date: 2024-10-01 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 cd2eba717787c..b63a00ee55163 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-09-30 +date: 2024-10-01 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 f0b415f6af71d..b84f0f1abe9f7 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-09-30 +date: 2024-10-01 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 a34f1f7c87ad3..d121c981880de 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-09-30 +date: 2024-10-01 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 17b40bebb5830..e8ffd7397c7b4 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-09-30 +date: 2024-10-01 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 18b6a08712f46..cdd49f61fdb6c 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-09-30 +date: 2024-10-01 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 b31cb9bfe9950..9cf7f7489be16 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-09-30 +date: 2024-10-01 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 9970090f29aeb..c2162999c75ba 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-09-30 +date: 2024-10-01 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 8788451548ee6..ff770a0250e5b 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-09-30 +date: 2024-10-01 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 6c37dbc27e7c0..98f03775f85d9 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-09-30 +date: 2024-10-01 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 0115712c02a8c..d06dac03f942c 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-09-30 +date: 2024-10-01 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 368587f7c5ab0..695a32fa634ee 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-09-30 +date: 2024-10-01 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 2252e7b08d583..64aa5d7b225f5 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-09-30 +date: 2024-10-01 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 7ad1383260000..f4daba871e1aa 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-09-30 +date: 2024-10-01 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 19e7af855c29e..7645fecaa540a 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-09-30 +date: 2024-10-01 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 7092b499fe4c3..a70e8903322bd 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-09-30 +date: 2024-10-01 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 457b6d2aac888..e7f4a617ecd9d 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-09-30 +date: 2024-10-01 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 ac5ed60f393b2..7932f117b7a94 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-09-30 +date: 2024-10-01 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 033d25e962b6b..b54168b054e6c 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-09-30 +date: 2024-10-01 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 35c958cc9fa1a..b384290f6e7e9 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-09-30 +date: 2024-10-01 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 41b5c86af75d7..38c29f4f96872 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-09-30 +date: 2024-10-01 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 bf3d3184ab512..02f71dca31f35 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-09-30 +date: 2024-10-01 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 7e7df520bda19..325a208ae2f2a 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-09-30 +date: 2024-10-01 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 ce2c034260867..c2bea389415fc 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-09-30 +date: 2024-10-01 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 2f326e9dc2fd5..277ce86a234ae 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-09-30 +date: 2024-10-01 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 d61dd65a0c0b4..1272abf42c87b 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-09-30 +date: 2024-10-01 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 ac604771619d4..7432394ddbe80 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-09-30 +date: 2024-10-01 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 b56426e9d806a..52b5b9460dc45 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-09-30 +date: 2024-10-01 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 f382c8458e870..97330aafdea68 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-09-30 +date: 2024-10-01 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 4a34d4c0912d2..b9d0f39e39114 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-09-30 +date: 2024-10-01 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 d5617956891ae..ed0ec2c4c740c 100644 --- a/api_docs/inventory.devdocs.json +++ b/api_docs/inventory.devdocs.json @@ -105,7 +105,7 @@ "; }>]>; }>, ", "InventoryRouteHandlerResources", ", { entities: ", - "LatestEntity", + "Entity", "[]; }, ", "InventoryRouteCreateOptions", ">; }" diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index 833bcccfefeb4..e37d1388eda5b 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-09-30 +date: 2024-10-01 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 c622580f9fbcb..aee15ec404242 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-09-30 +date: 2024-10-01 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 0093151d6bda8..6011475cea216 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 07bff3d1991dd..3ecb118bde677 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 108f79524a676..a936d14880a10 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index ff10fb9b3a052..2338b5fac0648 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-09-30 +date: 2024-10-01 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 6956773d77523..f98f40e40796d 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-09-30 +date: 2024-10-01 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 a8e27f6bebfa4..bc4fd57cb0bf7 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-09-30 +date: 2024-10-01 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 84a62ad868b6a..15378ab23c20f 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-09-30 +date: 2024-10-01 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 6ea2afc207679..723ba3eca2c7a 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-09-30 +date: 2024-10-01 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 196e9e948a442..95471606618f7 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-09-30 +date: 2024-10-01 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 b2c4eb2566556..53080181fd9dc 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-09-30 +date: 2024-10-01 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 17ed17fab58f7..10ceb25fb8207 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-09-30 +date: 2024-10-01 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 18f4a0eacb3ad..dd194433b2108 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-09-30 +date: 2024-10-01 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 a820a8de94edc..b50e6437178fe 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-09-30 +date: 2024-10-01 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 6b3f493f65ad3..4150cfef9aba6 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-09-30 +date: 2024-10-01 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 fc9bd8bf28e94..2c0a69a10f484 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-09-30 +date: 2024-10-01 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 222e18cc8bc05..4c157b1dd7413 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-09-30 +date: 2024-10-01 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 3e8b3c0957c0e..2e677862515bd 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-09-30 +date: 2024-10-01 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 cb3de865f6a6b..8b2d1ff57c159 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-09-30 +date: 2024-10-01 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 4ce527660c1c7..04b97cf570759 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-09-30 +date: 2024-10-01 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 028cdb22bafca..ce8210415752e 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-09-30 +date: 2024-10-01 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 5112c31a7a637..1a80039f68965 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-09-30 +date: 2024-10-01 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 17f96bdb5d508..c9494fed2085b 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-09-30 +date: 2024-10-01 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 3bef37990f05c..4fc4ebf1fd5f0 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-09-30 +date: 2024-10-01 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 8d3451765df6c..09a1db03a46a8 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-09-30 +date: 2024-10-01 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 32cf49133021a..1a61772a0bee9 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-09-30 +date: 2024-10-01 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 53433d9b76a78..f29584f4f83b8 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-09-30 +date: 2024-10-01 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 d0ad814c3b5d0..431a3ffb08646 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-09-30 +date: 2024-10-01 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 4bebc535d4385..9dc60e5f52381 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-09-30 +date: 2024-10-01 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 5b554a959ad8d..ad413ec0d25bb 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-09-30 +date: 2024-10-01 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 3f1884d144516..91bd6528e4238 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-09-30 +date: 2024-10-01 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 4cb8df35823dc..80363b09a0210 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-09-30 +date: 2024-10-01 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 ff7fd468a9467..2b10e9ddd20e9 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-09-30 +date: 2024-10-01 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 55dbaf66fb30f..eebc2de7e279a 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-09-30 +date: 2024-10-01 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 a2fa31ae5b050..fbd305dd8d605 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-09-30 +date: 2024-10-01 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 feb19650b34ee..ddce54fe2b62c 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-09-30 +date: 2024-10-01 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 3d6645ec5ba52..409b49c99c1a3 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-09-30 +date: 2024-10-01 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 bd91ea23fdcc0..4a9fcaef28d0a 100644 --- a/api_docs/kbn_cloud_security_posture_common.devdocs.json +++ b/api_docs/kbn_cloud_security_posture_common.devdocs.json @@ -17,7 +17,115 @@ "objects": [] }, "common": { - "classes": [], + "classes": [ + { + "parentPluginId": "@kbn/cloud-security-posture-common", + "id": "def-common.UiMetricService", + "type": "Class", + "tags": [], + "label": "UiMetricService", + "description": [], + "path": "x-pack/packages/kbn-cloud-security-posture-common/utils/ui_metrics.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-common", + "id": "def-common.UiMetricService.setup", + "type": "Function", + "tags": [], + "label": "setup", + "description": [], + "signature": [ + "(usageCollection: ", + { + "pluginId": "usageCollection", + "scope": "public", + "docId": "kibUsageCollectionPluginApi", + "section": "def-public.UsageCollectionSetup", + "text": "UsageCollectionSetup" + }, + ") => void" + ], + "path": "x-pack/packages/kbn-cloud-security-posture-common/utils/ui_metrics.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-common", + "id": "def-common.UiMetricService.setup.$1", + "type": "Object", + "tags": [], + "label": "usageCollection", + "description": [], + "signature": [ + { + "pluginId": "usageCollection", + "scope": "public", + "docId": "kibUsageCollectionPluginApi", + "section": "def-public.UsageCollectionSetup", + "text": "UsageCollectionSetup" + } + ], + "path": "x-pack/packages/kbn-cloud-security-posture-common/utils/ui_metrics.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/cloud-security-posture-common", + "id": "def-common.UiMetricService.trackUiMetric", + "type": "Function", + "tags": [], + "label": "trackUiMetric", + "description": [], + "signature": [ + "(metricType: string, eventName: CloudSecurityUiCounters) => void" + ], + "path": "x-pack/packages/kbn-cloud-security-posture-common/utils/ui_metrics.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-common", + "id": "def-common.UiMetricService.trackUiMetric.$1", + "type": "string", + "tags": [], + "label": "metricType", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/kbn-cloud-security-posture-common/utils/ui_metrics.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/cloud-security-posture-common", + "id": "def-common.UiMetricService.trackUiMetric.$2", + "type": "CompoundType", + "tags": [], + "label": "eventName", + "description": [], + "signature": [ + "CloudSecurityUiCounters" + ], + "path": "x-pack/packages/kbn-cloud-security-posture-common/utils/ui_metrics.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "functions": [ { "parentPluginId": "@kbn/cloud-security-posture-common", diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index 8f8e38bd82b1a..b4f97284d288e 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; @@ -21,13 +21,16 @@ Contact [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 68 | 0 | 66 | 0 | +| 74 | 0 | 72 | 0 | ## Common ### Functions +### Classes + + ### Interfaces diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 87c6a138cdf09..bfdd0e5508583 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-09-30 +date: 2024-10-01 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 4fbf4832258e8..d6a399933674e 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-09-30 +date: 2024-10-01 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 2e97a5443befe..07b1a75112054 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-09-30 +date: 2024-10-01 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 d6a868584e0e9..76f6745f3013c 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-09-30 +date: 2024-10-01 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 23f8eb144c0c0..497399e928ff2 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-09-30 +date: 2024-10-01 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 0eda7eb993687..f6e98bfbe9d32 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-09-30 +date: 2024-10-01 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 6f9e1dc5f0c7c..be8322ba44e5d 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-09-30 +date: 2024-10-01 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 84f4b0ce06a3b..ffe6711a7318c 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-09-30 +date: 2024-10-01 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 6c4e991362c3f..91f837f7d7e83 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-09-30 +date: 2024-10-01 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 98006b06f24ae..3bb4ee45d8c8d 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-09-30 +date: 2024-10-01 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 52ccdecaeb5e0..3858e6ad13e9f 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-09-30 +date: 2024-10-01 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 6469d8983f348..2cf068eea34ae 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-09-30 +date: 2024-10-01 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 cfaf4c50d43d9..848c7491b96af 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-09-30 +date: 2024-10-01 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 e712d9a890ca7..55a8064e83f6d 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-09-30 +date: 2024-10-01 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 b4d7d80e79483..0a8cdc33231d7 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-09-30 +date: 2024-10-01 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 ea525aaa88837..2ae812052de35 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-09-30 +date: 2024-10-01 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 3c32fbd12e72a..e3a129efc04fb 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-09-30 +date: 2024-10-01 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 57fab41924d1d..66e965f5200aa 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-09-30 +date: 2024-10-01 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 5cd4d439bc588..52c10b61a526b 100644 --- a/api_docs/kbn_core_analytics_browser.devdocs.json +++ b/api_docs/kbn_core_analytics_browser.devdocs.json @@ -650,6 +650,14 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx" }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.ts" + }, { "plugin": "integrationAssistant", "path": "x-pack/plugins/integration_assistant/public/services/telemetry/service.ts" @@ -1146,6 +1154,30 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/telemetry/send_alert_suppression_telemetry_event.test.ts" }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, { "plugin": "@kbn/core-analytics-browser-mocks", "path": "packages/core/analytics/core-analytics-browser-mocks/src/analytics_service.mock.ts" @@ -1782,7 +1814,7 @@ }, { "plugin": "discover", - "path": "src/plugins/discover/public/services/discover_ebt_context_manager.ts" + "path": "src/plugins/discover/public/services/discover_ebt_manager.ts" }, { "plugin": "telemetry", @@ -1854,7 +1886,7 @@ }, { "plugin": "discover", - "path": "src/plugins/discover/public/services/discover_ebt_context_manager.test.ts" + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" }, { "plugin": "@kbn/core-application-browser-internal", diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 9c96fed17a824..dd8459b9c5025 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-09-30 +date: 2024-10-01 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 ca656e0b61ea5..9f5ff975e667b 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-09-30 +date: 2024-10-01 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 d45952f72cc7d..ffef9bd5229db 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-09-30 +date: 2024-10-01 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 9444036ee944d..33ca18815bca9 100644 --- a/api_docs/kbn_core_analytics_server.devdocs.json +++ b/api_docs/kbn_core_analytics_server.devdocs.json @@ -658,6 +658,14 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx" }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.ts" + }, { "plugin": "integrationAssistant", "path": "x-pack/plugins/integration_assistant/public/services/telemetry/service.ts" @@ -1154,6 +1162,30 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/telemetry/send_alert_suppression_telemetry_event.test.ts" }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" + }, { "plugin": "@kbn/core-analytics-browser-mocks", "path": "packages/core/analytics/core-analytics-browser-mocks/src/analytics_service.mock.ts" @@ -1790,7 +1822,7 @@ }, { "plugin": "discover", - "path": "src/plugins/discover/public/services/discover_ebt_context_manager.ts" + "path": "src/plugins/discover/public/services/discover_ebt_manager.ts" }, { "plugin": "telemetry", @@ -1862,7 +1894,7 @@ }, { "plugin": "discover", - "path": "src/plugins/discover/public/services/discover_ebt_context_manager.test.ts" + "path": "src/plugins/discover/public/services/discover_ebt_manager.test.ts" }, { "plugin": "@kbn/core-application-browser-internal", diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 850c53e234998..cdbc7d1b815ad 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-09-30 +date: 2024-10-01 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 26b5d334c332b..ba1894cf9236b 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-09-30 +date: 2024-10-01 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 43f9244f4d4ad..16a50f7b7626c 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-09-30 +date: 2024-10-01 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 c9ae4ef8d4edd..193cbc80e7b48 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-09-30 +date: 2024-10-01 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 7c7700da55ecf..320935b72f49f 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-09-30 +date: 2024-10-01 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 f1f893e0d71b3..bd0d19ddbee70 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-09-30 +date: 2024-10-01 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 c7d4ca64056eb..0ce2ecc6ac6aa 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-09-30 +date: 2024-10-01 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 7151d0c7064f8..2d1ae36f74550 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-09-30 +date: 2024-10-01 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 887ad618548af..210c03bbbfebc 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-09-30 +date: 2024-10-01 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 e0d64a299f67c..86145623392f4 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-09-30 +date: 2024-10-01 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 22ade16cda1c5..9a94242cc4f37 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-09-30 +date: 2024-10-01 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 1cb7416ed99d7..d01d2bfadd2d6 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-09-30 +date: 2024-10-01 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 d8784ac43a38c..7a1ed385cc97a 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-09-30 +date: 2024-10-01 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 e6f9e56968520..495dff641a577 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-09-30 +date: 2024-10-01 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 479dd5f3916c4..5b74e0b644293 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-09-30 +date: 2024-10-01 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 c539b39499aae..0bc55cbba5e03 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-09-30 +date: 2024-10-01 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 70eefbb15b421..3d788d2663631 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-09-30 +date: 2024-10-01 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 99d7f64ec7892..9ba9276c2e0f3 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-09-30 +date: 2024-10-01 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 4265005261b83..26a776d8de6aa 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-09-30 +date: 2024-10-01 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 4076609dadde7..5cdc7fccc068f 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-09-30 +date: 2024-10-01 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 6e8514c3b2a8f..afffb741973a2 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-09-30 +date: 2024-10-01 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 2641966a6256d..36d03e5cf51a2 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-09-30 +date: 2024-10-01 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 4e5e8a66bba3e..32d309c90918f 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-09-30 +date: 2024-10-01 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 04b554c3ed8b2..8bf417d52c2bb 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-09-30 +date: 2024-10-01 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 417aa62ace742..702a340808af6 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-09-30 +date: 2024-10-01 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 8901b2e131883..02b180a6f8bb5 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-09-30 +date: 2024-10-01 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 deee85cc12123..32d723fc7af10 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-09-30 +date: 2024-10-01 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 c7cc1873ea0b6..b9604db0cb01f 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-09-30 +date: 2024-10-01 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 b50fd885690e0..c360e0506fc8d 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-09-30 +date: 2024-10-01 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 8f729d0ea0416..1f699cdb70256 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-09-30 +date: 2024-10-01 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 ec54c0d1cf4d4..fbf534bdf9610 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-09-30 +date: 2024-10-01 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 fa621d98db61e..bba47c306b3f5 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-09-30 +date: 2024-10-01 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 acfbfd4a95e8e..1b014f453d4ce 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-09-30 +date: 2024-10-01 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 459d0c52df339..292d0199b37d1 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-09-30 +date: 2024-10-01 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 f76cc8e5e52f5..eeb8777a6f5f2 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-09-30 +date: 2024-10-01 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 bc1e7490b5d42..a4a403512ce73 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-09-30 +date: 2024-10-01 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 d8628c3b056ab..978884605cd72 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-09-30 +date: 2024-10-01 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 544529663e8b2..52ea8c4e16f1a 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-09-30 +date: 2024-10-01 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 b60fb3fdf1999..bce7b75a82848 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-09-30 +date: 2024-10-01 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 a910976cbbd58..079de0432786a 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-09-30 +date: 2024-10-01 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 f963da2a15045..180c091912cb5 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-09-30 +date: 2024-10-01 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 7441bb0c054e8..b54ea151107de 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-09-30 +date: 2024-10-01 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 5ae8f40a318dd..c9b316083ceb5 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-09-30 +date: 2024-10-01 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 22d2b2644c7c4..71759693bb652 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-09-30 +date: 2024-10-01 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 0687746b37051..4fb3049d4250c 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-09-30 +date: 2024-10-01 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 d5b88c3cd5104..05b2858995dce 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-09-30 +date: 2024-10-01 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 46c3ad39662cf..ea5a293075a69 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-09-30 +date: 2024-10-01 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 b8c4f1cf8714f..8630149294337 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-09-30 +date: 2024-10-01 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 7bd69f4a905c6..ee53ff873e760 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-09-30 +date: 2024-10-01 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 399b5e6edf012..2a9d1243df193 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-09-30 +date: 2024-10-01 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 ab9cfd2210486..ff1c19d8c75d3 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-09-30 +date: 2024-10-01 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 038b53e8c3e61..af3d0fb89a9be 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-09-30 +date: 2024-10-01 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 51c53d89a1b80..7d30c1c11b2a2 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-09-30 +date: 2024-10-01 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 5fc0f395e0323..f3b8fff70126d 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-09-30 +date: 2024-10-01 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 b8cc529db80aa..29877e2c83b4d 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-09-30 +date: 2024-10-01 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 51b51dc726db9..46562e4eb5d34 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-09-30 +date: 2024-10-01 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 2f4938c766633..e58c2f915baac 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-09-30 +date: 2024-10-01 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 2bf157c950928..0056a6bc4c575 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-09-30 +date: 2024-10-01 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 dce024169a0c3..27b4daad7ceff 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-09-30 +date: 2024-10-01 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 866871c7cdd1b..0056153b1b89f 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-09-30 +date: 2024-10-01 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 79b0e6384d9f4..7a99351a04975 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-09-30 +date: 2024-10-01 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 230090ce59182..27224a167f0bd 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-09-30 +date: 2024-10-01 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 8d0a6de9c71a4..d89087b83dc8b 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-09-30 +date: 2024-10-01 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 bb0bbd9d71a0f..f6b41bbb0ccce 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-09-30 +date: 2024-10-01 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 9db29b0d955cc..c66f9aaf45038 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-09-30 +date: 2024-10-01 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 01f456d5d96ea..0e5e0df6c244e 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-09-30 +date: 2024-10-01 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 f981971a9dba2..470330cdbc120 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-09-30 +date: 2024-10-01 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 ea8cf5a283905..b416bf84af438 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-09-30 +date: 2024-10-01 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 109263a7bf6f4..724520397eb55 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-09-30 +date: 2024-10-01 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 71332556de1fd..c032e1de4715d 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-09-30 +date: 2024-10-01 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.devdocs.json b/api_docs/kbn_core_http_router_server_internal.devdocs.json index 211118bbfe356..ede556280b205 100644 --- a/api_docs/kbn_core_http_router_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_router_server_internal.devdocs.json @@ -179,7 +179,7 @@ }, "<", "Method", - ">, \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -187,7 +187,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -258,7 +266,7 @@ }, "<", "Method", - ">, \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -266,7 +274,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -337,7 +353,7 @@ }, "<", "Method", - ">, \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -345,7 +361,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -416,7 +440,7 @@ }, "<", "Method", - ">, \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -424,7 +448,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -495,7 +527,7 @@ }, "<", "Method", - ">, \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -503,7 +535,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 5414a33b0e791..4550ad2f41790 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-09-30 +date: 2024-10-01 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.devdocs.json b/api_docs/kbn_core_http_router_server_mocks.devdocs.json index a1827393c0cb2..24e21bf81d9dc 100644 --- a/api_docs/kbn_core_http_router_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_router_server_mocks.devdocs.json @@ -72,7 +72,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -80,7 +80,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 213262e4421fa..5f84e5c180b2f 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-09-30 +date: 2024-10-01 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 770d8f3ba717f..7b7082d5b4639 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -379,6 +379,98 @@ "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AddVersionOpts.security", + "type": "Object", + "tags": [], + "label": "security", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthcDisabled", + "type": "Interface", + "tags": [], + "label": "AuthcDisabled", + "description": [ + "\nDescribes the state when authentication is disabled.\n\n- `enabled`: A boolean indicating that authentication is not enabled (`false`).\n- `reason`: A string explaining why authentication is disabled." + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthcDisabled.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthcDisabled.reason", + "type": "string", + "tags": [], + "label": "reason", + "description": [], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthcEnabled", + "type": "Interface", + "tags": [], + "label": "AuthcEnabled", + "description": [ + "\nDescribes the authentication status when authentication is enabled.\n\n- `enabled`: A boolean or string indicating the authentication status. Can be `true` (authentication required) or `'optional'` (authentication is optional)." + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthcEnabled.enabled", + "type": "CompoundType", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "true | \"optional\"" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -790,6 +882,85 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthzDisabled", + "type": "Interface", + "tags": [], + "label": "AuthzDisabled", + "description": [ + "\nDescribes the state when authorization is disabled.\n\n- `enabled`: A boolean indicating that authorization is not enabled (`false`).\n- `reason`: A string explaining why authorization is disabled." + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthzDisabled.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "false" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthzDisabled.reason", + "type": "string", + "tags": [], + "label": "reason", + "description": [], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthzEnabled", + "type": "Interface", + "tags": [], + "label": "AuthzEnabled", + "description": [ + "\nDescribes the authorization requirements when authorization is enabled.\n\n- `requiredPrivileges`: An array of privileges or privilege sets that are required for the route." + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AuthzEnabled.requiredPrivileges", + "type": "Array", + "tags": [], + "label": "requiredPrivileges", + "description": [], + "signature": [ + "(string | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.PrivilegeSet", + "text": "PrivilegeSet" + }, + ")[]" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.CustomHttpResponseOptions", @@ -4922,6 +5093,14 @@ "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/router.test.ts" }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/router.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/router.test.ts" + }, { "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" @@ -5030,6 +5209,14 @@ "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -11182,6 +11369,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.KibanaRequest.authzResult", + "type": "Object", + "tags": [], + "label": "authzResult", + "description": [ + "\nAuthorization check result, passed to the route handler.\nIndicates whether the specific privilege was granted or denied." + ], + "signature": [ + "Record | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.KibanaRequest.isInternalApiRequest", @@ -11593,6 +11796,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.KibanaRequestState.authzResult", + "type": "Object", + "tags": [], + "label": "authzResult", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.KibanaRequestState.measureElu", @@ -11658,6 +11875,27 @@ "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.KibanaRouteOptions.security", + "type": "CompoundType", + "tags": [], + "label": "security", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.InternalRouteSecurity", + "text": "InternalRouteSecurity" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -12003,10 +12241,10 @@ }, { "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPostAuthNextResult", + "id": "def-server.OnPostAuthAuthzResult", "type": "Interface", "tags": [], - "label": "OnPostAuthNextResult", + "label": "OnPostAuthAuthzResult", "description": [], "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", "deprecated": false, @@ -12014,7 +12252,7 @@ "children": [ { "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPostAuthNextResult.type", + "id": "def-server.OnPostAuthAuthzResult.type", "type": "string", "tags": [], "label": "type", @@ -12026,7 +12264,22 @@ "docId": "kibKbnCoreHttpServerPluginApi", "section": "def-server.OnPostAuthResultType", "text": "OnPostAuthResultType" - } + }, + ".authzResult" + ], + "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.OnPostAuthAuthzResult.authzResult", + "type": "Object", + "tags": [], + "label": "authzResult", + "description": [], + "signature": [ + "{ [x: string]: boolean; }" ], "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", "deprecated": false, @@ -12037,10 +12290,10 @@ }, { "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPostAuthToolkit", + "id": "def-server.OnPostAuthNextResult", "type": "Interface", "tags": [], - "label": "OnPostAuthToolkit", + "label": "OnPostAuthNextResult", "description": [], "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", "deprecated": false, @@ -12048,60 +12301,134 @@ "children": [ { "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPostAuthToolkit.next", - "type": "Function", + "id": "def-server.OnPostAuthNextResult.type", + "type": "string", "tags": [], - "label": "next", - "description": [ - "To pass request to the next handler" - ], + "label": "type", + "description": [], "signature": [ - "() => ", { "pluginId": "@kbn/core-http-server", "scope": "server", "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.OnPostAuthNextResult", - "text": "OnPostAuthNextResult" - } + "section": "def-server.OnPostAuthResultType", + "text": "OnPostAuthResultType" + }, + ".next" ], "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] + "trackAdoption": false } ], "initialIsOpen": false }, { "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPreAuthNextResult", + "id": "def-server.OnPostAuthToolkit", "type": "Interface", "tags": [], - "label": "OnPreAuthNextResult", + "label": "OnPostAuthToolkit", "description": [], - "path": "packages/core/http/core-http-server/src/lifecycle/on_pre_auth.ts", + "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPreAuthNextResult.type", - "type": "string", + "id": "def-server.OnPostAuthToolkit.next", + "type": "Function", "tags": [], - "label": "type", - "description": [], + "label": "next", + "description": [ + "To pass request to the next handler" + ], "signature": [ + "() => ", { "pluginId": "@kbn/core-http-server", "scope": "server", "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.OnPreAuthResultType", - "text": "OnPreAuthResultType" + "section": "def-server.OnPostAuthResult", + "text": "OnPostAuthResult" } ], - "path": "packages/core/http/core-http-server/src/lifecycle/on_pre_auth.ts", + "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.OnPostAuthToolkit.authzResultNext", + "type": "Function", + "tags": [], + "label": "authzResultNext", + "description": [], + "signature": [ + "(authzResult: Record) => ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.OnPostAuthAuthzResult", + "text": "OnPostAuthAuthzResult" + } + ], + "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.OnPostAuthToolkit.authzResultNext.$1", + "type": "Object", + "tags": [], + "label": "authzResult", + "description": [], + "signature": [ + "Record" + ], + "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.OnPreAuthNextResult", + "type": "Interface", + "tags": [], + "label": "OnPreAuthNextResult", + "description": [], + "path": "packages/core/http/core-http-server/src/lifecycle/on_pre_auth.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.OnPreAuthNextResult.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.OnPreAuthResultType", + "text": "OnPreAuthResultType" + } + ], + "path": "packages/core/http/core-http-server/src/lifecycle/on_pre_auth.ts", "deprecated": false, "trackAdoption": false } @@ -12676,6 +13003,50 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.PrivilegeSet", + "type": "Interface", + "tags": [], + "label": "PrivilegeSet", + "description": [ + "\nA set of privileges that can be used to define complex authorization requirements.\n\n- `anyRequired`: An array of privileges where at least one must be satisfied to meet the authorization requirement.\n- `allRequired`: An array of privileges where all listed privileges must be satisfied to meet the authorization requirement." + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.PrivilegeSet.anyRequired", + "type": "Array", + "tags": [], + "label": "anyRequired", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.PrivilegeSet.allRequired", + "type": "Array", + "tags": [], + "label": "allRequired", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RequestHandlerContextBase", @@ -12802,6 +13173,29 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfig.security", + "type": "Object", + "tags": [], + "label": "security", + "description": [ + "\nDefines the security requirements for a route, including authorization and authentication." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouteConfig.options", @@ -13025,6 +13419,29 @@ "path": "packages/core/http/core-http-server/src/router/route.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.security", + "type": "Object", + "tags": [], + "label": "security", + "description": [ + "\nDefines the security requirements for a route, including authorization and authentication.\n" + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -13212,6 +13629,27 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterRoute.security", + "type": "CompoundType", + "tags": [], + "label": "security", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.InternalRouteSecurity", + "text": "InternalRouteSecurity" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouterRoute.validationSchemas", @@ -13302,6 +13740,71 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteSecurity", + "type": "Interface", + "tags": [], + "label": "RouteSecurity", + "description": [ + "\nDescribes the security requirements for a route, including authorization and authentication." + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteSecurity.authz", + "type": "CompoundType", + "tags": [], + "label": "authz", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AuthzDisabled", + "text": "AuthzDisabled" + }, + " | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AuthzEnabled", + "text": "AuthzEnabled" + } + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteSecurity.authc", + "type": "CompoundType", + "tags": [], + "label": "authc", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteAuthc", + "text": "RouteAuthc" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouteValidationResultFactory", @@ -15266,6 +15769,22 @@ "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, { "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts" @@ -15361,7 +15880,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -15369,7 +15888,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -15660,7 +16187,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -15668,7 +16195,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16763,7 +17298,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -16771,7 +17306,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16902,7 +17445,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -16910,7 +17453,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -17181,7 +17732,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -17189,7 +17740,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -17357,6 +17916,18 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.OnPostAuthResultType", + "type": "Enum", + "tags": [], + "label": "OnPostAuthResultType", + "description": [], + "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.OnPreResponseResultType", @@ -17977,6 +18548,35 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.InternalRouteSecurity", + "type": "Type", + "tags": [], + "label": "InternalRouteSecurity", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurityGetter", + "text": "RouteSecurityGetter" + } + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.IsAuthenticated", @@ -18321,8 +18921,8 @@ "pluginId": "@kbn/core-http-server", "scope": "server", "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.OnPostAuthNextResult", - "text": "OnPostAuthNextResult" + "section": "def-server.OnPostAuthResult", + "text": "OnPostAuthResult" }, " | Promise<", { @@ -18337,8 +18937,8 @@ "pluginId": "@kbn/core-http-server", "scope": "server", "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.OnPostAuthNextResult", - "text": "OnPostAuthNextResult" + "section": "def-server.OnPostAuthResult", + "text": "OnPostAuthResult" }, ">" ], @@ -18433,6 +19033,14 @@ "docId": "kibKbnCoreHttpServerPluginApi", "section": "def-server.OnPostAuthNextResult", "text": "OnPostAuthNextResult" + }, + " | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.OnPostAuthAuthzResult", + "text": "OnPostAuthAuthzResult" } ], "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", @@ -18440,18 +19048,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/core-http-server", - "id": "def-server.OnPostAuthResultType", - "type": "string", - "tags": [], - "label": "OnPostAuthResultType", - "description": [], - "path": "packages/core/http/core-http-server/src/lifecycle/on_post_auth.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.OnPreAuthHandler", @@ -18954,6 +19550,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.Privilege", + "type": "Type", + "tags": [], + "label": "Privilege", + "description": [], + "signature": [ + "string" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RawRequest", @@ -19352,6 +19963,68 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteAuthc", + "type": "Type", + "tags": [], + "label": "RouteAuthc", + "description": [ + "\nRepresents the authentication status for a route. It can either be enabled (`AuthcEnabled`) or disabled (`AuthcDisabled`)." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AuthcEnabled", + "text": "AuthcEnabled" + }, + " | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AuthcDisabled", + "text": "AuthcDisabled" + } + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteAuthz", + "type": "Type", + "tags": [], + "label": "RouteAuthz", + "description": [ + "\nRepresents the authorization status for a route. It can either be enabled (`AuthzEnabled`) or disabled (`AuthzDisabled`)." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AuthzDisabled", + "text": "AuthzDisabled" + }, + " | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AuthzEnabled", + "text": "AuthzEnabled" + } + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouteContentType", @@ -19563,6 +20236,62 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteSecurityGetter", + "type": "Type", + "tags": [], + "label": "RouteSecurityGetter", + "description": [], + "signature": [ + "(request: { headers: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.Headers", + "text": "Headers" + }, + "; query?: unknown; }) => ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteSecurityGetter.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + "{ headers: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.Headers", + "text": "Headers" + }, + "; query?: unknown; }" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouteValidationFunction", @@ -19902,7 +20631,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -19910,7 +20639,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -19978,7 +20715,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -19986,7 +20723,15 @@ "section": "def-server.RouteAccess", "text": "RouteAccess" }, - "; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + "; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 0548a36b3ba09..1d755fd067ec2 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 496 | 2 | 193 | 0 | +| 530 | 2 | 216 | 0 | ## Server diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 10dee3fc5dd42..91ae86b098cc8 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-09-30 +date: 2024-10-01 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 c2b597cc9c44c..38ce3cb89c9fe 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-09-30 +date: 2024-10-01 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 f4239d7d333bf..a1bb917f0a554 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-09-30 +date: 2024-10-01 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 a59b9ce3d143a..74a04bbc0e63a 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-09-30 +date: 2024-10-01 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 d988ea5e2e501..db80eda8e4113 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-09-30 +date: 2024-10-01 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 22f0702cc9823..c83bcfc01b9ba 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-09-30 +date: 2024-10-01 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 2d2b26eb1b5ba..fa1bfda4d4f08 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-09-30 +date: 2024-10-01 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 6af7e8b65fb46..bc788f6bfcbdf 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-09-30 +date: 2024-10-01 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 943d5b3510194..f6f3e08774d3c 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-09-30 +date: 2024-10-01 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 1e17079951e9b..7b293a2c4e73b 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-09-30 +date: 2024-10-01 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 134f0f91ce98e..cbecdf78998bc 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-09-30 +date: 2024-10-01 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 2050a6be01d36..92e90fc3d49f6 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-09-30 +date: 2024-10-01 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 d63cdee34cc2f..8b8a288c25d5d 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-09-30 +date: 2024-10-01 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 8ed31c8856538..b45eed3402a67 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-09-30 +date: 2024-10-01 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 50c807aa0ab5d..7b9156bbe3bc8 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-09-30 +date: 2024-10-01 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 fcc3067607c60..a6d3f9d197482 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-09-30 +date: 2024-10-01 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 34e8dd7a2edda..9baa8923384e7 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-09-30 +date: 2024-10-01 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 3d3eccd8e1014..fa5ce18f8f68a 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-09-30 +date: 2024-10-01 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 72e4efc783dc8..ecde70734f41f 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-09-30 +date: 2024-10-01 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 fcef748b7adbc..3a22611eb9070 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-09-30 +date: 2024-10-01 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 e2efed966c022..e21e9083c81e5 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-09-30 +date: 2024-10-01 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 5f3f3985a299d..9d3640f11768e 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-09-30 +date: 2024-10-01 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 5b76f0f7d0cc2..c75ef3d712c18 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-09-30 +date: 2024-10-01 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 69ece9f78d81a..a64d092522bf3 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-09-30 +date: 2024-10-01 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 9889e6d05224c..7d89b670ead29 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-09-30 +date: 2024-10-01 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 f70279ececb46..51ac5870ae176 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-09-30 +date: 2024-10-01 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 eb2347734804d..aeb99514efc46 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-09-30 +date: 2024-10-01 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 bff7ce4550429..8c448a3ae4aaa 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-09-30 +date: 2024-10-01 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 8e77587a94bae..7cc1c2cf1bac2 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-09-30 +date: 2024-10-01 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 8ca26e2a5874b..8b9885bfd4550 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-09-30 +date: 2024-10-01 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 7768916db1a7b..f4df1c28c1f90 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-09-30 +date: 2024-10-01 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 d1cf99186e20b..54af2731e0adf 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-09-30 +date: 2024-10-01 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 9ead2b84f5a89..d7d35d7c6e229 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-09-30 +date: 2024-10-01 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 086dc12bd09f5..efdbbb455be61 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-09-30 +date: 2024-10-01 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 bcadf9afc266e..fafa6d3a06d7d 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-09-30 +date: 2024-10-01 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 742f50f45f9cc..884ac3922e63f 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-09-30 +date: 2024-10-01 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 7013e7cb7a0dd..5d8350eb2eb2e 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-09-30 +date: 2024-10-01 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 1ce86f4285181..dc3b14e28cf59 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-09-30 +date: 2024-10-01 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 d540bcc984aa2..e9a6696f4038b 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-09-30 +date: 2024-10-01 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 e71ad52c32980..45997c647b7fe 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-09-30 +date: 2024-10-01 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 f3f434ade677c..7946283a6f514 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-09-30 +date: 2024-10-01 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 73cf5fe0e0282..6e085205576e6 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-09-30 +date: 2024-10-01 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 6eb796b9fcb27..22f6a606b16cd 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-09-30 +date: 2024-10-01 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 b309ce2b38716..28d97c9514d2b 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-09-30 +date: 2024-10-01 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 5d48afd33ae32..ef533ad0fa3ef 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-09-30 +date: 2024-10-01 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 83ba508ddb82c..280ad7fbbc8ff 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-09-30 +date: 2024-10-01 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 ad7685630af0c..6dc38390484aa 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-09-30 +date: 2024-10-01 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 a4d820c6480ca..ec10013d865bd 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-09-30 +date: 2024-10-01 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 b490a5dc1fe31..6c8ad6fd3279c 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-09-30 +date: 2024-10-01 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 e8dedb30689c5..161e523b0a1d0 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-09-30 +date: 2024-10-01 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 a0dfe9aa9711c..ea62ba0226054 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-09-30 +date: 2024-10-01 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 7529f241a4cff..7819a0e652f4d 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-09-30 +date: 2024-10-01 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 6c48368df7788..c3da4d02e1518 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-09-30 +date: 2024-10-01 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 8ebbef45ee0ce..95bff7fefaeda 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-09-30 +date: 2024-10-01 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 d7491716efe44..294def97417bb 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-09-30 +date: 2024-10-01 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 eeeb3f1bab68c..8fc83a3d3837b 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-09-30 +date: 2024-10-01 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 b00a5acebc6ef..4a3180afeca82 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-09-30 +date: 2024-10-01 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 04253a4f02a8a..df68bb0fd6d07 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-09-30 +date: 2024-10-01 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 3634c5cbb65cc..4a6d19d8a8eb8 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-09-30 +date: 2024-10-01 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 03792f4135333..14d7d24eef56b 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-09-30 +date: 2024-10-01 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 2e39d810f9a35..52c4d63f504c9 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-09-30 +date: 2024-10-01 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 9e073bd9b1a27..c896cbfacf26d 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-09-30 +date: 2024-10-01 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 074ad6734db47..3205a706aab30 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-09-30 +date: 2024-10-01 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 9da787088d0c3..971f8cc65aaa9 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-09-30 +date: 2024-10-01 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 8b12709ff8c83..df8f0ac12a6a1 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-09-30 +date: 2024-10-01 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 e8e702f056c80..2d68c293f9fe4 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-09-30 +date: 2024-10-01 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 076f80f900eef..4b1e28a7de9c9 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-09-30 +date: 2024-10-01 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 8b38faf4646e9..2c6fa3bf01ef7 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-09-30 +date: 2024-10-01 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 7177ec05c5c75..6b2fd5644e4b3 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-09-30 +date: 2024-10-01 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 256c41897ed66..93bc79d9aaeca 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-09-30 +date: 2024-10-01 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 3866aa57190ed..23939f977b189 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-09-30 +date: 2024-10-01 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 80dddb98a44d6..cbb589dc104d4 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-09-30 +date: 2024-10-01 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 b97429db2e558..e02c9bdca1df4 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-09-30 +date: 2024-10-01 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 7483ed73530ac..93adba1d38b85 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-09-30 +date: 2024-10-01 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 f68cafb952495..8f058e2ebcaad 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-09-30 +date: 2024-10-01 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 8d01fa7a3f848..24a4d4b7d58d3 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-09-30 +date: 2024-10-01 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 182d35b68040c..34ed2e7886e5e 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-09-30 +date: 2024-10-01 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 497a7b479bf0d..9eff12f75942d 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-09-30 +date: 2024-10-01 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 1571bc1837e47..2e62a928fcd75 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-09-30 +date: 2024-10-01 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 24c5b6d2c5451..56761fa7fa94a 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-09-30 +date: 2024-10-01 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 5c9ca0269a11b..f914a13c42f8d 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-09-30 +date: 2024-10-01 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 d5436958c7001..215d265e20262 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-09-30 +date: 2024-10-01 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 3e80690ccea01..1df80afbd4c7c 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-09-30 +date: 2024-10-01 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 75a19b1f819a0..c56c9998fddec 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-09-30 +date: 2024-10-01 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 ff4638e1ef6b6..59c1937198e78 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-09-30 +date: 2024-10-01 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 4860843b3c16f..34d13d6ed7874 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-09-30 +date: 2024-10-01 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 ca4152c08924c..9d648b7ed0ab1 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-09-30 +date: 2024-10-01 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 65c7013c10b43..ea244aacf9c2e 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-09-30 +date: 2024-10-01 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 e25f7e01bf3f7..1406599df4d8a 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-09-30 +date: 2024-10-01 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 d378db81842bb..8e70643d30c5f 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-09-30 +date: 2024-10-01 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 7a0b7926bf624..d45e41bc85ff6 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-09-30 +date: 2024-10-01 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 44ab8e90ff5ef..468dc3db9c1dc 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-09-30 +date: 2024-10-01 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 6efacde3b9b57..112bd28ab3c98 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-09-30 +date: 2024-10-01 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 fbf724dbe0552..fce03e2b207bc 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-09-30 +date: 2024-10-01 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 634d44dbc62f5..ff19d701ea5e2 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-09-30 +date: 2024-10-01 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 5ff966a29fceb..eed024a60aac8 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-09-30 +date: 2024-10-01 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 32eee801057f4..6ac848ba164df 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-09-30 +date: 2024-10-01 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 44f7b5fb1297b..35bf221601950 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-09-30 +date: 2024-10-01 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 c59a386708dad..77f84b1f1a224 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-09-30 +date: 2024-10-01 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 3a17ff8acc281..fdb8768b547ad 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-09-30 +date: 2024-10-01 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 3bb9a91db3de5..8c3729ed18d3d 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-09-30 +date: 2024-10-01 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 6066275fd05ab..fe864ebc4a974 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-09-30 +date: 2024-10-01 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 8c3426fea3a6d..b459dd9010a93 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-09-30 +date: 2024-10-01 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 66ddecbb351e4..52ea567c77e3a 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-09-30 +date: 2024-10-01 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 d10b857f988d6..412063d1eb26e 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-09-30 +date: 2024-10-01 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 0ea94eacfa6f0..12c2f120f2c2f 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-09-30 +date: 2024-10-01 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 c55fd36a97b43..a48f6d770dd09 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-09-30 +date: 2024-10-01 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 132c108741fde..806a21029dec2 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-09-30 +date: 2024-10-01 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 f6e3c7a81b849..0abcd0d819ff6 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-09-30 +date: 2024-10-01 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 1ef1c90a34eec..b3082b2375683 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-09-30 +date: 2024-10-01 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 9fa1be46a7963..ada2be47729b4 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-09-30 +date: 2024-10-01 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 cca3d82a93a38..c06023f45c2fd 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-09-30 +date: 2024-10-01 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 6cb61b8ed9aa2..7f6f7dba3f7e9 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-09-30 +date: 2024-10-01 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 a6126739b2a3b..206189e105f8b 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-09-30 +date: 2024-10-01 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 99836cf5375fa..8ceab799c19be 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-09-30 +date: 2024-10-01 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 d88e56ea131bf..af3c80c29f21f 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-09-30 +date: 2024-10-01 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 72df570915250..ea572390f3362 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-09-30 +date: 2024-10-01 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 59a72f7f2234a..4f2af16db8f67 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-09-30 +date: 2024-10-01 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 952966dcaa2d0..e50d3157080ba 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-09-30 +date: 2024-10-01 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 dcb0a42832c6a..965ef3bcdc279 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-09-30 +date: 2024-10-01 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 f5c36d7e047a6..91c86e4067133 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-09-30 +date: 2024-10-01 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 ee6bb00c8e187..991063cb1c9ea 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-09-30 +date: 2024-10-01 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 d49684a6a2186..0916876f1a1c3 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-09-30 +date: 2024-10-01 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 d4c6fb895d68a..3b513aa74dc05 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-09-30 +date: 2024-10-01 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 ace6be4fb5fa4..ba2c1c9b29333 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-09-30 +date: 2024-10-01 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 15e82385ea530..29e4317828f86 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-09-30 +date: 2024-10-01 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 5066e51ebf209..81b74a73d4373 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-09-30 +date: 2024-10-01 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 2c97807bf54d2..2d8cd04e30ed5 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-09-30 +date: 2024-10-01 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 b619d4a83c272..147ce18d35a25 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.devdocs.json b/api_docs/kbn_discover_utils.devdocs.json index fa5600e7872ef..2d3b734d648e2 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -516,7 +516,7 @@ "label": "createLogsContextService", "description": [], "signature": [ - "({ logsDataAccessPlugin, }: ", + "({ logsDataAccess }: ", "LogsContextServiceDeps", ") => Promise<{ isLogsIndexPattern: (indexPattern: unknown) => boolean; }>" ], @@ -529,7 +529,7 @@ "id": "def-common.createLogsContextService.$1", "type": "Object", "tags": [], - "label": "{\n logsDataAccessPlugin,\n}", + "label": "{ logsDataAccess }", "description": [], "signature": [ "LogsContextServiceDeps" @@ -1189,7 +1189,7 @@ "label": "getFieldValue", "description": [], "signature": [ - "(record: ", + " any" + ", TField extends string>(record: TRecord, field: TField & keyof TRecord[\"flattened\"]) => TRecord[\"flattened\"][TField]" ], "path": "packages/kbn-discover-utils/src/utils/get_field_value.ts", "deprecated": false, @@ -1206,18 +1206,12 @@ { "parentPluginId": "@kbn/discover-utils", "id": "def-common.getFieldValue.$1", - "type": "Object", + "type": "Uncategorized", "tags": [], "label": "record", "description": [], "signature": [ - { - "pluginId": "@kbn/discover-utils", - "scope": "common", - "docId": "kibKbnDiscoverUtilsPluginApi", - "section": "def-common.DataTableRecord", - "text": "DataTableRecord" - } + "TRecord" ], "path": "packages/kbn-discover-utils/src/utils/get_field_value.ts", "deprecated": false, @@ -1227,12 +1221,12 @@ { "parentPluginId": "@kbn/discover-utils", "id": "def-common.getFieldValue.$2", - "type": "string", + "type": "CompoundType", "tags": [], "label": "field", "description": [], "signature": [ - "string" + "TField & keyof TRecord[\"flattened\"]" ], "path": "packages/kbn-discover-utils/src/utils/get_field_value.ts", "deprecated": false, diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 3a6d3bbb49887..0f5d0f043ea52 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-09-30 +date: 2024-10-01 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 a5794f0584ac3..521545ee89718 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-09-30 +date: 2024-10-01 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 9b1b3ea4f5908..e3eae99b96058 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-09-30 +date: 2024-10-01 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 c9adc253b6278..81d89982c57f6 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-09-30 +date: 2024-10-01 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 6db98c94b5ae2..10996d3869e8e 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-09-30 +date: 2024-10-01 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 10ddfe6b1b645..42e633b1bf3cd 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-09-30 +date: 2024-10-01 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 5f8b4fdc363ca..9339a96ad0078 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-09-30 +date: 2024-10-01 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 392aedccdc670..67ebd23beb45d 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-09-30 +date: 2024-10-01 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.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index cb9fad9537b72..48301e65f7fd4 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -476,7 +476,7 @@ "label": "replaceAnonymizedValuesWithOriginalValues", "description": [], "signature": [ - "({ messageContent, replacements, }: { messageContent: string; replacements: Zod.objectOutputType<{}, Zod.ZodString, \"strip\">; }) => string" + "({ messageContent, replacements, }: { messageContent: string; replacements: Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | null | undefined; }) => string" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.ts", "deprecated": false, @@ -512,7 +512,7 @@ "label": "replacements", "description": [], "signature": [ - "{} & { [k: string]: string; }" + "Zod.objectOutputType<{}, Zod.ZodString, \"strip\"> | null | undefined" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/data_anonymization/helpers/index.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 51d175e601a67..642fd2f06b012 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-09-30 +date: 2024-10-01 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 18f63c088e8a4..0677fb33a8f04 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-09-30 +date: 2024-10-01 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 3e783a0265734..cdad5b2fec3bc 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-09-30 +date: 2024-10-01 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 091a29f8d243b..260857abbd005 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-09-30 +date: 2024-10-01 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 d48b846bd5ff3..b3aab2ccb6655 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-09-30 +date: 2024-10-01 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 cd367c551378f..95ab60d012b3c 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-09-30 +date: 2024-10-01 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 411ddc1cd4b2f..ecb40ec85497b 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-09-30 +date: 2024-10-01 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 ce897efc284b7..b5468890cd5d3 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-09-30 +date: 2024-10-01 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 f538e4d51209b..37d2ef2c0719a 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-09-30 +date: 2024-10-01 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 f5e51262bee96..b44f95809d84b 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-09-30 +date: 2024-10-01 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 fe4344fc4280a..90941e5d63252 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-09-30 +date: 2024-10-01 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 0bd81e7dafbd1..82ab9f9a68fe4 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-09-30 +date: 2024-10-01 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 ed41cd2f52cca..7ed16b15b54c4 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-09-30 +date: 2024-10-01 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 1fa1031fc246f..03b880b6aa9f9 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-09-30 +date: 2024-10-01 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 046dbbe245069..d43ee875371cd 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-09-30 +date: 2024-10-01 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 a61e3e8d5f64f..6297654e49f3d 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-09-30 +date: 2024-10-01 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 4a53b5fc4ff01..ccc8d29b7a048 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-09-30 +date: 2024-10-01 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 2eeccbd0ec0cf..a3dfd34cfe7f8 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-09-30 +date: 2024-10-01 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 290a7eff0f7cf..d54dbfec4d997 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-09-30 +date: 2024-10-01 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 52654a7f75451..4443520e21885 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-09-30 +date: 2024-10-01 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 5ee23b2719a68..c8165efdbc07f 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-09-30 +date: 2024-10-01 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 57e0f75170b94..98aa56d6288f2 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-09-30 +date: 2024-10-01 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 f977e2402cbf3..8ae2b60a76b2a 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-09-30 +date: 2024-10-01 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 8df97c078813b..3ba302aac67dd 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-09-30 +date: 2024-10-01 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 f354852248aef..6778905579cdb 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-09-30 +date: 2024-10-01 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 8baa1a3401595..49e77ae481dc4 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-09-30 +date: 2024-10-01 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 5e4c939d953fc..2df84955942c6 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-09-30 +date: 2024-10-01 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 78f5e7c63c45f..7b0a02caa876b 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-09-30 +date: 2024-10-01 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 1fbeee682258c..61d4578c8df43 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-09-30 +date: 2024-10-01 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 fc50746562c94..803e195207c12 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-09-30 +date: 2024-10-01 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 939bf3d0f06da..4836506d39a4d 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-09-30 +date: 2024-10-01 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 affebd4ef6ef1..e9c8cb7ab2278 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-09-30 +date: 2024-10-01 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 40fff90a10e89..2533b80f1e732 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-09-30 +date: 2024-10-01 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 bfc6a850db5b8..a1be22ef39755 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-09-30 +date: 2024-10-01 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 a7f1c7d516719..5c8de142e5ea8 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-09-30 +date: 2024-10-01 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 74b284e6e7d36..707f869ebe87e 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-09-30 +date: 2024-10-01 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 61ca7d876ebe1..4c89e81521072 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-09-30 +date: 2024-10-01 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 b240f0f8b163c..fd720ed14ac54 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-09-30 +date: 2024-10-01 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 15550631e5943..2c3a09d4b358c 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-09-30 +date: 2024-10-01 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 a54f19ffd54c3..f52e304ff36c9 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-09-30 +date: 2024-10-01 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 61ef22189b156..2e35c2de50370 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-09-30 +date: 2024-10-01 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 31274a24c6630..43a3780cc6a9f 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index afd49c0c71ac1..6428ab7c6b463 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-09-30 +date: 2024-10-01 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 bfd46bf124621..0debf9e57a5a1 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-09-30 +date: 2024-10-01 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 a852d3d10b734..ebcbab6f60c0c 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-09-30 +date: 2024-10-01 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 4d113127e5462..39c959324ae46 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-09-30 +date: 2024-10-01 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 4920f02bd4be1..bbf6600847392 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-09-30 +date: 2024-10-01 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 c6b45c82e7a76..f8b2d671c9010 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-09-30 +date: 2024-10-01 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 b7248d0db484b..3737133cd0b66 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-09-30 +date: 2024-10-01 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 48d7b9de8a0c9..3bc1132770cbd 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-09-30 +date: 2024-10-01 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 15aa7db247687..14ce7091f242d 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-09-30 +date: 2024-10-01 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 43f0fac47a531..3a5a0761fd9f7 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-09-30 +date: 2024-10-01 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 a5f2e3d5486db..14be6eeb6fd91 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-09-30 +date: 2024-10-01 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 17f665ac54a66..3e61f0cbad0ea 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-09-30 +date: 2024-10-01 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 5c3b44aba3912..df95e83ac2971 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-09-30 +date: 2024-10-01 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 d8397cb5613e5..e6d3c59c829fc 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-09-30 +date: 2024-10-01 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 a9ec06acb5c6f..80b94b11cf70c 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-09-30 +date: 2024-10-01 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 262683c5a4566..0fef3c793ab12 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-09-30 +date: 2024-10-01 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 ef04a1c04810a..482fb62959150 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-09-30 +date: 2024-10-01 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 51e9f5fbd55d5..0ebd5498dc48e 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-09-30 +date: 2024-10-01 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 e08979aac3b8a..190d69e66c82f 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-09-30 +date: 2024-10-01 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 6c9ed97185515..9d5845197a9c9 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-09-30 +date: 2024-10-01 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 219b04228d993..970803071fff4 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-09-30 +date: 2024-10-01 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 19b472c7eb39a..a970ffe068eef 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-09-30 +date: 2024-10-01 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 8529a7107b253..1275ba3987bd7 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-09-30 +date: 2024-10-01 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 b2d80783e167a..f874d68e25c4b 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index b96aed922a5e0..3e946b549a9ea 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-09-30 +date: 2024-10-01 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 3fed2eff0487b..40514d7e726e4 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-09-30 +date: 2024-10-01 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 af6de3fb7f145..cb2244fa168e3 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-09-30 +date: 2024-10-01 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 34d0c0523b2c4..eef8d334d4684 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-09-30 +date: 2024-10-01 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 397e3a83750d5..0e06abf57ba09 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-09-30 +date: 2024-10-01 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 f08b1249dbc48..e618ff9739440 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-09-30 +date: 2024-10-01 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 c9388d07a7f87..bd77f992694df 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-09-30 +date: 2024-10-01 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 26b342495be4f..078672d989cf9 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-09-30 +date: 2024-10-01 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 c792818f55a3d..c9406eede84be 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-09-30 +date: 2024-10-01 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 f3de901060ce7..488f87e30fd05 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-09-30 +date: 2024-10-01 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 42cc49610fb4e..eb90efe54b7f6 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-09-30 +date: 2024-10-01 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 60490ccd3ee4d..7fea72d99e3c2 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-09-30 +date: 2024-10-01 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 a96cf26b39685..97c7ada0a8de6 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-09-30 +date: 2024-10-01 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 31baf2994ba2e..6b69a8403ed3e 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-09-30 +date: 2024-10-01 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 a3e03e88dbde5..2257374763016 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-09-30 +date: 2024-10-01 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 217e792c4955b..2b476984688b9 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-09-30 +date: 2024-10-01 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 c524c9b83457a..bbc86966dde13 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-09-30 +date: 2024-10-01 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 44a64004df2be..0dc0e5fa0a06d 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-09-30 +date: 2024-10-01 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 6bdd3907aaefe..362168657f29e 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-09-30 +date: 2024-10-01 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 627d9eb11c196..5478f89183c97 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-09-30 +date: 2024-10-01 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 ea1cfa188ca0d..9ea5269642814 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-09-30 +date: 2024-10-01 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 60f9632f0fcfc..22cc194900007 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-09-30 +date: 2024-10-01 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 f26760a1773fb..c348d149f1cd7 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-09-30 +date: 2024-10-01 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 ea665c53d213e..abc608daca077 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-09-30 +date: 2024-10-01 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 fd67b1684e1b3..6050ce5528184 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-09-30 +date: 2024-10-01 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 3441cbe42fb0f..2c187ef245cd4 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-09-30 +date: 2024-10-01 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 06c5b550ef879..c9ddf77603092 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-09-30 +date: 2024-10-01 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 f73a9778f45b1..d10bd6f0041d7 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-09-30 +date: 2024-10-01 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 39bf6c7789998..3e6752339f44a 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-09-30 +date: 2024-10-01 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 ae3be62c009a2..86aaf5b62eda1 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-09-30 +date: 2024-10-01 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 967d5d2e8709b..0b825a146b981 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-09-30 +date: 2024-10-01 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 9fe74b64330f9..5d77909202cf3 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-09-30 +date: 2024-10-01 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 7a03275e453e5..ca3b0561307c2 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-09-30 +date: 2024-10-01 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 894c246d5b897..058170b55816a 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-09-30 +date: 2024-10-01 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 4fb7513525d72..a14d50ef62b93 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-09-30 +date: 2024-10-01 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 a3a300c635dd7..543b80574160a 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-09-30 +date: 2024-10-01 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 437adb49792c0..28d5410a30011 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-09-30 +date: 2024-10-01 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 f5bf83a6f3dc9..48c8adfc9a894 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-09-30 +date: 2024-10-01 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 b866ba02496b9..1d4246facea11 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index d59b23cc65fd9..13f9b5bd318e6 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-09-30 +date: 2024-10-01 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 2d12ca3da2796..2fa42a1620c1d 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-09-30 +date: 2024-10-01 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 1cdc98385b65d..77fe323165ace 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-09-30 +date: 2024-10-01 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 468f53c28db96..953ed23eb8836 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-09-30 +date: 2024-10-01 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 062a65af7f3a7..1de7980a16039 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-09-30 +date: 2024-10-01 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 2efd1db56aca0..53f46ee3f0b56 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-09-30 +date: 2024-10-01 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 1b1cf32a7fa1d..ac19c831ad2c5 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-09-30 +date: 2024-10-01 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 5cd4db6a9fc27..63e0c3c8af852 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-09-30 +date: 2024-10-01 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 e9f51f3b3c474..4f8f6419b5451 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-09-30 +date: 2024-10-01 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 fdd8dc355981b..7c95f6be43a41 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-09-30 +date: 2024-10-01 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 640a6910cee92..7b09886fdb7ef 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-09-30 +date: 2024-10-01 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 5af98de8c35ce..aede943c2a5c4 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 5f3c2760ef0bf..bf61f9a86fa69 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-09-30 +date: 2024-10-01 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 f09d4be3143e2..2ff242a545971 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-09-30 +date: 2024-10-01 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 302cff21763c2..7d46fc90fbea8 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-09-30 +date: 2024-10-01 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 860f5b5e25301..9258a199ae78b 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-09-30 +date: 2024-10-01 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 40adbf08d705e..80b24d5f7cc37 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-09-30 +date: 2024-10-01 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 7edc2205e8383..d1f9057e516d0 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-09-30 +date: 2024-10-01 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 674c5dd440b31..5bbc7ceef7b4c 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-09-30 +date: 2024-10-01 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 872f8eb82da88..40725a847a075 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-09-30 +date: 2024-10-01 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 3eace9bfed7d3..eb43a8e747d11 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-09-30 +date: 2024-10-01 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 2dc3734b14e3f..61f69006d9b6a 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-09-30 +date: 2024-10-01 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 7af4d042fc4de..31b2513d2059e 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-09-30 +date: 2024-10-01 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 c1d788e323ac6..ff5a113a597ea 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-09-30 +date: 2024-10-01 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 680dc7d0ab64c..0be339f20f47e 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-09-30 +date: 2024-10-01 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 ef849b87ec8aa..e2b8c32308503 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-09-30 +date: 2024-10-01 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 11f0dbc22fa41..ae355d010e8df 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-09-30 +date: 2024-10-01 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 fcc64f7c3f21d..d8d24e9e310c8 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-09-30 +date: 2024-10-01 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 95c555c527255..56379d994c6af 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-09-30 +date: 2024-10-01 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 ba040c0c67725..4f6dd7cc454fc 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-09-30 +date: 2024-10-01 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 08d173360ab59..5790ced14523e 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-09-30 +date: 2024-10-01 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 18a956b435370..1bd38c8e2deba 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-09-30 +date: 2024-10-01 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 55711ffbe68f2..adf330132e99f 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-09-30 +date: 2024-10-01 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 bd122073117cd..de177903c61cb 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-09-30 +date: 2024-10-01 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 42531868ba1a4..8bb958aa52a56 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-09-30 +date: 2024-10-01 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 60e495fd7a4b3..04494f84d39af 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-09-30 +date: 2024-10-01 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 3e28d2d66e37f..538185e68f8d6 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-09-30 +date: 2024-10-01 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 b8f8188761e4b..bdaa889ba6c4f 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-09-30 +date: 2024-10-01 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 9b2967457bdb1..d7dfe2cdb88e1 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-09-30 +date: 2024-10-01 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 202fb4ae1cf0e..97881df306f85 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-09-30 +date: 2024-10-01 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_rison.mdx b/api_docs/kbn_rison.mdx index fc879a29d0eae..f1eceba31c1e4 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-09-30 +date: 2024-10-01 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 69f563a37c50c..676993b297271 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-09-30 +date: 2024-10-01 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 f7752cf80c5f9..3020ce64ffb07 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-09-30 +date: 2024-10-01 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 370785836306d..65a1058e9daeb 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-09-30 +date: 2024-10-01 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 102cb196e6170..b1aa26a7e951f 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-09-30 +date: 2024-10-01 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 0d7c7f4365346..620239d122974 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-09-30 +date: 2024-10-01 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 814d03e40befd..fe6fe2a88f538 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-09-30 +date: 2024-10-01 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 f8a40a7db4a57..efc465e25225a 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index f194322e6e8c4..822b29919a2d2 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-09-30 +date: 2024-10-01 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 6a7cc2e2b67db..b357dd1a442e5 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-09-30 +date: 2024-10-01 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 bfb3f502ef731..6231fe929240f 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-09-30 +date: 2024-10-01 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 cebb3ede3e7bc..305809b495e81 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-09-30 +date: 2024-10-01 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 3c2291f41430d..6864e29c4df30 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-09-30 +date: 2024-10-01 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_types.mdx b/api_docs/kbn_search_types.mdx index 483729522beec..8c4b3768c88fb 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-09-30 +date: 2024-10-01 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 4d593ad366990..0c3c20d753cb0 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-09-30 +date: 2024-10-01 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 fc3f7cffc4357..bb3295a7e618c 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-09-30 +date: 2024-10-01 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_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 0b445960272c2..ead1434d5bcb1 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-09-30 +date: 2024-10-01 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 2d2755c163eed..ee51dbd5ec0fc 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-09-30 +date: 2024-10-01 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 0835ccb589a9a..e40ebc36b7bf7 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-09-30 +date: 2024-10-01 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 5f93b46e5b6fe..442aeeafae6b9 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-09-30 +date: 2024-10-01 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 1bb2681789148..cf95f79f143d2 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-09-30 +date: 2024-10-01 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 68632f9caa071..294fb6005b530 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-09-30 +date: 2024-10-01 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 1ea0f279e61eb..1696a47a296cc 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-09-30 +date: 2024-10-01 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 38edb09102e41..46045d49f3be8 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-09-30 +date: 2024-10-01 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 99e1a97de911f..c297172d64c08 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-09-30 +date: 2024-10-01 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 c4e3a39139850..2d5366fc3fe86 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-09-30 +date: 2024-10-01 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 59af464dbe3da..c231f9d32e2e7 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-09-30 +date: 2024-10-01 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 ae68011b424fd..439eee1e67a49 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-09-30 +date: 2024-10-01 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 068eed0662437..fc1f03d35d65b 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-09-30 +date: 2024-10-01 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 c552c2166744a..7dbb5c002c8f7 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-09-30 +date: 2024-10-01 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 ec9536e8b59bf..84ee327e93794 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-09-30 +date: 2024-10-01 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 e0ba10db97a98..f0823b5e1d707 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-09-30 +date: 2024-10-01 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 a6b621e2e3c28..ebec2fb015012 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-09-30 +date: 2024-10-01 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 f30827086ad7c..7b53f9a440395 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-09-30 +date: 2024-10-01 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 2e120754e0e24..cb67715b9d258 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-09-30 +date: 2024-10-01 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 6193050520d44..f19904eeb6152 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-09-30 +date: 2024-10-01 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.devdocs.json b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json index 8b77c1af12ea7..89daf03f4a461 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json @@ -11579,12 +11579,8 @@ "]>; id: ", "Type", "; item_id: ", - "UnionC", - "<[", - "StringC", - ", ", - "UndefinedC", - "]>; meta: ", + "Type", + "; meta: ", "ObjectC", "; namespace_type: ", "Type", diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index e657674156692..052655a0d647e 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-09-30 +date: 2024-10-01 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 de593d9b62462..8f4681576361c 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-09-30 +date: 2024-10-01 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 4fb04972255b2..9408b6c7abc37 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-09-30 +date: 2024-10-01 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 0244a63ad147b..a271dd803ec63 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-09-30 +date: 2024-10-01 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 c8c8ed77a4741..4627c050a4f32 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-09-30 +date: 2024-10-01 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 63c323808cb2e..2ee36434040e5 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-09-30 +date: 2024-10-01 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 a022cd1d7a0a4..b41d807f98f55 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-09-30 +date: 2024-10-01 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 dc2ee45d3fbda..2bfd9e4418955 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-09-30 +date: 2024-10-01 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 38ee726adb11e..f1698e12bedac 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-09-30 +date: 2024-10-01 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 7ca3d040b2aa8..6ed317a594a3c 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-09-30 +date: 2024-10-01 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 273d2e2a2de1f..5e6aab4076b37 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-09-30 +date: 2024-10-01 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 bf23a5f788be6..0ac9b96ea0033 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-09-30 +date: 2024-10-01 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 0332c32f44f44..da5b0c3861248 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-09-30 +date: 2024-10-01 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 38ba5ccc0c3c2..28c6f53f338ae 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-09-30 +date: 2024-10-01 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 fa2eb55d7a3e7..66cc2dd71c445 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-09-30 +date: 2024-10-01 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 589fa2f0e6b59..d1d24edfe1d8a 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-09-30 +date: 2024-10-01 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 f6c2ee0a17a29..5c6600514349b 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-09-30 +date: 2024-10-01 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 9741a05e5f05f..422b0718f072d 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-09-30 +date: 2024-10-01 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 bd255ffdb18fc..3df47ff49bbc6 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-09-30 +date: 2024-10-01 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 37beb69198437..5af347070b05a 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-09-30 +date: 2024-10-01 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 346ee4a630045..45dd9e3652b88 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-09-30 +date: 2024-10-01 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 a8f4fe4cbb2fa..a778b905e6398 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-09-30 +date: 2024-10-01 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 3c21ce35f2ad3..2210afdc99e0d 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-09-30 +date: 2024-10-01 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 344eaa215314f..4f961f45fe04e 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-09-30 +date: 2024-10-01 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 562f1943d0cd6..ca899d3281c0a 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-09-30 +date: 2024-10-01 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 4c690ff6019c9..500d528d3acd5 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-09-30 +date: 2024-10-01 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 6f94d956b975d..4cd923b09f9df 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-09-30 +date: 2024-10-01 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 9a9c42806c0f7..cce4acd766b90 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-09-30 +date: 2024-10-01 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 e831d7262343f..e7558cea68716 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-09-30 +date: 2024-10-01 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 e091fb20ae3b6..5a172df0d1ea7 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-09-30 +date: 2024-10-01 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 bbb55c8fc323f..560cc9bf1e252 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-09-30 +date: 2024-10-01 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 4da3dd6ffe07b..2efb7dbcb2036 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-09-30 +date: 2024-10-01 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 163fb05948cb8..4221f8b6f93e8 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-09-30 +date: 2024-10-01 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 6d2157f6a7c90..d14f83142105c 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-09-30 +date: 2024-10-01 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 09a8c47c3ac35..8fec769c8f044 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-09-30 +date: 2024-10-01 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 a83b00b3ea25d..7a0adf7dc9606 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-09-30 +date: 2024-10-01 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 39417ad1ff129..3be5475b7c953 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-09-30 +date: 2024-10-01 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 55f1894663209..d5100ba2c7b18 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-09-30 +date: 2024-10-01 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 b8a587bd7a17b..9bb184ce62527 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-09-30 +date: 2024-10-01 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 1dcbf3f99c810..7aa4feefbc35c 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-09-30 +date: 2024-10-01 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 5061965a38bc6..848ddf4639299 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-09-30 +date: 2024-10-01 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 6c21fc625ad2a..d3e372e9bbc9c 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-09-30 +date: 2024-10-01 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 12fe90544d7da..7b78bdcfdd4ec 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-09-30 +date: 2024-10-01 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 65be20d693c3d..1528c4aa811ff 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-09-30 +date: 2024-10-01 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 18eb84c9a2571..7c109660a386b 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-09-30 +date: 2024-10-01 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 bf18348ffff45..53c946aadc2cd 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-09-30 +date: 2024-10-01 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 8d40dc49fa606..9af60601567b4 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-09-30 +date: 2024-10-01 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 92bfc86952f73..c5ef3b0b9e465 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-09-30 +date: 2024-10-01 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 6780b84958e3e..47d4e3a9a48d0 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-09-30 +date: 2024-10-01 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 f5a7fd486dec9..0862fd0c9fc7f 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-09-30 +date: 2024-10-01 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 0bdc472f330c2..8053b43fc09df 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-09-30 +date: 2024-10-01 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 35c51a4176744..0662c54a524b1 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-09-30 +date: 2024-10-01 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 7fb7836849ca0..d759f8d05819c 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-09-30 +date: 2024-10-01 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 f921776f27222..c3ead9fec01c0 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-09-30 +date: 2024-10-01 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 0924a2d674588..f79b2f00918ed 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-09-30 +date: 2024-10-01 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 1f3d7b390e249..cb84dfb3c2c62 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-09-30 +date: 2024-10-01 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 0d49dbc9cc673..d3bbc14a34747 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-09-30 +date: 2024-10-01 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 5d07401a58ad8..a2cf7b918655f 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-09-30 +date: 2024-10-01 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 76c8c00c2811e..1c9a562f19ff4 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-09-30 +date: 2024-10-01 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 b00e412647737..ea9709d6dc3ce 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-09-30 +date: 2024-10-01 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 0d6d96e54a118..1b3521b7c65f5 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-09-30 +date: 2024-10-01 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 21884042eb227..6b6c573157eb1 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-09-30 +date: 2024-10-01 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 1856c7b09f4cf..925c595641dd5 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-09-30 +date: 2024-10-01 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 193b5f114c2fe..ad256a5e303b5 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-09-30 +date: 2024-10-01 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 354c7a537bcbc..eac1daf9c55af 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-09-30 +date: 2024-10-01 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 5002f3ad27535..0651e1a1cb4ff 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-09-30 +date: 2024-10-01 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 e342bd1b1ca0d..42871196889f3 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-09-30 +date: 2024-10-01 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 ddd48d3684709..9b0d29f9fda9a 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-09-30 +date: 2024-10-01 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 5cfd9a7bf8574..d7642b52b1144 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-09-30 +date: 2024-10-01 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 42ea8e5259cf5..383c8a6044521 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-09-30 +date: 2024-10-01 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 6f18bc079e06e..26175e1340298 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-09-30 +date: 2024-10-01 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 922024cd586ad..de114263110e5 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-09-30 +date: 2024-10-01 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 3a699877ba849..1b93ed574344a 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-09-30 +date: 2024-10-01 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 087b39638a077..67f338bd5e90c 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-09-30 +date: 2024-10-01 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 83500b2e84702..6f76ea922d9d3 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-09-30 +date: 2024-10-01 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 ff05e3f7f5e53..0ee8f1f612ecf 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-09-30 +date: 2024-10-01 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 2f3e8848dc798..f12b118ea9c10 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-09-30 +date: 2024-10-01 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 afa75182c343b..0e7ca2c0dd017 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-09-30 +date: 2024-10-01 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 a6c59436bf8fa..aeb7b0bced041 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index c380e82b60b58..b8c1f6ffff12d 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-09-30 +date: 2024-10-01 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 1784b9d0fd831..431a49159089b 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-09-30 +date: 2024-10-01 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 13e0a46279cd4..b1299fc238a5d 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-09-30 +date: 2024-10-01 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 88388edc2f007..a97b8a95678cd 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-09-30 +date: 2024-10-01 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 cb42effffee9d..580a3c7e55af8 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-09-30 +date: 2024-10-01 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 a33f732fe5a63..5edf893f709b4 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-09-30 +date: 2024-10-01 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 76a75c8cf1b2d..3699415f2ac01 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-09-30 +date: 2024-10-01 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.devdocs.json b/api_docs/kbn_unified_data_table.devdocs.json index bf0686fb24c6c..dcfb9d2f4cdb4 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -5,33 +5,65 @@ "functions": [ { "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.DataTableRowControl", + "id": "def-public.getDataGridDensity", "type": "Function", "tags": [], - "label": "DataTableRowControl", + "label": "getDataGridDensity", "description": [], "signature": [ - "({ size, children, }: React.PropsWithChildren>) => JSX.Element" + "(storage: ", + { + "pluginId": "kibanaUtils", + "scope": "public", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-public.Storage", + "text": "Storage" + }, + ", consumer: string) => ", + { + "pluginId": "@kbn/unified-data-table", + "scope": "public", + "docId": "kibKbnUnifiedDataTablePluginApi", + "section": "def-public.DataGridDensity", + "text": "DataGridDensity" + } ], - "path": "packages/kbn-unified-data-table/src/components/data_table_row_control.tsx", + "path": "packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.DataTableRowControl.$1", - "type": "CompoundType", + "id": "def-public.getDataGridDensity.$1", + "type": "Object", "tags": [], - "label": "{\n size,\n children,\n}", + "label": "storage", "description": [], "signature": [ - "React.PropsWithChildren>" + { + "pluginId": "kibanaUtils", + "scope": "public", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-public.Storage", + "text": "Storage" + } ], - "path": "packages/kbn-unified-data-table/src/components/data_table_row_control.tsx", + "path": "packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.getDataGridDensity.$2", + "type": "string", + "tags": [], + "label": "consumer", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-unified-data-table/src/hooks/use_data_grid_density.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -172,6 +204,39 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.getRowHeight", + "type": "Function", + "tags": [], + "label": "getRowHeight", + "description": [], + "signature": [ + "({ storage, consumer, rowHeightState, configRowHeight, }: Pick & { configRowHeight?: number | undefined; }) => number" + ], + "path": "packages/kbn-unified-data-table/src/hooks/use_row_height.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.getRowHeight.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n storage,\n consumer,\n rowHeightState,\n configRowHeight,\n}", + "description": [], + "signature": [ + "Pick & { configRowHeight?: number | undefined; }" + ], + "path": "packages/kbn-unified-data-table/src/hooks/use_row_height.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-public.getRowsPerPageOptions", @@ -500,6 +565,256 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument", + "type": "Function", + "tags": [], + "label": "SourceDocument", + "description": [], + "signature": [ + "({\n useTopLevelObjectColumns,\n row,\n columnId,\n dataView,\n shouldShowFieldHandler,\n maxEntries,\n isPlainRecord,\n fieldFormats,\n dataTestSubj = 'discoverCellDescriptionList',\n className,\n isCompressed = true,\n}: { useTopLevelObjectColumns: boolean; row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + "; columnId: string; dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + "; shouldShowFieldHandler: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.ShouldShowFieldInTableHandler", + "text": "ShouldShowFieldInTableHandler" + }, + "; maxEntries: number; isPlainRecord?: boolean | undefined; fieldFormats: ", + { + "pluginId": "fieldFormats", + "scope": "public", + "docId": "kibFieldFormatsPluginApi", + "section": "def-public.FieldFormatsStart", + "text": "FieldFormatsStart" + }, + "; dataTestSubj?: string | undefined; className?: string | undefined; isCompressed?: boolean | undefined; }) => JSX.Element" + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1", + "type": "Object", + "tags": [], + "label": "{\n useTopLevelObjectColumns,\n row,\n columnId,\n dataView,\n shouldShowFieldHandler,\n maxEntries,\n isPlainRecord,\n fieldFormats,\n dataTestSubj = 'discoverCellDescriptionList',\n className,\n isCompressed = true,\n}", + "description": [], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.useTopLevelObjectColumns", + "type": "boolean", + "tags": [], + "label": "useTopLevelObjectColumns", + "description": [], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.row", + "type": "Object", + "tags": [], + "label": "row", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + } + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.columnId", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.dataView", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + } + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.shouldShowFieldHandler", + "type": "Function", + "tags": [], + "label": "shouldShowFieldHandler", + "description": [], + "signature": [ + "(fieldName: string) => boolean" + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.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/unified-data-table", + "id": "def-public.SourceDocument.$1.maxEntries", + "type": "number", + "tags": [], + "label": "maxEntries", + "description": [], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.isPlainRecord", + "type": "CompoundType", + "tags": [], + "label": "isPlainRecord", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.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": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.dataTestSubj", + "type": "string", + "tags": [], + "label": "dataTestSubj", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.className", + "type": "string", + "tags": [], + "label": "className", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SourceDocument.$1.isCompressed", + "type": "CompoundType", + "tags": [], + "label": "isCompressed", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-public.UnifiedDataTable", @@ -2965,6 +3280,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-public.SOURCE_COLUMN", + "type": "string", + "tags": [], + "label": "SOURCE_COLUMN", + "description": [], + "signature": [ + "\"_source\"" + ], + "path": "packages/kbn-unified-data-table/src/utils/columns.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-public.UnifiedDataTableRenderCustomToolbar", diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 0df7a92d3e807..a821f090448b9 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 165 | 0 | 90 | 2 | +| 183 | 0 | 108 | 1 | ## Client diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 490b379b3e8f3..912f345ce45d2 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-09-30 +date: 2024-10-01 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 2be4019f471a0..a975d41e7910c 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-09-30 +date: 2024-10-01 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 a9a945bbd644d..46f4b5323d4be 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-09-30 +date: 2024-10-01 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 5d7c4b50c4ecb..b5c2bbf4d2952 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-09-30 +date: 2024-10-01 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 ba709ffc87e28..b76ac9c1773f7 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-09-30 +date: 2024-10-01 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 a7e60d264c71c..d464592521ec8 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-09-30 +date: 2024-10-01 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 6fe9c03c1ab83..68db096926513 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-09-30 +date: 2024-10-01 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 36a1c1e332704..791988c7dca21 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-09-30 +date: 2024-10-01 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 0434d38389775..5780f7f974402 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-09-30 +date: 2024-10-01 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 3c0472c036d06..99fe2e17510d0 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-09-30 +date: 2024-10-01 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 30601fb671e54..4300cba0cf59f 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-09-30 +date: 2024-10-01 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 214e50366c8dd..e93413eded9e2 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-09-30 +date: 2024-10-01 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 46609dddd0d44..7152ce3a26646 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-09-30 +date: 2024-10-01 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 3edc5fd608a3d..edf27b9b76e7b 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-09-30 +date: 2024-10-01 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 f4a4ce5a2907f..4f70c5dd1b9ff 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-09-30 +date: 2024-10-01 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 e7970204f2717..0e61c5edd946d 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-09-30 +date: 2024-10-01 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 69985044c2667..ca8f5b2586435 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-09-30 +date: 2024-10-01 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 7470e26f8df42..ef714d3e61240 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-09-30 +date: 2024-10-01 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 9f01614eab5f3..e2bb6c1195229 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-09-30 +date: 2024-10-01 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 be2530bcdc508..a29d1b1c2bf3a 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-09-30 +date: 2024-10-01 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 376b4adf15032..921b8948c0dd5 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-09-30 +date: 2024-10-01 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 7a4b23f08a0ef..82870639243a6 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-09-30 +date: 2024-10-01 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 9cc9fcf4834a5..2da3bb498a5c6 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-09-30 +date: 2024-10-01 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 c96b66e32f9f5..e18b4140315d5 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-09-30 +date: 2024-10-01 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 954d946e0d280..3a93b1df649d2 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-09-30 +date: 2024-10-01 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 46c3496f4ce15..b790f91d184e6 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-09-30 +date: 2024-10-01 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 1d82ca228ab8a..cc99d12aa0e2d 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-09-30 +date: 2024-10-01 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 3c21db5160fe2..52a9f480ef8d8 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-09-30 +date: 2024-10-01 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 e8b0da57f1164..ca36d6234e45e 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-09-30 +date: 2024-10-01 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 2dc705d16f3ff..51fe33fad784f 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-09-30 +date: 2024-10-01 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 d7394cb0ba45d..f7b5c3ab1e769 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-09-30 +date: 2024-10-01 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 5245f77603d4a..a9a02e2d30de6 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-09-30 +date: 2024-10-01 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 39418c0a212b5..a41f072fd2c09 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-09-30 +date: 2024-10-01 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 0a1cebec9624b..c1a9f326dfe23 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-09-30 +date: 2024-10-01 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 ec09caeeb8376..4159f0355bcb7 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-09-30 +date: 2024-10-01 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 1b025cd8be5c6..4fdb21fd4a6dd 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-09-30 +date: 2024-10-01 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 6c1a9ddad4ed6..331434ec190e6 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-09-30 +date: 2024-10-01 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 fe466f0106497..f934c96161da6 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-09-30 +date: 2024-10-01 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 271ef9cb39d7f..57f5e59ee54e1 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-09-30 +date: 2024-10-01 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 b57aec54fb781..1eee3d99d5543 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-09-30 +date: 2024-10-01 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 b12159bcddf8c..9ac1c5e2a497e 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-09-30 +date: 2024-10-01 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 75922418bef35..d225d68eba652 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -9520,7 +9520,15 @@ "text": "ChatCompletionErrorEvent" }, " | ", - "TokenCountEvent" + "TokenCountEvent", + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.BufferFlushEvent", + "text": "BufferFlushEvent" + } ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts", "deprecated": false, @@ -9567,7 +9575,15 @@ "text": "ChatCompletionChunkEvent" }, " | ", - "TokenCountEvent" + "TokenCountEvent", + " | ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.BufferFlushEvent", + "text": "BufferFlushEvent" + } ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts", "deprecated": false, diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 6e48bd5310892..baae91ec81803 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-09-30 +date: 2024-10-01 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 478d83805ded2..ce9f06dfa77b5 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-09-30 +date: 2024-10-01 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 09e3b37e0994b..716495409af36 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-09-30 +date: 2024-10-01 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 af5d9242498fb..d47057e2bbf12 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-09-30 +date: 2024-10-01 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 a8d754fb07def..0b3a5b2e45690 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-09-30 +date: 2024-10-01 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 411e26945dba4..b62196dbdd307 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -3947,6 +3947,76 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.EntitiesInventoryLocatorDefinition", + "type": "Class", + "tags": [], + "label": "EntitiesInventoryLocatorDefinition", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.EntitiesInventoryLocatorDefinition", + "text": "EntitiesInventoryLocatorDefinition" + }, + " implements ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorDefinition", + "text": "LocatorDefinition" + }, + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.EntitiesInventoryLocatorDefinition.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "\"ENTITY_INVENTORY_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.EntitiesInventoryLocatorDefinition.getLocation", + "type": "Function", + "tags": [], + "label": "getLocation", + "description": [], + "signature": [ + "() => Promise<{ app: string; path: string; state: {}; }>" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.FlamegraphLocatorDefinition", @@ -6601,6 +6671,51 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.ENTITIES_INVENTORY_LOCATOR_ID", + "type": "string", + "tags": [], + "label": "ENTITIES_INVENTORY_LOCATOR_ID", + "description": [], + "signature": [ + "\"ENTITY_INVENTORY_LOCATOR\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.EntitiesInventoryLocator", + "type": "Type", + "tags": [], + "label": "EntitiesInventoryLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/locators/entity_inventory/entity_inventory_locator.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ERROR_CULPRIT", @@ -6826,6 +6941,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.HOST_NAME", + "type": "string", + "tags": [], + "label": "HOST_NAME", + "description": [], + "signature": [ + "\"host.name\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/field_names/elasticsearch.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.HOST_OS_PLATFORM", diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 41b83f009305c..d7869264cedd4 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 478 | 1 | 473 | 19 | +| 484 | 1 | 479 | 19 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index e60a1f050046c..1258bfe614189 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-09-30 +date: 2024-10-01 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 0759edc108820..46896024dac86 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-09-30 +date: 2024-10-01 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 a812ec47c62d5..144e1ad2111a3 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53386 | 245 | 40009 | 1981 | +| 53450 | 245 | 40062 | 1980 | ## Plugin Directory @@ -158,7 +158,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 24 | 0 | 24 | 0 | -| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 478 | 1 | 473 | 19 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 484 | 1 | 479 | 19 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 | @@ -277,7 +277,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 74 | 1 | 74 | 0 | -| | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 68 | 0 | 66 | 0 | +| | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 74 | 0 | 72 | 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 | @@ -371,7 +371,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 7 | 54 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 15 | 0 | 15 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 496 | 2 | 193 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 530 | 2 | 216 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 96 | 0 | 83 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 46 | 0 | 45 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | @@ -776,7 +776,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 59 | 0 | 50 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 165 | 0 | 90 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 183 | 0 | 108 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 314 | 0 | 285 | 8 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 3c411143e6bc2..d3e9e9952a269 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-09-30 +date: 2024-10-01 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 c37ae92418cc0..ea40b232504af 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-09-30 +date: 2024-10-01 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 3930932cd4559..3f847ffa29d09 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-09-30 +date: 2024-10-01 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 71138344d5303..05d2ff7481b3b 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-09-30 +date: 2024-10-01 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 165ec64f812b9..cdbe5e0beba1d 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-09-30 +date: 2024-10-01 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 ed8f82d1e1fda..6c8d6189823df 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-09-30 +date: 2024-10-01 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 ecfd27575404a..e83018eca915d 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-09-30 +date: 2024-10-01 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 d574c84e8ff7f..663f645639c31 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-09-30 +date: 2024-10-01 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 c5ff2853c1f1b..e5ea93d8745bf 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-09-30 +date: 2024-10-01 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 e085f0ff58bef..4bbc4276299f4 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-09-30 +date: 2024-10-01 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 152443f911f7e..23db480af11d1 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-09-30 +date: 2024-10-01 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 cb85671033386..819215de0acd7 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-09-30 +date: 2024-10-01 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 0f70d48b862eb..f642e3f2c1dac 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-09-30 +date: 2024-10-01 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 5a38434868201..16f2f9145dd5d 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-09-30 +date: 2024-10-01 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 0666295dde691..e493bcbcb7dd7 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-09-30 +date: 2024-10-01 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 8c9a9d5f008f4..57eb7e8393826 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-09-30 +date: 2024-10-01 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 8929a01aae630..adff5413e8295 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-09-30 +date: 2024-10-01 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 7e024597324a0..a3ecda9535694 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-09-30 +date: 2024-10-01 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 63808cbaa0891..ce4b5836f797d 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-09-30 +date: 2024-10-01 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 dc80035f89f06..5fba961b47c57 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-09-30 +date: 2024-10-01 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 8a8c3d1642603..a99dec00d605c 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-09-30 +date: 2024-10-01 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 55de2c0c3aeb7..e84158310a65e 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-09-30 +date: 2024-10-01 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 e4f8e7aa5e196..09d101c02590f 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-09-30 +date: 2024-10-01 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 0a6409f98ae58..1ce786ee12787 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-09-30 +date: 2024-10-01 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 23cda2a61ce08..b40f78850375b 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-09-30 +date: 2024-10-01 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 e2dfdd33a7dab..0d7c4e49d2a24 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-09-30 +date: 2024-10-01 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 5523c1f940f06..890f79d18b7b5 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-09-30 +date: 2024-10-01 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 8383709fc6b3c..9e7193ae47373 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-09-30 +date: 2024-10-01 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 eeae132ef6b53..2b06d2416ce05 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-09-30 +date: 2024-10-01 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 5cbd6e28cce7f..a069838984e6e 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-09-30 +date: 2024-10-01 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 2ee08bacffcd0..8cc7095235cca 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-09-30 +date: 2024-10-01 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 1fab24248e431..0fc171cd65a01 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-09-30 +date: 2024-10-01 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 1479191871765..95d3fb2db8d41 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-09-30 +date: 2024-10-01 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 34e14029dea76..1b13dc2b1a51a 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-09-30 +date: 2024-10-01 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 3aa01b4222dc2..9821976429955 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-09-30 +date: 2024-10-01 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 5e1e89c153ade..09662fd4305f1 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-09-30 +date: 2024-10-01 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 45f32f25805a1..789f8fd4dca20 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-09-30 +date: 2024-10-01 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 8334becb04701..a03e152a73c8e 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-09-30 +date: 2024-10-01 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 653094e76024d..0e4bc42f5b3e2 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-09-30 +date: 2024-10-01 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 a596cca06552a..00378c1a14809 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-09-30 +date: 2024-10-01 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 2529c1593ee0b..3f4d31bafee30 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-09-30 +date: 2024-10-01 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 b3ae5fe918f3c..8beb088b1f01e 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-09-30 +date: 2024-10-01 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 ed97be0e59a5e..977d1f9dd93ab 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-09-30 +date: 2024-10-01 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 43bd1340c50d0..17cf097f0e87d 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-09-30 +date: 2024-10-01 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 ed514a70e8f63..a0fa177db0f15 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-09-30 +date: 2024-10-01 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 71e722b0117b1..2e01cb896ef68 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-09-30 +date: 2024-10-01 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 9159ed2e6dcbb..52a3d3b74ba27 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-09-30 +date: 2024-10-01 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 52df3b914b3be..de6145d7f50e6 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-09-30 +date: 2024-10-01 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 1d5f7cd653be8..11682517241ec 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-09-30 +date: 2024-10-01 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 45317d8df3425..6d4f43f65e397 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-09-30 +date: 2024-10-01 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 fd319eafe595b..89ba7e2af7d99 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-09-30 +date: 2024-10-01 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 42b11395fead7..964244828057d 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-09-30 +date: 2024-10-01 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 8033db5116988..563b3f9c048ff 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-09-30 +date: 2024-10-01 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 04f3c093e845d..dd325efea54b9 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-09-30 +date: 2024-10-01 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 81eb182c0e99f..11e5a7b3e0528 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-09-30 +date: 2024-10-01 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 530ef57462fa5..0233ce9784368 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-09-30 +date: 2024-10-01 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 066241addf6bd..00a5ec129e57c 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-09-30 +date: 2024-10-01 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 d5fb3191150ee..787de382e04f2 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-09-30 +date: 2024-10-01 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 7cf44073fabb9..180f8b70539c4 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-09-30 +date: 2024-10-01 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 d2413ede759a6..0528133d7d8b4 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-09-30 +date: 2024-10-01 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 5d918e9b65c99..1b4210053ad15 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-09-30 +date: 2024-10-01 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 28b74ac21f59f..5ab20118f42f7 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-09-30 +date: 2024-10-01 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 1042bc5052d61..40508cdf5a138 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-09-30 +date: 2024-10-01 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 2a83e18fa1fcc..b7a84f83698a7 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-09-30 +date: 2024-10-01 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 54383966923b4..55eb18e178f3e 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-09-30 +date: 2024-10-01 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 eddfd2633ba70..1b64be0e76bdb 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-09-30 +date: 2024-10-01 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 5543b5f15529f..9f209eb1fd312 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-09-30 +date: 2024-10-01 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 bd2f8ad01e6f6..1b6b7804fe379 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-09-30 +date: 2024-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From ea9850683a2b24ede2b792717eb6c2ed9271777d Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Tue, 1 Oct 2024 10:01:22 +0200 Subject: [PATCH 049/107] [Dataset quality] Adding size column and estimated size to serverless (#193998) Closes https://github.com/elastic/logs-dev/issues/179. This PR aims to enable: The estimated size is displayed in Serverless in the following areas: - Estimated and size column in main page - Size in Overview section of Dataset details ### Demo https://github.com/user-attachments/assets/b0ef03fb-061d-44e5-8e1a-c47ece58de37 --- .../dataset_quality/README.md | 16 +++---- .../dataset_quality/common/api_types.ts | 6 +-- .../summary_panel/summary_panel.tsx | 5 +- .../dataset_quality/table/columns.tsx | 4 +- .../overview/summary/index.tsx | 15 +++--- .../hooks/use_dataset_quality_table.tsx | 4 -- .../hooks/use_overview_summary_panel.ts | 6 +-- .../public/hooks/use_summary_panel.ts | 10 +--- .../src/defaults.ts | 1 - .../src/state_machine.ts | 5 -- .../dataset_quality_controller/src/types.ts | 1 - .../get_data_stream_details/index.ts | 44 +++++++++++++----- .../get_data_streams_metering_stats/index.ts | 46 +++++++++++++++++++ .../server/routes/data_streams/routes.ts | 10 ++-- .../data_stream_details.ts | 22 +++++++-- .../data_stream_settings.ts | 2 +- .../dataset_quality_details.ts | 8 ++-- .../dataset_quality/dataset_quality_table.ts | 11 +++++ 18 files changed, 144 insertions(+), 72 deletions(-) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_streams_metering_stats/index.ts diff --git a/x-pack/plugins/observability_solution/dataset_quality/README.md b/x-pack/plugins/observability_solution/dataset_quality/README.md index 8aaba88966d0c..356393aa5237f 100755 --- a/x-pack/plugins/observability_solution/dataset_quality/README.md +++ b/x-pack/plugins/observability_solution/dataset_quality/README.md @@ -92,34 +92,34 @@ unset FLEET_PACKAGE_REGISTRY_PORT ### Functional Tests -### Stateful -#### FTR Server +#### Stateful +##### FTR Server ``` yarn test:ftr:server --config ./x-pack/test/functional/apps/dataset_quality/config.ts ``` -#### FTR Runner +##### FTR Runner ``` yarn test:ftr:runner --config ./x-pack/test/functional/apps/dataset_quality/config.ts --include ./x-pack/test/functional/apps/dataset_quality/index.ts ``` -#### Running Individual Tests +##### Running Individual Tests ``` yarn test:ftr:runner --config ./x-pack/test/functional/apps/dataset_quality/config.ts --include ./x-pack/test/functional/apps/dataset_quality/$1 ``` -### Serverless +#### Serverless -#### Server +##### Server ``` yarn test:ftr:server --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts ``` -#### Runner +##### Runner ``` yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/dataset_quality/index.ts ``` -#### Running Individual Tests +##### Running Individual Tests ``` yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/dataset_quality/$1 ``` \ No newline at end of file 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 6a514650b195d..8bcce166b936f 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 @@ -31,7 +31,7 @@ export const dataStreamStatRt = rt.intersection([ sizeBytes: rt.number, lastActivity: rt.number, integration: rt.string, - totalDocs: rt.union([rt.null, rt.number]), // rt.null is only needed for https://github.com/elastic/kibana/issues/178954 + totalDocs: rt.number, }), ]); @@ -132,7 +132,7 @@ export const dataStreamDetailsRt = rt.partial({ lastActivity: rt.number, degradedDocsCount: rt.number, docsCount: rt.number, - sizeBytes: rt.union([rt.null, rt.number]), // rt.null is only needed for https://github.com/elastic/kibana/issues/178954 + sizeBytes: rt.number, services: rt.record(rt.string, rt.array(rt.string)), hosts: rt.record(rt.string, rt.array(rt.string)), userPrivileges: userPrivilegesRt, @@ -158,7 +158,7 @@ export const getDataStreamsSettingsResponseRt = rt.exact(dataStreamSettingsRt); export const getDataStreamsDetailsResponseRt = rt.exact(dataStreamDetailsRt); export const dataStreamsEstimatedDataInBytesRT = rt.type({ - estimatedDataInBytes: rt.union([rt.number, rt.null]), // Null in serverless: https://github.com/elastic/kibana/issues/178954 + estimatedDataInBytes: rt.number, }); export const getDataStreamsEstimatedDataInBytesResponseRt = rt.exact( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/summary_panel.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/summary_panel.tsx index 9100e25fdce8f..a913e60939e52 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/summary_panel.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/summary_panel.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { useSummaryPanelContext } from '../../../hooks'; import { DatasetsQualityIndicators } from './datasets_quality_indicators'; import { DatasetsActivity } from './datasets_activity'; import { EstimatedData } from './estimated_data'; @@ -16,17 +15,15 @@ import { EstimatedData } from './estimated_data'; // Allow for lazy loading // eslint-disable-next-line import/no-default-export export default function SummaryPanel() { - const { isEstimatedDataDisabled } = useSummaryPanelContext(); return ( - - {!isEstimatedDataDisabled && } + diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx index da6bbf1628d10..68ec09897f7c2 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -161,7 +161,6 @@ export const getDatasetQualityTableColumns = ({ loadingDataStreamStats, loadingDegradedStats, showFullDatasetNames, - isSizeStatsAvailable, isActiveDataset, timeRange, urlService, @@ -172,7 +171,6 @@ export const getDatasetQualityTableColumns = ({ loadingDataStreamStats: boolean; loadingDegradedStats: boolean; showFullDatasetNames: boolean; - isSizeStatsAvailable: boolean; isActiveDataset: (lastActivity: number) => boolean; timeRange: TimeRangeConfig; urlService: BrowserUrlService; @@ -226,7 +224,7 @@ export const getDatasetQualityTableColumns = ({ ), width: '160px', }, - ...(isSizeStatsAvailable && canUserMonitorDataset && canUserMonitorAnyDataStream + ...(canUserMonitorDataset && canUserMonitorAnyDataStream ? [ { name: ( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/summary/index.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/summary/index.tsx index 707c900a248a1..752b224b6973a 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/summary/index.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/summary/index.tsx @@ -26,7 +26,6 @@ export default function Summary() { const { isSummaryPanelLoading, totalDocsCount, - sizeInBytesAvailable, sizeInBytes, isUserAllowedToSeeSizeInBytes, totalServicesCount, @@ -41,14 +40,12 @@ export default function Summary() { value={totalDocsCount} isLoading={isSummaryPanelLoading} /> - {sizeInBytesAvailable && ( - - )} + { const { page, rowsPerPage, sort } = useSelector(service, (state) => state.context.table); - const isSizeStatsAvailable = useSelector(service, (state) => state.context.isSizeStatsAvailable); const canUserMonitorDataset = useSelector( service, (state) => state.context.datasetUserPrivileges.canMonitor @@ -102,7 +101,6 @@ export const useDatasetQualityTable = () => { loadingDataStreamStats, loadingDegradedStats, showFullDatasetNames, - isSizeStatsAvailable, isActiveDataset: isActive, timeRange, urlService: url, @@ -114,7 +112,6 @@ export const useDatasetQualityTable = () => { loadingDataStreamStats, loadingDegradedStats, showFullDatasetNames, - isSizeStatsAvailable, isActive, timeRange, url, @@ -211,6 +208,5 @@ export const useDatasetQualityTable = () => { canUserMonitorAnyDataStream, toggleInactiveDatasets, toggleFullDatasetNames, - isSizeStatsAvailable, }; }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_overview_summary_panel.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_overview_summary_panel.ts index 5cdd820c9b4ae..084210774f958 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_overview_summary_panel.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_overview_summary_panel.ts @@ -26,10 +26,9 @@ export const useOverviewSummaryPanel = () => { .map((key: string) => services[key].length) .reduce((a, b) => a + b, 0); - const totalDocsCount = formatNumber(dataStreamDetails?.docsCount ?? 0, NUMBER_FORMAT); + const totalDocsCount = formatNumber(dataStreamDetails.docsCount, NUMBER_FORMAT); - const sizeInBytesAvailable = dataStreamDetails?.sizeBytes !== null; - const sizeInBytes = formatNumber(dataStreamDetails?.sizeBytes ?? 0, BYTE_NUMBER_FORMAT); + const sizeInBytes = formatNumber(dataStreamDetails.sizeBytes, BYTE_NUMBER_FORMAT); const isUserAllowedToSeeSizeInBytes = dataStreamDetails?.userPrivileges?.canMonitor ?? true; const hosts = dataStreamDetails?.hosts ?? {}; @@ -57,7 +56,6 @@ export const useOverviewSummaryPanel = () => { return { totalDocsCount, - sizeInBytesAvailable, sizeInBytes, isUserAllowedToSeeSizeInBytes, totalServicesCount, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts index ce8acd58b7507..a85dc9c21d222 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts @@ -14,13 +14,8 @@ import { filterInactiveDatasets } from '../utils'; const useSummaryPanel = () => { const { service } = useDatasetQualityContext(); - const { - filteredItems, - isSizeStatsAvailable, - canUserMonitorDataset, - canUserMonitorAnyDataStream, - loading, - } = useDatasetQualityTable(); + const { filteredItems, canUserMonitorDataset, canUserMonitorAnyDataStream, loading } = + useDatasetQualityTable(); const { timeRange } = useSelector(service, (state) => state.context.filters); @@ -84,7 +79,6 @@ const useSummaryPanel = () => { isEstimatedDataLoading, estimatedData, - isEstimatedDataDisabled: !isSizeStatsAvailable, isDatasetsActivityLoading, datasetsActivity, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts index d0b2b9978080a..41cfa859ec977 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/defaults.ts @@ -55,6 +55,5 @@ export const DEFAULT_CONTEXT: DefaultDatasetQualityControllerState = { types: [DEFAULT_DATASET_TYPE], }, datasets: [], - isSizeStatsAvailable: true, nonAggregatableDatasets: [], }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts index 127e56a755c86..a803d73448263 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/state_machine.ts @@ -323,13 +323,8 @@ export const createPureDatasetQualityControllerStateMachine = ( const dataStreamStats = event.data.dataStreamsStats as DataStreamStat[]; const datasetUserPrivileges = event.data.datasetUserPrivileges; - // Check if any DataStreamStat has null; to check for serverless - const isSizeStatsAvailable = - !dataStreamStats.length || dataStreamStats.some((stat) => stat.totalDocs !== null); - return { dataStreamStats, - isSizeStatsAvailable, datasetUserPrivileges, }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts index 624fef066afcb..a5e03cfb480ff 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_controller/src/types.ts @@ -60,7 +60,6 @@ export interface WithNonAggregatableDatasets { export interface WithDatasets { datasets: DataStreamStat[]; - isSizeStatsAvailable: boolean; } export interface WithIntegrations { 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 4aeeb1087ba89..c24ac84b10772 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 @@ -6,7 +6,7 @@ */ import { badRequest } from '@hapi/boom'; -import type { ElasticsearchClient } from '@kbn/core/server'; +import type { ElasticsearchClient, IScopedClusterClient } from '@kbn/core/server'; import { findInventoryFields, InventoryItemType, @@ -20,6 +20,7 @@ import { DataStreamDetails, DataStreamSettings } from '../../../../common/api_ty import { createDatasetQualityESClient } from '../../../utils'; import { dataStreamService, datasetQualityPrivileges } from '../../../services'; import { getDataStreams } from '../get_data_streams'; +import { getDataStreamsMeteringStats } from '../get_data_streams_metering_stats'; export async function getDataStreamSettings({ esClient, @@ -51,7 +52,7 @@ export async function getDataStreamDetails({ end, isServerless, }: { - esClient: ElasticsearchClient; + esClient: IScopedClusterClient; dataStream: string; start: number; end: number; @@ -59,14 +60,22 @@ export async function getDataStreamDetails({ }): Promise { throwIfInvalidDataStreamParams(dataStream); + // Query datastreams as the current user as the Kibana internal user may not have all the required permissions + const esClientAsCurrentUser = esClient.asCurrentUser; + const esClientAsSecondaryAuthUser = esClient.asSecondaryAuthUser; + const hasAccessToDataStream = ( - await datasetQualityPrivileges.getHasIndexPrivileges(esClient, [dataStream], ['monitor']) + await datasetQualityPrivileges.getHasIndexPrivileges( + esClientAsCurrentUser, + [dataStream], + ['monitor'] + ) )[dataStream]; const esDataStream = hasAccessToDataStream ? ( await getDataStreams({ - esClient, + esClient: esClientAsCurrentUser, datasetQuery: dataStream, }) ).dataStreams[0] @@ -74,18 +83,19 @@ export async function getDataStreamDetails({ try { const dataStreamSummaryStats = await getDataStreamSummaryStats( - esClient, + esClientAsCurrentUser, dataStream, start, end ); - const whenSizeStatsNotAvailable = NaN; // This will indicate size cannot be calculated - const avgDocSizeInBytes = isServerless - ? whenSizeStatsNotAvailable - : hasAccessToDataStream && dataStreamSummaryStats.docsCount > 0 - ? await getAvgDocSizeInBytes(esClient, dataStream) - : 0; + const avgDocSizeInBytes = + hasAccessToDataStream && dataStreamSummaryStats.docsCount > 0 + ? isServerless + ? await getMeteringAvgDocSizeInBytes(esClientAsSecondaryAuthUser, dataStream) + : await getAvgDocSizeInBytes(esClientAsCurrentUser, dataStream) + : 0; + const sizeBytes = Math.ceil(avgDocSizeInBytes * dataStreamSummaryStats.docsCount); return { @@ -172,6 +182,18 @@ async function getDataStreamSummaryStats( }; } +async function getMeteringAvgDocSizeInBytes(esClient: ElasticsearchClient, index: string) { + const meteringStats = await getDataStreamsMeteringStats({ + esClient, + dataStreams: [index], + }); + + const docCount = meteringStats[index].totalDocs ?? 0; + const sizeInBytes = meteringStats[index].sizeBytes ?? 0; + + return docCount ? sizeInBytes / docCount : 0; +} + async function getAvgDocSizeInBytes(esClient: ElasticsearchClient, index: string) { const indexStats = await esClient.indices.stats({ index }); const docCount = indexStats._all.total?.docs?.count ?? 0; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_streams_metering_stats/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_streams_metering_stats/index.ts new file mode 100644 index 0000000000000..bdf30533cbed9 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_streams_metering_stats/index.ts @@ -0,0 +1,46 @@ +/* + * Copyright 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 { ElasticsearchClient } from '@kbn/core/server'; + +export interface MeteringStatsResponse { + datastreams: Array<{ + name: string; + num_docs: number; + size_in_bytes: number; + }>; +} + +export async function getDataStreamsMeteringStats({ + esClient, + dataStreams, +}: { + esClient: ElasticsearchClient; + dataStreams: string[]; +}): Promise> { + if (!dataStreams.length) { + return {}; + } + + const { datastreams: dataStreamsStats } = await esClient.transport.request( + { + method: 'GET', + path: `/_metering/stats/` + dataStreams.join(','), + } + ); + + return dataStreamsStats.reduce( + (acc, dataStream) => ({ + ...acc, + [dataStream.name]: { + sizeBytes: dataStream.size_in_bytes, + totalDocs: dataStream.num_docs, + }, + }), + {} + ); +} 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 c23b917a18e82..869e60c6bfaa3 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 @@ -26,6 +26,7 @@ import { getDegradedDocsPaginated } from './get_degraded_docs'; import { getNonAggregatableDataStreams } from './get_non_aggregatable_data_streams'; import { getDegradedFields } from './get_degraded_fields'; import { getDegradedFieldValues } from './get_degraded_field_values'; +import { getDataStreamsMeteringStats } from './get_data_streams_metering_stats'; const statsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/stats', @@ -50,6 +51,7 @@ const statsRoute = createDatasetQualityServerRoute({ // Query datastreams as the current user as the Kibana internal user may not have all the required permissions const esClient = coreContext.elasticsearch.client.asCurrentUser; + const esClientAsSecondaryAuthUser = coreContext.elasticsearch.client.asSecondaryAuthUser; const { dataStreams, datasetUserPrivileges } = await getDataStreams({ esClient, @@ -62,7 +64,10 @@ const statsRoute = createDatasetQualityServerRoute({ }); const dataStreamsStats = isServerless - ? {} + ? await getDataStreamsMeteringStats({ + esClient: esClientAsSecondaryAuthUser, + dataStreams: privilegedDataStreams.map((stream) => stream.name), + }) : await getDataStreamsStats({ esClient, dataStreams: privilegedDataStreams.map((stream) => stream.name), @@ -271,8 +276,7 @@ const dataStreamDetailsRoute = createDatasetQualityServerRoute({ const { start, end } = params.query; const coreContext = await context.core; - // Query datastreams as the current user as the Kibana internal user may not have all the required permissions - const esClient = coreContext.elasticsearch.client.asCurrentUser; + const esClient = coreContext.elasticsearch.client; const isServerless = (await getEsCapabilities()).serverless; const dataStreamDetails = await getDataStreamDetails({ diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts index 61e4878856de3..50a1f51a86449 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts @@ -20,6 +20,7 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { const synthtrace = getService('logSynthtraceEsClient'); const svlUserManager = getService('svlUserManager'); const svlCommonApi = getService('svlCommonApi'); + const retry = getService('retry'); const start = '2023-12-11T18:00:00.000Z'; const end = '2023-12-11T18:01:00.000Z'; const type = 'logs'; @@ -56,7 +57,7 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { before(async () => { roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); internalReqHeader = svlCommonApi.getInternalRequestHeader(); - return synthtrace.index([ + await synthtrace.index([ timerange(start, end) .interval('1m') .rate(1) @@ -96,9 +97,24 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { expect(resp.body).empty(); }); - it('returns "sizeBytes" as null in serverless', async () => { + it('returns "sizeBytes" correctly', async () => { + // Metering stats api is cached and refreshed every 30 seconds + await retry.waitForWithTimeout('Metering stats cache is refreshed', 31000, async () => { + const detailsResponse = await callApi( + `${type}-${dataset}-${namespace}`, + roleAuthc, + internalReqHeader + ); + if (detailsResponse.body.sizeBytes === 0) { + throw new Error("Metering stats cache hasn't refreshed"); + } + return true; + }); + const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); - expect(resp.body.sizeBytes).to.be(null); + + expect(isNaN(resp.body.sizeBytes as number)).to.be(false); + expect(resp.body.sizeBytes).to.be.greaterThan(0); }); it('returns service.name and host.name correctly', async () => { 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 index d9fc208e971be..52a1c51d24917 100644 --- 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 @@ -56,7 +56,7 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { before(async () => { roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); internalReqHeader = svlCommonApi.getInternalRequestHeader(); - return synthtrace.index([ + await synthtrace.index([ timerange(start, end) .interval('1m') .rate(1) 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 a007ddc6c10a7..521a0b782b3a1 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 @@ -35,7 +35,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const browser = getService('browser'); const to = '2024-01-01T12:00:00.000Z'; - const excludeKeysFromServerless = ['size']; // https://github.com/elastic/kibana/issues/178954 const apacheAccessDatasetName = 'apache.access'; const apacheAccessDataStreamName = `logs-${apacheAccessDatasetName}-${productionNamespace}`; @@ -93,7 +92,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { getLogsForDataset({ to, count: 10, dataset: bitbucketDatasetName }), ]); - await PageObjects.svlCommonPage.loginWithPrivilegedRole(); + await PageObjects.svlCommonPage.loginAsAdmin(); }); after(async () => { @@ -172,12 +171,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { dataStream: apacheAccessDataStreamName, }); - const { docsCountTotal, degradedDocs, services, hosts } = - await PageObjects.datasetQuality.parseOverviewSummaryPanelKpis(excludeKeysFromServerless); + const { docsCountTotal, degradedDocs, services, hosts, size } = + await PageObjects.datasetQuality.parseOverviewSummaryPanelKpis(); expect(parseInt(docsCountTotal, 10)).to.be(226); expect(parseInt(degradedDocs, 10)).to.be(1); expect(parseInt(services, 10)).to.be(3); expect(parseInt(hosts, 10)).to.be(52); + expect(parseInt(size, 10)).to.be.greaterThan(0); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table.ts index 30b5a7831d68e..80214767c92d2 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_table.ts @@ -112,6 +112,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(degradedDocsColCellTexts).to.eql(['0%', '0%', '0%', '100%']); }); + it('shows the value in the size column', async () => { + const cols = await PageObjects.datasetQuality.parseDatasetTable(); + + const sizeColCellTexts = await cols.Size.getCellTexts(); + const sizeGreaterThanZero = sizeColCellTexts[3]; + const sizeEqualToZero = sizeColCellTexts[2]; + + expect(sizeGreaterThanZero).to.not.eql('0.0 KB'); + expect(sizeEqualToZero).to.eql('0.0 B'); + }); + it('shows dataset from integration', async () => { const cols = await PageObjects.datasetQuality.parseDatasetTable(); const datasetNameCol = cols['Data Set Name']; From ddab54f0a830106b47ca23d57caeeadb6a8898e7 Mon Sep 17 00:00:00 2001 From: Liam Thompson <32779855+leemthompo@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:07:40 +0200 Subject: [PATCH 050/107] [Search] Update connectors doc links & find/replace terms (#194423) ## Summary - Update doc links now that connectors live in the Elasticsearch guide - Update terms: - Native connectors -> _Elastic managed connectors_ - Connector clients -> _Self-managed connectors_ --- packages/kbn-doc-links/src/get_doc_links.ts | 70 +++++++++---------- .../connector_configuration.tsx | 4 +- .../native_connector_configuration.tsx | 6 +- .../components/connector_detail/overview.tsx | 7 +- .../components/connectors/connectors.tsx | 4 +- .../select_connector/connector_checkable.tsx | 6 +- .../connector_description_badge_popout.tsx | 4 +- .../select_connector/native_popover.tsx | 2 +- .../select_connector/select_connector.tsx | 19 ++--- .../new_index/new_search_index_page.tsx | 4 +- .../connector/api_key_configuration.tsx | 2 +- .../convert_connector.tsx | 15 ++-- .../components/search_index/overview.tsx | 2 +- .../search_indices/indices_table.tsx | 2 +- .../convert_connector_modal.tsx | 2 +- .../platinum_license_popover.tsx | 10 ++- .../applications/shared/constants/labels.ts | 4 +- .../connector_config/connector_index_name.tsx | 2 +- .../components/connectors_callout.tsx | 2 +- 19 files changed, 91 insertions(+), 76 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 63b16314bdb17..8e0dc0d3e108f 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -160,39 +160,39 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D buildConnector: `${ENTERPRISE_SEARCH_DOCS}build-connector.html`, bulkApi: `${ELASTICSEARCH_DOCS}docs-bulk.html`, configuration: `${ENTERPRISE_SEARCH_DOCS}configuration.html`, - connectors: `${ENTERPRISE_SEARCH_DOCS}connectors.html`, - connectorsClientDeploy: `${ENTERPRISE_SEARCH_DOCS}deploy-connector-client.html`, - connectorsMappings: `${ENTERPRISE_SEARCH_DOCS}connectors-usage.html#connectors-usage-index-create-configure-existing-index`, - connectorsAzureBlobStorage: `${ENTERPRISE_SEARCH_DOCS}connectors-azure-blob.html`, - connectorsBox: `${ENTERPRISE_SEARCH_DOCS}connectors-box.html`, - connectorsClients: `${ENTERPRISE_SEARCH_DOCS}connectors.html#connectors-build`, - connectorsConfluence: `${ENTERPRISE_SEARCH_DOCS}connectors-confluence.html`, - connectorsDropbox: `${ENTERPRISE_SEARCH_DOCS}connectors-dropbox.html`, - connectorsContentExtraction: `${ENTERPRISE_SEARCH_DOCS}connectors-content-extraction.html`, - connectorsGithub: `${ENTERPRISE_SEARCH_DOCS}connectors-github.html`, - connectorsGmail: `${ENTERPRISE_SEARCH_DOCS}connectors-gmail.html`, - connectorsGoogleCloudStorage: `${ENTERPRISE_SEARCH_DOCS}connectors-google-cloud.html`, - connectorsGoogleDrive: `${ENTERPRISE_SEARCH_DOCS}connectors-google-drive.html`, - connectorsJira: `${ENTERPRISE_SEARCH_DOCS}connectors-jira.html`, - connectorsMicrosoftSQL: `${ENTERPRISE_SEARCH_DOCS}connectors-ms-sql.html`, - connectorsMongoDB: `${ENTERPRISE_SEARCH_DOCS}connectors-mongodb.html`, - connectorsMySQL: `${ENTERPRISE_SEARCH_DOCS}connectors-mysql.html`, - connectorsNative: `${ENTERPRISE_SEARCH_DOCS}connectors.html#connectors-native`, - connectorsNetworkDrive: `${ENTERPRISE_SEARCH_DOCS}connectors-network-drive.html`, - connectorsNotion: `${ENTERPRISE_SEARCH_DOCS}connectors-notion.html`, - connectorsOneDrive: `${ENTERPRISE_SEARCH_DOCS}connectors-onedrive.html`, - connectorsOracle: `${ENTERPRISE_SEARCH_DOCS}connectors-oracle.html`, - connectorsOutlook: `${ENTERPRISE_SEARCH_DOCS}connectors-outlook.html`, - connectorsPostgreSQL: `${ENTERPRISE_SEARCH_DOCS}connectors-postgresql.html`, - connectorsRedis: `${ENTERPRISE_SEARCH_DOCS}connectors-redis.html`, - connectorsS3: `${ENTERPRISE_SEARCH_DOCS}connectors-s3.html`, - connectorsSalesforce: `${ENTERPRISE_SEARCH_DOCS}connectors-salesforce.html`, - connectorsServiceNow: `${ENTERPRISE_SEARCH_DOCS}connectors-servicenow.html`, - connectorsSharepoint: `${ENTERPRISE_SEARCH_DOCS}connectors-sharepoint.html`, - connectorsSharepointOnline: `${ENTERPRISE_SEARCH_DOCS}connectors-sharepoint-online.html`, - connectorsSlack: `${ENTERPRISE_SEARCH_DOCS}connectors-slack.html`, - connectorsTeams: `${ENTERPRISE_SEARCH_DOCS}connectors-teams.html`, - connectorsZoom: `${ENTERPRISE_SEARCH_DOCS}connectors-zoom.html`, + connectors: `${ELASTICSEARCH_DOCS}es-connectors.html`, + connectorsClientDeploy: `${ELASTICSEARCH_DOCS}es-build-connector.html#es-connectors-deploy-connector-service`, + connectorsMappings: `${ELASTICSEARCH_DOCS}es-connectors-usage.html#es-connectors-usage-index-create-configure-existing-index`, + connectorsAzureBlobStorage: `${ELASTICSEARCH_DOCS}es-connectors-azure-blob.html`, + connectorsBox: `${ELASTICSEARCH_DOCS}es-connectors-box.html`, + connectorsClients: `${ELASTICSEARCH_DOCS}es-connectors.html#es-connectors-build`, + connectorsConfluence: `${ELASTICSEARCH_DOCS}es-connectors-confluence.html`, + connectorsDropbox: `${ELASTICSEARCH_DOCS}es-connectors-dropbox.html`, + connectorsContentExtraction: `${ELASTICSEARCH_DOCS}es-connectors-content-extraction.html`, + connectorsGithub: `${ELASTICSEARCH_DOCS}es-connectors-github.html`, + connectorsGmail: `${ELASTICSEARCH_DOCS}es-connectors-gmail.html`, + connectorsGoogleCloudStorage: `${ELASTICSEARCH_DOCS}es-connectors-google-cloud.html`, + connectorsGoogleDrive: `${ELASTICSEARCH_DOCS}es-connectors-google-drive.html`, + connectorsJira: `${ELASTICSEARCH_DOCS}es-connectors-jira.html`, + connectorsMicrosoftSQL: `${ELASTICSEARCH_DOCS}es-connectors-ms-sql.html`, + connectorsMongoDB: `${ELASTICSEARCH_DOCS}es-connectors-mongodb.html`, + connectorsMySQL: `${ELASTICSEARCH_DOCS}es-connectors-mysql.html`, + connectorsNative: `${ELASTICSEARCH_DOCS}es-connectors.html#es-connectors-native`, + connectorsNetworkDrive: `${ELASTICSEARCH_DOCS}es-connectors-network-drive.html`, + connectorsNotion: `${ELASTICSEARCH_DOCS}es-connectors-notion.html`, + connectorsOneDrive: `${ELASTICSEARCH_DOCS}es-connectors-onedrive.html`, + connectorsOracle: `${ELASTICSEARCH_DOCS}es-connectors-oracle.html`, + connectorsOutlook: `${ELASTICSEARCH_DOCS}es-connectors-outlook.html`, + connectorsPostgreSQL: `${ELASTICSEARCH_DOCS}es-connectors-postgresql.html`, + connectorsRedis: `${ELASTICSEARCH_DOCS}es-connectors-redis.html`, + connectorsS3: `${ELASTICSEARCH_DOCS}es-connectors-s3.html`, + connectorsSalesforce: `${ELASTICSEARCH_DOCS}es-connectors-salesforce.html`, + connectorsServiceNow: `${ELASTICSEARCH_DOCS}es-connectors-servicenow.html`, + connectorsSharepoint: `${ELASTICSEARCH_DOCS}es-connectors-sharepoint.html`, + connectorsSharepointOnline: `${ELASTICSEARCH_DOCS}es-connectors-sharepoint-online.html`, + connectorsSlack: `${ELASTICSEARCH_DOCS}es-connectors-slack.html`, + connectorsTeams: `${ELASTICSEARCH_DOCS}es-connectors-teams.html`, + connectorsZoom: `${ELASTICSEARCH_DOCS}es-connectors-zoom.html`, crawlerExtractionRules: `${ENTERPRISE_SEARCH_DOCS}crawler-extraction-rules.html`, crawlerManaging: `${ENTERPRISE_SEARCH_DOCS}crawler-managing.html`, crawlerOverview: `${ENTERPRISE_SEARCH_DOCS}crawler.html`, @@ -224,8 +224,8 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D semanticTextField: `${ELASTICSEARCH_DOCS}semantic-text.html`, start: `${ENTERPRISE_SEARCH_DOCS}start.html`, supportedNlpModels: `${MACHINE_LEARNING_DOCS}ml-nlp-model-ref.html`, - syncRules: `${ENTERPRISE_SEARCH_DOCS}sync-rules.html`, - syncRulesAdvanced: `${ENTERPRISE_SEARCH_DOCS}sync-rules.html#sync-rules-advanced`, + syncRules: `${ELASTICSEARCH_DOCS}es-sync-rules.html`, + syncRulesAdvanced: `${ELASTICSEARCH_DOCS}es-sync-rules.html#es-sync-rules-advanced`, trainedModels: `${MACHINE_LEARNING_DOCS}ml-trained-models.html`, textEmbedding: `${MACHINE_LEARNING_DOCS}ml-nlp-model-ref.html#ml-nlp-model-ref-text-embedding`, troubleshootSetup: `${ENTERPRISE_SEARCH_DOCS}troubleshoot-setup.html`, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx index e0aa934f17954..fe8039b811f33 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx @@ -109,11 +109,11 @@ export const ConnectorConfiguration: React.FC = () => { {connector.is_native ? i18n.translate( 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.badgeType.nativeConnector', - { defaultMessage: 'Native connector' } + { defaultMessage: 'Elastic managed connector' } ) : i18n.translate( 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.badgeType.connectorClient', - { defaultMessage: 'Connector client' } + { defaultMessage: 'Self-managed connector' } )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx index fac70afd156d2..29a54c913301a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/native_connector_configuration.tsx @@ -105,11 +105,11 @@ export const NativeConnectorConfiguration: React.FC = () => { {connector.is_native ? i18n.translate( 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.badgeType.nativeConnector', - { defaultMessage: 'Native connector' } + { defaultMessage: 'Elastic managed connector' } ) : i18n.translate( 'xpack.enterpriseSearch.content.connector_detail.configurationConnector.badgeType.connectorClient', - { defaultMessage: 'Connector client' } + { defaultMessage: 'Self-managed connector' } )} @@ -132,7 +132,7 @@ export const NativeConnectorConfiguration: React.FC = () => { 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.entSearchWarning.text', { defaultMessage: - 'Native connectors require a running Enterprise Search instance to sync content from source.', + 'Elastic managed connectors require a running Enterprise Search instance.', } )}

diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx index 7e5b5cf61b475..906c64ccae8e2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/overview.tsx @@ -167,7 +167,8 @@ export const ConnectorDetailOverview: React.FC = () => { title={i18n.translate( 'xpack.enterpriseSearch.content.connectors.overview.nativeCloudCallout.title', { - defaultMessage: 'Native connectors are no longer supported outside Elastic Cloud', + defaultMessage: + 'Elastic managed connectors (formerly native connectors) are no longer supported outside Elastic Cloud', } )} > @@ -176,7 +177,7 @@ export const ConnectorDetailOverview: React.FC = () => {

{ > {i18n.translate( 'xpack.enterpriseSearch.content.connectors.overview.nativeCloudCallout.connectorClient', - { defaultMessage: 'connector client' } + { defaultMessage: 'self-managed connector' } )} ), diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx index eab42df85cc2f..a29f6c540b7ce 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx @@ -160,7 +160,7 @@ export const Connectors: React.FC = ({ isCrawler }) => { {i18n.translate( 'xpack.enterpriseSearch.connectors.newNativeConnectorButtonLabel', { - defaultMessage: 'New Native Connector', + defaultMessage: 'New Elastic managed Connector', } )} , @@ -176,7 +176,7 @@ export const Connectors: React.FC = ({ isCrawler }) => { > {i18n.translate( 'xpack.enterpriseSearch.connectors.newConnectorsClientButtonLabel', - { defaultMessage: 'New Connector Client' } + { defaultMessage: 'New Self-managed Connector' } )} , ]} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx index 2a1f00a6396df..d92718ac1c64e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_checkable.tsx @@ -159,7 +159,7 @@ export const ConnectorCheckable: React.FC = ({ 'xpack.enterpriseSearch.content.newIndex.selectConnector.openNativePopoverLabel', { defaultMessage: - 'Open popover with information about native connectors', + 'Open popover with information about Elastic managed connectors', } )} iconType="questionInCircle" @@ -220,7 +220,7 @@ export const ConnectorCheckable: React.FC = ({ > {i18n.translate( 'xpack.enterpriseSearch.connectorCheckable.setupANativeConnectorContextMenuItemLabel', - { defaultMessage: 'Setup a Native Connector' } + { defaultMessage: 'Set up an Elastic managed connector' } )} , , @@ -233,7 +233,7 @@ export const ConnectorCheckable: React.FC = ({ > {i18n.translate( 'xpack.enterpriseSearch.connectorCheckable.setupAConnectorClientContextMenuItemLabel', - { defaultMessage: 'Setup a Connector Client' } + { defaultMessage: 'Set up a self-managed connector' } )} , ]} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx index f4af323ab034d..4063a4a75266d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/connector_description_badge_popout.tsx @@ -105,10 +105,10 @@ export const ConnectorDescriptionBadge: React.FC > {isNative ? i18n.translate('xpack.enterpriseSearch.selectConnector.nativeBadgeLabel', { - defaultMessage: 'Native', + defaultMessage: 'Elastic managed', }) : i18n.translate('xpack.enterpriseSearch.selectConnector.connectorClientBadgeLabel', { - defaultMessage: 'Connector client', + defaultMessage: 'Self-managed', })} } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx index 226d4a96c6978..9e940cc31289f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/native_popover.tsx @@ -64,7 +64,7 @@ export const NativePopover: React.FC = ({ 'xpack.enterpriseSearch.content.newIndex.selectConnectore.nativePopover.description', { defaultMessage: - 'Native connectors are hosted on Elastic Cloud. Get started with a free 14-day trial.', + 'Elastic managed connectors are hosted on Elastic Cloud. Get started with a free 14-day trial.', } )}

diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx index f569d3c5cff2a..01d7136a65ecb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/select_connector/select_connector.tsx @@ -118,7 +118,8 @@ export const SelectConnector: React.FC = () => { description: i18n.translate( 'xpack.enterpriseSearch.content.indices.selectConnector.description', { - defaultMessage: "Choose which third-party data source you'd like to sync to Elastic.", + defaultMessage: + "Select which third-party data source you'd like to sync to Elastic. All data sources are supported by self-managed connectors. Check the availability for Elastic managed connectors by using the filters.", } ), pageTitle: i18n.translate('xpack.enterpriseSearch.content.indices.selectConnector.title', { @@ -161,7 +162,7 @@ export const SelectConnector: React.FC = () => { {i18n.translate( 'xpack.enterpriseSearch.content.indices.selectConnector.nativeLabel', { - defaultMessage: 'Native connectors', + defaultMessage: 'Elastic managed', } )} @@ -177,7 +178,7 @@ export const SelectConnector: React.FC = () => { {i18n.translate( 'xpack.enterpriseSearch.content.indices.selectConnector.connectorClients', { - defaultMessage: 'Connector clients', + defaultMessage: 'Self-managed', } )} @@ -193,7 +194,7 @@ export const SelectConnector: React.FC = () => { {i18n.translate( 'xpack.enterpriseSearch.content.indices.selectConnector.nativeLabel', { - defaultMessage: 'Native connectors', + defaultMessage: 'Elastic managed', } )} @@ -234,7 +235,7 @@ export const SelectConnector: React.FC = () => {

{i18n.translate( 'xpack.enterpriseSearch.selectConnector.nativeConnectorsTitleLabel', - { defaultMessage: 'Native connectors' } + { defaultMessage: 'Elastic managed connectors' } )}

@@ -249,7 +250,7 @@ export const SelectConnector: React.FC = () => { 'xpack.enterpriseSearch.selectConnector.p.areAvailableDirectlyWithinLabel', { defaultMessage: - 'Available directly within Elastic Cloud deployments. No additional infrastructure is required. You can also convert native connectors to self-hosted connector clients.', + 'Available directly within Elastic Cloud deployments. No additional infrastructure is required. You can also convert Elastic managed connectors to self-managed connectors.', } )}

@@ -268,7 +269,7 @@ export const SelectConnector: React.FC = () => {

{i18n.translate( 'xpack.enterpriseSearch.selectConnector.h4.connectorClientsLabel', - { defaultMessage: 'Connector clients' } + { defaultMessage: 'Self-managed connectors' } )}

@@ -283,7 +284,7 @@ export const SelectConnector: React.FC = () => { 'xpack.enterpriseSearch.selectConnector.p.deployConnectorsOnYourLabel', { defaultMessage: - 'Deploy connectors on your own infrastructure. You can also customize existing connector clients, or build your own using our connector framework.', + 'Deploy connectors on your own infrastructure. You can also customize existing self-managed connectors, or build your own using our connector framework.', } )}

@@ -363,7 +364,7 @@ export const SelectConnector: React.FC = () => {

{ ); @@ -161,7 +161,7 @@ const getConnectorModeBadge = (isNative?: boolean) => { return ( {i18n.translate('xpack.enterpriseSearch.getConnectorTypeBadge.connectorClientBadgeLabel', { - defaultMessage: 'Connector client', + defaultMessage: 'Self-managed', })} ); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/api_key_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/api_key_configuration.tsx index 29655218034dd..f6d59a7c25dd7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/api_key_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/api_key_configuration.tsx @@ -103,7 +103,7 @@ export const ApiKeyConfig: React.FC<{ ? i18n.translate( 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.apiKey.description', { - defaultMessage: `This native connector's API key {apiKeyName} is managed internally by Elasticsearch. The connector uses this API key to index documents into the {indexName} index. To refresh your API key, click "Generate API key".`, + defaultMessage: `This Elastic managed connector's API key {apiKeyName} is managed internally by Elasticsearch. The connector uses this API key to index documents into the {indexName} index. To refresh your API key, click "Generate API key".`, values: { apiKeyName: `${indexName}-connector`, indexName, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector.tsx index 5b1478086aadb..a4aa192491452 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector.tsx @@ -53,20 +53,27 @@ export const ConvertConnector: React.FC = () => { + {i18n.translate( 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.linkTitle', - { defaultMessage: 'connector client' } + { defaultMessage: 'self-managed connector' } )} ), }} /> - showModal()}> + showModal()} + > {i18n.translate( 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.buttonTitle', { defaultMessage: 'Convert connector' } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx index 2baf9bb2b530c..80021c5c20c00 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx @@ -88,7 +88,7 @@ export const SearchIndexOverview: React.FC = () => { > {i18n.translate( 'xpack.enterpriseSearch.content.searchIndex.nativeCloudCallout.connectorClient', - { defaultMessage: 'connector client' } + { defaultMessage: 'self-managed connector' } )} ), diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx index 244e4a48eca54..4e34ffde4922b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx @@ -120,7 +120,7 @@ export const IndicesTable: React.FC = ({ ? i18n.translate( 'xpack.enterpriseSearch.content.searchIndices.ingestionmethod.nativeConnector', { - defaultMessage: 'Native connector', + defaultMessage: 'Elastic managed connector', } ) : ingestionMethodToText(index.ingestionMethod)} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/convert_connector_modal/convert_connector_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/convert_connector_modal/convert_connector_modal.tsx index c05b155e38b2e..35e348df1334c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/convert_connector_modal/convert_connector_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/convert_connector_modal/convert_connector_modal.tsx @@ -46,7 +46,7 @@ export const ConvertConnectorModal: React.FC = () => { 'xpack.enterpriseSearch.searchApplications.searchApplication.indices.convertIndexConfirm.description', { defaultMessage: - "Once you convert a native connector to a self-managed connector client this can't be undone.", + "Converting an Elastic managed connector to a self-managed connector can't be undone.", } )}

diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/platinum_license_popover/platinum_license_popover.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/platinum_license_popover/platinum_license_popover.tsx index acb6f69e60406..154f5d7a16afe 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/platinum_license_popover/platinum_license_popover.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/platinum_license_popover/platinum_license_popover.tsx @@ -64,7 +64,7 @@ export const PlatinumLicensePopover: React.FC = ({ 'xpack.enterpriseSearch.content.newIndex.selectConnector.upgradeContent', { defaultMessage: - 'Connector clients sending data to a self-managed Elasticsearch instance require at least a Platinum license.', + 'Self-managed connectors sending data to a self-managed Elasticsearch instance require at least a Platinum license.', } )}

@@ -72,7 +72,12 @@ export const PlatinumLicensePopover: React.FC = ({ - + {i18n.translate( 'xpack.enterpriseSearch.content.newIndex.selectConnector.subscriptionButtonLabel', { @@ -83,6 +88,7 @@ export const PlatinumLicensePopover: React.FC = ({ diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts b/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts index 33db1e29e5161..f1da7cefa5cc0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/constants/labels.ts @@ -28,7 +28,7 @@ export const BETA_LABEL = i18n.translate('xpack.enterpriseSearch.betaLabel', { }); export const NATIVE_LABEL = i18n.translate('xpack.enterpriseSearch.nativeLabel', { - defaultMessage: 'Native', + defaultMessage: 'Elastic managed', }); export const NAME_LABEL = i18n.translate('xpack.enterpriseSearch.nameLabel', { @@ -50,7 +50,7 @@ export const LEARN_MORE_LINK = i18n.translate('xpack.enterpriseSearch.learnMore. export const CONNECTOR_CLIENT_LABEL = i18n.translate( 'xpack.enterpriseSearch.connectorClientLabel', { - defaultMessage: 'Connector Client', + defaultMessage: 'Self-managed', } ); diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_index_name.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_index_name.tsx index 6282b02d7968a..a421af47a0a79 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_index_name.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_index_name.tsx @@ -108,7 +108,7 @@ export const ConnectorIndexName: React.FC = ({ connecto

{DEFAULT_INGESTION_PIPELINE}, }} diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_callout.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_callout.tsx index fd23316c6e4d4..52fb878d4b619 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_callout.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_callout.tsx @@ -16,7 +16,7 @@ export const ConnectorsCallout = () => { return ( Date: Tue, 1 Oct 2024 10:32:37 +0200 Subject: [PATCH 051/107] [ML] Data frame analytics: Fix screen flickering in Results Explorer and Analytics Map when no jobs are available (#193890) ## Summary Fix for [#138193](https://github.com/elastic/kibana/issues/138193) I didn't find any relation between user permissions and the issue. The error mentioned in the issue doesn't come from the ML package and is unrelated to the problem. The view was visible due to the initial state of `jobsExist`. Added additional loading state to prevent screen flickering. Disabled automatic display of the job selection flyout when no jobs are available. After: https://github.com/user-attachments/assets/a8c6e5e2-ebcc-4320-b5be-f586ca6c0672 --- .../pages/analytics_exploration/page.tsx | 14 ++++++++++++-- .../data_frame_analytics/pages/job_map/page.tsx | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx index fd7cf90dbb7df..bf4bc9e7db894 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx @@ -32,8 +32,9 @@ export const Page: FC<{ analysisType: DataFrameAnalysisConfigType; }> = ({ jobId, analysisType }) => { const [analyticsId, setAnalyticsId] = useState(); - const [isIdSelectorFlyoutVisible, setIsIdSelectorFlyoutVisible] = useState(!jobId); + const [isIdSelectorFlyoutVisible, setIsIdSelectorFlyoutVisible] = useState(false); const [jobsExist, setJobsExist] = useState(true); + const [isLoadingJobsExist, setIsLoadingJobsExist] = useState(false); const { services: { docLinks }, } = useMlKibana(); @@ -49,12 +50,17 @@ export const Page: FC<{ const [, setGlobalState] = useUrlState('_g'); const checkJobsExist = async () => { + setIsLoadingJobsExist(true); try { const { count } = await getDataFrameAnalytics(undefined, undefined, 0); - setJobsExist(count > 0); + const hasAnalyticsJobs = count > 0; + setJobsExist(hasAnalyticsJobs); + setIsIdSelectorFlyoutVisible(hasAnalyticsJobs && !jobId); } catch (e) { // Swallow the error and just show the empty table in the analytics id selector console.error('Error checking analytics jobs exist', e); // eslint-disable-line no-console + } finally { + setIsLoadingJobsExist(false); } }; @@ -98,6 +104,10 @@ export const Page: FC<{ ); const getEmptyState = () => { + if (isLoadingJobsExist) { + return null; + } + if (jobsExist === false) { return ; } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx index 7afb189cf91f3..2f1936a0c89de 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx @@ -29,10 +29,9 @@ export const Page: FC = () => { const modelId = globalState?.ml?.modelId; const [isLoading, setIsLoading] = useState(false); - const [isIdSelectorFlyoutVisible, setIsIdSelectorFlyoutVisible] = useState( - !jobId && !modelId - ); + const [isIdSelectorFlyoutVisible, setIsIdSelectorFlyoutVisible] = useState(false); const [jobsExist, setJobsExist] = useState(true); + const [isLoadingJobsExist, setIsLoadingJobsExist] = useState(false); const { refresh } = useRefreshAnalyticsList({ isLoading: setIsLoading }); const setAnalyticsId = useCallback( @@ -56,12 +55,17 @@ export const Page: FC = () => { const helpLink = docLinks.links.ml.dataFrameAnalytics; const checkJobsExist = async () => { + setIsLoadingJobsExist(true); try { const { count } = await getDataFrameAnalytics(undefined, undefined, 0); - setJobsExist(count > 0); + const hasAnalyticsJobs = count > 0; + setJobsExist(hasAnalyticsJobs); + setIsIdSelectorFlyoutVisible(hasAnalyticsJobs && !jobId && !modelId); } catch (e) { // Swallow the error and just show the empty table in the analytics id selector console.error('Error checking analytics jobs exist', e); // eslint-disable-line no-console + } finally { + setIsLoadingJobsExist(false); } }; @@ -71,6 +75,10 @@ export const Page: FC = () => { }, []); const getEmptyState = () => { + if (isLoadingJobsExist) { + return null; + } + if (jobsExist === false) { return ; } From 12ea569eb97f96bd595466c92a5311695674f27e Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:23:04 +0200 Subject: [PATCH 052/107] Added 8.x to CodeQL scan (#194014) ## Summary Added `8.x` to CodeQL scan __Closes: https://github.com/elastic/kibana/issues/194000__ Co-authored-by: Elastic Machine --- .github/workflows/codeql.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5a93858e2d4a8..e16dbcb261807 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: language: [ 'javascript' ] - branch: [ 'main', '7.17' ] + branch: [ 'main', '7.17', '8.x' ] steps: - name: Checkout repository @@ -73,6 +73,7 @@ jobs: env: GITHUB_TOKEN: ${{secrets.KIBANAMACHINE_TOKEN}} SLACK_TOKEN: ${{secrets.CODE_SCANNING_SLACK_TOKEN}} + CODEQL_BRANCHES: 7.17,8.x,main run: | npm ci --omit=dev - node codeql-alert + node codeql-alert From 8776fe588d146fa768f912bc6265032576347617 Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:26:21 +0200 Subject: [PATCH 053/107] [Authz] Eslint Rule for Security Config (#193187) ## Summary ESLint rule is introduced to enforce the migration of access tags in route configurations to the `security.authz.requiredPrivileges` field. It ensures that security configurations are correctly applied in both standard and versioned routes. Will be enabled after https://github.com/elastic/kibana/pull/191973 is merged. The rule covers: - **Access Tag Migration.** Moves `access:` tags from the `options.tags` property to `security.authz.requiredPrivileges`. Preserves any non-access tags in the tags property. - **Missing Security Config Detection.** Reports an error if no security config is found in the route or version. Suggests adding a default security configuration `authz: { enabled: false }`. ### Note There is an indentation issues with the test, `dedent` doesn't solve most of the issues and since `RuleTester` was designed to test a single rule at a time,I couldn't enable multiple fixes (including indent ones) before checking output. Manually adjusted the indentation. ### 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 __Fixes: https://github.com/elastic/kibana/issues/191715__ __Related: https://github.com/elastic/kibana/issues/191710__ --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../rules/no_deprecated_authz_config.js | 318 +++++++++++++++ .../rules/no_deprecated_authz_config.test.js | 385 ++++++++++++++++++ 2 files changed, 703 insertions(+) create mode 100644 packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js create mode 100644 packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js new file mode 100644 index 0000000000000..ca2821c4f8ce6 --- /dev/null +++ b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js @@ -0,0 +1,318 @@ +/* + * Copyright 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". + */ + +const routeMethods = ['get', 'put', 'delete', 'post']; +const ACCESS_TAG_PREFIX = 'access:'; + +const isStringLiteral = (el) => el.type === 'Literal' && typeof el.value === 'string'; +const isLiteralAccessTag = (el) => isStringLiteral(el) && el.value.startsWith(ACCESS_TAG_PREFIX); +const isLiteralNonAccessTag = (el) => + isStringLiteral(el) && !el.value.startsWith(ACCESS_TAG_PREFIX); + +const isTemplateLiteralAccessTag = (el) => + el.type === 'TemplateLiteral' && el.quasis[0].value.raw.startsWith(ACCESS_TAG_PREFIX); +const isTemplateLiteralNonAccessTag = (el) => + el.type === 'TemplateLiteral' && !el.quasis[0].value.raw.startsWith(ACCESS_TAG_PREFIX); + +const maybeReportDisabledSecurityConfig = (node, context, isVersionedRoute = false) => { + const callee = node.callee; + const isAddVersionCall = + callee.type === 'MemberExpression' && callee.property.name === 'addVersion'; + + const disabledSecurityConfig = ` + security: { + authz: { + enabled: false, + reason: 'This route is opted out from authorization', + }, + },`; + + // Skipping root route call intentionally, we will check root route security config in addVersion node traversal + if (isVersionedRoute && !isAddVersionCall) { + return; + } + + if (isVersionedRoute) { + const [versionConfig] = node.arguments; + + if (versionConfig && versionConfig.type === 'ObjectExpression') { + const securityInVersion = versionConfig.properties.find( + (property) => property.key && property.key.name === 'security' + ); + + if (securityInVersion) { + return; + } + + let currentNode = node; + + const hasSecurityInRoot = (config) => { + const securityInRoot = config.properties.find( + (property) => property.key && property.key.name === 'security' + ); + + if (securityInRoot) { + return true; + } + + const optionsProperty = config.properties.find( + (prop) => prop.key && prop.key.name === 'options' + ); + + if (optionsProperty?.value?.properties) { + const tagsProperty = optionsProperty.value.properties.find( + (prop) => prop.key.name === 'tags' + ); + + const accessTagsFilter = (el) => isLiteralAccessTag(el) || isTemplateLiteralAccessTag(el); + const accessTags = tagsProperty.value.elements.filter(accessTagsFilter); + + return accessTags.length > 0; + } + + return false; + }; + + while ( + currentNode && + currentNode.type === 'CallExpression' && + currentNode.callee.type === 'MemberExpression' + ) { + const callee = currentNode.callee; + + if ( + callee.object && + callee.object.property && + callee.object.property.name === 'versioned' && + routeMethods.includes(callee.property.name) + ) { + const [routeConfig] = currentNode.arguments; + + if (routeConfig && routeConfig.type === 'ObjectExpression') { + const securityInRoot = hasSecurityInRoot(routeConfig); + + // If security is missing in both the root and the version + if (!securityInRoot) { + context.report({ + node: versionConfig, + message: 'Security config is missing in addVersion call', + fix(fixer) { + const versionProperty = versionConfig.properties.find( + (property) => property.key && property.key.name === 'version' + ); + const insertPosition = versionProperty.range[1]; + + return fixer.insertTextAfterRange( + [insertPosition, insertPosition + 1], + `${disabledSecurityConfig}` + ); + }, + }); + } + } + + break; + } + + currentNode = callee.object; + } + } + } else { + const [routeConfig] = node.arguments; + const securityProperty = routeConfig.properties.find( + (property) => property.key && property.key.name === 'security' + ); + + if (!securityProperty) { + const pathProperty = routeConfig.properties.find((prop) => prop.key.name === 'path'); + context.report({ + node: routeConfig, + message: 'Security config is missing', + fix(fixer) { + const insertPosition = pathProperty.range[1]; + + return fixer.insertTextAfterRange( + [insertPosition, insertPosition + 1], + `${disabledSecurityConfig}` + ); + }, + }); + } + } +}; + +const handleRouteConfig = (node, context, isVersionedRoute = false) => { + const [routeConfig] = node.arguments; + + if (routeConfig && routeConfig.type === 'ObjectExpression') { + const optionsProperty = routeConfig.properties.find( + (prop) => prop.key && prop.key.name === 'options' + ); + + if (!optionsProperty) { + return maybeReportDisabledSecurityConfig(node, context, isVersionedRoute); + } + + if (optionsProperty?.value?.properties) { + const tagsProperty = optionsProperty.value.properties.find( + (prop) => prop.key.name === 'tags' + ); + + const accessTagsFilter = (el) => isLiteralAccessTag(el) || isTemplateLiteralAccessTag(el); + const nonAccessTagsFilter = (el) => + isLiteralNonAccessTag(el) || isTemplateLiteralNonAccessTag(el); + + const getAccessPrivilege = (el) => { + if (el.type === 'Literal') { + return `'${el.value.split(':')[1]}'`; + } + + if (el.type === 'TemplateLiteral') { + const firstQuasi = el.quasis[0].value.raw; + + if (firstQuasi.startsWith(ACCESS_TAG_PREFIX)) { + const staticPart = firstQuasi.split(ACCESS_TAG_PREFIX)[1] || ''; + + const dynamicParts = el.expressions.map((expression, index) => { + const dynamicPlaceholder = `\${${expression.name}}`; + const nextQuasi = el.quasis[index + 1].value.raw || ''; + return `${dynamicPlaceholder}${nextQuasi}`; + }); + + return `\`${staticPart}${dynamicParts.join('')}\``; + } + } + }; + + if (!tagsProperty) { + return maybeReportDisabledSecurityConfig(node, context, isVersionedRoute); + } + + if (tagsProperty && tagsProperty.value.type === 'ArrayExpression') { + const accessTags = tagsProperty.value.elements.filter(accessTagsFilter); + const nonAccessTags = tagsProperty.value.elements.filter(nonAccessTagsFilter); + + if (!accessTags.length) { + return maybeReportDisabledSecurityConfig(node, context, isVersionedRoute); + } + + context.report({ + node: tagsProperty, + message: `Move 'access' tags to security.authz.requiredPrivileges.`, + fix(fixer) { + const accessPrivileges = accessTags.map(getAccessPrivilege); + + const securityConfig = `security: { + authz: { + requiredPrivileges: [${accessPrivileges.map((priv) => priv).join(', ')}], + }, + }`; + + const sourceCode = context.getSourceCode(); + + const fixes = []; + let remainingOptions = []; + + // If there are non-access tags, keep the 'tags' property with those + if (nonAccessTags.length > 0) { + const nonAccessTagsText = `[${nonAccessTags + .map((tag) => sourceCode.getText(tag)) + .join(', ')}]`; + fixes.push(fixer.replaceText(tagsProperty.value, nonAccessTagsText)); + } else { + // Check if 'options' will be empty after removing 'tags' + remainingOptions = optionsProperty.value.properties.filter( + (prop) => prop.key.name !== 'tags' + ); + + // If options are empty, replace the entire 'options' with 'security' config + if (remainingOptions.length === 0) { + fixes.push(fixer.replaceText(optionsProperty, securityConfig)); + } + } + + // If 'options' was replaced or has other properties, insert security separately + if (remainingOptions.length > 0) { + // If no non-access tags, remove 'tags' + const nextToken = sourceCode.getTokenAfter(tagsProperty); + + if (nextToken && nextToken.value === ',') { + // Remove the 'tags' property and the trailing comma + fixes.push(fixer.removeRange([tagsProperty.range[0], nextToken.range[1]])); + } else { + fixes.push(fixer.remove(tagsProperty)); + } + fixes.push(fixer.insertTextBefore(optionsProperty, `${securityConfig},`)); + } + + if (nonAccessTags.length && !remainingOptions.length) { + fixes.push(fixer.insertTextBefore(optionsProperty, `${securityConfig},`)); + } + + return fixes; + }, + }); + } + } + } +}; + +/** + * ESLint Rule: Migrate `access` tags in route configurations to `security.authz.requiredPrivileges`. + * + * This rule checks for the following in route configurations: + * 1. If a route (e.g., `router.get()`, `router.post()`) contains an `options` property with `tags`. + * 2. If `tags` contains any `access:` tags, these are moved to `security.authz.requiredPrivileges`. + * 3. If no `security` configuration exists, it reports an error and suggests adding a default `security` config. + * 4. It handles both standard routes and versioned routes (e.g., `router.versioned.post()`, `router.addVersion()`). + * 5. If other non-access tags exist, they remain in `tags`. + */ +module.exports = { + meta: { + type: 'suggestion', + docs: { + description: 'Migrate routes with and without access tags to security config', + category: 'Best Practices', + recommended: false, + }, + fixable: 'code', + }, + + create(context) { + return { + CallExpression(node) { + const callee = node.callee; + + if ( + callee.type === 'MemberExpression' && + callee.object && + callee.object.name === 'router' && + routeMethods.includes(callee.property.name) + ) { + handleRouteConfig(node, context, false); + } + + if ( + (callee.type === 'MemberExpression' && callee.property.name === 'addVersion') || + (callee.object && + callee.object.type === 'MemberExpression' && + callee.object.object.name === 'router' && + callee.object.property.name === 'versioned' && + routeMethods.includes(callee.property.name)) + ) { + const versionConfig = node.arguments[0]; + + if (versionConfig && versionConfig.type === 'ObjectExpression') { + handleRouteConfig(node, context, true); + } + } + }, + }; + }, +}; diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js new file mode 100644 index 0000000000000..f0b64da01cf75 --- /dev/null +++ b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js @@ -0,0 +1,385 @@ +/* + * Copyright 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". + */ + +const { RuleTester } = require('eslint'); +const rule = require('./no_deprecated_authz_config'); +const dedent = require('dedent'); + +// Indentation is a big problem in the test cases, dedent library does not work as expected. + +const ruleTester = new RuleTester({ + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + }, +}); + +ruleTester.run('no_deprecated_authz_config', rule, { + valid: [ + { + code: ` + router.get( + { + path: '/api/security/authz_poc/simple_privileges_example_1', + security: { + authz: { + enabled: false, + reason: 'This route is opted out from authorization ', + }, + }, + validate: false, + }, + () => {} + ); + `, + name: 'valid: security config is present and authz is disabled', + }, + { + code: ` + router.get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + security: { + authz: { + requiredPrivileges: ['somePrivilege'], + }, + }, + }); + `, + name: 'valid: security config is present and authz is enabled', + }, + { + code: ` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + }) + .addVersion( + { + version: '1', + validate: false, + security: { + authz: { + requiredPrivileges: ['managePrivileges'], + }, + }, + }, + () => {} + ); + `, + name: 'valid: security config is present for versioned route', + }, + { + code: ` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + security: { + authz: { + requiredPrivileges: ['managePrivileges'], + }, + }, + }) + .addVersion( + { + version: '1', + validate: false, + }, + () => {} + ); + `, + name: 'valid: security config is present for versioned route provided in root route definition', + }, + ], + + invalid: [ + { + code: dedent(` + router.get( + { + path: '/test/path', + validate: false, + }, + () => {} + ); + `), + errors: [{ message: 'Security config is missing' }], + output: dedent(` + router.get( + { + path: '/test/path', + security: { + authz: { + enabled: false, + reason: 'This route is opted out from authorization', + }, + }, + validate: false, + }, + () => {} + ); + `), + name: 'invalid: security config is missing', + }, + { + code: ` + router.get({ + path: '/some/path', + options: { + tags: ['access:securitySolution'], + }, + }); + `, + errors: [{ message: "Move 'access' tags to security.authz.requiredPrivileges." }], + output: ` + router.get({ + path: '/some/path', + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, + }, + }); + `, + name: 'invalid: access tags are string literals, move to security.authz.requiredPrivileges', + }, + { + code: ` + router.get({ + path: '/some/path', + options: { + tags: [\`access:\${APP_ID}-entity-analytics\`], + }, + }); + `, + errors: [{ message: "Move 'access' tags to security.authz.requiredPrivileges." }], + output: ` + router.get({ + path: '/some/path', + security: { + authz: { + requiredPrivileges: [\`\${APP_ID}-entity-analytics\`], + }, + }, + }); + `, + name: 'invalid: access tags are template literals, move to security.authz.requiredPrivileges', + }, + { + code: ` + router.get({ + path: '/some/path', + options: { + tags: ['access:securitySolution', 'otherTag'], + }, + }); + `, + errors: [{ message: "Move 'access' tags to security.authz.requiredPrivileges." }], + output: ` + router.get({ + path: '/some/path', + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, + },options: { + tags: ['otherTag'], + }, + }); + `, + name: 'invalid: both access tags and non access tags, move only access tags to security.authz.requiredPrivileges', + }, + { + code: ` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['access:securitySolution'], + }, + }) + .addVersion( + { + version: '1', + validate: false, + security: { + authz: { + requiredPrivileges: [ApiActionPermission.ManageSpaces], + }, + }, + }, + () => {} + ); + `, + errors: [{ message: "Move 'access' tags to security.authz.requiredPrivileges." }], + output: ` + router.versioned + .get({ + path: '/some/path', + security: { + authz: { + requiredPrivileges: ['securitySolution'], + }, + }, + }) + .addVersion( + { + version: '1', + validate: false, + security: { + authz: { + requiredPrivileges: [ApiActionPermission.ManageSpaces], + }, + }, + }, + () => {} + ); + `, + name: 'invalid: versioned route root access tags, move access tags to security.authz.requiredPrivileges', + }, + { + code: ` + router.get({ + path: '/some/path', + options: { + tags: ['access:securitySolution', \`access:\${APP_ID}-entity-analytics\`], + }, + }); + `, + errors: [{ message: "Move 'access' tags to security.authz.requiredPrivileges." }], + output: ` + router.get({ + path: '/some/path', + security: { + authz: { + requiredPrivileges: ['securitySolution', \`\${APP_ID}-entity-analytics\`], + }, + }, + }); + `, + name: 'invalid: string and template literal access tags, move both to security.authz.requiredPrivileges', + }, + { + code: dedent(` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + }) + .addVersion( + { + version: '1', + validate: false, + }, + () => {} + ); + `), + errors: [{ message: 'Security config is missing in addVersion call' }], + output: dedent(` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + }) + .addVersion( + { + version: '1', + security: { + authz: { + enabled: false, + reason: 'This route is opted out from authorization', + }, + }, + validate: false, + }, + () => {} + ); + `), + name: 'invalid: security config is missing in addVersion call', + }, + { + code: dedent(` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + }) + .addVersion( + { + version: '1', + validate: false, + }, + () => {} + ) + .addVersion( + { + version: '2', + validate: false, + }, + () => {} + ); + `), + errors: [ + { message: 'Security config is missing in addVersion call' }, + { message: 'Security config is missing in addVersion call' }, + ], + output: dedent(` + router.versioned + .get({ + path: '/some/path', + options: { + tags: ['otherTag'], + }, + }) + .addVersion( + { + version: '1', + security: { + authz: { + enabled: false, + reason: 'This route is opted out from authorization', + }, + }, + validate: false, + }, + () => {} + ) + .addVersion( + { + version: '2', + security: { + authz: { + enabled: false, + reason: 'This route is opted out from authorization', + }, + }, + validate: false, + }, + () => {} + ); + `), + name: 'invalid: security config is missing in multiple addVersion call', + }, + ], +}); From dfe00f20dd3d8d051b5682f7abdc75df2464e3fd Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 1 Oct 2024 11:29:32 +0200 Subject: [PATCH 054/107] [ES|QL] Adds the ability to breakdown the histogram in Discover (#193820) ## Summary Part of https://github.com/elastic/kibana/issues/186369 It enables the users to breakdown the histogram visualization in Discover. ![meow](https://github.com/user-attachments/assets/d5fdaa41-0a69-4caf-9da2-1221dcfd5ce2) ### 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] [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/)) - [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) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../chart/breakdown_field_selector.test.tsx | 109 +++++++++++++++++- .../public/chart/breakdown_field_selector.tsx | 33 ++++-- .../unified_histogram/public/chart/chart.tsx | 4 + .../public/container/container.tsx | 1 + .../container/hooks/use_state_props.test.ts | 98 +++++++++++++++- .../public/container/hooks/use_state_props.ts | 24 +++- .../public/layout/layout.tsx | 1 + .../lens_vis_service.suggestions.test.ts | 52 +++++++++ .../public/services/lens_vis_service.ts | 71 ++++++++++-- src/plugins/unified_histogram/tsconfig.json | 1 + .../apps/discover/esql/_esql_view.ts | 58 ++++++++++ .../apps/discover/group3/_lens_vis.ts | 20 +++- .../lens/public/embeddable/embeddable.tsx | 9 +- 13 files changed, 451 insertions(+), 30 deletions(-) diff --git a/src/plugins/unified_histogram/public/chart/breakdown_field_selector.test.tsx b/src/plugins/unified_histogram/public/chart/breakdown_field_selector.test.tsx index 5b39fd0482bb4..4342c00c98854 100644 --- a/src/plugins/unified_histogram/public/chart/breakdown_field_selector.test.tsx +++ b/src/plugins/unified_histogram/public/chart/breakdown_field_selector.test.tsx @@ -9,12 +9,15 @@ import { render, act, screen } from '@testing-library/react'; import React from 'react'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; +import { convertDatatableColumnToDataViewFieldSpec } from '@kbn/data-view-utils'; +import { DataViewField } from '@kbn/data-views-plugin/common'; import { UnifiedHistogramBreakdownContext } from '../types'; import { dataViewWithTimefieldMock } from '../__mocks__/data_view_with_timefield'; import { BreakdownFieldSelector } from './breakdown_field_selector'; describe('BreakdownFieldSelector', () => { - it('should render correctly', () => { + it('should render correctly for dataview fields', () => { const onBreakdownFieldChange = jest.fn(); const breakdown: UnifiedHistogramBreakdownContext = { field: undefined, @@ -63,6 +66,67 @@ describe('BreakdownFieldSelector', () => { `); }); + it('should render correctly for ES|QL columns', () => { + const onBreakdownFieldChange = jest.fn(); + const breakdown: UnifiedHistogramBreakdownContext = { + field: undefined, + }; + + render( + + ); + + const button = screen.getByTestId('unifiedHistogramBreakdownSelectorButton'); + expect(button.getAttribute('data-selected-value')).toBe(null); + + act(() => { + button.click(); + }); + + const options = screen.getAllByRole('option'); + expect( + options.map((option) => ({ + label: option.getAttribute('title'), + value: option.getAttribute('value'), + checked: option.getAttribute('aria-checked'), + })) + ).toMatchInlineSnapshot(` + Array [ + Object { + "checked": "true", + "label": "No breakdown", + "value": "__EMPTY_SELECTOR_OPTION__", + }, + Object { + "checked": "false", + "label": "bytes", + "value": "bytes", + }, + Object { + "checked": "false", + "label": "extension", + "value": "extension", + }, + ] + `); + }); + it('should mark the option as checked if breakdown.field is defined', () => { const onBreakdownFieldChange = jest.fn(); const field = dataViewWithTimefieldMock.fields.find((f) => f.name === 'extension')!; @@ -111,7 +175,7 @@ describe('BreakdownFieldSelector', () => { `); }); - it('should call onBreakdownFieldChange with the selected field when the user selects a field', () => { + it('should call onBreakdownFieldChange with the selected field when the user selects a dataview field', () => { const onBreakdownFieldChange = jest.fn(); const selectedField = dataViewWithTimefieldMock.fields.find((f) => f.name === 'bytes')!; const breakdown: UnifiedHistogramBreakdownContext = { @@ -135,4 +199,45 @@ describe('BreakdownFieldSelector', () => { expect(onBreakdownFieldChange).toHaveBeenCalledWith(selectedField); }); + + it('should call onBreakdownFieldChange with the selected field when the user selects an ES|QL field', () => { + const onBreakdownFieldChange = jest.fn(); + const esqlColumns = [ + { + name: 'bytes', + meta: { type: 'number' }, + id: 'bytes', + }, + { + name: 'extension', + meta: { type: 'string' }, + id: 'extension', + }, + ] as DatatableColumn[]; + const breakdownColumn = esqlColumns.find((c) => c.name === 'bytes')!; + const selectedField = new DataViewField( + convertDatatableColumnToDataViewFieldSpec(breakdownColumn) + ); + const breakdown: UnifiedHistogramBreakdownContext = { + field: undefined, + }; + render( + + ); + + act(() => { + screen.getByTestId('unifiedHistogramBreakdownSelectorButton').click(); + }); + + act(() => { + screen.getByTitle('bytes').click(); + }); + + expect(onBreakdownFieldChange).toHaveBeenCalledWith(selectedField); + }); }); diff --git a/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx b/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx index 7d29827a1389b..b3c49e27c6011 100644 --- a/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx +++ b/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx @@ -11,7 +11,9 @@ import React, { useCallback, useMemo } from 'react'; import { EuiSelectableOption } from '@elastic/eui'; import { FieldIcon, getFieldIconProps, comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import { css } from '@emotion/react'; -import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import { type DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; +import { convertDatatableColumnToDataViewFieldSpec } from '@kbn/data-view-utils'; import { i18n } from '@kbn/i18n'; import { UnifiedHistogramBreakdownContext } from '../types'; import { fieldSupportsBreakdown } from '../utils/field_supports_breakdown'; @@ -25,17 +27,32 @@ import { export interface BreakdownFieldSelectorProps { dataView: DataView; breakdown: UnifiedHistogramBreakdownContext; + esqlColumns?: DatatableColumn[]; onBreakdownFieldChange?: (breakdownField: DataViewField | undefined) => void; } +const mapToDropdownFields = (dataView: DataView, esqlColumns?: DatatableColumn[]) => { + if (esqlColumns) { + return ( + esqlColumns + .map((column) => new DataViewField(convertDatatableColumnToDataViewFieldSpec(column))) + // filter out unsupported field types + .filter((field) => field.type !== 'unknown') + ); + } + + return dataView.fields.filter(fieldSupportsBreakdown); +}; + export const BreakdownFieldSelector = ({ dataView, breakdown, + esqlColumns, onBreakdownFieldChange, }: BreakdownFieldSelectorProps) => { + const fields = useMemo(() => mapToDropdownFields(dataView, esqlColumns), [dataView, esqlColumns]); const fieldOptions: SelectableEntry[] = useMemo(() => { - const options: SelectableEntry[] = dataView.fields - .filter(fieldSupportsBreakdown) + const options: SelectableEntry[] = fields .map((field) => ({ key: field.name, name: field.name, @@ -69,16 +86,16 @@ export const BreakdownFieldSelector = ({ }); return options; - }, [dataView, breakdown.field]); + }, [fields, breakdown?.field]); const onChange = useCallback>( (chosenOption) => { - const field = chosenOption?.value - ? dataView.fields.find((currentField) => currentField.name === chosenOption.value) + const breakdownField = chosenOption?.value + ? fields.find((currentField) => currentField.name === chosenOption.value) : undefined; - onBreakdownFieldChange?.(field); + onBreakdownFieldChange?.(breakdownField); }, - [dataView.fields, onBreakdownFieldChange] + [fields, onBreakdownFieldChange] ); return ( diff --git a/src/plugins/unified_histogram/public/chart/chart.tsx b/src/plugins/unified_histogram/public/chart/chart.tsx index 4204658273447..4fb1b9cbe6471 100644 --- a/src/plugins/unified_histogram/public/chart/chart.tsx +++ b/src/plugins/unified_histogram/public/chart/chart.tsx @@ -19,6 +19,7 @@ import type { LensEmbeddableInput, LensEmbeddableOutput, } from '@kbn/lens-plugin/public'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import type { TimeRange } from '@kbn/es-query'; import { Histogram } from './histogram'; @@ -79,6 +80,7 @@ export interface ChartProps { onFilter?: LensEmbeddableInput['onFilter']; onBrushEnd?: LensEmbeddableInput['onBrushEnd']; withDefaultActions: EmbeddableComponentProps['withDefaultActions']; + columns?: DatatableColumn[]; } const HistogramMemoized = memo(Histogram); @@ -114,6 +116,7 @@ export function Chart({ onBrushEnd, withDefaultActions, abortController, + columns, }: ChartProps) { const lensVisServiceCurrentSuggestionContext = useObservable( lensVisService.currentSuggestionContext$ @@ -312,6 +315,7 @@ export function Chart({ dataView={dataView} breakdown={breakdown} onBreakdownFieldChange={onBreakdownFieldChange} + esqlColumns={isPlainRecord ? columns : undefined} /> )}

diff --git a/src/plugins/unified_histogram/public/container/container.tsx b/src/plugins/unified_histogram/public/container/container.tsx index a4231529a629b..15367ae51d9b5 100644 --- a/src/plugins/unified_histogram/public/container/container.tsx +++ b/src/plugins/unified_histogram/public/container/container.tsx @@ -147,6 +147,7 @@ export const UnifiedHistogramContainer = forwardRef< query, searchSessionId, requestAdapter, + columns: containerProps.columns, }); const handleVisContextChange: UnifiedHistogramLayoutProps['onVisContextChanged'] | undefined = diff --git a/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts b/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts index e109b5339e728..44a36be34d1ab 100644 --- a/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts +++ b/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts @@ -11,6 +11,8 @@ import { DataView, DataViewField, DataViewType } from '@kbn/data-views-plugin/co import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { renderHook } from '@testing-library/react-hooks'; import { act } from 'react-test-renderer'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; +import { convertDatatableColumnToDataViewFieldSpec } from '@kbn/data-view-utils'; import { UnifiedHistogramFetchStatus, UnifiedHistogramSuggestionContext } from '../../types'; import { dataViewMock } from '../../__mocks__/data_view'; import { dataViewWithTimefieldMock } from '../../__mocks__/data_view_with_timefield'; @@ -60,6 +62,7 @@ describe('useStateProps', () => { query: { language: 'kuery', query: '' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); expect(result.current).toMatchInlineSnapshot(` @@ -150,11 +153,14 @@ describe('useStateProps', () => { query: { esql: 'FROM index' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); expect(result.current).toMatchInlineSnapshot(` Object { - "breakdown": undefined, + "breakdown": Object { + "field": undefined, + }, "chart": Object { "hidden": false, "timeInterval": "auto", @@ -220,9 +226,13 @@ describe('useStateProps', () => { }, } `); + + expect(result.current.chart).toStrictEqual({ hidden: false, timeInterval: 'auto' }); + expect(result.current.breakdown).toStrictEqual({ field: undefined }); + expect(result.current.isPlainRecord).toBe(true); }); - it('should return the correct props when a text based language is used', () => { + it('should return the correct props when an ES|QL query is used with transformational commands', () => { const stateService = getStateService({ initialState: { ...initialState, @@ -233,9 +243,10 @@ describe('useStateProps', () => { useStateProps({ stateService, dataView: dataViewWithTimefieldMock, - query: { esql: 'FROM index' }, + query: { esql: 'FROM index | keep field1' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); expect(result.current.chart).toStrictEqual({ hidden: false, timeInterval: 'auto' }); @@ -243,6 +254,82 @@ describe('useStateProps', () => { expect(result.current.isPlainRecord).toBe(true); }); + it('should return the correct props when an ES|QL query is used with breakdown field', () => { + const breakdownField = 'extension'; + const esqlColumns = [ + { + name: 'bytes', + meta: { type: 'number' }, + id: 'bytes', + }, + { + name: 'extension', + meta: { type: 'string' }, + id: 'extension', + }, + ] as DatatableColumn[]; + const stateService = getStateService({ + initialState: { + ...initialState, + currentSuggestionContext: undefined, + breakdownField, + }, + }); + const { result } = renderHook(() => + useStateProps({ + stateService, + dataView: dataViewWithTimefieldMock, + query: { esql: 'FROM index' }, + requestAdapter: new RequestAdapter(), + searchSessionId: '123', + columns: esqlColumns, + }) + ); + + const breakdownColumn = esqlColumns.find((c) => c.name === breakdownField)!; + const selectedField = new DataViewField( + convertDatatableColumnToDataViewFieldSpec(breakdownColumn) + ); + expect(result.current.breakdown).toStrictEqual({ field: selectedField }); + }); + + it('should call the setBreakdown cb when an ES|QL query is used', () => { + const breakdownField = 'extension'; + const esqlColumns = [ + { + name: 'bytes', + meta: { type: 'number' }, + id: 'bytes', + }, + { + name: 'extension', + meta: { type: 'string' }, + id: 'extension', + }, + ] as DatatableColumn[]; + const stateService = getStateService({ + initialState: { + ...initialState, + currentSuggestionContext: undefined, + }, + }); + const { result } = renderHook(() => + useStateProps({ + stateService, + dataView: dataViewWithTimefieldMock, + query: { esql: 'FROM index' }, + requestAdapter: new RequestAdapter(), + searchSessionId: '123', + columns: esqlColumns, + }) + ); + const { onBreakdownFieldChange } = result.current; + act(() => { + onBreakdownFieldChange({ name: breakdownField } as DataViewField); + }); + expect(stateService.setBreakdownField).toHaveBeenLastCalledWith(breakdownField); + }); + it('should return the correct props when a rollup data view is used', () => { const stateService = getStateService({ initialState }); const { result } = renderHook(() => @@ -255,6 +342,7 @@ describe('useStateProps', () => { query: { language: 'kuery', query: '' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); expect(result.current).toMatchInlineSnapshot(` @@ -333,6 +421,7 @@ describe('useStateProps', () => { query: { language: 'kuery', query: '' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); expect(result.current).toMatchInlineSnapshot(` @@ -411,6 +500,7 @@ describe('useStateProps', () => { query: { language: 'kuery', query: '' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); const { @@ -470,6 +560,7 @@ describe('useStateProps', () => { query: { language: 'kuery', query: '' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }) ); (stateService.setLensRequestAdapter as jest.Mock).mockClear(); @@ -489,6 +580,7 @@ describe('useStateProps', () => { query: { language: 'kuery', query: '' }, requestAdapter: new RequestAdapter(), searchSessionId: '123', + columns: undefined, }; const hook = renderHook((props: Parameters[0]) => useStateProps(props), { initialProps, diff --git a/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts b/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts index bb0e4acc81740..fcc19fcd78a00 100644 --- a/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts +++ b/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts @@ -9,7 +9,10 @@ import { DataView, DataViewField, DataViewType } from '@kbn/data-views-plugin/common'; import { AggregateQuery, isOfAggregateQueryType, Query } from '@kbn/es-query'; +import { hasTransformationalCommand } from '@kbn/esql-utils'; import type { RequestAdapter } from '@kbn/inspector-plugin/public'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; +import { convertDatatableColumnToDataViewFieldSpec } from '@kbn/data-view-utils'; import { useCallback, useEffect, useMemo } from 'react'; import { UnifiedHistogramChartLoadEvent, @@ -34,12 +37,14 @@ export const useStateProps = ({ query, searchSessionId, requestAdapter, + columns, }: { stateService: UnifiedHistogramStateService | undefined; dataView: DataView; query: Query | AggregateQuery | undefined; searchSessionId: string | undefined; requestAdapter: RequestAdapter | undefined; + columns: DatatableColumn[] | undefined; }) => { const breakdownField = useStateSelector(stateService?.state$, breakdownFieldSelector); const chartHidden = useStateSelector(stateService?.state$, chartHiddenSelector); @@ -86,14 +91,29 @@ export const useStateProps = ({ }, [chartHidden, isPlainRecord, isTimeBased, timeInterval]); const breakdown = useMemo(() => { - if (isPlainRecord || !isTimeBased) { + if (!isTimeBased) { return undefined; } + // hide the breakdown field selector when the ES|QL query has a transformational command (STATS, KEEP etc) + if (query && isOfAggregateQueryType(query) && hasTransformationalCommand(query.esql)) { + return undefined; + } + + if (isPlainRecord) { + const breakdownColumn = columns?.find((column) => column.name === breakdownField); + const field = breakdownColumn + ? new DataViewField(convertDatatableColumnToDataViewFieldSpec(breakdownColumn)) + : undefined; + return { + field, + }; + } + return { field: breakdownField ? dataView?.getFieldByName(breakdownField) : undefined, }; - }, [breakdownField, dataView, isPlainRecord, isTimeBased]); + }, [isTimeBased, query, isPlainRecord, breakdownField, dataView, columns]); const request = useMemo(() => { return { diff --git a/src/plugins/unified_histogram/public/layout/layout.tsx b/src/plugins/unified_histogram/public/layout/layout.tsx index aac1cfe308c60..3e34cf4ee69b3 100644 --- a/src/plugins/unified_histogram/public/layout/layout.tsx +++ b/src/plugins/unified_histogram/public/layout/layout.tsx @@ -374,6 +374,7 @@ export const UnifiedHistogramLayout = ({ lensAdapters={lensAdapters} lensEmbeddableOutput$={lensEmbeddableOutput$} withDefaultActions={withDefaultActions} + columns={columns} /> diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts index f4128146c9f34..28819f7a5c54b 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts @@ -8,6 +8,7 @@ */ import type { AggregateQuery, Query } from '@kbn/es-query'; +import { DataViewField } from '@kbn/data-views-plugin/common'; import { deepMockedFields, buildDataViewMock } from '@kbn/discover-utils/src/__mocks__'; import { allSuggestionsMock } from '../__mocks__/suggestions'; import { getLensVisMock } from '../__mocks__/lens_vis'; @@ -195,4 +196,55 @@ describe('LensVisService suggestions', () => { expect(lensVis.currentSuggestionContext?.type).toBe(UnifiedHistogramSuggestionType.unsupported); expect(lensVis.currentSuggestionContext?.suggestion).not.toBeDefined(); }); + + test('should return histogramSuggestion if no suggestions returned by the api with the breakdown field if it is given', async () => { + const lensVis = await getLensVisMock({ + filters: [], + query: { esql: 'from the-data-view | limit 100' }, + dataView: dataViewMock, + timeInterval: 'auto', + timeRange: { + from: '2023-09-03T08:00:00.000Z', + to: '2023-09-04T08:56:28.274Z', + }, + breakdownField: { name: 'var0' } as DataViewField, + columns: [ + { + id: 'var0', + name: 'var0', + meta: { + type: 'number', + }, + }, + ], + isPlainRecord: true, + allSuggestions: [], + hasHistogramSuggestionForESQL: true, + }); + + expect(lensVis.currentSuggestionContext?.type).toBe( + UnifiedHistogramSuggestionType.histogramForESQL + ); + expect(lensVis.currentSuggestionContext?.suggestion).toBeDefined(); + expect(lensVis.currentSuggestionContext?.suggestion?.visualizationState).toHaveProperty( + 'layers', + [ + { + layerId: '662552df-2cdc-4539-bf3b-73b9f827252c', + seriesType: 'bar_stacked', + xAccessor: '@timestamp every 30 second', + accessors: ['results'], + layerType: 'data', + splitAccessor: 'var0', + }, + ] + ); + + const histogramQuery = { + esql: `from the-data-view | limit 100 +| EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats results = count(*) by timestamp, \`var0\` | sort \`var0\` asc | rename timestamp as \`@timestamp every 30 minute\``, + }; + + expect(lensVis.visContext?.attributes.state.query).toStrictEqual(histogramQuery); + }); }); diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.ts index caadc3506ccbe..eccfd663b2557 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.ts @@ -245,7 +245,10 @@ export class LensVisService { if (queryParams.isPlainRecord) { // appends an ES|QL histogram - const histogramSuggestionForESQL = this.getHistogramSuggestionForESQL({ queryParams }); + const histogramSuggestionForESQL = this.getHistogramSuggestionForESQL({ + queryParams, + breakdownField, + }); if (histogramSuggestionForESQL) { availableSuggestionsWithType.push({ suggestion: histogramSuggestionForESQL, @@ -452,16 +455,27 @@ export class LensVisService { private getHistogramSuggestionForESQL = ({ queryParams, + breakdownField, }: { queryParams: QueryParams; + breakdownField?: DataViewField; }): Suggestion | undefined => { - const { dataView, query, timeRange } = queryParams; + const { dataView, query, timeRange, columns } = queryParams; + const breakdownColumn = breakdownField?.name + ? columns?.find((column) => column.name === breakdownField.name) + : undefined; if (dataView.isTimeBased() && query && isOfAggregateQueryType(query) && timeRange) { const isOnHistogramMode = shouldDisplayHistogram(query); if (!isOnHistogramMode) return undefined; const interval = computeInterval(timeRange, this.services.data); - const esqlQuery = this.getESQLHistogramQuery({ dataView, query, timeRange, interval }); + const esqlQuery = this.getESQLHistogramQuery({ + dataView, + query, + timeRange, + interval, + breakdownColumn, + }); const context = { dataViewSpec: dataView?.toSpec(), fieldName: '', @@ -485,9 +499,38 @@ export class LensVisService { esql: esqlQuery, }, }; + + if (breakdownColumn) { + context.textBasedColumns.push(breakdownColumn); + } const suggestions = this.lensSuggestionsApi(context, dataView, ['lnsDatatable']) ?? []; if (suggestions.length) { - return suggestions[0]; + const suggestion = suggestions[0]; + const suggestionVisualizationState = Object.assign({}, suggestion?.visualizationState); + // the suggestions api will suggest a numeric column as a metric and not as a breakdown, + // so we need to adjust it here + if ( + breakdownColumn && + breakdownColumn.meta?.type === 'number' && + suggestion && + 'layers' in suggestionVisualizationState && + Array.isArray(suggestionVisualizationState.layers) + ) { + return { + ...suggestion, + visualizationState: { + ...(suggestionVisualizationState ?? {}), + layers: suggestionVisualizationState.layers.map((layer) => { + return { + ...layer, + accessors: ['results'], + splitAccessor: breakdownColumn.name, + }; + }), + }, + }; + } + return suggestion; } } @@ -499,18 +542,23 @@ export class LensVisService { timeRange, query, interval, + breakdownColumn, }: { dataView: DataView; timeRange: TimeRange; query: AggregateQuery; interval?: string; + breakdownColumn?: DatatableColumn; }): string => { const queryInterval = interval ?? computeInterval(timeRange, this.services.data); const language = getAggregateQueryMode(query); const safeQuery = removeDropCommandsFromESQLQuery(query[language]); + const breakdown = breakdownColumn + ? `, \`${breakdownColumn.name}\` | sort \`${breakdownColumn.name}\` asc` + : ''; return appendToESQLQuery( safeQuery, - `| EVAL timestamp=DATE_TRUNC(${queryInterval}, ${dataView.timeFieldName}) | stats results = count(*) by timestamp | rename timestamp as \`${dataView.timeFieldName} every ${queryInterval}\`` + `| EVAL timestamp=DATE_TRUNC(${queryInterval}, ${dataView.timeFieldName}) | stats results = count(*) by timestamp${breakdown} | rename timestamp as \`${dataView.timeFieldName} every ${queryInterval}\`` ); }; @@ -548,7 +596,7 @@ export class LensVisService { externalVisContextStatus: UnifiedHistogramExternalVisContextStatus; visContext: UnifiedHistogramVisContext | undefined; } => { - const { dataView, query, filters, timeRange } = queryParams; + const { dataView, query, filters, timeRange, columns } = queryParams; const { type: suggestionType, suggestion } = currentSuggestionContext; if (!suggestion || !suggestion.datasourceId || !query || !filters) { @@ -563,13 +611,20 @@ export class LensVisService { dataViewId: dataView.id, timeField: dataView.timeFieldName, timeInterval: isTextBased ? undefined : timeInterval, - breakdownField: isTextBased ? undefined : breakdownField?.name, + breakdownField: breakdownField?.name, }; const currentQuery = suggestionType === UnifiedHistogramSuggestionType.histogramForESQL && isTextBased && timeRange ? { - esql: this.getESQLHistogramQuery({ dataView, query, timeRange }), + esql: this.getESQLHistogramQuery({ + dataView, + query, + timeRange, + breakdownColumn: breakdownField?.name + ? columns?.find((column) => column.name === breakdownField.name) + : undefined, + }), } : query; diff --git a/src/plugins/unified_histogram/tsconfig.json b/src/plugins/unified_histogram/tsconfig.json index 2f54a5d33797a..d14adf53889b9 100644 --- a/src/plugins/unified_histogram/tsconfig.json +++ b/src/plugins/unified_histogram/tsconfig.json @@ -33,6 +33,7 @@ "@kbn/discover-utils", "@kbn/visualization-utils", "@kbn/search-types", + "@kbn/data-view-utils", ], "exclude": [ "target/**/*", diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index 01660925db799..760827816db96 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -675,5 +675,63 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); }); + + describe('histogram breakdown', () => { + before(async () => { + await common.navigateToApp('discover'); + await timePicker.setDefaultAbsoluteRange(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + }); + + it('should choose breakdown field', async () => { + await discover.selectTextBaseLang(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + const testQuery = 'from logstash-*'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + await discover.chooseBreakdownField('extension'); + await header.waitUntilLoadingHasFinished(); + const list = await discover.getHistogramLegendList(); + expect(list).to.eql(['css', 'gif', 'jpg', 'php', 'png']); + }); + + it('should add filter using histogram legend values', async () => { + await discover.clickLegendFilter('png', '+'); + await header.waitUntilLoadingHasFinished(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.waitUntilSidebarHasLoaded(); + + const editorValue = await monacoEditor.getCodeEditorValue(); + expect(editorValue).to.eql(`from logstash-*\n| WHERE \`extension\`=="png"`); + }); + + it('should save breakdown field in saved search', async () => { + // revert the filter + const testQuery = 'from logstash-*'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + + await discover.saveSearch('esql view with breakdown'); + + await discover.clickNewSearchButton(); + await header.waitUntilLoadingHasFinished(); + const prevList = await discover.getHistogramLegendList(); + expect(prevList).to.eql([]); + + await discover.loadSavedSearch('esql view with breakdown'); + await header.waitUntilLoadingHasFinished(); + const list = await discover.getHistogramLegendList(); + expect(list).to.eql(['css', 'gif', 'jpg', 'php', 'png']); + }); + }); }); } diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index b5907a97bb5ab..1bd6f8099fd22 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -56,7 +56,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await discover.getHitCount()).to.be(totalCount); } - async function checkESQLHistogramVis(timespan: string, totalCount: string) { + async function checkESQLHistogramVis( + timespan: string, + totalCount: string, + hasTransformationalCommand = false + ) { await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); @@ -64,7 +68,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.existOrFail('unifiedHistogramSaveVisualization'); await testSubjects.existOrFail('unifiedHistogramEditFlyoutVisualization'); await testSubjects.missingOrFail('unifiedHistogramEditVisualization'); - await testSubjects.missingOrFail('unifiedHistogramBreakdownSelectorButton'); + if (hasTransformationalCommand) { + await testSubjects.missingOrFail('unifiedHistogramBreakdownSelectorButton'); + } else { + await testSubjects.existOrFail('unifiedHistogramBreakdownSelectorButton'); + } await testSubjects.missingOrFail('unifiedHistogramTimeIntervalSelectorButton'); expect(await discover.getChartTimespan()).to.be(timespan); expect(await discover.getHitCount()).to.be(totalCount); @@ -310,7 +318,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - await checkESQLHistogramVis(defaultTimespanESQL, '5'); + await checkESQLHistogramVis(defaultTimespanESQL, '5', true); await discover.chooseLensSuggestion('pie'); await testSubjects.existOrFail('unsavedChangesBadge'); @@ -359,7 +367,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - await checkESQLHistogramVis(defaultTimespanESQL, '5'); + await checkESQLHistogramVis(defaultTimespanESQL, '5', true); await discover.chooseLensSuggestion('pie'); await testSubjects.existOrFail('unsavedChangesBadge'); @@ -412,7 +420,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - await checkESQLHistogramVis(defaultTimespanESQL, '5'); + await checkESQLHistogramVis(defaultTimespanESQL, '5', true); await discover.chooseLensSuggestion('pie'); await testSubjects.existOrFail('unsavedChangesBadge'); @@ -456,7 +464,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - await checkESQLHistogramVis(defaultTimespanESQL, '5'); + await checkESQLHistogramVis(defaultTimespanESQL, '5', true); await discover.chooseLensSuggestion('pie'); await discover.saveSearch('testCustomESQLVis'); diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 51bcbb4fed635..2d8dad7571c1a 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -24,6 +24,7 @@ import { getAggregateQueryMode, ExecutionContextSearch, getLanguageDisplayName, + isOfAggregateQueryType, } from '@kbn/es-query'; import type { PaletteOutput } from '@kbn/coloring'; import { @@ -1406,7 +1407,13 @@ export class Embeddable } else if (isLensTableRowContextMenuClickEvent(event)) { eventHandler = this.input.onTableRowClick; } - const esqlQuery = this.isTextBasedLanguage() ? this.savedVis?.state.query : undefined; + // if the embeddable is located in an app where there is the Unified search bar with the ES|QL editor, then use this query + // otherwise use the query from the saved object + let esqlQuery: AggregateQuery | Query | undefined; + if (this.isTextBasedLanguage()) { + const query = this.deps.data.query.queryString.getQuery(); + esqlQuery = isOfAggregateQueryType(query) ? query : this.savedVis?.state.query; + } eventHandler?.({ ...event.data, From bdd57b64fe19683c481f673d6f1571f91379e730 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 1 Oct 2024 11:40:11 +0200 Subject: [PATCH 055/107] [React@18] Upgrade @types to React 18 (#194144) ## Summary Part of https://github.com/elastic/kibana/issues/138222 This PR finilizes the breaking type fixes that are needed for upgrade to React@18. Most of the remaining issues are muted with "@ts-expect-error" are tricky or could be runtime bugs that need to be looked at. **Since the types changes are backward compatible (except the new APIs) we can upgrade to @types/react@18 now so that we "save" the progress and all the code in Kibana from now on is written in compatbile for react@18 way from types perspective.** --- package.json | 8 +++--- .../src/toasts/global_toast_list.tsx | 1 - .../core-overlays-browser/src/flyout.ts | 5 +++- packages/kbn-eslint-config/.eslintrc.js | 7 +++++ packages/kbn-esql-editor/src/esql_editor.tsx | 4 +-- .../src/components/resizable_container.tsx | 4 +-- .../src/components/as_flyout/index.tsx | 6 +++-- .../src/components/as_inline/index.tsx | 6 +++-- .../field_row/description/description.tsx | 1 - .../custom_toolbar/render_custom_toolbar.tsx | 9 ++----- .../src/components/data_table.test.tsx | 4 +-- .../components/heatmap_component.test.tsx | 2 +- .../public/components/metric_vis.test.tsx | 2 ++ .../partition_vis_component.test.tsx | 2 +- .../data_types/logs/service_name_cell.tsx | 2 +- .../use_additional_cell_actions.test.tsx | 2 +- .../fields/card_radio_group_field.tsx | 4 +-- .../floating_actions/floating_actions.tsx | 3 +-- .../public/context_menu/open_context_menu.tsx | 1 + .../document_entry_editor.tsx | 5 ++-- .../index.tsx | 8 +++--- .../index_entry_editor.tsx | 14 ++++++---- .../use_knowledge_base_table.tsx | 10 +++++-- .../renderers/host/with_expandable_flyout.tsx | 2 +- .../workpad/hooks/use_refresh_helper.test.tsx | 1 + .../public/routes/workpad/workpad_route.tsx | 2 ++ .../analytics_collection_explorer_table.tsx | 3 +++ .../analytics_collection_overview_table.tsx | 3 +++ .../connector_detail/connector_detail.tsx | 4 ++- .../ml_inference/pipeline_select_option.tsx | 1 + .../hooks/use_fetch_agents_data.tsx | 1 + .../default_to_data_nodes_notice.tsx | 5 +++- .../components/no_tiers_nodes_notice.tsx | 5 +++- .../components/will_fallback_nodes_notice.tsx | 7 ++++- .../searchable_snapshot_field.tsx | 1 + .../definitions/terms/terms.test.tsx | 3 +++ .../alert_actions.tsx | 5 +++- .../custom_hooks/use_create_ad_links.ts | 3 ++- .../waterfall/accordion_waterfall.tsx | 1 + .../shared/links/elastic_docs_link.tsx | 1 + .../apm/public/plugin.ts | 3 +++ .../page_template/page_template.tsx | 12 ++++++--- .../common/links/step_details_link.tsx | 1 + ...managed_policy_create_import_extension.tsx | 2 +- .../components/indices/details_page.tsx | 2 +- .../components/indices/indices_router.tsx | 7 ++++- .../components/start/elasticsearch_start.tsx | 2 +- .../analyzer_panels/index.tsx | 3 ++- .../view/components/blocklist_form.tsx | 12 ++++++--- .../public/upselling/register_upsellings.tsx | 1 + .../process_tree_alerts_filter/index.tsx | 2 +- .../edit_space_content_tab.test.tsx | 2 +- .../edit_space_general_tab.test.tsx | 2 +- .../edit_space/edit_space_roles_tab.test.tsx | 2 +- yarn.lock | 27 +++++++++---------- 55 files changed, 157 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index aadda3070ecc6..5446bea2c12b2 100644 --- a/package.json +++ b/package.json @@ -90,11 +90,12 @@ "**/hoist-non-react-statics": "^3.3.2", "**/isomorphic-fetch/node-fetch": "^2.6.7", "**/langchain": "^0.2.11", - "**/react-intl/**/@types/react": "^17.0.45", "**/remark-parse/trim": "1.0.1", "**/sharp": "0.32.6", "**/typescript": "5.1.6", "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.cd77847.0", + "@types/react": "~18.2.0", + "@types/react-dom": "~18.2.0", "globby/fast-glob": "^3.2.11" }, "dependencies": { @@ -1607,8 +1608,8 @@ "@types/pngjs": "^3.4.0", "@types/prop-types": "^15.7.5", "@types/rbush": "^3.0.0", - "@types/react": "^17.0.45", - "@types/react-dom": "^17.0.17", + "@types/react": "~18.2.0", + "@types/react-dom": "~18.2.0", "@types/react-grid-layout": "^1.3.2", "@types/react-is": "^17.0.3", "@types/react-recompose": "^0.33.4", @@ -1622,6 +1623,7 @@ "@types/react-window-infinite-loader": "^1.0.9", "@types/redux-actions": "^2.6.1", "@types/resolve": "^1.20.1", + "@types/scheduler": "^0.23.0", "@types/seedrandom": ">=2.0.0 <4.0.0", "@types/selenium-webdriver": "^4.1.26", "@types/semver": "^7.5.8", diff --git a/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx index 14339d0d6e9e8..572145c5c8807 100644 --- a/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/global_toast_list.tsx @@ -31,7 +31,6 @@ interface State { const convertToEui = (toast: ToastWithRichTitle): EuiToast => ({ ...toast, - // @ts-expect-error upgrade typescript v5.1.6 title: toast.title instanceof Function ? : toast.title, text: toast.text instanceof Function ? : toast.text, }); diff --git a/packages/core/overlays/core-overlays-browser/src/flyout.ts b/packages/core/overlays/core-overlays-browser/src/flyout.ts index 6285e90b264c9..68e04de6f6318 100644 --- a/packages/core/overlays/core-overlays-browser/src/flyout.ts +++ b/packages/core/overlays/core-overlays-browser/src/flyout.ts @@ -30,7 +30,10 @@ export interface OverlayFlyoutStart { /** * @public */ -export type OverlayFlyoutOpenOptions = Omit & { +export type OverlayFlyoutOpenOptions = Omit< + EuiFlyoutProps | EuiFlyoutResizableProps, + 'onClose' | 'onResize' +> & { /** * EuiFlyout onClose handler. * If provided the consumer is responsible for calling flyout.close() to close the flyout; diff --git a/packages/kbn-eslint-config/.eslintrc.js b/packages/kbn-eslint-config/.eslintrc.js index 205e5b182e215..f241131cd6273 100644 --- a/packages/kbn-eslint-config/.eslintrc.js +++ b/packages/kbn-eslint-config/.eslintrc.js @@ -171,6 +171,13 @@ module.exports = { from: 'rison-node', to: '@kbn/rison', }, + { + from: 'react-dom/client', + to: 'react-dom', + exact: true, + disallowedMessage: + 'Use `react-dom` instead of `react-dom/client` until upgraded to React 18', + }, ], ], diff --git a/packages/kbn-esql-editor/src/esql_editor.tsx b/packages/kbn-esql-editor/src/esql_editor.tsx index 244abba93a5f9..abdaa577c4bea 100644 --- a/packages/kbn-esql-editor/src/esql_editor.tsx +++ b/packages/kbn-esql-editor/src/esql_editor.tsx @@ -251,7 +251,7 @@ export const ESQLEditor = memo(function ESQLEditor({ const editor1 = useRef(); const containerRef = useRef(null); - const onMouseDownResize = useCallback( + const onMouseDownResize = useCallback( ( mouseDownEvent, firstPanelHeight, @@ -270,7 +270,7 @@ export const ESQLEditor = memo(function ESQLEditor({ [] ); - const onKeyDownResize = useCallback( + const onKeyDownResize = useCallback( ( keyDownEvent, firstPanelHeight, diff --git a/packages/kbn-expandable-flyout/src/components/resizable_container.tsx b/packages/kbn-expandable-flyout/src/components/resizable_container.tsx index c7da40167a7fd..d5e8f2c1b0801 100644 --- a/packages/kbn-expandable-flyout/src/components/resizable_container.tsx +++ b/packages/kbn-expandable-flyout/src/components/resizable_container.tsx @@ -66,10 +66,10 @@ export const ResizableContainer: React.FC = memo( ); const onWidthChange = useCallback( - (newSizes) => + (newSizes: { [key: string]: number }) => dispatch( changeUserSectionWidthsAction({ - ...newSizes, + ...(newSizes as { left: number; right: number }), savedToLocalStorage: true, }) ), diff --git a/packages/kbn-language-documentation/src/components/as_flyout/index.tsx b/packages/kbn-language-documentation/src/components/as_flyout/index.tsx index da6ff14134e1b..1c34a49b5ddde 100644 --- a/packages/kbn-language-documentation/src/components/as_flyout/index.tsx +++ b/packages/kbn-language-documentation/src/components/as_flyout/index.tsx @@ -6,7 +6,7 @@ * 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 React, { useCallback, useEffect, useState, useRef, useMemo } from 'react'; +import React, { useCallback, useEffect, useState, useRef, useMemo, ComponentProps } from 'react'; import { EuiFlyout, useEuiTheme, @@ -45,7 +45,9 @@ function DocumentationFlyout({ const scrollTargets = useRef>({}); - const onNavigationChange = useCallback((selectedOptions) => { + const onNavigationChange = useCallback< + NonNullable>['onNavigationChange'] + >((selectedOptions) => { setSelectedSection(selectedOptions.length ? selectedOptions[0].label : undefined); if (selectedOptions.length) { const scrollToElement = scrollTargets.current[selectedOptions[0].label]; diff --git a/packages/kbn-language-documentation/src/components/as_inline/index.tsx b/packages/kbn-language-documentation/src/components/as_inline/index.tsx index 81ffef285d17d..783ab2ac356dc 100644 --- a/packages/kbn-language-documentation/src/components/as_inline/index.tsx +++ b/packages/kbn-language-documentation/src/components/as_inline/index.tsx @@ -6,7 +6,7 @@ * 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 React, { useCallback, useState, useRef, useMemo, useEffect } from 'react'; +import React, { useCallback, useState, useRef, useMemo, useEffect, ComponentProps } from 'react'; import { css } from '@emotion/react'; import { useEuiTheme, euiScrollBarStyles, EuiSpacer } from '@elastic/eui'; import { getFilteredGroups } from '../../utils/get_filtered_groups'; @@ -43,7 +43,9 @@ function DocumentationInline({ searchInDescription, height }: DocumentationInlin return getFilteredGroups(searchText, searchInDescription, documentationSections, 1); }, [documentationSections, searchText, searchInDescription]); - const onNavigationChange = useCallback((selectedOptions) => { + const onNavigationChange = useCallback< + NonNullable>['onNavigationChange'] + >((selectedOptions) => { setSelectedSection(selectedOptions.length ? selectedOptions[0].label : undefined); if (selectedOptions.length) { const scrollToElement = scrollTargets.current[selectedOptions[0].label]; diff --git a/packages/kbn-management/settings/components/field_row/description/description.tsx b/packages/kbn-management/settings/components/field_row/description/description.tsx index d843d1303a7a5..cced9d3b7acc0 100644 --- a/packages/kbn-management/settings/components/field_row/description/description.tsx +++ b/packages/kbn-management/settings/components/field_row/description/description.tsx @@ -59,7 +59,6 @@ export const FieldDescription = ({ * Justification for dangerouslySetInnerHTML: * Setting description may contain formatting and links to documentation. */ - /* @ts-expect-error upgrade typescript v5.1.6 */ dangerouslySetInnerHTML={{ __html: content || '' }} // eslint-disable-line react/no-danger /> ); diff --git a/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.tsx b/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.tsx index 4785e27ae51b7..d13b8bbc7b03a 100644 --- a/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.tsx +++ b/packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.tsx @@ -8,18 +8,13 @@ */ import React from 'react'; -import { - EuiDataGridCustomToolbarProps, - EuiDataGridToolBarVisibilityOptions, - EuiFlexGroup, - EuiFlexItem, -} from '@elastic/eui'; +import { EuiDataGridCustomToolbarProps, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import './render_custom_toolbar.scss'; export interface UnifiedDataTableRenderCustomToolbarProps { toolbarProps: EuiDataGridCustomToolbarProps; gridProps: { - additionalControls?: EuiDataGridToolBarVisibilityOptions['additionalControls']; + additionalControls?: React.ReactNode; }; } diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index c797701facdcc..13304d4661cc0 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -160,7 +160,7 @@ const renderDataTable = async (props: Partial) => { // to "Can't perform a React state update on an unmounted component." warnings in tests, // so we need to wait for the next animation frame to avoid this await screen.findByTestId('discoverDocTable'); - await act(() => new Promise((resolve) => requestAnimationFrame(() => resolve()))); + await act(() => new Promise((resolve) => requestAnimationFrame(() => resolve(void 0)))); }; async function getComponent(props: UnifiedDataTableProps = getProps()) { @@ -1107,7 +1107,7 @@ describe('UnifiedDataTable', () => { // to "Can't perform a React state update on an unmounted component." warnings in tests, // so we need to wait for the next animation frame to avoid this await screen.findByTestId('unifiedDataTableCompareDocuments'); - await act(() => new Promise((resolve) => requestAnimationFrame(() => resolve()))); + await act(() => new Promise((resolve) => requestAnimationFrame(() => resolve(void 0)))); }; const getFullScreenButton = () => screen.queryByTestId('dataGridFullScreenButton'); diff --git a/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.test.tsx b/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.test.tsx index 0b2efc3b172c1..8192ce766caf8 100644 --- a/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.test.tsx +++ b/src/plugins/chart_expressions/expression_heatmap/public/components/heatmap_component.test.tsx @@ -37,7 +37,7 @@ const actWithTimeout = (action: Function, timer: number = 1) => new Promise((resolve) => setTimeout(async () => { await action(); - resolve(); + resolve(void 0); }, timer) ) ); diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx index a60cad01bc136..fd0892ea12735 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx @@ -561,6 +561,7 @@ describe('MetricVisComponent', function () { componentWithSecondaryDimension .find(Metric) .props() + // @ts-expect-error @types/react@18 - Parameter 'datum' implicitly has an 'any' type. .data?.[0].map((datum) => datum?.extra) ).toMatchInlineSnapshot(` Array [ @@ -602,6 +603,7 @@ describe('MetricVisComponent', function () { componentWithExtraText .find(Metric) .props() + // @ts-expect-error @types/react@18 - Parameter 'datum' implicitly has an 'any' type. .data?.[0].map((datum) => datum?.extra) ).toMatchInlineSnapshot(` Array [ diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.test.tsx b/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.test.tsx index 448eb16051394..7e3c9bc64c0d8 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.test.tsx +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.test.tsx @@ -35,7 +35,7 @@ const actWithTimeout = (action: Function, timer: number = 1) => new Promise((resolve) => setTimeout(async () => { await action(); - resolve(); + resolve(void 0); }, timer) ) ); diff --git a/src/plugins/discover/public/components/data_types/logs/service_name_cell.tsx b/src/plugins/discover/public/components/data_types/logs/service_name_cell.tsx index e70c3dae4c2af..39d112de5258e 100644 --- a/src/plugins/discover/public/components/data_types/logs/service_name_cell.tsx +++ b/src/plugins/discover/public/components/data_types/logs/service_name_cell.tsx @@ -20,7 +20,7 @@ const AgentIcon = dynamic(() => import('@kbn/custom-icons/src/components/agent_i export const getServiceNameCell = (serviceNameField: string) => (props: DataGridCellValueElementProps) => { - const serviceNameValue = getFieldValue(props.row, serviceNameField); + const serviceNameValue = getFieldValue(props.row, serviceNameField) as string; const agentName = getFieldValue(props.row, AGENT_NAME_FIELD) as AgentName; if (!serviceNameValue) { diff --git a/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx b/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx index befaaf7718d05..88dffdfa1ce6a 100644 --- a/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx +++ b/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx @@ -67,7 +67,7 @@ jest }); describe('useAdditionalCellActions', () => { - const initialProps: Parameters[0] = { + const initialProps: React.PropsWithChildren[0]> = { dataSource: createEsqlDataSource(), dataView: dataViewWithTimefieldMock, query: { esql: `FROM ${dataViewWithTimefieldMock.getIndexPattern()}` }, diff --git a/src/plugins/es_ui_shared/static/forms/components/fields/card_radio_group_field.tsx b/src/plugins/es_ui_shared/static/forms/components/fields/card_radio_group_field.tsx index ddf308fb5449b..865e6e45a7650 100644 --- a/src/plugins/es_ui_shared/static/forms/components/fields/card_radio_group_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/fields/card_radio_group_field.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import React, { Fragment, ReactChildren } from 'react'; +import React, { Fragment } from 'react'; import { EuiFormRow, EuiSpacer, EuiCheckableCard, useGeneratedHtmlId } from '@elastic/eui'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../hook_form_lib'; @@ -17,7 +17,7 @@ interface Props { options: Array<{ label: string; value: string; - children: ReactChildren; + children: React.ReactNode; 'data-test-subj'?: string; }>; euiFieldProps?: Record; diff --git a/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx b/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx index b9de65d46c32b..8eb9ff4f2cef8 100644 --- a/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx +++ b/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx @@ -56,7 +56,7 @@ export const FloatingActions: FC = ({ trigger: panelHoverTrigger, }; const actions = (await getTriggerCompatibleActions(PANEL_HOVER_TRIGGER, context)) - .filter((action): action is Action & { MenuItem: React.FC } => { + .filter((action): action is Action & { MenuItem: React.FC<{ context: unknown }> } => { return action.MenuItem !== undefined && (disabledActions ?? []).indexOf(action.id) === -1; }) .sort((a, b) => (a.order || 0) - (b.order || 0)); @@ -66,7 +66,6 @@ export const FloatingActions: FC = ({ setFloatingActions( <> {actions.map((action) => - // @ts-expect-error upgrade typescript v5.1.6 React.createElement(action.MenuItem, { key: action.id, context, diff --git a/src/plugins/ui_actions/public/context_menu/open_context_menu.tsx b/src/plugins/ui_actions/public/context_menu/open_context_menu.tsx index c16bd224ed045..ab8a12374a605 100644 --- a/src/plugins/ui_actions/public/context_menu/open_context_menu.tsx +++ b/src/plugins/ui_actions/public/context_menu/open_context_menu.tsx @@ -174,6 +174,7 @@ export function openContextMenu( | undefined' button={container} isOpen={true} closePopover={onClose} 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 850c8b29d063a..016da27d2c051 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 @@ -26,13 +26,14 @@ interface Props { export const DocumentEntryEditor: React.FC = React.memo(({ entry, setEntry }) => { // Name const setName = useCallback( - (e) => setEntry((prevEntry) => ({ ...prevEntry, name: e.target.value })), + (e: React.ChangeEvent) => + setEntry((prevEntry) => ({ ...prevEntry, name: e.target.value })), [setEntry] ); // Sharing const setSharingOptions = useCallback( - (value) => + (value: string) => setEntry((prevEntry) => ({ ...prevEntry, users: value === i18n.SHARING_GLOBAL_OPTION_LABEL ? [] : undefined, 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 d970b76e98bd1..8e551781563f1 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 @@ -50,6 +50,7 @@ import { import { useCreateKnowledgeBaseEntry } from '../../assistant/api/knowledge_base/entries/use_create_knowledge_base_entry'; import { useUpdateKnowledgeBaseEntries } from '../../assistant/api/knowledge_base/entries/use_update_knowledge_base_entries'; import { SETTINGS_UPDATED_TOAST_TITLE } from '../../assistant/settings/translations'; +import { KnowledgeBaseConfig } from '../../assistant/types'; export const KnowledgeBaseSettingsManagement: React.FC = React.memo(() => { const { @@ -68,7 +69,9 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(() => { false // Knowledge Base settings do not require prompts ); - const handleUpdateKnowledgeBaseSettings = useCallback( + const handleUpdateKnowledgeBaseSettings = useCallback< + React.Dispatch> + >( (updatedKnowledgeBase) => { setHasPendingChanges(true); setUpdatedKnowledgeBaseSettings(updatedKnowledgeBase); @@ -148,9 +151,6 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(() => { setSelectedEntry(entry); openFlyout(); }, - onSpaceNameClicked: ({ namespace }: KnowledgeBaseEntryResponse) => { - openFlyout(); - }, isDeleteEnabled: (entry: KnowledgeBaseEntryResponse) => { return !isEsqlSystemEntry(entry); }, 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 97ae01ad2edd4..19f8cfbbc52ba 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 @@ -27,13 +27,14 @@ interface Props { export const IndexEntryEditor: React.FC = React.memo(({ entry, setEntry }) => { // Name const setName = useCallback( - (e) => setEntry((prevEntry) => ({ ...prevEntry, name: e.target.value })), + (e: React.ChangeEvent) => + setEntry((prevEntry) => ({ ...prevEntry, name: e.target.value })), [setEntry] ); // Sharing const setSharingOptions = useCallback( - (value) => + (value: string) => setEntry((prevEntry) => ({ ...prevEntry, users: value === i18n.SHARING_GLOBAL_OPTION_LABEL ? [] : undefined, @@ -96,19 +97,22 @@ export const IndexEntryEditor: React.FC = React.memo(({ entry, setEntry } // Field const setField = useCallback( - (e) => setEntry((prevEntry) => ({ ...prevEntry, field: e.target.value })), + (e: React.ChangeEvent) => + setEntry((prevEntry) => ({ ...prevEntry, field: e.target.value })), [setEntry] ); // Description const setDescription = useCallback( - (e) => setEntry((prevEntry) => ({ ...prevEntry, description: e.target.value })), + (e: React.ChangeEvent) => + setEntry((prevEntry) => ({ ...prevEntry, description: e.target.value })), [setEntry] ); // Query Description const setQueryDescription = useCallback( - (e) => setEntry((prevEntry) => ({ ...prevEntry, queryDescription: e.target.value })), + (e: React.ChangeEvent) => + setEntry((prevEntry) => ({ ...prevEntry, queryDescription: e.target.value })), [setEntry] ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx index db46d55f4e5d6..380e6ffedf3ce 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx @@ -46,6 +46,12 @@ export const useKnowledgeBaseTable = () => { onEntryNameClicked, onDeleteActionClicked, onEditActionClicked, + }: { + isDeleteEnabled: (entry: KnowledgeBaseEntryResponse) => boolean; + isEditEnabled: (entry: KnowledgeBaseEntryResponse) => boolean; + onEntryNameClicked: (entry: KnowledgeBaseEntryResponse) => void; + onDeleteActionClicked: (entry: KnowledgeBaseEntryResponse) => void; + onEditActionClicked: (entry: KnowledgeBaseEntryResponse) => void; }): Array> => { return [ { @@ -55,8 +61,8 @@ export const useKnowledgeBaseTable = () => { }, { name: i18n.COLUMN_NAME, - render: ({ id, name }: KnowledgeBaseEntryResponse) => ( - onEntryNameClicked({ id })}>{name} + render: (entry: KnowledgeBaseEntryResponse) => ( + onEntryNameClicked(entry)}>{entry.name} ), sortable: ({ name }: KnowledgeBaseEntryResponse) => name, width: '30%', diff --git a/x-pack/packages/security-solution/common/src/cells/renderers/host/with_expandable_flyout.tsx b/x-pack/packages/security-solution/common/src/cells/renderers/host/with_expandable_flyout.tsx index f870fd9f7d04e..5e48d85b0384d 100644 --- a/x-pack/packages/security-solution/common/src/cells/renderers/host/with_expandable_flyout.tsx +++ b/x-pack/packages/security-solution/common/src/cells/renderers/host/with_expandable_flyout.tsx @@ -23,7 +23,7 @@ export type HostCellWithFlyoutRendererProps = PropsWithChildren { expect(mockDispatch).not.toHaveBeenCalledWith(refreshAction); state.transient.inFlight = true; + // @ts-expect-error @types/react@18 - Type '() => void' has no properties in common with type '{ children?: ReactNode; }'. rerender(useRefreshHelper); jest.runAllTimers(); diff --git a/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx b/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx index 733a0b2d2b9af..0f6e2349f1e13 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx @@ -33,6 +33,7 @@ export const WorkpadRoute = () => { { return ; }} @@ -82,6 +83,7 @@ export const ExportWorkpadRoute = () => { return ( { return ; }} diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explorer/analytics_collection_explorer_table.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explorer/analytics_collection_explorer_table.tsx index 9666ceb8eac2f..5ac046ef66758 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explorer/analytics_collection_explorer_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explorer/analytics_collection_explorer_table.tsx @@ -162,6 +162,7 @@ const tableSettings: { }, [ExploreTables.Clicked]: { columns: [ + // @ts-expect-error @types/react@18 - Type '(value: string) => React.JSX.Element' is not assignable to type 'ReactNode' { field: ExploreTableColumns.page, name: i18n.translate( @@ -197,6 +198,7 @@ const tableSettings: { }, [ExploreTables.Referrers]: { columns: [ + // @ts-expect-error @types/react@18 - Type '(value: string) => React.JSX.Element' is not assignable to type 'ReactNode' { field: ExploreTableColumns.page, name: i18n.translate( @@ -232,6 +234,7 @@ const tableSettings: { }, [ExploreTables.Locations]: { columns: [ + // @ts-expect-error @types/react@18 - Type '(value: string) => React.JSX.Element' is not assignable to type 'ReactNode' { field: ExploreTableColumns.location, name: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_overview_table.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_overview_table.tsx index 1cf9f91f08db8..21982d1d94a8d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_overview_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_overview/analytics_collection_overview_table.tsx @@ -171,6 +171,7 @@ const tableSettings: { }, [ExploreTables.Clicked]: { columns: [ + // @ts-expect-error Type '(value: string) => React.JSX.Element' is not assignable to type 'ReactNode'. { field: ExploreTableColumns.page, name: i18n.translate( @@ -206,6 +207,7 @@ const tableSettings: { }, [ExploreTables.Referrers]: { columns: [ + // @ts-expect-error Type '(value: string) => React.JSX.Element' is not assignable to type 'ReactNode'. { field: ExploreTableColumns.page, name: i18n.translate( @@ -241,6 +243,7 @@ const tableSettings: { }, [ExploreTables.Locations]: { columns: [ + // @ts-expect-error Type '(value: string, data: LocationsTable) => React.JSX.Element' is not assignable to type 'ReactNode'. { field: ExploreTableColumns.location, name: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx index 62e209d2a5f14..645090ee4b777 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_detail.tsx @@ -10,6 +10,8 @@ import { useParams } from 'react-router-dom'; import { useActions, useValues } from 'kea'; +import type { EuiTabProps } from '@elastic/eui'; + import { i18n } from '@kbn/i18n'; import { generateEncodedPath } from '../../../shared/encode_path_params'; @@ -251,7 +253,7 @@ export const ConnectorDetail: React.FC = () => { wrap: false, }, rightSideItems: getHeaderActions(index, connector), - tabs, + tabs: tabs as Array, }} > {selectedTab?.content || null} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/pipeline_select_option.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/pipeline_select_option.tsx index a458a2d6c2633..ec5a6efa11912 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/pipeline_select_option.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/pipeline_select_option.tsx @@ -32,6 +32,7 @@ export const PipelineSelectOptionDisabled: React.FC<{ disabledReason?: string }> + {/* @ts-expect-error Type 'string | ((commaSeparatedMissingSourceFields: string) => string)' is not assignable to type 'ReactNode' */} {disabledReason ?? EXISTING_PIPELINE_DISABLED_MISSING_SOURCE_FIELDS} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.tsx index 2c9fcfe2b16c6..4ea03518620d9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.tsx @@ -139,6 +139,7 @@ export function useFetchAgentsData() { if (urlParams.kuery !== newVal) { history.replace({ + // @ts-expect-error - kuery can't be undefined search: toUrlParams({ ...urlParams, kuery: newVal === '' ? undefined : newVal }), }); } diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/default_to_data_nodes_notice.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/default_to_data_nodes_notice.tsx index b29ddb75c18cf..59e44f4aaee61 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/default_to_data_nodes_notice.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/default_to_data_nodes_notice.tsx @@ -32,7 +32,10 @@ export const DefaultToDataNodesNotice: FunctionComponent<{ phase: PhaseWithAlloc )}

- {nodeAllocationMigrationGuidance} + { + // @ts-expect-error Type '({ docLinks }: Props) => React.JSX.Element' is not assignable to type 'ReactNode'. + nodeAllocationMigrationGuidance + } ); }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/no_tiers_nodes_notice.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/no_tiers_nodes_notice.tsx index 02dbd1baff25f..23a7ecead25f6 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/no_tiers_nodes_notice.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/no_tiers_nodes_notice.tsx @@ -30,7 +30,10 @@ export const NoTiersAvailableUsingNodeAttributesNotice: FunctionComponent = () = )}

-

{nodeAllocationMigrationGuidance}

+ { + // @ts-expect-error Type '({ docLinks }: Props) => React.JSX.Element' is not assignable to type 'ReactNode'. + nodeAllocationMigrationGuidance + } ); }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/will_fallback_nodes_notice.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/will_fallback_nodes_notice.tsx index 199f1001f4276..33dc2439a1408 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/will_fallback_nodes_notice.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/will_fallback_nodes_notice.tsx @@ -41,7 +41,12 @@ export const WillUseFallbackTierUsingNodeAttributesNotice: FunctionComponent -

{nodeAllocationMigrationGuidance}

+

+ { + // @ts-expect-error Type '({ docLinks }: Props) => React.JSX.Element' is not assignable to type 'ReactNode'. + nodeAllocationMigrationGuidance + } +

); }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/searchable_snapshot_field/searchable_snapshot_field.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/searchable_snapshot_field/searchable_snapshot_field.tsx index e98d1f1c2c55a..83f9afefb3b06 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/searchable_snapshot_field/searchable_snapshot_field.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/searchable_snapshot_field/searchable_snapshot_field.tsx @@ -319,6 +319,7 @@ export const SearchableSnapshotField: FunctionComponent = ({ fieldNotices={renderInfoCallout()} fullWidth > + {/* @ts-expect-error Type '() => React.JSX.Element' is not assignable to type 'string'. */} {isDisabledDueToLicense ?
: renderField} ); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx index 3cc6da91d8755..aa7c75b15d022 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/terms/terms.test.tsx @@ -2284,6 +2284,7 @@ describe('terms', () => { expect(select.prop('value')).toEqual('alphabetical'); + // @ts-expect-error @types/react@18 - Parameter 'option' implicitly has an 'any' type. expect(select.prop('options')!.map((option) => option.value)).toEqual([ 'column$$$col2', 'alphabetical', @@ -2311,6 +2312,7 @@ describe('terms', () => { expect(select.prop('value')).toEqual('alphabetical'); + // @ts-expect-error @types/react@18 - Parameter 'option' implicitly has an 'any' type. expect(select.prop('options')!.map((option) => option.value)).toEqual([ 'column$$$col2', 'alphabetical', @@ -2372,6 +2374,7 @@ describe('terms', () => { const selection = instance.find(EuiButtonGroup); expect(selection.prop('idSelected')).toContain('asc'); + // @ts-expect-error @types/react@18 - Parameter 'option' implicitly has an 'any' type. expect(selection.prop('options').map((option) => option.value)).toEqual(['asc', 'desc']); }); diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx index 91ab60d47263f..82c39ac0d8013 100644 --- a/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_alerts_table/alert_actions.tsx @@ -123,9 +123,12 @@ export function AlertActions(props: AlertActionsProps) { , ] : []), - DefaultAlertActions, ]; + if (DefaultAlertActions) { + actionsMenuItems.push(DefaultAlertActions); + } + const actionsToolTip = actionsMenuItems.length <= 0 ? i18n.translate('xpack.ml.alertsTable.notEnoughPermissions', { diff --git a/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts b/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts index c2534eb66cbec..64693e3515c1f 100644 --- a/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts +++ b/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts @@ -12,6 +12,7 @@ import { ANOMALY_DETECTION_ENABLE_TIME_RANGE, } from '../../../../common/constants/settings'; import { createResultsUrlForJobs } from '../../util/results_url'; +import type { MlSummaryJob } from '../../../../common'; export const useCreateADLinks = () => { const { @@ -23,7 +24,7 @@ export const useCreateADLinks = () => { const useUserTimeSettings = useUiSettings().get(ANOMALY_DETECTION_ENABLE_TIME_RANGE); const userTimeSettings = useUiSettings().get(ANOMALY_DETECTION_DEFAULT_TIME_RANGE); const createLinkWithUserDefaults = useCallback( - (location, jobList) => { + (location: string, jobList: MlSummaryJob[]) => { const resultsUrl = createResultsUrlForJobs( jobList, location, diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx index d0197f23d5fd5..a6520f964c7b8 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx @@ -127,6 +127,7 @@ function Waterfall(props: WaterfallProps) { {({ registerChild }) => ( {({ width }) => ( + // @ts-expect-error @types/react@18 Type 'HTMLDivElement' is not assignable to type 'ReactNode'
diff --git a/x-pack/plugins/observability_solution/apm/public/plugin.ts b/x-pack/plugins/observability_solution/apm/public/plugin.ts index f58b9d6d40969..85580d6d866a4 100644 --- a/x-pack/plugins/observability_solution/apm/public/plugin.ts +++ b/x-pack/plugins/observability_solution/apm/public/plugin.ts @@ -293,16 +293,19 @@ export class ApmPlugin implements Plugin { // Registers custom component that is going to be render on fleet section pluginSetupDeps.home?.tutorials.registerCustomComponent( 'TutorialFleetInstructions', + // @ts-expect-error @types/react@18 is not assignable to type 'ReactNode'. Types in registerCustomComponent are incorrect () => import('./tutorial/tutorial_fleet_instructions') ); pluginSetupDeps.home?.tutorials.registerCustomComponent( 'TutorialConfigAgent', + // @ts-expect-error @types/react@18 is not assignable to type 'ReactNode'. Types in registerCustomComponent are incorrect () => import('./tutorial/config_agent') ); pluginSetupDeps.home?.tutorials.registerCustomComponent( 'TutorialConfigAgentRumScript', + // @ts-expect-error @types/react@18 is not assignable to type 'ReactNode'. Types in registerCustomComponent are incorrect () => import('./tutorial/config_agent/rum_script') ); diff --git a/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/page_template.tsx b/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/page_template.tsx index f485da7047a50..1c0b70d3e1af0 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/page_template.tsx +++ b/x-pack/plugins/observability_solution/observability_shared/public/components/page_template/page_template.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiSideNavItemType, EuiPageSectionProps, EuiEmptyPromptProps } from '@elastic/eui'; +import { EuiSideNavItemType, EuiPageSectionProps } from '@elastic/eui'; import { _EuiPageBottomBarProps } from '@elastic/eui/src/components/page_template/bottom_bar/page_bottom_bar'; import { i18n } from '@kbn/i18n'; import React, { useMemo } from 'react'; @@ -31,7 +31,13 @@ import { NavNameWithBetaBadge } from './nav_name_with_beta_badge'; export type WrappedPageTemplateProps = Pick< KibanaPageTemplateProps, - 'children' | 'data-test-subj' | 'pageHeader' | 'restrictWidth' | 'isEmptyState' | 'noDataConfig' + | 'children' + | 'data-test-subj' + | 'pageHeader' + | 'restrictWidth' + | 'isEmptyState' + | 'noDataConfig' + | 'paddingSize' > & { showSolutionNav?: boolean; isPageDataLoaded?: boolean; @@ -39,7 +45,7 @@ export type WrappedPageTemplateProps = Pick< bottomBar?: React.ReactNode; bottomBarProps?: _EuiPageBottomBarProps; topSearchBar?: React.ReactNode; -} & Pick; +}; export interface NavigationEntry { // the label of the menu entry, should be translated diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/step_details_link.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/step_details_link.tsx index bd7476a1568f4..a69f1120cc347 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/step_details_link.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/links/step_details_link.tsx @@ -43,6 +43,7 @@ export const StepDetailsLinkIcon = ({ iconType="apmTrace" href={stepDetailsLink} > + {/* @ts-expect-error Type '(stepIndex?: number) => string' is not assignable to type 'ReactNode'.*/} {label ?? VIEW_DETAILS} ); diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx index 50dfe808139dc..66edc1101a48f 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx @@ -193,7 +193,7 @@ export const OsqueryManagedPolicyCreateImportExtension = React.memo< const { isValid, setFieldValue } = configForm; const agentsLinkHref = useCallback( - (policyId) => { + (policyId: string) => { if (!policy?.policy_ids?.length) return '#'; return getUrlForApp(PLUGIN_ID, { diff --git a/x-pack/plugins/search_indices/public/components/indices/details_page.tsx b/x-pack/plugins/search_indices/public/components/indices/details_page.tsx index ce44bffb045ca..d7a359f56a6f4 100644 --- a/x-pack/plugins/search_indices/public/components/indices/details_page.tsx +++ b/x-pack/plugins/search_indices/public/components/indices/details_page.tsx @@ -93,7 +93,7 @@ export const SearchIndexDetailsPage = () => { }, [detailsPageTabs, tabId]); const handleTabClick = useCallback( - (tab) => { + (tab: EuiTabbedContentTab) => { history.push(`index_details/${indexName}/${tab.id}`); }, diff --git a/x-pack/plugins/search_indices/public/components/indices/indices_router.tsx b/x-pack/plugins/search_indices/public/components/indices/indices_router.tsx index f6c931d73a99e..51527a7d2ef8e 100644 --- a/x-pack/plugins/search_indices/public/components/indices/indices_router.tsx +++ b/x-pack/plugins/search_indices/public/components/indices/indices_router.tsx @@ -29,7 +29,12 @@ export const SearchIndicesRouter: React.FC = () => { /> - application.navigateToApp('elasticsearchStart')} /> + { + application.navigateToApp('elasticsearchStart'); + return null; + }} + /> ); diff --git a/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx b/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx index 8d6e85bfc900a..429af48bac332 100644 --- a/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx +++ b/x-pack/plugins/search_indices/public/components/start/elasticsearch_start.tsx @@ -79,7 +79,7 @@ export const ElasticsearchStart = ({ userPrivileges }: ElasticsearchStartProps) }, [cloud, http]); const onChangeView = useCallback( - (id) => { + (id: string) => { switch (id) { case CreateIndexView.UI: usageTracker.click(AnalyticsEvents.startPageShowCreateIndexUIClick); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/analyzer_panels/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/analyzer_panels/index.tsx index 379ee6cafbd60..ff1e0cd73e7a3 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/analyzer_panels/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/analyzer_panels/index.tsx @@ -11,6 +11,7 @@ import { FlyoutBody } from '@kbn/security-solution-common'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import type { DocumentDetailsAnalyzerPanelKey } from '../shared/constants/panel_keys'; import { DetailsPanel } from '../../../resolver/view/details_panel'; +import type { NodeEventOnClick } from '../../../resolver/view/panels/node_events_of_type'; import { DocumentDetailsPreviewPanelKey } from '../shared/constants/panel_keys'; import { ALERT_PREVIEW_BANNER } from '../preview/constants'; @@ -32,7 +33,7 @@ export interface AnalyzerPanelExpandableFlyoutProps extends FlyoutPanelProps { export const AnalyzerPanel: React.FC = ({ resolverComponentInstanceID }) => { const { openPreviewPanel } = useExpandableFlyoutApi(); - const openPreview = useCallback( + const openPreview = useCallback( ({ documentId, indexName, scopeId }) => () => { openPreviewPanel({ diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx index d4640aed42c11..2163a0f156833 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx @@ -30,7 +30,10 @@ import { uniq } from 'lodash'; import { ListOperatorEnum, ListOperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; import { OS_TITLES } from '../../../../common/translations'; -import type { ArtifactFormComponentProps } from '../../../../components/artifact_list_page'; +import type { + ArtifactFormComponentOnChangeCallbackProps, + ArtifactFormComponentProps, +} from '../../../../components/artifact_list_page'; import { CONDITIONS_HEADER, CONDITIONS_HEADER_DESCRIPTION, @@ -237,7 +240,7 @@ export const BlockListForm = memo( return selectableFields; }, [selectedOs, getTestId]); - const operatorOptions: Array> = useMemo(() => { + const operatorOptions: Array> = useMemo(() => { return [ { value: isOneOfOperator.type, @@ -423,7 +426,7 @@ export const BlockListForm = memo( ); const handleOperatorUpdate = useCallback( - (newOperator) => { + (newOperator: ListOperatorTypeEnum) => { const nextItem = { ...item, entries: [ @@ -437,7 +440,8 @@ export const BlockListForm = memo( onChange({ isValid: isValid(errorsRef.current), - item: nextItem, + // Type ListOperatorTypeEnum is not assignable to type "wildcard" + item: nextItem as ArtifactFormComponentOnChangeCallbackProps['item'], }); }, [item, blocklistEntry, generateBlocklistEntryValue, onChange] diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx index 851bf6010cb44..d238148dcc0b0 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx +++ b/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx @@ -76,6 +76,7 @@ const configurePluginsUpsellings = (upsellingService: UpsellingService, services const { integrationAssistant } = services; upsellingService.sections$.subscribe((sections) => { + // @ts-expect-error Type 'FunctionComponent<{}>' is not assignable to type 'ReactNode'. integrationAssistant?.renderUpselling(sections.get('integration_assistant')); }); }; diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx index 6f4b2b5570b4d..4474b5266880d 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx @@ -127,7 +127,7 @@ export const ProcessTreeAlertsFilter = ({ defaultMessage="{count, plural, one {Showing # alert} other {Showing # alerts}}" values={{ count: totalAlertsCount, - bold: (str: string) => {str}, + bold: (str) => {str}, }} /> )} diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx index 209f65b9a6783..bb55cea5cd50f 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx @@ -39,7 +39,7 @@ const theme = themeServiceMock.createStartContract(); const i18n = i18nServiceMock.createStartContract(); const logger = loggingSystemMock.createLogger(); -const TestComponent: React.FC = ({ children }) => { +const TestComponent: React.FC = ({ children }) => { return ( { deleteSpaceSpy.mockReset(); }); - const TestComponent: React.FC = ({ children }) => { + const TestComponent: React.FC = ({ children }) => { return ( { const loadRolesSpy = jest.spyOn(spacesManager, 'getRolesForSpace'); const toastErrorSpy = jest.spyOn(notifications.toasts, 'addError'); - const TestComponent: React.FC = ({ children }) => { + const TestComponent: React.FC = ({ children }) => { return ( =2.0.0 <4.0.0": version "2.4.28" From e373e443770399d4b0401b02abc39f794a3ec321 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Tue, 1 Oct 2024 12:18:17 +0200 Subject: [PATCH 056/107] [Security Solution] Fix the feature app list (#191965) ## Summary Fixes https://github.com/elastic/kibana-team/issues/1136 The Kibana feature definition for Security Solution was missing the correct plugin ID registered in the `app` definition. We were still defining the old _"securitySolution"_ app ID in the `app` property, instead of the new _"securitySolutionUI"_ ID. The Security Solution plugin ID change (_"securitySolution"_ -> _"securitySolutionUI"_) was done a long time ago, the inconsistency with the Security feature definition is causing the _Security_ app to still be visible in the global search when the Security feature is disabled: - In the role features Security and Cases disabled - Or in the space features config Captura de pantalla 2024-09-03 a les 15 31 09 This is fixed now: Before: Security app incorrectly enabled After: Security app disabled properly ### Caveat As per this PR changes: https://github.com/elastic/kibana/pull/113573 In the Kibana features of the role, under the Security catalog, both Security and Cases features need to be `none` for the Security Solution plugin to be disabled. Otherwise, we must enable the plugin and make the enabled features available. So, with a role with the following Kibana features: Security disabled cases enabled The Security app needs to be available and display only Cases available: navigation with only cases --------- Co-authored-by: Elastic Machine --- .../security_solution/public/plugin.tsx | 195 ++++++++++-------- 1 file changed, 106 insertions(+), 89 deletions(-) diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index f7c35fbcb99f5..9833414b7a31f 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -17,7 +17,7 @@ import type { PluginInitializerContext, Plugin as IPlugin, } from '@kbn/core/public'; -import { DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; +import { AppStatus, DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import type { TriggersAndActionsUIPublicPluginSetup } from '@kbn/triggers-actions-ui-plugin/public'; import { uiMetricService } from '@kbn/cloud-security-posture-common/utils/ui_metrics'; @@ -208,81 +208,8 @@ export class Plugin implements IPlugin { if (!this._subPlugins) { const { subPluginClasses } = await this.lazySubPlugins(); @@ -317,9 +249,6 @@ export class Plugin implements IPlugin ({ + status: AppStatus.inaccessible, + visibleIn: [], + })); + // no need to register the links updater when the plugin is inaccessible + return; + } + + // Configuration of AppLinks updater registration based on license and capabilities const { appLinks: initialAppLinks, getFilteredLinks, solutionAppLinksSwitcher, } = await this.lazyApplicationLinks(); - const { license$ } = plugins.licensing; - const { upsellingService, isSolutionNavigationEnabled$ } = this.contract; registerDeepLinksUpdater(this.appUpdater$, isSolutionNavigationEnabled$); - const appLinks$ = new Subject(); - appLinks$.next(initialAppLinks); + const appLinksToUpdate$ = new Subject(); + appLinksToUpdate$.next(initialAppLinks); - appLinks$ + appLinksToUpdate$ .pipe(combineLatestWith(license$, isSolutionNavigationEnabled$)) .subscribe(([appLinks, license, isSolutionNavigationEnabled]) => { const links = isSolutionNavigationEnabled ? solutionAppLinksSwitcher(appLinks) : appLinks; const linksPermissions: LinksPermissions = { experimentalFeatures: this.experimentalFeatures, upselling: upsellingService, - capabilities: core.application.capabilities, + capabilities, uiSettingsClient: core.uiSettings, ...(license.type != null && { license }), }; @@ -437,7 +379,82 @@ export class Plugin implements IPlugin Date: Tue, 1 Oct 2024 13:29:31 +0200 Subject: [PATCH 057/107] Update Search Index Document Card design. (#194061) ## Summary https://github.com/user-attachments/assets/552e1198-ba95-45d6-b13b-e1b26060d34c This PR adds an option to add a richer design for Result card. Defaults still stay the same with old design. Screenshot from Index Management. Screenshot 2024-09-27 at 14 52 25 Added a bunch of options to show score, show amount of fields to show when collapsed by default etc. ### 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 - [ ] [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)) - [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) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../components/document_list.tsx | 163 +++++++------ .../components/documents_list.test.tsx | 10 +- .../components/result/index.ts | 6 +- .../components/result/result.tsx | 135 ++++++++--- .../components/result/result_metadata.ts | 32 ++- .../components/result/result_types.ts | 3 + .../components/result/rich_result_header.tsx | 228 ++++++++++++++++++ .../components/search_index/documents.tsx | 2 +- .../index_documents/document_list.tsx | 2 +- .../plugins/search_playground/common/types.ts | 1 + .../public/components/app.tsx | 6 +- .../components/search_mode/empty_results.tsx | 34 --- .../components/search_mode/result_list.tsx | 122 +++------- .../components/search_mode/search_mode.tsx | 6 +- .../public/hooks/use_index_mappings.ts | 45 ++++ .../public/hooks/use_search_preview.ts | 8 +- .../public/utils/pagination_helper.ts | 7 - .../search_playground/server/routes.ts | 43 ++++ .../plugins/search_playground/tsconfig.json | 3 +- .../components/index_documents/documents.tsx | 2 +- 20 files changed, 611 insertions(+), 247 deletions(-) create mode 100644 packages/kbn-search-index-documents/components/result/rich_result_header.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/search_mode/empty_results.tsx create mode 100644 x-pack/plugins/search_playground/public/hooks/use_index_mappings.ts diff --git a/packages/kbn-search-index-documents/components/document_list.tsx b/packages/kbn-search-index-documents/components/document_list.tsx index ec9efe7d6b1d7..5491d228e7d07 100644 --- a/packages/kbn-search-index-documents/components/document_list.tsx +++ b/packages/kbn-search-index-documents/components/document_list.tsx @@ -9,7 +9,7 @@ import React, { useState } from 'react'; -import { MappingProperty, SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import type { IndicesGetMappingResponse, SearchHit } from '@elastic/elasticsearch/lib/api/types'; import { EuiButtonEmpty, @@ -30,18 +30,22 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage, FormattedNumber } from '@kbn/i18n-react'; -import { resultMetaData, resultToField } from './result/result_metadata'; +import { resultMetaData, resultToFieldFromMappingResponse } from './result/result_metadata'; import { Result } from '..'; +import { type ResultProps } from './result/result'; + interface DocumentListProps { dataTelemetryIdPrefix: string; docs: SearchHit[]; docsPerPage: number; isLoading: boolean; - mappings: Record | undefined; + mappings: IndicesGetMappingResponse | undefined; meta: Pagination; onPaginate: (newPageIndex: number) => void; - setDocsPerPage: (docsPerPage: number) => void; + setDocsPerPage?: (docsPerPage: number) => void; + onDocumentClick?: (doc: SearchHit) => void; + resultProps?: Partial; } export const DocumentList: React.FC = ({ @@ -53,6 +57,8 @@ export const DocumentList: React.FC = ({ meta, onPaginate, setDocsPerPage, + onDocumentClick, + resultProps = {}, }) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); @@ -99,7 +105,12 @@ export const DocumentList: React.FC = ({ {docs.map((doc) => { return ( - + onDocumentClick(doc) : undefined} + {...resultProps} + /> ); @@ -116,81 +127,83 @@ export const DocumentList: React.FC = ({ onPageClick={onPaginate} /> - - { - setIsPopoverOpen(true); - }} - > - {i18n.translate('searchIndexDocuments.documentList.pagination.itemsPerPage', { - defaultMessage: 'Documents per page: {docPerPage}', - values: { docPerPage: docsPerPage }, - })} - - } - isOpen={isPopoverOpen} - closePopover={() => { - setIsPopoverOpen(false); - }} - panelPaddingSize="none" - anchorPosition="downLeft" - > - + { - setIsPopoverOpen(false); - setDocsPerPage(10); + setIsPopoverOpen(true); }} > - {i18n.translate('searchIndexDocuments.documentList.paginationOptions.option', { - defaultMessage: '{docCount} documents', - values: { docCount: 10 }, + {i18n.translate('searchIndexDocuments.documentList.pagination.itemsPerPage', { + defaultMessage: 'Documents per page: {docPerPage}', + values: { docPerPage: docsPerPage }, })} - , + + } + isOpen={isPopoverOpen} + closePopover={() => { + setIsPopoverOpen(false); + }} + panelPaddingSize="none" + anchorPosition="downLeft" + > + { + setIsPopoverOpen(false); + setDocsPerPage(10); + }} + > + {i18n.translate('searchIndexDocuments.documentList.paginationOptions.option', { + defaultMessage: '{docCount} documents', + values: { docCount: 10 }, + })} + , - { - setIsPopoverOpen(false); - setDocsPerPage(25); - }} - > - {i18n.translate('searchIndexDocuments.documentList.paginationOptions.option', { - defaultMessage: '{docCount} documents', - values: { docCount: 25 }, - })} - , - { - setIsPopoverOpen(false); - setDocsPerPage(50); - }} - > - {i18n.translate('searchIndexDocuments.documentList.paginationOptions.option', { - defaultMessage: '{docCount} documents', - values: { docCount: 50 }, - })} - , - ]} - /> - - + { + setIsPopoverOpen(false); + setDocsPerPage(25); + }} + > + {i18n.translate('searchIndexDocuments.documentList.paginationOptions.option', { + defaultMessage: '{docCount} documents', + values: { docCount: 25 }, + })} + , + { + setIsPopoverOpen(false); + setDocsPerPage(50); + }} + > + {i18n.translate('searchIndexDocuments.documentList.paginationOptions.option', { + defaultMessage: '{docCount} documents', + values: { docCount: 50 }, + })} + , + ]} + /> + + + )} diff --git a/packages/kbn-search-index-documents/components/documents_list.test.tsx b/packages/kbn-search-index-documents/components/documents_list.test.tsx index b445c5fa48711..b97b36989ad62 100644 --- a/packages/kbn-search-index-documents/components/documents_list.test.tsx +++ b/packages/kbn-search-index-documents/components/documents_list.test.tsx @@ -58,8 +58,14 @@ describe('DocumentList', () => { }, ], mappings: { - AvgTicketPrice: { - type: 'float' as const, + kibana_sample_data_flights: { + mappings: { + properties: { + AvgTicketPrice: { + type: 'float' as const, + }, + }, + }, }, }, }; diff --git a/packages/kbn-search-index-documents/components/result/index.ts b/packages/kbn-search-index-documents/components/result/index.ts index a5e613fbd83ec..8c894f7e2ca3b 100644 --- a/packages/kbn-search-index-documents/components/result/index.ts +++ b/packages/kbn-search-index-documents/components/result/index.ts @@ -8,4 +8,8 @@ */ export { Result } from './result'; -export { resultMetaData, resultToField } from './result_metadata'; +export { + resultMetaData, + resultToFieldFromMappingResponse, + resultToFieldFromMappings as resultToField, +} from './result_metadata'; diff --git a/packages/kbn-search-index-documents/components/result/result.tsx b/packages/kbn-search-index-documents/components/result/result.tsx index 4e6f0ed8c6eb8..5e1c4db104116 100644 --- a/packages/kbn-search-index-documents/components/result/result.tsx +++ b/packages/kbn-search-index-documents/components/result/result.tsx @@ -9,76 +9,147 @@ import React, { useState } from 'react'; -import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiPanel, EuiToolTip } from '@elastic/eui'; +import { + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiSpacer, + EuiToolTip, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ResultFields } from './results_fields'; -import { ResultHeader } from './result_header'; import './result.scss'; import { MetaDataProps, ResultFieldProps } from './result_types'; +import { RichResultHeader } from './rich_result_header'; +import { ResultHeader } from './result_header'; + +export const DEFAULT_VISIBLE_FIELDS = 3; -interface ResultProps { +export interface ResultProps { fields: ResultFieldProps[]; metaData: MetaDataProps; + defaultVisibleFields?: number; + showScore?: boolean; + compactCard?: boolean; + onDocumentClick?: () => void; } -export const Result: React.FC = ({ metaData, fields }) => { +export const Result: React.FC = ({ + metaData, + fields, + defaultVisibleFields = DEFAULT_VISIBLE_FIELDS, + compactCard = true, + showScore = false, + onDocumentClick, +}) => { const [isExpanded, setIsExpanded] = useState(false); const tooltipText = - fields.length <= 3 + fields.length <= defaultVisibleFields ? i18n.translate('searchIndexDocuments.result.expandTooltip.allVisible', { defaultMessage: 'All fields are visible', }) : isExpanded ? i18n.translate('searchIndexDocuments.result.expandTooltip.showFewer', { defaultMessage: 'Show {amount} fewer fields', - values: { amount: fields.length - 3 }, + values: { amount: fields.length - defaultVisibleFields }, }) : i18n.translate('searchIndexDocuments.result.expandTooltip.showMore', { defaultMessage: 'Show {amount} more fields', - values: { amount: fields.length - 3 }, + values: { amount: fields.length - defaultVisibleFields }, }); const toolTipContent = <>{tooltipText}; return ( - + - + - + {compactCard && ( + + )} + {!compactCard && ( + + + ) => { + e.stopPropagation(); + setIsExpanded(!isExpanded); + }} + aria-label={tooltipText} + /> + + + } + /> + )} + {!compactCard && + ((isExpanded && fields.length > 0) || + (!isExpanded && fields.slice(0, defaultVisibleFields).length > 0)) && ( + + )} - -
- - setIsExpanded(!isExpanded)} - aria-label={tooltipText} - /> - -
-
+ {compactCard && ( + +
+ + ) => { + e.stopPropagation(); + setIsExpanded(!isExpanded); + }} + aria-label={tooltipText} + /> + +
+
+ )}
); diff --git a/packages/kbn-search-index-documents/components/result/result_metadata.ts b/packages/kbn-search-index-documents/components/result/result_metadata.ts index 783cd537b4535..ba50644cafc59 100644 --- a/packages/kbn-search-index-documents/components/result/result_metadata.ts +++ b/packages/kbn-search-index-documents/components/result/result_metadata.ts @@ -7,7 +7,11 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { MappingProperty, SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import type { + IndicesGetMappingResponse, + MappingProperty, + SearchHit, +} from '@elastic/elasticsearch/lib/api/types'; import type { MetaDataProps } from './result_types'; const TITLE_KEYS = ['title', 'name']; @@ -37,15 +41,19 @@ export const resultTitle = (result: SearchHit): string | undefined => { export const resultMetaData = (result: SearchHit): MetaDataProps => ({ id: result._id!, title: resultTitle(result), + score: result._score, }); -export const resultToField = (result: SearchHit, mappings?: Record) => { - if (mappings && result._source && !Array.isArray(result._source)) { +export const resultToFieldFromMappingResponse = ( + result: SearchHit, + mappings?: IndicesGetMappingResponse +) => { + if (mappings && mappings[result._index] && result._source && !Array.isArray(result._source)) { if (typeof result._source === 'object') { return Object.entries(result._source).map(([key, value]) => { return { fieldName: key, - fieldType: mappings[key]?.type ?? 'object', + fieldType: mappings[result._index]?.mappings?.properties?.[key]?.type ?? 'object', fieldValue: JSON.stringify(value, null, 2), }; }); @@ -53,3 +61,19 @@ export const resultToField = (result: SearchHit, mappings?: Record +) => { + if (mappings && result._source && !Array.isArray(result._source)) { + return Object.entries(result._source).map(([key, value]) => { + return { + fieldName: key, + fieldType: mappings[key]?.type ?? 'object', + fieldValue: JSON.stringify(value, null, 2), + }; + }); + } + return []; +}; diff --git a/packages/kbn-search-index-documents/components/result/result_types.ts b/packages/kbn-search-index-documents/components/result/result_types.ts index e04ccb1091c8e..c7899874b27ee 100644 --- a/packages/kbn-search-index-documents/components/result/result_types.ts +++ b/packages/kbn-search-index-documents/components/result/result_types.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { SearchHit } from '@elastic/elasticsearch/lib/api/types'; import { IconType } from '@elastic/eui'; export interface ResultFieldProps { @@ -20,4 +21,6 @@ export interface MetaDataProps { id: string; onDocumentDelete?: Function; title?: string; + score?: SearchHit['_score']; + showScore?: boolean; } diff --git a/packages/kbn-search-index-documents/components/result/rich_result_header.tsx b/packages/kbn-search-index-documents/components/result/rich_result_header.tsx new file mode 100644 index 0000000000000..7caff8514871f --- /dev/null +++ b/packages/kbn-search-index-documents/components/result/rich_result_header.tsx @@ -0,0 +1,228 @@ +/* + * Copyright 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 React, { useState } from 'react'; + +import { + EuiButton, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiPanel, + EuiPopover, + EuiPopoverFooter, + EuiPopoverTitle, + EuiText, + EuiTextColor, + EuiTitle, + useEuiTheme, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import { MetaDataProps } from './result_types'; + +interface Props { + metaData: MetaDataProps; + title: string; + rightSideActions?: React.ReactNode; + showScore?: boolean; + onTitleClick?: () => void; +} + +interface TermDef { + label: string | number; +} + +const Term: React.FC = ({ label }) => ( + + + {label}: + + +); + +const Definition: React.FC = ({ label }) => ( + + {label} + +); +const MetadataPopover: React.FC = ({ + id, + onDocumentDelete, + score, + showScore = false, +}) => { + const [popoverIsOpen, setPopoverIsOpen] = useState(false); + const closePopover = () => setPopoverIsOpen(false); + + const metaDataIcon = ( + ) => { + e.stopPropagation(); + setPopoverIsOpen(!popoverIsOpen); + }} + aria-label={i18n.translate('searchIndexDocuments.result.header.metadata.icon.ariaLabel', { + defaultMessage: 'Metadata for document: {id}', + values: { id }, + })} + /> + ); + + return ( + + + {i18n.translate('searchIndexDocuments.result.header.metadata.title', { + defaultMessage: 'Document metadata', + })} + + + + + + + + + + {score && showScore && ( + + + + + + + )} + + {onDocumentDelete && ( + + ) => { + e.stopPropagation(); + closePopover(); + }} + fullWidth + > + {i18n.translate('searchIndexDocuments.result.header.metadata.deleteDocument', { + defaultMessage: 'Delete document', + })} + + + )} + + ); +}; + +const Score: React.FC<{ score: MetaDataProps['score'] }> = ({ score }) => { + return ( + + + + + + + + + {score ? score.toString().substring(0, 5) : '-'} + + + + + + ); +}; + +export const RichResultHeader: React.FC = ({ + title, + metaData, + rightSideActions = null, + showScore = false, + onTitleClick, +}) => { + const { euiTheme } = useEuiTheme(); + return ( + + + {showScore && ( + + + + )} + + + + + + + {onTitleClick ? ( + + +

{title}

+
+
+ ) : ( + +

{title}

+
+ )} +
+ {!!metaData && ( + + + + )} +
+
+
+
+
+ {rightSideActions} +
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx index 353fc84546a9c..592da5d044f2a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx @@ -122,7 +122,7 @@ export const SearchIndexDocuments: React.FC = () => { docs={docs} docsPerPage={pagination.pageSize ?? 10} isLoading={status !== Status.SUCCESS && mappingStatus !== Status.SUCCESS} - mappings={mappingData?.mappings?.properties ?? {}} + mappings={mappingData ? { [indexName]: mappingData } : undefined} meta={data?.meta ?? DEFAULT_PAGINATION} onPaginate={(pageIndex) => setPagination({ ...pagination, pageIndex })} setDocsPerPage={(pageSize) => setPagination({ ...pagination, pageSize })} diff --git a/x-pack/plugins/search_indices/public/components/index_documents/document_list.tsx b/x-pack/plugins/search_indices/public/components/index_documents/document_list.tsx index ddf4f27122ef9..22735cc86c05f 100644 --- a/x-pack/plugins/search_indices/public/components/index_documents/document_list.tsx +++ b/x-pack/plugins/search_indices/public/components/index_documents/document_list.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { MappingProperty, SearchHit } from '@elastic/elasticsearch/lib/api/types'; -import { Result, resultToField, resultMetaData } from '@kbn/search-index-documents'; +import { Result, resultMetaData, resultToField } from '@kbn/search-index-documents'; import { EuiSpacer } from '@elastic/eui'; diff --git a/x-pack/plugins/search_playground/common/types.ts b/x-pack/plugins/search_playground/common/types.ts index c0e3300fe7dff..c239858b5b459 100644 --- a/x-pack/plugins/search_playground/common/types.ts +++ b/x-pack/plugins/search_playground/common/types.ts @@ -51,6 +51,7 @@ export enum APIRoutes { POST_QUERY_SOURCE_FIELDS = '/internal/search_playground/query_source_fields', GET_INDICES = '/internal/search_playground/indices', POST_SEARCH_QUERY = '/internal/search_playground/search', + GET_INDEX_MAPPINGS = '/internal/search_playground/mappings', } export enum LLMs { diff --git a/x-pack/plugins/search_playground/public/components/app.tsx b/x-pack/plugins/search_playground/public/components/app.tsx index 34b89433ea705..4f371ea5d15bb 100644 --- a/x-pack/plugins/search_playground/public/components/app.tsx +++ b/x-pack/plugins/search_playground/public/components/app.tsx @@ -106,7 +106,11 @@ export const App: React.FC = ({ css={{ position: 'relative', }} - contentProps={{ css: { display: 'flex', flexGrow: 1, position: 'absolute', inset: 0 } }} + contentProps={ + selectedPageMode === PlaygroundPageMode.search && selectedMode === 'chat' + ? undefined + : { css: { display: 'flex', flexGrow: 1, position: 'absolute', inset: 0 } } + } paddingSize={paddingSize} className="eui-fullHeight" > diff --git a/x-pack/plugins/search_playground/public/components/search_mode/empty_results.tsx b/x-pack/plugins/search_playground/public/components/search_mode/empty_results.tsx deleted file mode 100644 index ab5779e85ddd5..0000000000000 --- a/x-pack/plugins/search_playground/public/components/search_mode/empty_results.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 { EuiEmptyPrompt } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -export interface EmptyResultsArgs { - query?: string; -} - -export const EmptyResults: React.FC = ({ query }) => { - return ( - - {query - ? i18n.translate('xpack.searchPlayground.resultList.emptyWithQuery.text', { - defaultMessage: 'No result found for: {query}', - values: { query }, - }) - : i18n.translate('xpack.searchPlayground.resultList.empty.text', { - defaultMessage: 'No results found', - })} -

- } - /> - ); -}; diff --git a/x-pack/plugins/search_playground/public/components/search_mode/result_list.tsx b/x-pack/plugins/search_playground/public/components/search_mode/result_list.tsx index 02e1193e22332..87c7060c29151 100644 --- a/x-pack/plugins/search_playground/public/components/search_mode/result_list.tsx +++ b/x-pack/plugins/search_playground/public/components/search_mode/result_list.tsx @@ -7,40 +7,29 @@ import React, { useEffect, useState } from 'react'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiHorizontalRule, - EuiPagination, - EuiPanel, - EuiText, - EuiTitle, -} from '@elastic/eui'; - -import { UnifiedDocViewerFlyout } from '@kbn/unified-doc-viewer-plugin/public'; +import { DocumentList, pageToPagination } from '@kbn/search-index-documents'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { EsHitRecord } from '@kbn/discover-utils/types'; -import type { SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import type { IndicesGetMappingResponse, SearchHit } from '@elastic/elasticsearch/lib/api/types'; import { buildDataTableRecord } from '@kbn/discover-utils'; -import { i18n } from '@kbn/i18n'; -import { Pagination } from '../../types'; -import { getPageCounts } from '../../utils/pagination_helper'; -import { EmptyResults } from './empty_results'; +import { UnifiedDocViewerFlyout } from '@kbn/unified-doc-viewer-plugin/public'; +import { Pagination as PaginationTypeEui } from '@elastic/eui'; import { useKibana } from '../../hooks/use_kibana'; +import { Pagination } from '../../types'; export interface ResultListArgs { searchResults: SearchHit[]; + mappings?: IndicesGetMappingResponse; pagination: Pagination; onPaginationChange: (nextPage: number) => void; - searchQuery?: string; } export const ResultList: React.FC = ({ searchResults, + mappings, pagination, onPaginationChange, - searchQuery = '', }) => { const { services: { data }, @@ -50,73 +39,42 @@ export const ResultList: React.FC = ({ data.dataViews.getDefaultDataView().then((d) => setDataView(d)); }, [data]); const [flyoutDocId, setFlyoutDocId] = useState(undefined); - const { totalPage, page } = getPageCounts(pagination); + const documentMeta: PaginationTypeEui = pageToPagination(pagination); const hit = flyoutDocId && buildDataTableRecord(searchResults.find((item) => item._id === flyoutDocId) as EsHitRecord); return ( - - - {searchResults.length === 0 && ( - - - - )} - {searchResults.length !== 0 && - searchResults.map((item, index) => { - return ( - <> - setFlyoutDocId(item._id)} - grow - > - - - -

ID:{item._id}

-
-
- - -

- {i18n.translate('xpack.searchPlayground.resultList.result.score', { - defaultMessage: 'Document score: {score}', - values: { score: item._score }, - })} -

-
-
-
-
- {index !== searchResults.length - 1 && } - - ); - })} - {searchResults.length !== 0 && ( - - - - )} - {flyoutDocId && dataView && hit && ( - setFlyoutDocId(undefined)} - isEsqlQuery={false} - columns={[]} - hit={hit} - dataView={dataView} - onAddColumn={() => {}} - onRemoveColumn={() => {}} - setExpandedDoc={() => {}} - flyoutType="overlay" - /> - )} -
-
+ <> + setFlyoutDocId(searchHit._id)} + resultProps={{ + showScore: true, + compactCard: false, + defaultVisibleFields: 0, + }} + /> + + {flyoutDocId && dataView && hit && ( + setFlyoutDocId(undefined)} + isEsqlQuery={false} + columns={[]} + hit={hit} + dataView={dataView} + onAddColumn={() => {}} + onRemoveColumn={() => {}} + setExpandedDoc={() => {}} + flyoutType="overlay" + /> + )} + ); }; diff --git a/x-pack/plugins/search_playground/public/components/search_mode/search_mode.tsx b/x-pack/plugins/search_playground/public/components/search_mode/search_mode.tsx index 967c5786eed63..94e6337f1a03c 100644 --- a/x-pack/plugins/search_playground/public/components/search_mode/search_mode.tsx +++ b/x-pack/plugins/search_playground/public/components/search_mode/search_mode.tsx @@ -23,6 +23,7 @@ import { ResultList } from './result_list'; import { ChatForm, ChatFormFields, Pagination } from '../../types'; import { useSearchPreview } from '../../hooks/use_search_preview'; import { getPaginationFromPage } from '../../utils/pagination_helper'; +import { useIndexMappings } from '../../hooks/use_index_mappings'; export const SearchMode: React.FC = () => { const { euiTheme } = useEuiTheme(); @@ -40,6 +41,7 @@ export const SearchMode: React.FC = () => { }>({ query: searchBarValue, pagination: DEFAULT_PAGINATION }); const { results, pagination } = useSearchPreview(searchQuery); + const { data: mappingData } = useIndexMappings(); const queryClient = useQueryClient(); const handleSearch = async (query = searchBarValue, paginationParam = DEFAULT_PAGINATION) => { @@ -81,15 +83,15 @@ export const SearchMode: React.FC = () => { /> - + {searchQuery.query ? ( ) : ( { + const mappings = await http.post<{ + mappings: IndicesGetMappingResponse; + }>(APIRoutes.GET_INDEX_MAPPINGS, { + body: JSON.stringify({ + indices, + }), + }); + return mappings; +}; +export const useIndexMappings = () => { + const { + services: { http }, + } = useKibana(); + const { getValues } = useFormContext(); + const indices = getValues(ChatFormFields.indices); + const { data } = useQuery({ + queryKey: ['search-playground-index-mappings'], + queryFn: () => fetchIndexMappings({ indices, http }), + refetchOnWindowFocus: false, + refetchOnReconnect: false, + refetchOnMount: false, + }); + + return { data: data?.mappings }; +}; diff --git a/x-pack/plugins/search_playground/public/hooks/use_search_preview.ts b/x-pack/plugins/search_playground/public/hooks/use_search_preview.ts index 54566563fcee5..f66f81b37cd2e 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_search_preview.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_search_preview.ts @@ -8,6 +8,7 @@ import { SearchHit } from '@elastic/elasticsearch/lib/api/types'; import { useQuery } from '@tanstack/react-query'; import { useFormContext } from 'react-hook-form'; +import type { HttpSetup } from '@kbn/core-http-browser'; import { APIRoutes, ChatForm, ChatFormFields, Pagination } from '../types'; import { useKibana } from './use_kibana'; import { DEFAULT_PAGINATION } from '../../common'; @@ -17,7 +18,7 @@ export interface FetchSearchResultsArgs { pagination: Pagination; indices: ChatForm[ChatFormFields.indices]; elasticsearchQuery: ChatForm[ChatFormFields.elasticsearchQuery]; - http: ReturnType['services']['http']; + http: HttpSetup; } interface UseSearchPreviewData { @@ -64,9 +65,10 @@ export const useSearchPreview = ({ query: string; pagination: Pagination; }) => { - const { services } = useKibana(); + const { + services: { http }, + } = useKibana(); const { getValues } = useFormContext(); - const { http } = services; const indices = getValues(ChatFormFields.indices); const elasticsearchQuery = getValues(ChatFormFields.elasticsearchQuery); diff --git a/x-pack/plugins/search_playground/public/utils/pagination_helper.ts b/x-pack/plugins/search_playground/public/utils/pagination_helper.ts index 1379bbc257bd4..2602327b8c968 100644 --- a/x-pack/plugins/search_playground/public/utils/pagination_helper.ts +++ b/x-pack/plugins/search_playground/public/utils/pagination_helper.ts @@ -7,13 +7,6 @@ import { Pagination } from '../../common/types'; -export const getPageCounts = (pagination: Pagination) => { - const { total, from, size } = pagination; - const totalPage = Math.ceil(total / size); - const page = Math.floor(from / size); - return { totalPage, total, page, size }; -}; - export const getPaginationFromPage = (page: number, size: number, previousValue: Pagination) => { const from = page < 0 ? 0 : page * size; return { ...previousValue, from, size, page }; diff --git a/x-pack/plugins/search_playground/server/routes.ts b/x-pack/plugins/search_playground/server/routes.ts index d30904214d8df..cf6a139b1344b 100644 --- a/x-pack/plugins/search_playground/server/routes.ts +++ b/x-pack/plugins/search_playground/server/routes.ts @@ -305,4 +305,47 @@ export function defineRoutes({ } }) ); + router.post( + { + path: APIRoutes.GET_INDEX_MAPPINGS, + validate: { + body: schema.object({ + indices: schema.arrayOf(schema.string()), + }), + }, + }, + errorHandler(logger)(async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const { indices } = request.body; + + try { + if (indices.length === 0) { + return response.badRequest({ + body: { + message: 'Indices cannot be empty', + }, + }); + } + + const mappings = await client.asCurrentUser.indices.getMapping({ + index: indices, + }); + return response.ok({ + body: { + mappings, + }, + }); + } catch (e) { + logger.error('Failed to get index mappings', e); + if (typeof e === 'object' && e.message) { + return response.badRequest({ + body: { + message: e.message, + }, + }); + } + throw e; + } + }) + ); } diff --git a/x-pack/plugins/search_playground/tsconfig.json b/x-pack/plugins/search_playground/tsconfig.json index eebfd0df9a7b3..29c144ff4bac8 100644 --- a/x-pack/plugins/search_playground/tsconfig.json +++ b/x-pack/plugins/search_playground/tsconfig.json @@ -44,7 +44,8 @@ "@kbn/unified-doc-viewer-plugin", "@kbn/data-views-plugin", "@kbn/discover-utils", - "@kbn/data-plugin" + "@kbn/data-plugin", + "@kbn/search-index-documents" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx b/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx index d74c3a479a68a..0dc6e74d63ba6 100644 --- a/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/index_documents/documents.tsx @@ -63,7 +63,7 @@ export const IndexDocuments: React.FC = ({ indexName }) => docs={docs} docsPerPage={pagination.pageSize ?? 10} isLoading={false} - mappings={mappingData?.mappings?.properties ?? {}} + mappings={mappingData ? { [indexName]: mappingData } : undefined} meta={documentsMeta ?? DEFAULT_PAGINATION} onPaginate={(pageIndex) => setPagination({ ...pagination, pageIndex })} setDocsPerPage={(pageSize) => setPagination({ ...pagination, pageSize })} From 1d3ab6989d1e42d0a85ffe1f7f3db316fcd011ea Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Tue, 1 Oct 2024 13:36:54 +0200 Subject: [PATCH 058/107] [Dataset quality] Keeping timeframe selected when navigating to dataset details (#194263) https://github.com/user-attachments/assets/1042bc36-29df-4833-be53-96ee142a4d6a --- .../dataset_quality/table/columns.tsx | 6 +- .../dataset_quality_details_link.test.tsx | 70 +++++++++++++++++++ .../table/dataset_quality_details_link.tsx | 13 ++-- 3 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.test.tsx diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx index 68ec09897f7c2..99fdc25382bf2 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/columns.tsx @@ -186,7 +186,11 @@ export const getDatasetQualityTableColumns = ({ const { integration, name, rawName } = dataStreamStat; return ( - + diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.test.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.test.tsx new file mode 100644 index 0000000000000..ca9dc9764e4b4 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.test.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DATA_QUALITY_DETAILS_LOCATOR_ID } from '@kbn/deeplinks-observability'; +import { BrowserUrlService } from '@kbn/share-plugin/public'; +import { shallow } from 'enzyme'; +import React from 'react'; +import { DatasetQualityDetailsLink } from './dataset_quality_details_link'; + +const createMockLocator = (id: string) => ({ + navigate: jest.fn(), + getRedirectUrl: jest.fn().mockReturnValue(id), +}); + +describe('DatasetQualityDetailsLink', () => { + const mockDataQualityDetailsLocator = createMockLocator(DATA_QUALITY_DETAILS_LOCATOR_ID); + + const urlServiceMock = { + locators: { + get: jest.fn((id) => { + switch (id) { + case DATA_QUALITY_DETAILS_LOCATOR_ID: + return mockDataQualityDetailsLocator; + default: + throw new Error(`Unknown locator id: ${id}`); + } + }), + }, + } as any as BrowserUrlService; + + const dataStream = { + title: 'My data stream', + rawName: 'logs-my.data.stream-default', + }; + + const timeRange = { + from: 'now-7d/d', + refresh: { + pause: true, + value: 60000, + }, + to: 'now', + }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders a link to dataset quality details', () => { + const wrapper = shallow( + + {dataStream.title} + + ); + + expect(mockDataQualityDetailsLocator.getRedirectUrl).toHaveBeenCalledWith({ + dataStream: dataStream.rawName, + timeRange, + }); + expect(wrapper.prop('href')).toBe(DATA_QUALITY_DETAILS_LOCATOR_ID); + }); +}); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.tsx index ac73f269d9f5a..ec6c34ce1a772 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/table/dataset_quality_details_link.tsx @@ -5,31 +5,34 @@ * 2.0. */ -import React from 'react'; -import { BrowserUrlService } from '@kbn/share-plugin/public'; +import { EuiHeaderLink } from '@elastic/eui'; import { DATA_QUALITY_DETAILS_LOCATOR_ID, DataQualityDetailsLocatorParams, } from '@kbn/deeplinks-observability'; import { getRouterLinkProps } from '@kbn/router-utils'; -import { EuiHeaderLink } from '@elastic/eui'; +import { BrowserUrlService } from '@kbn/share-plugin/public'; +import React from 'react'; +import { TimeRangeConfig } from '../../../../common/types'; export const DatasetQualityDetailsLink = React.memo( ({ urlService, dataStream, + timeRange, children, }: { urlService: BrowserUrlService; dataStream: string; + timeRange: TimeRangeConfig; children: React.ReactNode; }) => { const locator = urlService.locators.get( DATA_QUALITY_DETAILS_LOCATOR_ID ); - const datasetQualityUrl = locator?.getRedirectUrl({ dataStream }); + const datasetQualityUrl = locator?.getRedirectUrl({ dataStream, timeRange }); const navigateToDatasetQuality = () => { - locator?.navigate({ dataStream }); + locator?.navigate({ dataStream, timeRange }); }; const datasetQualityLinkDetailsProps = getRouterLinkProps({ From dbfd4f0879aa89c49b379cc2c6c5feb74f5c16c7 Mon Sep 17 00:00:00 2001 From: mohamedhamed-ahmed Date: Tue, 1 Oct 2024 12:38:16 +0100 Subject: [PATCH 059/107] [Logs Explorer] Fix Privileges Accessibility (#193894) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/elastic/kibana/issues/192062 ## 📝 Summary This PR adds privileges checks for `Logs Explorerer` it checks for `Discover & Fleet` privileges before allowing the user access to `Logs Explorer`. Clicking on the `Logs` tab from the side nav defaults to `Stream`, as long as its not depricated, in case the user doesn't have access to `Logs Explorer` ## 🎥 Demo https://github.com/user-attachments/assets/a4105ec0-7681-40ee-b2fd-e39b9c178dcf --- .../infra/public/apps/logs_app.tsx | 26 ++++++++++--------- .../infra/public/pages/logs/page_content.tsx | 1 + .../infra/public/plugin.ts | 21 +++++++++------ .../public/plugin.ts | 16 +++++++++++- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/observability_solution/infra/public/apps/logs_app.tsx b/x-pack/plugins/observability_solution/infra/public/apps/logs_app.tsx index 8bd243b0723d5..329e059288e3e 100644 --- a/x-pack/plugins/observability_solution/infra/public/apps/logs_app.tsx +++ b/x-pack/plugins/observability_solution/infra/public/apps/logs_app.tsx @@ -57,7 +57,7 @@ const LogsApp: React.FC<{ storage: Storage; theme$: AppMountParameters['theme$']; }> = ({ core, history, pluginStart, plugins, setHeaderActionMenu, storage, theme$ }) => { - const uiCapabilities = core.application.capabilities; + const { logs, discover, fleet } = core.application.capabilities; return ( @@ -74,19 +74,21 @@ const LogsApp: React.FC<{ toastsService={core.notifications.toasts} > - { - plugins.share.url.locators - .get(ALL_DATASETS_LOCATOR_ID) - ?.navigate({}); + {Boolean(discover?.show && fleet?.read) && ( + { + plugins.share.url.locators + .get(ALL_DATASETS_LOCATOR_ID) + ?.navigate({}); - return null; - }} - /> + return null; + }} + /> + )} - {uiCapabilities?.logs?.show && } + {logs?.show && } diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx index 056c98513c244..5b5965bb2d5ec 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/page_content.tsx @@ -113,6 +113,7 @@ export const LogsPageContent: React.FunctionComponent = () => { )} + ( { + const { infrastructure, logs, discover, fleet } = capabilities; return [ - ...(capabilities.logs.show + ...(logs.show ? [ { label: 'Logs', sortKey: 200, entries: [ - { - label: 'Explorer', - app: 'observability-logs-explorer', - path: '/', - isBetaFeature: true, - }, + ...(discover?.show && fleet?.read + ? [ + { + label: 'Explorer', + app: 'observability-logs-explorer', + path: '/', + isBetaFeature: true, + }, + ] + : []), ...(this.config.featureFlags.logsUIEnabled ? [ { label: 'Stream', app: 'logs', path: '/stream' }, @@ -161,7 +166,7 @@ export class Plugin implements InfraClientPluginClass { }, ] : []), - ...(capabilities.infrastructure.show + ...(infrastructure.show ? [ { label: metricsTitle, diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts index 906caf72a450a..798a03da0ebdf 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts @@ -7,6 +7,8 @@ import { AppMountParameters, + AppStatus, + AppUpdater, CoreSetup, CoreStart, DEFAULT_APP_CATEGORIES, @@ -14,6 +16,7 @@ import { PluginInitializerContext, } from '@kbn/core/public'; import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { BehaviorSubject } from 'rxjs'; import { AllDatasetsLocatorDefinition, ObservabilityLogsExplorerLocators, @@ -35,6 +38,7 @@ export class ObservabilityLogsExplorerPlugin { private config: ObservabilityLogsExplorerConfig; private locators?: ObservabilityLogsExplorerLocators; + private appStateUpdater = new BehaviorSubject(() => ({})); constructor(context: PluginInitializerContext) { this.config = context.config.get(); @@ -56,6 +60,7 @@ export class ObservabilityLogsExplorerPlugin ? ['globalSearch', 'sideNav'] : ['globalSearch'], keywords: ['logs', 'log', 'explorer', 'logs explorer'], + updater$: this.appStateUpdater, mount: async (appMountParams: ObservabilityLogsExplorerAppMountParameters) => { const [coreStart, pluginsStart, ownPluginStart] = await core.getStartServices(); const { renderObservabilityLogsExplorer } = await import( @@ -123,7 +128,16 @@ export class ObservabilityLogsExplorerPlugin }; } - public start(_core: CoreStart, _pluginsStart: ObservabilityLogsExplorerStartDeps) { + public start(core: CoreStart, _pluginsStart: ObservabilityLogsExplorerStartDeps) { + const { discover, fleet, logs } = core.application.capabilities; + + if (!(discover?.show && fleet?.read && logs?.show)) { + this.appStateUpdater.next(() => ({ + status: AppStatus.inaccessible, + visibleIn: [], + })); + } + return {}; } } From b49024ba0173c50cece1559a1a6d1ccbb4c8b69c Mon Sep 17 00:00:00 2001 From: Ido Cohen <90558359+CohenIdo@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:51:15 +0300 Subject: [PATCH 060/107] [Cloud Security] Fix Metering Flaky Tests --- .../apis/cloud_security_posture/helper.ts | 15 +++++++++++++++ .../cloud_security_metering.ts | 19 +++++++++---------- .../serverless_metering/mock_data.ts | 4 ++-- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts b/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts index 9ab91cf0d60c0..51f98b5389a9d 100644 --- a/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts +++ b/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts @@ -29,6 +29,21 @@ export const deleteIndex = async (es: Client, indexToBeDeleted: string[]) => { ]); }; +export const bulkIndex = async (es: Client, findingsMock: T[], indexName: string) => { + const operations = findingsMock.flatMap((finding) => [ + { create: { _index: indexName } }, // Action description + { + ...finding, + '@timestamp': new Date().toISOString(), + }, // Data to index + ]); + + await es.bulk({ + body: operations, // Bulk API expects 'body' for operations + refresh: true, + }); +}; + export const addIndex = async (es: Client, findingsMock: T[], indexName: string) => { await Promise.all([ ...findingsMock.map((finding) => 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 01c2ebf9a64a7..b3db98c829afd 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 @@ -11,9 +11,9 @@ import { LATEST_FINDINGS_INDEX_DEFAULT_NS } from '@kbn/cloud-security-posture-pl import * as http from 'http'; import { deleteIndex, - addIndex, createPackagePolicy, createCloudDefendPackagePolicy, + bulkIndex, } from '@kbn/test-suites-xpack/api_integration/apis/cloud_security_posture/helper'; import { RoleCredentials } from '../../../../../shared/services'; import { getMockFindings, getMockDefendForContainersHeartbeats } from './mock_data'; @@ -38,8 +38,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/188660 - 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; @@ -117,7 +116,7 @@ export default function (providerContext: FtrProviderContext) { numberOfFindings: 10, }); - await addIndex( + await bulkIndex( es, [...billableFindings, ...notBillableFindings], LATEST_FINDINGS_INDEX_DEFAULT_NS @@ -161,7 +160,7 @@ export default function (providerContext: FtrProviderContext) { numberOfFindings: 11, }); - await addIndex( + await bulkIndex( es, [...billableFindings, ...notBillableFindings], LATEST_FINDINGS_INDEX_DEFAULT_NS @@ -200,7 +199,7 @@ export default function (providerContext: FtrProviderContext) { numberOfFindings: 2, }); - await addIndex(es, billableFindings, CDR_LATEST_NATIVE_VULNERABILITIES_INDEX_PATTERN); + await bulkIndex(es, billableFindings, CDR_LATEST_NATIVE_VULNERABILITIES_INDEX_PATTERN); let interceptedRequestBody: UsageRecord[] = []; @@ -234,7 +233,7 @@ export default function (providerContext: FtrProviderContext) { isBlockActionEnables: false, numberOfHearbeats: 2, }); - await addIndex( + await bulkIndex( es, [...blockActionEnabledHeartbeats, ...blockActionDisabledHeartbeats], CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS @@ -316,7 +315,7 @@ export default function (providerContext: FtrProviderContext) { }); await Promise.all([ - addIndex( + bulkIndex( es, [ ...billableFindingsCSPM, @@ -326,8 +325,8 @@ export default function (providerContext: FtrProviderContext) { ], LATEST_FINDINGS_INDEX_DEFAULT_NS ), - addIndex(es, [...billableFindingsCNVM], CDR_LATEST_NATIVE_VULNERABILITIES_INDEX_PATTERN), - addIndex( + bulkIndex(es, [...billableFindingsCNVM], CDR_LATEST_NATIVE_VULNERABILITIES_INDEX_PATTERN), + bulkIndex( es, [...blockActionEnabledHeartbeats, ...blockActionDisabledHeartbeats], CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts index 2455c8e1762cc..5e5844eaaf3b5 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts @@ -95,13 +95,13 @@ export const getMockDefendForContainersHeartbeats = ({ mockDefendForContainersHeartbeats(isBlockActionEnables) ); }; -const mockDefendForContainersHeartbeats = (isBlockActionEnables: boolean) => { +const mockDefendForContainersHeartbeats = (isBlockActionEnabled: boolean) => { return { agent: { id: chance.guid(), }, cloud_defend: { - block_action_enabled: isBlockActionEnables, + block_action_enabled: isBlockActionEnabled, }, event: { ingested: new Date().toISOString(), From ed9f9883d83afe971147d664b3344dc7256e4e9d Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:04:10 +0200 Subject: [PATCH 061/107] Add CA certificate path to actions config (#194528) This PR adds usage-api CA certificate path to actions plugin's config. So we can add it to serverless config in gitops. --- x-pack/plugins/actions/server/config.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/x-pack/plugins/actions/server/config.ts b/x-pack/plugins/actions/server/config.ts index 980144117e4e8..399f92090818b 100644 --- a/x-pack/plugins/actions/server/config.ts +++ b/x-pack/plugins/actions/server/config.ts @@ -145,6 +145,15 @@ export const configSchema = schema.object({ max: schema.maybe(schema.number({ min: MIN_QUEUED_MAX, defaultValue: DEFAULT_QUEUED_MAX })), }) ), + usage: schema.maybe( + schema.object({ + cert: schema.maybe( + schema.object({ + path: schema.string(), + }) + ), + }) + ), }); export type ActionsConfig = TypeOf; From c4e2a7256b76cc94c08f34bb6dc3faeff58777f1 Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Tue, 1 Oct 2024 08:22:24 -0400 Subject: [PATCH 062/107] fix(slo): timestamp field was allowing mutliple values (#194311) --- .../components/common/group_by_field.tsx | 30 +------ ...lector.tsx => group_by_field_selector.tsx} | 67 ++++++++-------- .../common/timestamp_field_selector.tsx | 79 +++++++++++++++++++ .../index_and_timestamp_field.tsx | 19 ++--- 4 files changed, 124 insertions(+), 71 deletions(-) rename x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/{index_field_selector.tsx => group_by_field_selector.tsx} (59%) create mode 100644 x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/timestamp_field_selector.tsx diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field.tsx index 939755b8a9e3e..a7450bfb2a465 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field.tsx @@ -5,16 +5,13 @@ * 2.0. */ -import { ALL_VALUE, QuerySchema } from '@kbn/slo-schema'; -import { i18n } from '@kbn/i18n'; -import { EuiIconTip } from '@elastic/eui'; -import React from 'react'; import { DataView, FieldSpec } from '@kbn/data-views-plugin/common'; +import { QuerySchema } from '@kbn/slo-schema'; +import React from 'react'; import { useFormContext } from 'react-hook-form'; -import { OptionalText } from './optional_text'; import { CreateSLOForm } from '../../types'; -import { IndexFieldSelector } from './index_field_selector'; import { GroupByCardinality } from './group_by_cardinality'; +import { GroupByFieldSelector } from './group_by_field_selector'; export function GroupByField({ dataView, @@ -32,27 +29,8 @@ export function GroupByField({ return ( <> - - {i18n.translate('xpack.slo.sloEdit.groupBy.label', { - defaultMessage: 'Group by', - })}{' '} - - - } - labelAppend={} - placeholder={i18n.translate('xpack.slo.sloEdit.groupBy.placeholder', { - defaultMessage: 'Select an optional field to group by', - })} isLoading={!!index && isLoading} isDisabled={!index} /> diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/index_field_selector.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field_selector.tsx similarity index 59% rename from x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/index_field_selector.tsx rename to x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field_selector.tsx index 0a277900ac31f..c45cc1d337aad 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/index_field_selector.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/group_by_field_selector.tsx @@ -5,35 +5,27 @@ * 2.0. */ -import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; -import React, { useEffect, useState, ReactNode } from 'react'; -import { Controller, useFormContext } from 'react-hook-form'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow, EuiIconTip } from '@elastic/eui'; import { FieldSpec } from '@kbn/data-views-plugin/common'; -import { createOptionsFromFields, Option } from '../../helpers/create_options'; +import { i18n } from '@kbn/i18n'; +import { ALL_VALUE } from '@kbn/slo-schema'; +import React, { useEffect, useState } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; +import { Option, createOptionsFromFields } from '../../helpers/create_options'; import { CreateSLOForm } from '../../types'; +import { OptionalText } from './optional_text'; interface Props { indexFields: FieldSpec[]; - name: 'groupBy' | 'indicator.params.timestampField'; - label: ReactNode | string; - placeholder: string; isDisabled: boolean; isLoading: boolean; - isRequired?: boolean; - defaultValue?: string; - labelAppend?: ReactNode; } -export function IndexFieldSelector({ - indexFields, - name, - label, - labelAppend, - placeholder, - isDisabled, - isLoading, - isRequired = false, - defaultValue = '', -}: Props) { + +const placeholder = i18n.translate('xpack.slo.sloEdit.groupBy.placeholder', { + defaultMessage: 'Select an optional field to group by', +}); + +export function GroupByFieldSelector({ indexFields, isDisabled, isLoading }: Props) { const { control, getFieldState } = useFormContext(); const [options, setOptions] = useState(createOptionsFromFields(indexFields)); @@ -41,10 +33,10 @@ export function IndexFieldSelector({ setOptions(createOptionsFromFields(indexFields)); }, [indexFields]); - const getSelectedItems = (value: string | string[], fields: FieldSpec[]) => { + const getSelectedItems = (value: string | string[]) => { const values = [value].flat(); const selectedItems: Array> = []; - fields.forEach((field) => { + indexFields.forEach((field) => { if (values.includes(field.name)) { selectedItems.push({ value: field.name, label: field.name }); } @@ -53,12 +45,27 @@ export function IndexFieldSelector({ }; return ( - + + {i18n.translate('xpack.slo.sloEdit.groupBy.label', { + defaultMessage: 'Group by', + })}{' '} + + + } + isInvalid={getFieldState('groupBy').invalid} + labelAppend={} + > { return ( @@ -75,7 +82,7 @@ export function IndexFieldSelector({ return field.onChange(selected.map((selection) => selection.value)); } - field.onChange(defaultValue); + field.onChange([ALL_VALUE]); }} options={options} onSearchChange={(searchValue: string) => { @@ -83,9 +90,7 @@ export function IndexFieldSelector({ createOptionsFromFields(indexFields, ({ value }) => value.includes(searchValue)) ); }} - selectedOptions={ - !!indexFields && !!field.value ? getSelectedItems(field.value, indexFields) : [] - } + selectedOptions={!!indexFields && !!field.value ? getSelectedItems(field.value) : []} /> ); }} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/timestamp_field_selector.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/timestamp_field_selector.tsx new file mode 100644 index 0000000000000..dc3289ca895c1 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/timestamp_field_selector.tsx @@ -0,0 +1,79 @@ +/* + * Copyright 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 { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; +import { i18n } from '@kbn/i18n'; +import React, { useEffect, useState } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; +import { Option, createOptionsFromFields } from '../../helpers/create_options'; +import { CreateSLOForm } from '../../types'; + +interface Props { + fields: FieldSpec[]; + isDisabled: boolean; + isLoading: boolean; +} + +const placeholder = i18n.translate('xpack.slo.sloEdit.timestampField.placeholder', { + defaultMessage: 'Select a timestamp field', +}); + +export function TimestampFieldSelector({ fields, isDisabled, isLoading }: Props) { + const { control, getFieldState } = useFormContext(); + const [options, setOptions] = useState(createOptionsFromFields(fields)); + + useEffect(() => { + setOptions(createOptionsFromFields(fields)); + }, [fields]); + + return ( + + { + return ( + + {...field} + async + placeholder={placeholder} + aria-label={placeholder} + isClearable + isDisabled={isLoading || isDisabled} + isInvalid={fieldState.invalid} + isLoading={isLoading} + onChange={(selected: EuiComboBoxOptionOption[]) => { + if (selected.length) { + return field.onChange(selected[0].value); + } + + field.onChange(''); + }} + singleSelection={{ asPlainText: true }} + options={options} + onSearchChange={(searchValue: string) => { + setOptions( + createOptionsFromFields(fields, ({ value }) => value.includes(searchValue)) + ); + }} + selectedOptions={ + !!fields && !!field.value ? [{ value: field.value, label: field.value }] : [] + } + /> + ); + }} + /> + + ); +} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_and_timestamp_field.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_and_timestamp_field.tsx index b4b5bdd4557d4..7059810a5aae0 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_and_timestamp_field.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_and_timestamp_field.tsx @@ -6,13 +6,12 @@ */ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; import { DataView } from '@kbn/data-views-plugin/public'; +import React from 'react'; import { useFormContext } from 'react-hook-form'; -import { IndexSelection } from './index_selection'; -import { IndexFieldSelector } from '../common/index_field_selector'; import { CreateSLOForm } from '../../types'; +import { TimestampFieldSelector } from '../common/timestamp_field_selector'; +import { IndexSelection } from './index_selection'; export function IndexAndTimestampField({ dataView, @@ -32,18 +31,10 @@ export function IndexAndTimestampField({ - From 34fb65430326c3c6ca3810f68c59ed44b9f5e57b Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Tue, 1 Oct 2024 14:29:10 +0200 Subject: [PATCH 063/107] [Lens][LogsDB] Add test suite (#194031) ## Summary Test suite for LogsDB in Kibana Adding tests for the following scenarios: * [x] All Lens operations (aggs) should work fine with a LogsDB stream * Mixed index scenarios * [x] LogsDB stream (upgraded from regular stream) * [x] LogsDB stream without `host.name` field in the mapping * [x] LogsDB stream (upgraded from regular stream) + regular index * [x] LogsDB stream (upgraded from regular stream) + TSDB stream * [x] LogsDB stream (upgraded from regular stream) + another LogsDB stream * [x] LogsDB stream (upgraded from regular stream) + TSDB stream downsampled * [x] Data stream (downgraded from LogsDB stream) * [x] Data stream without `host.name` field in the mapping * [x] Data stream (downgraded from LogsDB stream) + regular index * [x] Data stream (downgraded from LogsDB stream) + TSDB stream * [x] Data stream (downgraded from LogsDB stream) + another LogsDB stream * [x] Data stream (downgraded from LogsDB stream) + TSDB stream downsampled For the mixed scenario suite the following tests are performed: * Create a date histogram vs `count(bytes)` * same test but using the `utc_time` field rather than `@timestamp` * Create a chart with an annotation layer * same test but using the `utc_time` for both data and annotation layer * use the `host.name`, `utc_time`, `@timestamp` as extra field in the annotation tooltip * Create a visualization with ES|QL using `STATS` --------- Co-authored-by: dej611 --- .../data.json.gz | Bin 0 -> 1622455 bytes .../mappings.json | 171 +++++ .../kibana_sample_data_logs_logsdb.json | 22 + .../test/functional/apps/lens/group4/index.ts | 1 + .../functional/apps/lens/group4/logsdb.ts | 586 +++++++++++++++++ .../test/functional/apps/lens/group4/tsdb.ts | 437 +------------ .../apps/lens/group4/tsdb_logsdb_helpers.ts | 480 ++++++++++++++ .../test/functional/services/data_stream.ts | 123 +++- .../common/visualizations/group1/index.ts | 1 + .../common/visualizations/group1/logsdb.ts | 586 +++++++++++++++++ .../common/visualizations/group1/tsdb.ts | 598 ++++-------------- .../group1/tsdb_logsdb_helpers.ts | 480 ++++++++++++++ 12 files changed, 2552 insertions(+), 933 deletions(-) create mode 100644 test/functional/fixtures/es_archiver/kibana_sample_data_logs_logsdb/data.json.gz create mode 100644 test/functional/fixtures/es_archiver/kibana_sample_data_logs_logsdb/mappings.json create mode 100644 test/functional/fixtures/kbn_archiver/kibana_sample_data_logs_logsdb.json create mode 100644 x-pack/test/functional/apps/lens/group4/logsdb.ts create mode 100644 x-pack/test/functional/apps/lens/group4/tsdb_logsdb_helpers.ts create mode 100644 x-pack/test_serverless/functional/test_suites/common/visualizations/group1/logsdb.ts create mode 100644 x-pack/test_serverless/functional/test_suites/common/visualizations/group1/tsdb_logsdb_helpers.ts diff --git a/test/functional/fixtures/es_archiver/kibana_sample_data_logs_logsdb/data.json.gz b/test/functional/fixtures/es_archiver/kibana_sample_data_logs_logsdb/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..349fa50d7989f9e184ebc908c905bd71910542fe GIT binary patch literal 1622455 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⁡3Ye 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%0Am4uy+ zC@g+t``?bdy76YiHB;nHFE}ZTme-=kvFNTFJ>k*xSsSMAivSreQ~QVaCKQN|qnbG| zVQ9{Dfra+}97eg$oW-XV>KO!&O1+Fp8_0x5v9DayhsUt#Q$%-lS zvM6mR3E^XfhBmM`_z$NQVjnCXdkF@UD>Al*aIyBSrP5yMLn0!891mp%(h$G+J?!jk zE7asbLSu2-?+639KVZ?ffKE*8;JD@8`j9OR9UEd3QkPXgcf7v$K)mbPFz|}&P_F6K z#eO(P`kV*gl1@#NgLIH*qY=&hhA;I|23^U)lS-w}b^(nm6X10N%M zQQN7CiN3&;jLvM>ir>rHc)hn?oaOI5RVd!sqqE(@e_-2E)m-UAh;DlIFIfDIWFW>< zVLLN)k1#y)U0&Zx$~A8DPak`ZrLILg8b@P|5o%3iseJ4xqG<9dco|+o-*a;(#SBR+ zwhsx>sFBReW+8o-Ao&o<}n zfysh_0B3+*R$J*Yfjdp-Xey(B(Fc#3 zpGG2jQ-P0?*&F|0CZ(&bU%n&d37HhShW2CMb@7B7v3m;__m)Y}v|tC?Qe#O_3WqRQ z_Ec-p%@B@zD%~)*Y5c3~gn}rY?4C#5*3IAMAU-4%bFfI}^U*R>3AD^{@@% z{qe7{<#f>{1{BHmRLSW5AWaha!qc<3H;7_;!XJ?3s!TG2;Lj5VI(%sRF6x;JC_A3 zJHO~o1QvOP$bAzlZ8=2r8tv4(k;a31iPbnvaiG9pmcF3yHVs0yc2tAeMUop!6spQe zF?YOW>WK$}4E^($)+ckoa1`K}E9QX6lVOi_i&lld%ZeY2hd0z*mW?g%0#;vOE z<-K>y13K74<$3hcDw`JY6{u7c4RXqQo&=!iLa2DZ4lk6)8xX*93VaQ!o+NxO+SoDu z@$QkBwRkwjW_k01UnFp!wt23);>+@Af;V@kAx^7wn+E5yo#a=a6@Pnw4$k`d{MelM z>Rts=lAmRmNV}95l^Vnl`Rm$nfkG7PJP>N80xdgCV+(R!Ib) zIMa&6Fnd_DTgbB|*Jg=6_=zVYr^{?DoyU`WIe+#;5;PYkX5j89)=)#E;;ys000K4o zbsE;=N6j5(7c1fTluCl6Vjjuq&qD?gyYU zjQ+-2sv(a?&O|Li(B(;|WfZ;Pq3rQxWvlVuhU|9%_paLS%sg?PBczfYZH2hC1O9=n zY97yeGnd%a5|AUHLv{x%@ye>FO84zd%nIu7+!pXQ67%z)(FxfTR`VtjasE6qQY@Kh zWujoCrN(dJ0J8)l4R7WU5s{A;kF}ptd8#~Q^#bSM$*NexK=Ku7ZiVB{*;Faj?es2k zyFNYI;u@g;qt%hI!U>;2@~RRx+W#@3z1m}5dqMttzEb)+DvkgBdsXqFb?dPm;E>Fm zk*2W6riQkNzV`R;il9~lW7b!(e8R76vt4bH1eOzI5-s$d=8C`$nANljyz}K^s=>zs z?qTy5SeThRUgPFK6j+TwxQHH-XFf)?HWn=t>f zo-#$s#}SiPHVNuR7qF1YAZZC{6nZc_NyRicX*+glW7vT@=M?Obg&?V^`~dt&MX+0! zcY&I9YuoiMah8eDa$-CqcQb6`OxIfl=eC*6tvm2nQ+I~rg@@SiQ?dVJw|PFtz4GjN z2=GpxZ+ApM$KP@EoWw9`nl0^H;CtGrBitEdELM<+l?j~kiUv6}U>9u^X+DZ_VeC`- zC0_5zWOWMB=;+c};RP%+3?ccEfforzE~&I@x2wuXdMd}8M&DMOC~LZT^BncDYzYA=}Q;jyGkO`l+ArALMP(8MuFo+a0z3kNYo z_t;K$!I5(&Dk1mFDd(=t`mBc=f7h=w>})QQK}`K}0y}JPx{(eRD^_|Enb?G8s=P+c zl01WYRiz#5<1MqL1zmGd%H(*@r4)a{X}ZZ^*J}Eyp2+>DQVJ#UQYPhhz}>8tLzLy6%8WOJ=}s;l>2$mG}!wuabb#Ml8ZIGn!8WVm5gQvR%(_b5bRQxEJN%zLdWDb$T$(Q?cw@?wl1#+!?ZaIh2 zwxcel^w4F4rwnkOSsciCGKMocaZG3Sf`eupytDitm6~Ic$N52n4rls=*X#2;m+d2( z1|I(^sPq;k89UUJR!pI-uV8Wx%?0m7|B`yyAewja_biN}0KpiB-GYrUCa*U@ZVT#$ z?-5vT8*cg{JluHwXKnbxfR?=**Nf#KkDFx^smj9zIsagj;b2OlgA$`F;O9fGB(lA5 zruS31&bcaCfTi(cKMh9>#|Kj=S7XmdVpvHOTO4kdO z&-itj!94JYUwT5}L_&PY00Jytz7DoQ$$3U~ToEgcz7*4eI?_)K6gthouvl%`=zQjn zz~D~%UtLFwST~L=PM>#7RlaecM|j@2Rlii-TSEuC!x&7%!Yfx?wGdrNImVJRwxO2- zV_6>s|Jb+E0Bf`#ewhnCZxan!ok9xLW7z`9mr1QOwqJ*SB44kzyr2t?O;=TXJa5!7 zdNg5aS+e{C3#DZftnihIF>gGmf@l5JYy8X%7gqRxC>ZJMrrXc9TI)gSv5-Mub^N=jx8EaCf@&zt@V6A+NaS2p4KMy9BQGM?^G%{_hi z1q2kQY2<5^`niiL36IeNFI>?q9cSLIC{6pKhgASsZKuq{5q#Mc!sjGwI~_wgGmr81vD-isP5RBe;5De7a*!+wB^#gKo3&P;@i6Vn5TF6n9@oSr9 zMiyKnORp6RIlmrT(yCq&o8}XJvYan~ub}}stTlKk%&_pPMvOZlSUhuKuCZxN;E>d{ zyq@jeqFbNEbbgc8{esAiJ6DE}d~zki>i`QuPZ%frD}V`B0I1;^Ltea0N^b;XjYs6K za`V`^;`cDTQG zxIuJN4$X;n$|5X1i?L6g254ihoyi7EggQpakq0@X*;z;+cLDocA2rKG!3=gce#zdv^%Nu%KtZN`X+uf~0uOvS<{~IP0;aT|kjQ>b1{mlTC1@sv3nqLvcp^mb zUoa^2*P9!ErZBWuQ}oy?e1vEp6;OHLce(;tU`ZE56j+ip_`e%0()@%W z>7?#mUYiS@!7pt$2~mdeg#%}a(eiw>QbZ*7 ziCPTcqtmV)+ap?`sjE=Q!wY8DnV5?sFyV>e9I+%p+s>W`22R2F3w_}1FEPD~MP|0& zZdy&{M&-9P8li%u5|fg=58vkGu=E<)*PCD})PQfEr%0j8=J~(u2Hz%{(Oe$n4OlLA z{;0b+j(o)+FJ|igP9^y#FC*zsH!;TV{w7vQINON z|H2@L^qOQntV0It73z0rG^?(V&|1DI)seEy`JBr;Q@IH{J9U=OtgaY2DWUB#naVW; zWVT}Rc~I0xB%`Rk#c`e8%wA@ZwPPFBb>T&E<^_ejVrc;>IoI76zy=k|9rA|;H5AmT zI>{t5uOGe{-99MhUn9`{ER|(@eCnH;5yab}!rmZbMKxACM|eyxYmVAdD7W{Q0LV5x5+-uKf5SPXC4))TA4&FF8S4^nPmfntc9BBAvK@`!c>qCiQx(XBJ zBl1=>ACL{r*Hj+-&}JN@CHwR60on+RK}kYU_m1F-!K)Ah-$md}GiZhO%`Z2`8=&L+ za<|3Nfss-9?Kfsqb#HJri#)urzBhfzC-Gf2cRKrAW}9fOPMXfe%M)#DO+p|^&b%%( zb)dg^u7lcxqNh29ZZoE2xBy33i%-z17|)uiG5FiTkw-I4L(B7HFEP*UAS^HPx8|?d z`+Qo(d{zI3Z(odP*^vs?)V`@p&>8oIy=52ON{3tn8ndnJ)zc~fv>Al3XkIim}% zV@mo~;3^i1he^mCkZx5=To4PutCTG^(d+W(g3qbLTz76;YOV#)3i_V({ z_OIJAvcH|a{HdCaV*6p4#8^YfL3`lSrPz+}>@I{;a>z_SFl}Z34@se?Bgg26>MyLK z)_iEFD?SC54&NRJ@uSBey(GxlA78Yg9`!m?96~Pa zxWp}&=O>QLAo;wG{2ILMw5Hktdi9#8F(iYhJWrDK@x>yzyJbYE7p}=MIo673@_A8C zaL~AoWb`XJtm4g_HaVBr z0I+!}@D9^~ce#WXqNDGB_Ys2@v%5E^X)M%8Ov(%><9lA&Xv==SaZmJ0@#SOfW_=)% z8Ws$oBQJ)ykZx|o^&<|BiR|uX#1k>?zGl)T5K_`DRQ}^nq^>v(<5;(y zd8v*xoUiZ(?iK1-OvYjUl8?!vT{0Lv{p5vhs>j!(gHx>YHY8uI-O2jDMNmT8m$|6i;k~A_$VS%@xbUNutelgY2&>A`2Lqx~| zE9F2ok;1R`V(no6vF3OBcr+&SEAz*j!v;!WA*G)XDLjef$Ueso8U3IMbDI66*qSm1 zMOKpX*FRa{JgXtPg`e*qMb~gzErI_gdl3e+grjVjb9f;tON4j|8?EetzVkokCBJxh zERCp$2fhUde$!lwLtY1KF%Dh+E@${7;`J`TssOFdpL4((2@gJ$g@U7tG_#{y0UEZH z^J=OvBK{1w!;&q1gCBxS&Mx)alsbk_8U#8ZJCACq#QTmB@{l0Lzb>-So?eh=#cXCF zeW}U)w39ELiCueCChfTSc zq?Q$`=)O(ed5&2K*qpCVPI+k10qJJGyGj~n>N(j-vLQ}tx;@!3<7w~=tGBE=tnSN_ z3Q@8NYQry@g6h(ev?bJSNu^Wr!{vy1;VruDK;7FWOE10t@CLItW~XqI8~)+fl<<37 z4-bN*2HV3|U)heH_M4-bjC`E7$5Vyd$nL%e7HWg*4`J|CU`4eVu@OV2N(Va;t{^%b zieM3R+?uTHQ{Z9A-F36xW>tuhL=e8XDi+^P!)7jV?RSQ777!LdMKMHkzfH`LJAoA- zgT@Eot(Q5_vv)tmeP}f0B|AzzpG+=%Jf*QU?eX6nx&gi`{G8d(ix2)?SzOE#)0Rm| zv>x2n_Flh2^CT_5))K-UbgLr)av<<$PKztXaaHz5MeIW?DT!|g zQtx3zy&Zxu1-boWDJ>vWn&2i*K>qVmtoUiLORDZ3r+xDyOWpMrqY4{y8M5mej%yPm z2aWm$ewj?^Q;YlVendklemDOH#my~@EY=Wk^dyc6!b^F28h+kA^cnVLaE8~TR)F3dXHw?QD%%;5o%%z4i zh`%C5;BAKb4IM_(O~}sgY+HbF3wjf47Y~39j^kFnOJh-yU}IGfE&9G?*rb{67$V5e ze=Eq;OaBfa`=2tTe&0Q}Cyr4*mWN;`Qbok4983Dr%$p1eAi1P#4xAoo@JZtAi5~|Us)3hMFE7Y=dFNUj3&SH+1jpzX|rhoG$vhbqL~6NbXd^ zM{=_{NcO0<;Aud*-f_uj903}}t-=A!e7ftDR9yPFOHu{It&#@3q-ZUOG^Ox#I&zg1 zLwi)7)tEeU{6AZzCk#J%lG4DaiLQmB*;z5rxD+&JA*Sfg)ZZ;7)6#Ql(JwVd1GsI0 zJT&(CT(M(v?4HC)Z#zGj>cCKXV#Xt{CdxQLiR%8rBgQMiVJ%`#GD52)$Ifdt2@N*) z{uM(LPvCPBy_usMq=b8*uZ7r$Q031(C`A**J&jGF$=x7lxLa-ji3H^Sm0|ItF!l1v zu*ADuf-H-U^+RDE8&Y_1^;+!$zwJa?l&pbK#u7XNGL~p=%6DXILxL)g*u{ zhAPD_QQ7`_9PZ3sSYXvd%Gv?bGjiUHAqP#FDGl>+?cZh7J^K*-a4~fnp!mSB z8m^?Ft-eji6P(u!0|)!>)H?}ZzzYeF0qjw=lrcVLI|#2--mfmf8i$5+U1tCbhxNHh z;3B2b_zD-!R1~W><0lD6(WDMsxd_R?4l$qc-=o8d9}Lf4U0q!|h8!ogDxP$g%s~p~ zxGC;o?#=)N#MS~tvy#T=gL6-(lqqc8vCVC5({LmNTiDqhq#3zp>r(d1kS6%fVnZmB z7EKBCr8?3~!Nlc=4Ej1{D7i$jZy}rSs)W7`4+5JJcBXEEGK^rmgMO1W=WWOH`7>(c zKw%Xet!06Bn%JxL?ed*K%HH8-^WsLbsfYa;jc%aDa+qYmvXnGEG|D#e+X-%h$-dc> zUFxs6LpfghM+L1nyA#1?po7z4OCF4o^2@^~KNEa<{@M&z5>-K`5pZi>>Rg(?>zoMUh(;^-D<(Z~)G8*+3Oh44q;Z{Y<5YWjV3Dt)KM{k~Tfx$>w_jpDrO! z>f0aE&_)t6mx|DIVG4CaM*$W#is;cX7S^y0^io266m7<+8vO(=4+>Ks)ULvKgxQcH z635P;@#&nL&jKo31UfCTYw?EVp4(e?M4FC58LgMjiv8n)iB%@0nT5GuLm9ZOj}#0v zM6{DuNLcE1k@1XWN&#jW)LaXW$N0q5D%u#mulmP^jlVYdzHYR@8TCoGYe`5heXwTo zCCrIhqsFwsDW;O**>i=MEiXNmSnYh#A1k)3?XjrNRysG~5ki@Y5_F<7C5=XDKpihJ z=f7L;DL9AR3N?ByO`MrY*lbbp?V@+bp!>@!AW38;mW~*VloXgzM*28O+x|FgrI7gW zns=Ydm(*~X0JQX>4yLm`8}2AIdNMil*&-bqrV8CXaq^HL$97l;-88H+)NQ@t-I%rT z`R%C>iDrDAWQU^#{bOlfY-IK&@Vtp0zh>4Y7}J!-Zl5QceJrAvpD5VdK^CBEHtSYQ2 zUhJxT;YT?sGG9k`j+e{-NqQ>|en}BK*#6)|k7_oWPv8M-8!K)3?UuB_?@N?^^mclb z$^x-b%8o30`)Ketb;j85wdYff zbJAN-`Vi1q=$N6TmPwWY(4Z7~oYzs3UN6g%J6##I>4~?~@We0RNDT;f7qSuh@EA_{ z-CGcA%JrC}rW)0&a=XEQOw`aiiW2|#|16Z>YUZ!M=zV$N5U_59iJ^rCVn$T;;qWIn zb+pPU&Zxfsz2&Fztwza}-a_R)?n2h9U|_Qk+wds0W4`MUv;GGHM7H!OA55Fsbq|x- z+^i3{LqJ%55FiU%|zp3Vessqi4v#1xi= za2?H_QyV{)PJx+(m7bj)s|gYMKHIm#GE|(;kmfcoyUrf~fVbZEk1fJ*zM-)T*slHk z24h^(aw6Pulq{@Oi}|GWDync&!~=YHql&Nke|T0mtn4v$)j}E)geYgf{(8` zKL~0D{-$X0`D+xPAVZu@WjP~EbZt4LIduV6<}fVZcgn^M zDatXnZYYqc7@3vhwS3I=zZP_Gg=_hnQq?t~tC3G`2)tP5do9{sUh+a&S)KbY@pEb1 z`^1$$g8!d<2m>Q*5n{~e|CXl(c7=FUj)WPl&sXi8tC3kUvpVde+lCt^BpIT&dHDpU zNLuDt0)s4m;0CX8ruGzNkN`CV_;@zqJxSvj$65bw@HvojBDT2KAI*G&_fCY9_M(<6 z>m8wBuCv=t_m0Ec_I7;ZM9tbNJ#>)!h=J{|#&Fh-G=^+cey1fwzUFU9UI~bT0GT{uB5*^4M>RL3H&nQ_p79?9Pp}EGDDuQzhCpOOgtjgO%{Bq;=Sh8JeibL|dM1Uz>f(^<5|?bV@}t1!qL5<@1rD2=7Y zUUC}8vE^|?Eo^mrk7|sVMJ%b*rOmxn!tssOtzB9kTmM|D;yCaCF}3#S|_k>y@by z-BdGcVh@R|w|rrYDb~WNvxE(dRY z49C)?CPpMpxjy5mH)RoqROFOL=CkXN2&eg9gtN0uWIuA(dJJ$EG2_Xbc%1j@=r`%> zu=H(RyA;i2hNXY*-@=-znq7r6VZ7BSv~bOFXDRE@NX0;OiPS2c+c1LhQ-LlYF4k@x ziWaa_|6~U-H|O{_Q1L@+;#=R`Xx6S~M8N0URt`|7j%}q)zmxNEo{m)XpOfytsaOHb zqowWKGDEs!(z6=&e(5YSJ6pGur=-Na4hL3f$O~b4?hXlE8W9CC-xm#GPdyy?#ziy2>0Zf26DJ3BFcAo;4a zB9YB^cc;~R15$AVz{r}a#zIcsEM7yR{Mm!EabMM>uHK}gtK=73TKIT${bPntN^}L3 zg?@!bQuIz%j7zsCgGuFd5YNWU94Wz{)t7)#Xif+d$v@o@unKeMKVf}+!=kpJv&^8W zQ-9A*mc4JPLgI+=dEdS+M99t(jQR83Z>v&d2GOfARuX3uZBRiX(}RvjD$W* z>l(5*u3#dg&-c?m@T4HJSle;#`eqh= zMsZ~vUFK>vf+U;%>9X6MPZ!|XFvMQp?@oj5C*d3DleLodIYeSKb!nB=VV`*|GFa?# z9gyHQ9lxlx3$U9Jtf3%!);^V{Kqq>jqZw9t$OZsUG4u7R=>p-ar!r*4{sq$@DWT9m zXlpTWb-KO}5tn5(L^*;@!$lmeFKS~OQaiW0_C0$B>mJWro>xpernlRE1ElNh1(;!3 znrUw19sl&uC!O!J8jeTLA1CjReU>Zudd5~rdc?xIc?kMOyoiu4EHXp;i6;y@<|`s zA)_`RlPovbv_7{}Fso|;`aec#F4YXJ*&t||x1VB0>vAc@)>W{e#Jv6SUA{RK?`u9B zDs%^i5LjYqq88W3@{EB>uMKtdT!jOk?rb$3+aB%t#suBrlUm3jYDgk_kNFB$bSp}jmDlZijk>kV z(dt(cf?h1XelOo;W5Mgxip)BhZdG@@Z>OG%O645|95? z{ve?(JO2?Zv9QT>tt$u6u$ns83N?@CHe7a}#*^4N=npyfKXC#N( zCo6Ae?+v_^i%o5^U{7gz|K_o2LNae%zBgm9M_I~3$}|ijJ9^g9g?Gy^0j3CNE^0z{ z{J&SGpa-5>5L zik-2&MNrhuXZ*$4jH|-F3Mq6kHq6x|Xk_&9_7|Fypa>MHpG7da1gus8FTV@c?`3|B zQKO3`kj?xx-x^MUL>3A&3Q_A5-(D&VNIzZmH`=j&YaR5wn&subYRthtC!Gm^Dy!v; zp~9ZhXXt@U&5Y3yH7D+CcLeP{wInTwS1IU z$3LH56xWC~dR|g@qCo_2W8CaOzk2FwzOeo`OpRm+)6A`G7(y6mpu0j&E~v&VjBDhT z*$1L96?`TKCLSRty50YdPGHN9Sn)r6+BgQcLkoN=ktf~j`) zQOWg`JsJR2NXFbhE~hYn9)>;`YUst)I&`LJoc>2}t^idb#JQ9sJ37NuHV>_2vme14 z&>FaU=psvWV~h0NOK=Y|DSjy84;Zl8-`?ggLif#mDHUyJ9<9;lE{kv9;-k>E&>{NMcUMjt^ky7?T3sf_s-PF@rd~xRs{P)3c29bw&11oK) z=>}}dsaw0Q*ux)woP)khgttChrJ$Lnv1F*gd#;ZMrn06WUMj5U*Ih-V33Cy`GK4R2 z<;*QI*i-<&cHDR@#|6CIaL_zMrtyam5Rd8NrTbS;4evo*YO|TZB48BRaadA;vYE&g zyM0rG?a%hS>Ac6Q(m?&6Me&1#p;h#>iXu`G& zF{Lj{8oZD=MQYzuyDFjg;uSK)R_)5t4KYI1Atv6pWq#uQ_Zpq54{>gR-{^+Os6)Ki zYN>xZLyb?KK3VylwlzswocaZI>9gg!;=^RZ{s+#U7#0!G4P6gewzvHYgTZ77M5JQq zz~@NH^N1kWS*a|Mq`;E+ldiOYj(1^8Yj$@iN z(cGqo5iZ1cA6QEyIy_uc2kAh&_`w#NJ7SuSugBII%kvx%iEw7r5mdB5_ps8gI8Cm# zbjmZ(8tfs2DbjI0WhYIyaYMB?jBprLKudqt>VR>NP*Ktp>P@CNIBq*rZjDYNr141X z89?>e&Xo%bFfg|}vj67WR{7CSHSg8-y-x(itSz}UmvY)9+Y8>KvQ^*67nf}s^VTra zDv!Jz)Sb7u6;tlvEsjzgXp%wbscC?U%+!92bqHcma8~)ODUo7|aIyECKY19N;K`3c z8oajYFf>28_GINa*;ji3_Qjt48$M^d9boD*U-qXjx!CU)K&;wiG}Ub+Pl4goF#Hpz zP(}Xm&W{3s6G1`%L)gAmW$iZs+CQ%H6Mha;La}GiJ%`@S@SM-tg-~(V!szq)lPo}9 z1pFd7lE**Q77lwSru&%56R6`_ImEYe+d6Hp*U#s8%Rd~-&5Hze78hpJXT6>W6znF| z+&>Z9udE#@PC??!kP0~r;^?AoAg452{>=}57Z`yCAS~si60I47ya#~wuSk!?U;rV? zCF8XlfF!wmg!01Pn1Pp+E3ZlEAHBlH<#w@K-MlKZS@KfO|l!XHC6TX5A&{$RN z@Lqxh1AbaWu){wMl9fa}FPpa}eR`=Rdb7-nrmmskL>@3FUP*4byHxzY?B&bt?4IaY z(`FRbWvHv>LU9~==67jE8AJQh-=Kvy#w=XgPa7ET~5l?4`i~aL-)IDihrXS>vc5DAFbQ8s-KCt0Oo-R8Qtep3u>ctRL;zR&8xw8v= z=QNE02E_;oZj`9#kgnwOad}J$yl==H+*zax*JLac5RpQLu7{{5aLxB!SS2HCQkI_# z3mJ&=J2rf+0wGPGI7DAG%Of%)6;a)bt9rO8|sy0SCaPGsxmTv)|!yGVI@)oQN)g8464;H=ZOMaYA#^wf=hR!tS*V) z1{f5+kaBv(0dI~hw)r4S{zu_+pO=-I*k~@-d72Znx9Y>0R0@hj)W}LH5>#KKZe<81 zYUvN2;+K{@n^P7zI%K82Y#1bDCIM|w^_Kq&G_HyEg|Fj*sLWjpm=_YN`{@Izo79Vi zS-l~%QK+d?`g92pzV7n0WmbvWnCRV@o2VIYmIHFHp3A>KK4D>ZqBZB{)z8JkbvSlR zxcE2%ayLwi1f~>hLgJJ3-4Iz!bw%jR1|8YOc20G2rJ>9vOjfh z(z}r_M-+I2cckcBk)E-H-^K&M0+pw?^k08t0{y53%>Uyndu-fwCh(45&C7bvSMDmE zhaju|(uUVW-loO9s4r-zh;c_b4}GoOXv?+oc9NFCRrF&I#Zfm0WBg_K=7#?nf%b#* zObqDqyQ1m>Ljs=6LvX1vkXrRvJ_!dP2g!yTybmIN{|O|yC`A$mM)f_Tf=fADkwWnR=}m5P0xLU_ds<4?J*fe_4mdq6k(E5Pn)J)y`j zFiZ3u;ghCkv~mHmvp-weJyTv^q3it|>o4QrQ`XYV{a*xwIqo z=_~>(YQG3MbSi@xe=<-rG|b5*Eev=lYH*e!!;Q;~ctn3~HqPh!!R3_ZeJ(IQXe3lt zPwn3nFwn3j(CL5T`y-@{? z>GP11*U;$?2^nyA3HFsTvOR>CzrbCyJ{P4l=A|1GqS>G1zzCRK%|B0XFj)rYcuna) zYLDY1lZ{XP^dkBi)bSz`DVZ{PtDJ)#taz0F`*2G%pmwA*7kaK7H>M0;DBwD+;-=@2 z2ODeQ@G!KrLxZjxS5b@dxV#v%Q<8e==_voM*U*h@$urFqi34p|-KY_Jho;@=HO=}; ze!R*Jy*@vIA7aDkaP7bJ)5?ayzbhc@w^zTR2;WYQk0@h8h!!65k@B(`X;%)DModh_ zKE*)-U-y0yWcjNNdl-mxWm2Q5itVeLv8?*Zxj`AD>05o;arsT$K+=wUz`xw5>aumFLyEM+ZfDrU`&7jZx08p3>xr)iGJ zLt4g{v>Y12!WWr#bL0|8Q;i|{JA~9nMl#I=t)utYYrwd0LcUpa#6GMJmHX&44~J7# z7Ch<7wrWJ|`tx|?K0l%fhw-~_*?6f38z)rA;@p?moT~zH4PlwGsimy*U(*?x!5^Nq zS`d1bvP$6u;Bx|0ZV-|khX0R! z%k$-xgQtIG=^!^L1Y1$7ue%FFTQ>xoORKMg2c`fqF0AVX(au0)Dpd{?Ct+AqJ|wt~ zZRb)!ca4h{m~Gv4*VPj9=42@SpJEDKs?HMgNI9DvxL`Ia<&yZN@Qt68bLBLL@k zKDe|Cr-U_G&vZpN%+pWLcn^!fZ6i>$^g%`zzT;M&Ht=W$&zC34!Ws1lxn%FdmX;H8 z)B`jre#y2KbxZwI%~-$SDc zj4)9tIa7K{J=~1C1&3?o`2x^i#e3KZuL+WIs0=E;zapy{R<;Z-VQ;zf-F=1umBGIF z!k1cA%;Y1=Q90 zPw`@?zy&(vyr-@ScGyz>*!#x|jD>iy&_gJ-c+h`Cai~hsAQX1u_d;E{);4Ci4IgDE z_x|rM?s3q9X%TyYf3+iJct<(4a)at>6%Y;y&9eW5>?|U5GnW9IB7PK~5zIF}=~+hl zrAGyExa}q*L~bo(WIO+ZXFJ77!L`A`IlF!W|My+`{dIf-c*Cnvc!y<*h@(214ZViA!yuvH>RNtM)NcW$^K(h&ZT9;Mp1YAE;a@ zo8CMx$bvbzCd1!$iu&o-Qm+L=+VLsq+-2TGaf5cF0JyrXr<7j`)}y zoFGljmW>_TgxmQy$>s;Jbqoi`j5R2^^%Id{M#t|%q0Z^LW4pLZgYQZI0|S&4E;i|N z_tWM+)t(9&o*+;LCbjoE^yZ^d147S;}0uhKZXp zn5O^yd(vNw|0vYGr}m|mQ&REvBH90Mb6)Du+QfXjB&R%d zr30}m$g$$fn^onq9p4lI@f()1B{6Dp(E00jzi7#9YL=0Rdrw>7?0<=KWN7)Cg7#~I zS$kEh_q8tCX4&}K`Dq%&SkAA>gj^H~Npjte(c7Ew{Qlt_NmH4wgz6W@aP-6^@g*$= zLr-4!47vak>LmxQr6_T7x5;!gH+`YM;+ZtLl%9hBZi~cJ;i%EFR|DtRKqwJZMTZM< zKi!4RDdNB?W}O(mMFlIOZ^+|Ek8Xp8{MX*E54)r_@$RXg_aXZtIMD6!A+@%)pnRhR zD5ul-Yu3dOW@4hFyh|h(W%|R24q@+y3Ta$VNu&#>n%=Y zUYZZ#HliGZw3?j611{hFP0b$xqNuPn!tEe?W(wtT+n`Mor#!TRyyUj_wj4T)zWDm7 zueE|fw0+DY_k=d|PELB0K`TGuuiYL#-~5{V&(Q5=b}_0RBWDQaKDpK!;%U2^GVFlW zt~V!7Q@{&*i`((#XAWMDv$di03tF^Z8gR?GW&pW06-Q&{>+E@B z_ioea%;kJpO7nDCtvnL}Ji*sb=LWA+Kn}x&)lW`+ttKw-AR?FKL|i6A69{;L){OxG zF+9zuA(tdh)fC`jEYQPtREI^{-+OnWrnVc(k5T5Byw5%V7U4L*hG6Aih9U5~eNeTC zEU22a+(bgY?`NPWAL0oY5zWpDoa9+|9D-erjtUtjw9 zsgk?=p2jF0m>uIQX-$< zpsIy$TJ75`ADR9HYi-#1-f3y6!>*THl%UC*~3y#20? zpE#a>Y{0|UsEwNZSyRg{KmX`^LTkvBd~}F{Df!Ao1#jl|IsDO|#5#jReCwX*#&!tO zJTR!Z#*xReC>tyywj!iFdr^@*%QI*M7HcHWo$sAR4SF?BPteyUq8nyA)tWoCa68h7 z!-d61RXS?m6{y}>hU=kK}c?{i`-ZESL(}H$BddCySABh*?|LN*Hwxx~;;GIsx#n0t>=p<>>gFOK#<3!J} zpwq!3dyRiV|5V%G>2mxM1uM|N>zgmlj@M5mwPVtwQHEciQ4)K70h7-IMowmVKnC|- z8bX~YkkminY2VpIg+B}Z5R?v(5QfTM3-a%jE|vo7Rpl^@bgQx8bOkcS_V;nx>B+zv z5UH3FG6%E6H4ln9_-1y?{>wKYmqc&@Z&8r7a=VoVvqc zog(xz+hXbzWfnpnxQbK0#-RaD1v<=I)_;E-FJJo+?tZWVaCaw4k1G zEhSlhxU#L2U1XX*|5Q!GhNoU0x7rKEM-7Q$w6z+r0FE%QGfD=AWj ziUW0>GUuT)y7caI*Sean42mEUF_D_q-_vcVB;*a+DU+AxsJ_FnS9peS5zNJo%kq_L zCG$TY&TJun1FgOfskCKK5!*CUXRL(vxn9!&&OlYHcdcF&U%Kei*d|jeVj!_YU)1Fp znm^CW0Iyp#Z#SsJ>8kPZV*b9(c3)TSv<5k@87lB}0EfQDB*5JWVW@F=2cDXc!TM_I zGx0VoHQ;w-H1fB}Rae91VK3Rz2@e-1wVC_FX(ANSlmnCU-)0{U)M$1?mpqqjliK+3 z4#Pt6wL8ltym}N7U?a3A8S;He3kBP7nLVxuB=Cknfj#89Jog~`3coZ zYw5FlK!$pR)q_rC4xOMbB7JV78t5^JLLR&6x%0-R+w3~`y$U?m_-wtGkMh4QU&Y^y z)KG4RErI)XKkBYrRHgzpCdXtjGnm-9(eXTei+5*yJ{yx&NxHV(vY{SdwX8EYE$FNG z!bwwb?z#Sloma)~3Xn7wc;msOD0=-EnlHCy#eks|YsP|V5YU~nQ0zvz_%|oL~vX9ef>QG65E>f#Vr;#<7HwUeA4!sqMnv%lljBGPv z%{JH0KXgecnzdgX-b3*5_FbDXNQ?v5J)TPhD-D@0Y^zd9?cZvBEV6P}^Ph(3umRhC_cPmj2{xEIdTepls-Y zK%QYEj%6oDb)WmoK#~jfGdI@CmywGZpz{0&IZ<8`!{tFs{~m(HGBee>7A!eO=Bvux zh1*?|dx_dMUYiL(ywc@g*YlQCVYnuaivyuMD~c7c&z zQyj1V4)d8j$kYxZtFm@wy*`Y(Z9A^7_s-s$Kb-R?GpM7ean^7dmYOXfG>;iL)RAG8 zi7Q$sTzTI3F;hDxC(7GVH05uM)h^_>v&s_ojsBt{ye&u@=x7=7Y3kDfu<>Uymfj|7 z;ZS@CxbIu~DVT;SLWn~58kX^FXk|!R)d4@RVCf>-r)_u{wAfI@Tr#sR@*W1d&Gw3< zDCvjurvQv#m;%?krG>wyIG6ZnBDP(pq-bR=8Z_*Wrf0B*$YuvJH2ti}n7B%*pV&;0 zqvlY~$co*5^~>n34Ze@=RpurJ=XK%fxk=D}Sz8K~;_7GtaCI^$ng8)E!f4Md0ejxo z7i=F@L9UQ}VDLR)+W5*HF1Hqwkw6oxC^EN~x%q@h4$))lC4Wtor?ZOr_iV{T3m>nI z?=pJI8p%mL%z(A>b_5XJePNuk)SXILC)jFaF*u(%>EFTI2zHH*VCJQhuvt+Qm`zNZ z3UJ}L_41H((@DkQ*C7@U%!W(0r>^kW*&GM_o+3!(X4xa=^p%mrIfSkdG-?%jWTO+I zZV2PuY8zC({;Z(k=Lem_YbpX}b?2vQJOvW`1zW{LS z`d}zfR8}Xni7srr)2k@a;ju+$Vba0~o;w$>N*dzLS5 zxK-$D!dZBxdkrqRy=t$PaQ3Q^lZes}l$rxtHs)U?ifr|DIsG580i1 z`AUTS-C$I47(l1_{PPm_m=@f^Om-Vzx7zvqAzC1{J^~j~D@lXh(jA^1X)$`CcWnqj zdHx+WR6Xf9RSYSW^yUSIS8?wDovPJiCW-Gzp%G3B(7)0BuBOe&zJHQueYw15gC}+By5!_c$XcO5}z2X3s4bTL?gcWXG z88;ISS244WNN#^J3=Q(C%5|ildE(^R$)CFCqAR)`D;vflJ<}(B;Yd|8r63BOA)=^n z`O5RusG6qXK$Uo;q_4{69YmRax4dFBS#&I8=_XU@e$(wyNx0&ywq9l7KZq8)w0j=r2R>@hZ@8g4N3H*26h$!RnNrBy_6a5P@ zi40(*>~9f|blD4~U7zdyQa{g@{R=Xa{4GgJbSpnYLn_=9HJ!utQLX`ypgazTu0KuU ztn@R{Y}WqaT@ppgpOTE)x$L*8sRM%5{HeR76m2wCPoFBJgJw?gCS~1p!U%X|qRh3D zsFXVpb{zBIOCB;pjBk_Re`Dcmz9z_WR%uNhXMnd45U<`-4b>-`gUakI9O zs6;7AoZ(JBzEH>AFXN<*fFG^N;HHO1gMQS2I>^E+c^EAW+HSbcji0su@O?UGBT<#u zAfK?OW<@Bw-%qhLw?%u7&}>bC1@#CLMaWuOMkwlrm7v*u%JF-Uz^#Yks=}nDevUYE z{f>V=gks%Jh0&4EcE9_CL!}6N90{;dFvZ05p8DhxetQ(+BW#ILzL><(3+`L2_1JFG zD_Y+^?kth}-W@Cv=I5zmfx}uG2mB7@4G=k|&$uPsM5j~6-#=dS*EU!M0UU9OH5tQB z0)WI#!e=cZ%k?aElPqIA5)FukhHB-_ODrZ=RqxLBUr%>uLQ7Wsl&ekz)CPDBDDuHl zoa#3!c^7O3#cDOOhif=$^R>5C(M`2O$SBTest8`Wrq`*%_9e7S$F$!%o?zA1m=1Zi zcFG>b0;7>ZwUHRVPM`n&8s4yC`P?Mk9L1`I!PvoVjqnk@r$)8>PKkpgJJ~iXziw5!bnDf%c}Z+NM|b(NOvjqkTE>g1y@0o7H&-31!c!4P#jO}p z;G7q_$L3S3>FW_{!qBA5C=pCj$+WgCdzak*$WGf*n){u3^!?RaD{CQ=35YJLZkti51&W2>;Yp`$fj{cQwx(?YsKRfOFDVtivRy!|IOg#3wR}?y^R?pd ztvzrGO?ZLUlthV%eRfx0)ktr3H;BQqe5AO6Fg}T*jMbLc%b%EvF z@`-ZbZK+hZlQCe}38-q4#RqMSuyBPE(w4gQw5ru~o6PfeO>t^yyxYz{LlsT9Bk@MS{r*oY;dge1~J-ZeKC$INl zi}4|8-;vo_X1t=$^lw5C-TrVU3Ps(CwT+7DSB)eb>12jW*tS4&`1=LOFe!ay`LTa+ z%1$_7ON^)J>eQUPsKUKH`4p>;IkPrWW9Q5IRw-~?LvlkCuhyN@Rac2GVwZdyzOrQm z%jtWbV&r$YubsnInoH`_5L;$4KI7M5Hudlw_o>h8>p9oS9gjPDM zF3MW_ccWo=?SpvtR!k1FB>&iaoV^sg&wac)Cd?rIXZCvjX@94oSK}otq)DP-@mR=P z&XR^j)4r7)_v!E#yB3~X>YH=(5@A`4_qf%JyvlLpk+}CCLj)bK-nzjo$WvI!#I)?c z@)^J-fy^Jp!Te6`%r5j4B+0yH_bkaj`}{=}JN313=&S|cG6bM2DyN7kj2ByJ&3G>2 zGHXMbBd3ayTkR=d(Y!C{x5t>Xx_isB)V?pUp2s3jf$be^0nRFwMp^i&qCPRD zW3AUd1LTrr2b`EYB~H3&45FFM0hvm|$J6U03tlfvFR{vC0Fsqg;i@t=KHAmxF3$NP5!XO8*9bFOhU>#yZ5 zU^wNwg=8oHM-H~_nS1%2NgKS5iE+WxNA<<&MC*c@Ictuk(lTuqTTeRT3*-M0Duvc)K3 z@XedR@Zr}=zm^xY8Nn`wO7eg()uzpgM!Y-4SB8&(ie!9JQ%@Vd92(PPL^2B zs~s+FMuFjr0xUJqTTzaD?=jNWS;7<(nV0}l&|gAnjeQ9!?#tsd=l~95z;QbVy}EjP z(*N_xlGXXPvU8MY3FLHM_|0VM@;Xs!75G-*Q{Rs0u<NNto!eRO9^!O3VBUofD3 zn~C_{&e^-Gcm5*2Zr$d$!i)H0iWU(nU23jZa-o${5DTgSkRL-Tb8|6!+9G*e7AYH; zmIdnAf6}s+`-b^L65pBMiq)rJh7`G7rM_K!kCctVt)&WncrcG2vCt$9H0w4I>)>&$ zgmvQ!X+D$HWBF35TwCVZ3tFcOYGbPLPw|T*`AVp-4Sg?p7h_|HCO^&AI!T9bPu{n~ zWcoKSR%y;I&i z*Mh@Mh5K>_gW|E_-1(|yVdL*e(ySUAt{_R_i8mfFgyLG9KpSR%#OajkN2d&R6wW<$ z2IXQj%h*q?HM^L~n*jy^Ljr{mV3Bg#2Y+Il4dyoGsS!*cdv!yUVL7^b*Xb`nw>-V5 zbqS3-RPxAG@o{8rCln9uTxEYS-R7fEP0CtKIt0)w;VC6oqxImZ5|=Uq^a2;clonUN z6-%Yg$Bp|QOh-zt@^7hdOe*!{B&Ojd(JNy;KC_}$kazzEK4^7uzf#xxF0*oEUT2+H zR(FQz;3!&CzWPF|Qm%Lq3{8}Ntrj{vy|hv%PE17A!JHCs!*5r|!*8N_u6|4@u)>9x z&%|KziyAh#_3c1e+HjlLrTF)mckN%YFL>oXtPieYYPsz9KbNts2fzrqVp$s}uE*1= z9>y-~)4DC~-cM^C9b6IZ80KjeBimI5dgF9uRT)u^!zShJaGJbjBZ!>60Je@Iot?S5 z{ZaS7of4&!Z(*)h-yEFM`E}8G7(V7H7)pWgGxnY~nTIhpwmg;;nUK!b!&8x@L9v0> z@Aj#8R_e~Y-(b(wxS?~s>1wDbE(7a7TBr%(pt|9&cAvMFiuicmi_?Nuc7n!eSWDypA9?S&4L`%s$H9P);u;XH}3u@#BDm02Tb05T_}TqUFHPkPFbjeTnrZne_*n<>8c6U67K$BujVEhX_Dd)7 zY9fW~u`^X{Vk^qCPj?3nHAWxbdkkFG6N_dh{YGU!C!YTHDyOB1tj7G>R}68340v zXE8SO)zUg{&Pdd66bQecm6PeFjcpE`8H1mC->*-*gAJW>UypB>g9dj@`}_hIL0`9I zbagn#KEc$b5gMeCPLe&=I19w#}#)h%kuz;GCD? zLF}ZeNNWcujv4R`f!$v;9vTB7c|Et1CL{Ua?1j~dB07|ww0+jz!p?*21+Q{&!EcvW zZyN3HzQcU0?kQger+XSA_o_(GeY=Ebc_U|kqU(CZ8z^yVn$@}0ePrzWo^3umU>v!| zKwv{+3Cq7LZWxm?)7+J`t?0fFJb6XcX?%XWSc!5DF6b&Ta#k^=tg~8`utRq2KIP8k z9Gf{&5!+aC3hMsbGN#zouAXNtH3;^W%QDEt$Y7(?iB#-|YU4DOH>=kaf@cnA8{6*a z5+CrJ)9C8<`O@r@_a`n!+x91RytDyF$11+H=5;m=1)xDto7MOBc>3&i6=8cBlAqL* zl#JqzFWg%pqk}h(Jj9No(uQ&SeuIY2*)iuf1DE-6lH>&~BHRuWR|Hai|28V?mW6he zFSHme2x9<8I2lolDVnan50Cpf@`VE z42#7Of10;!FMOUn<-xs=2#c{Kj7@2q67z6Yjwo6n;k1(T}8oOK#G2B`%179=%N1S;8wC(Cw(jLKCe zx>|$`N0HZh7vNQA_s#kslfu{#%`E+nmUL8eLlzS)6QRK4^z$WyVwIC~Hpm1)IiFr@ z4T*sn_wUyu6I*p=E*a1dRpOF4WQTra@_KE`RdHW+@b5n>Zhb@WWO9pZjtUW?WMN#A zzV53L3s&X}dQ3gZb?=Y%-GhB%3|%5Hy4H*tQJ(ojvxfOs0gN&}3&l5rz1+kkHNMzM z0B+zj1v6@-`yENRqXsiL0bR5p21KS;e&7ftUFG!5)#hbfsb^(>p29r^9KLe=jM65e z7neEz8ZcyD1=g{ac+q1!w3eE%^7QuXe|H*Epr2Bvw?*1} z&$=tQN#7&^#%Y<0_};{4q8~RQP0iV_tE(pR-1zsnHJgtuY2k*=4M{Z>_4K5N3#{l; zktTE*l*l+Yum-|5IQ<_fY_x}rFIXia0g5A|MFJ!aP|i!dCtpxZ@+3m|nJFbArUw4~ zdeJ|8<~khBoNqLDbRW4Sqdn_?nldxpOvP z?AgVa;w&_FIi&Q$P7eK&5h8s%$7_(+L;54=i2~x`UtI}#!DBshjWVvq2{quDPa|wFPQr!{J$oZo@!auo)66Em;Nhj zRF2oIT1AlVKU-qu6ED0b9$zfC29ihN2A5C_`@$yrJms4V3_3Qh)jdrdU$8Don8fLf z>vZic#r3XEf#n z0;v1Z9}`)0At&VKUCH?C^v=Y%y!re;x!2x#tfK7Ez1DohSL^-WEg7b@=kG(#f! zX(!~+bzJH8x>DFy?>Z5h3@z$>ji}hFZi2Fl8{ZvwkloI{*C<6A$daDu;G_E75@y`l z(J5U;RT=J0{bX=108cU90qVzisnbe(J;U*xd5Rx<-oyhi1P7q z7NpL2e7{|F-&C`$>7>-fGkq9=3g4UbjrTXM;ccR(Ah6;i0a**(L2P;9zdA{kls93P zFotodI^cbWU#jrr$0gEQlV>XU{ekfnU#RxFuZgUOFX%pK!3^I z-v1ln7HC|N=qt9wx7~7lboKZ!9jIy@3IQb}rvjUZQt*Gy#!VLc^;6MEGuQZk0;&-Y zfm?2zs)H3JG(V~Llt}a{Bly{dO%is;b!wF``RR9J84l4<%AV6ylJ|oM zt(${eIq~FNz-K(q82&eLH+pbe8bKrnf89kd1d6ujm|3KUA;;(^jD*vBSQ8if9ST$n z9>#0iOxE~6lFlhSuK(-eNn_i#ZQHih*w#di)7Z9cG;Wf{o~Uu-OxU>bJHP*XF*h?8 zXP!CdneX0veb(AL2a9;|G7KG)L~&pxJ5H0#VFz{bM4bXpBbJ;;#6^WH8M8sjeeqlh zj&z^0t{En9^TlzU$A7Y*Tr#>az%mnM%x_ARaPu{od_u~|`BAZ`eDTMp*Eq>|u1ec( zkZ_i0q6w^yjGTUU^B=6b?TeSw)7!2Dd0MLEl;jdiZeGUIJO$K)T0q$`(7rF_9K5s%Nh0V-|j+a_fueJzK>s&DnC?=Z}a+8o|m=sgWxE6+vjUp zP{j1p>b%%THvv1yno7I|UG8^BL9XW50kp z#DQPBSAqHf-zmR$lX_M)>$^kR)o5uub%kB-C$xi&V@>d(HUP^-Ib1yw1-^KZfmEdeG@ zLZYn5rIun9mxKkJC`$-w_@qlm>%XiDa%?c@!ZblJWav|02zS*Y51#IZIoinC+?wQa zlP{lN0-dfOLVb4IM;WURo=d-eDBT6OZEgqZH<=ES{hB;n?YXFlk4>#NV2KYCsHqN; zsLZNoeEEGGLK9OW}=^*@VlMb<(ZgRfS zFt(N3SNuF8-yIL0Y7-Xmy{RwGAy@;7hL^i~XKmK#h1rNZi?y&&D@=+F-G)sB@VR^u zP+tP8WRX$DGxoVbstK{9MiNMMk++SahF_+4{K{}zFpYb?pAXQ2x?}Dod(2ZrIn=`d z2b@khH2xBU9ChV78=)kp=}U#paMP#!$YXXd?}SX}e2*(rTYO%qqJhQlzO=rn9G$ga z7)uHVVY>Z2H?nk}08t&^6|^}hvKUAc68c>-)!f1&ZMausl$q4+kA9{VfXWdkdt_Xp z>8%$$t&HIGR`Fj(w4v_MJOg%eWO7_A45brfVTl(k<7h9W+WL>+a=C%3LIrn0c08}W z(KfFw>)eC9=boV!5%~af`22|Sdr3e^3H*p9bX&uvx1Sy4;*#pJ0R_0e!7j&$8Fn+v zdC{MkN@sN2WoO8cEs&;os`beYPzKB1?gRP9TD|YthDkL!N%M-5H1MMH%X>vhzRwV! zc9uFs{WeE&U|RC|uRZu-z4kp>`Ycf@ox-1-WgzzVzT?vD4a_4(-Uul3I9dl&15_sH znZ)=5O-(7O_xxdd;wW%!CW6`{41uYaic*cdVH(zPH@!70>$|f?1qG%lpkvCjpL{EV z*i<~1>zeg}JC{(f?Bs~gGdv`y_VmoCo5&E zX9D~w;uMAzZQV&=LMTKQJ!vNmV_Z4 zwszXh_KaR)4$m_#!c^%K@$4Gh*MLDZ=|(UXm$QDi;%3Zq{WLud2E2kiaT~p}WHa0~ z8CvZp>2k2gMLqtE`Ay)FmimSw*XH{ea`O(`iA!9kcQ%tNu0(4zTU{l0NM3bu@EUwq z8KX9k!L5gOOz5JJ?+y6~7f>fBAeI+t!z?kl;?f)Yv55l%>JbZ;q>*fJw!Hby|Sur0Bmd zX8tQ<^^&QnxF_sk>6#oX$}zhp|+qyu= z@vw7u4o=^p{)=mCZMnryZ-4AIs*a4eIh}@i)QI<_Gl;+4EE>(Xpi(UsifuJjF#$`A|-Xs*^Ss`J9Z7UJzJlCN&~M zn6?|hW&%654S2$z^gF)iyl%g)fLp}gZ7dEma%)iy0ZZ06u3-)9;&dxir9B;usW_WX1%}#9svvKu@2d zDQVp1x_O-47#hun2(k!ai+I^Z7`ljG9*sTaVy^U$l8EgTc-N_>Qp zeSzjt=bx1-EE=!^qkHh<%Hk3PkdEhlRd>qo{0-`exN6irKd(DJUfLea1j~0pp1uzt zz|$FtE9y$xrEPFCQ4;bf{(pNl+n6gU?mB8674{`sE*7EbJO!n|ML_nHh)*n#JTPGf z+5)V8G~AkFS5E&#D===iB=KrmgcbSY7$UZ^_7QAqXM=kLvq3-=8C8n#`p1bZhC)m8 zahjZIY3_%~;^)#^&%kETKQ~&vG>%rr@S0yRrSLY7l=4{0-?Q!NBV6nkv`%|PI;--B z^qvEyj+oMIpyc++vOyYTOk3rT2Ygwnod;MF5$3i@PakUO|#i{X>DG$$a?~)+xU~@t0BLV&dfC9v3h`jek_vK8mx6Td$SuTP*sm z*z^Kk!PQa(!|RHwUrYV4;OE!fzr}Z*MfAdzh5vfQlFwXPYjyz+A zAi8YXBDu*o_67N?q|bc#Ut%AgrsOudhx|HUZk$LcU;L`jFcy=lg+zEUTr%W9 z6Y2vCec&i#Xbt~`WEClKs!|vdzG zvD4aCsj^SaxP79}v69B!Ge5H6O6~6J0gB!6yCR!cf1mvhU*3vO*W9vszs_8zoi2{; ziiA5149U8{tZFz+8x{_K2Fh+%bf?5w|6lPcx)}8mG*nqXWK+WM9sjD-GqoXvs|IQj ze%cz=UBzHNoYLJ{q($)5U)+L`zYUd^3!zPDTBBD3-*WJD5f)+z}d)e_&R?>OkoAgO7mpFsIa z-+{G%MoRGPF;Z9RL@V^HY70Q|rEsMMEV?=}X%7VJJ15~!=^31peo^Ikm45IY?#&$<}+`9~XW&nYj;YN%&MR@T?XS zVlewb9Q1owwUiqm3=1{G1~&g%4xLlzXyfdnWvkvG!vle#Pl%;oM#1RWF2N~%+Bj#n zxaA>skG&x#H;O=?f!<(#CPnZiQE06HK+{~}!AA16@hT&hm@6@!gUBWoVmhN`8$_{F zaVR1i+A4(pCggsJQ)M6tQ>cVwP-!xAtUz8bAU*sh9&|Yy3kFQem8R`FQHeQrKvHhy zBDxhkllBsIW_fuw-Rt#pW1Cm*)wGg|A=Nq=l6BybinE&gfQo$N+`93oZGc@m9yD`C zrGW&d12uJ!Xewj`h5l-YCha!TBw`tgA_EH2+O*bT?cmq1>HvjGqhwr-vJ}X;nE1+b z3eJr)shDyVpBMdqY;|a4k9E<<4o`a{v$yrF;eh{g({C626mkrj$W17=RD{XbxT>ly zfQv3FYHOZGL~Phoh&k2J(8!u)N2(;Cs9zFDB*^dm+SPsTB{9D?dI^s*tpu^gJ9uJG zlq7Ea>(C??QRI3~xQU7gJuj|wyYyxs9Evgwf~S+6N~%fadwi!@$_?bv$5a(dgninm zX1dm?$Mfdm=M)Y*qGh8hg!xUaa_y@*;>#j6fPN6x;nbv7jkE>c;%1Oxt^YbHat%@@ z3%kIk*~_1qSaX|g-te^tp6sXo2YF7-0;RLBMEBERl`XpQxPTL>9cfvzRzc=?*CFiK z$T4*d(Oji5LU>y*EzLv%Vy#i z&%0XS*Ig=CKY5c0+lMj!PHv-=D#7&)ra(eO$T{C~{odFupkur7swsE+I84{!vlN>G z;G2B_{synMW!7pO+<_=PcItKTNTZtJih5$zV^_KR~Qw$890^n8M} zz*}0oSU83i!0>Nq$k=HpV$sy){8p;6?|%QD=&YS22Pf(L8kD^kE-ckS@~2Sac(105Ss;tFQ8Oo5}!t^oy?kzs7w*CH;9eeiy#dHxR=~p4 zhHF#i>$LLVKA&Uyn0zf!CHKh1-u{xa+4MG-e@@rLxH)k=gjPZxR!_;Dtt*U@x(*)9+?@1THQ*f5Gk#gYY{E9FIJR2AP~CDF?KKFZWjW3MD*<)=c%i%M#?JYli+_)$Amt zX!of9WS0fmaq}7J_*SkCY%>pGM2?F9A-GFKDW`$Rcpn_(e{#(${el;1iDJP_yHgxeFIook|~ zMC(1W@pg$w;MXOxSQ&11nx`HPuG>bSHOrO`Cd{!G&BEOvB{Yfh5SE~?ip<2>C@_z( z=;bQroZ?r`Y=dK~f54}<-Kk@D!+Y6YmVfi*lG|Sbmn2oehcb2nt<>U0kI(4h_R%^y zgn;f|16R;>=B!7+;ASH@#_2pfb*xjd@VN4jEAFhM{P=4?V;9=+zuXITc>fjZI^^@h z6H3L)k`x+7o+oQ8#l@l$$@o%QBW;)~uOUov(IA9c5U3j>DlY8{L4{2G2dMWueg$M( zZfQ4>2!1L6xKfp0N&v4(m@h zF4cA(nT+NI=UIn?_y++B!5J^3B}{4b#F*nq6;l8XJef~9m>2V(z=kzxOAYsv1TZTkE2s2+_u z4+{OK-}zy`GXD3-Ykv??oRrajT~rCbT6*H?v071B6ZBQqWx=Fe%XrfbKi18TOGq+a{hJ z8?Hovt4{zVYSQxN+os#^a8(ihduI62&Uy@qo^_>o#E(u6D^~loS+S{qn~Gu%!H#7S zbqhzlPBZvN8U{x}N`QMX{w=*EfE~X@{maN1)O+E%wxdAb1>PIZ8EbptrZFB6tiScc zRj^R<`CULd*!Kx^9QgGR;lGVeBO(bBxHDyUf{rdWYxqtjDaed3Q`2)5lkz7N`lV=> z5=jp!DY#}|azcqI}rPY2|V9D7JPB_WO#F3hvYbLd2E>bDnDsgA|%(^6sx5Jbel{ zP_hSe)IfX-rndYsqW=b^CS=xLTk^Ab(nlGvvNJmxcSGQEATL~HZ;qS%HTQmZ0b(zJR5hxLtuL zVsrS)f^urGV#36<)BueCW-biZ)&Qf&i!}JTBuxzbCg7fJkOHzebDvCG^b#SJ6$)zh z@6KCeC2kmR>HFcr+pFfwC#Mb&A|SPdUkR5Rsgcuc{U8>{NE*jrozmkWY(+m63aG1I z(n(l(>Tlix4kruP)yv=kr(`7fZ4oMTJ*ScaH+2%&P6JZn+v)#9NTZ*IJMo|u2*9>a zd8Er$Mi=bs%)E!e#>~y*D+jQbW1zadW$v32o;Xj5#s6^ALvpwmM`ir3LuE$->h8#m9OZ64IzdkZuAD?f$lXo{S%8EorX#_L za@WbZJIBU_lyNx=uMpl6r_^-7V|gB0uSiQ`(s*5XOBT+DjMLpetN3RvGy*gcxyj8n z3H|)^9M8l0zkLqPDRYG9o~u@sk&&3F5gqk}Mr7>IE8XT$l+gzL>God<_sU`HnHMps z(_P6NlZMN|`Yf_dy`ZdPD}I*XFS)c`L2Z4#M!WT0Y?J=P3z(uQv+GBC z)>hWtsxR4(JSi&{rr22FGB^N@zg4gq*%+hC$1NTSvzR($W&)#-P+^|%p>5w%{bW=> zQ%KkCR&=vafMg%n(tY5Yc#~_Cnsp+b`Hyfulk(zD0slhnyN<$FRZOy-3(;*}JiXWB z;Gp=`6S^7Pv;BI;1>m%%ld)sINFJt&-d(GTmaVWA%;u)lCiermemb^Ym#%&&l!QDe z;jl-VNK!BhSOO1Bqnh5A0itXHKK^BWXRd(sY~}7JAE&SnXcU#(BnoN{T>N>F`2M)( zCQHR0+-G>{8k6vJ{%U#pqhRiDe6Jyee3n{HDdTcxR z^f^qu9t8LE>6!BpFRRiMj6 z4(Q)fVN3L=-5?rMBbu+OkW6!6@0O`Bx7F_Dnr-=L<{u4_a%k3UY5in8a;UjFNaNd~ zioLUbWQI+t17%M&+lV&;8c?zJZwt(Ph`Pn8ao9c(&>6fM9$r3XdDWn4c+-U=$0XhI zC|7RDTO4$7Das5bd=X71H0{x45ag8kw01%bkq@CpBj27N$c>cwL%sf7&#Tgm==C=9_ zR5$@UNeXRi{>x&8>%@Nr&EV_(u_JK(M@PR?&rcY%)|=0LC&_W7?yB2+`O@0GZJic9 z(DzU94YU)d0D8UusfB}iBnji9qriGmFR$%CYI-7KAkS(`(-}RcTZ(m+?0vx)zw|fm zPSzvZ+tq790c+7Hv^uOZs2(|0&g9VIVFL$D=4bl<6V@XOzf=*8k-$aE_YkcpV&p`@ywb?~1LB`YY>(@>1pR81& zTCX1JhxOkCl2pI^V@D>e^!eet{=N8xX6?-vI%Vaf#Q)Q+|25FJK;twhT-E{4=mA1! zP^&PKL&rSfy_+lIHs@kapUQiFl5E0?j!BKMgv@g40V6Fi9o?AxlcWKG@nFPpFZ|Zj z6Oi5l?6W5m?V?@^6=<|{5jKO%X5G1hY|J9wgG>*~oA36z-M1z+< z@Rim+ldN~XjP1weDN3$WNWtR*KVrmT9m48vDvu3%s5ut`kKo~zz$Bwb(l7vz-A*c# zKD!kt`_55(7)#6+LZ90_KmDkI&&h6|wPIzScx5@3k>QKi`&6gwu}H+t--})c*A%N_ z@e`)1?=;sTqt68GEG^4nL?Dvsn|_^l{fJ?3>%LSNDauM5w_vjLk?=IydF4eso92Z zO-ht?t3v`>tbc0?vb$+=2&2gIQm|FlsBGGIqhl0$oqW)Oy|{xr2F+Y18tDF*vTG{*LMzf1G-JEDXpXxHrB|%M+5wLVh|t0rF(zh;D(q} zUawl-?8_aeme&U@3lJY%-mkKjo647~-K>u&tl}8^SvmVm7?s=O6)K$z?M%Uob@NQc2J!jOC#Hx&9LOwL~O zo0np81%rfQ!W@%WF$^D%(nqv^+adTnY%&MeCqA3 z^S;|#`dE6nT~khq>pB5E6>Hj^Rw|e*gA` z>Eg3Yqf#V=kTJ`EL0bS8RTBi?W|`TyY?#H2FQT9chjJF57ujyUIuVNVlJzFm>nq<)9VoWquLZDQvxFYd7dh$#G87Qm=x91a z+Cr=EUSu+PC?UZ)>T~ivE%A+b^f21`rz7?uhDV zq|fXaY49z^TvFo9h`~jB4~NRsVKegd_NzW{7RAq4tjh9u{Rb*}{;_4|;+YV%Lk`#b zUj>_al-_Qfyt40}+J2OR6Vk0S_;1jTWfnaFmENl!{!YPW9 zFs`j_T^QeyD@4)l{aXuH7tM-~_~X@e!Qs&qD{@~xPF88*`K-Xpy`1VGjM(T%I^$3K z@M|$M!F;~c^%8C+Mbe^tnKne#N?Vv3Vg7%ZA(;51;|DjA{eIELF4tD-J@|F@^SDx4 zQGQKmSy%T+RB9TE1G^&J*H7ouNp)1z`9*(mTjL4=#sB;S%DPdP_Nn_zT_3tJ5XF~= z!l$OHyP|!9Tt*N#-nxy;))KtTNA^S|g#PTG%!p7EEWI7!@S|BL%v@K(+6?6Jv8NfO z;c0VAvhPsx>*!L)(q6bNj&BAf$FUo;2RrS)0tOEUl3tImf}fhVNTqoHN!KKa{96u} zc~{;0;y%=HGgT|qlptev`q!?*66SmUW5v9;pL8qcDFKt*b)~G9#?p9cmOLzZj<9*S zqTu=vJo$X?w8zBs>XmaAiw)ipj5+tA@V6?pjIRqlT$a)Ctl-EFt9vR!kwQu7?8Flv z|L27*R<^9X^E-ue(3cuU?JwhLsN3zd9n3(q8(ebW3R z13t3HbnVL_t>vF0zUk@kJ^%h*gR3M9-%8NLtl!b&dbooYr z2MCd*4}~2RF2vzn)%2VDIMLO>gfFg!#fMS2vS~wE(=1ah ztqej~J`)ZHckIXLfj*Wr<#>~s-qRiMraGLaOTnBhUR zpuV8GI9C8^AW`|*g0B#qraWD_kq;fN-k@$^XtAPf9qO5ySlsAETzORL{y>_I@v+8f-~?L zLUqEP^`onllTFwvtbOO+_^tIrkO==Rry&v%XD7TAJ5^bpTFOx1+@!}WQg(w30{4q; zt)t1D*5~*W7J~xRak-U^0&T$GgD|N@ClN{6-oT!J0F=Nt2e};{K0N4&IyE+h-}%)O zqS4cZ#p)t~>DTEd#b)v&kJI)26H*_EOX%Vgs1whJ;3}&{Ral9wed|8jAhk_1%E ztI;wykji4xAVJ~=>9ip40ESaJee-QQYPq%x@4-AmbO4{LIDH$noR*p6>?&APCP$WC zF7S`T%bK1&3(0DieLeQ+GT1gTF%Iex>UJxCzsi``J->p(mPkjwUYIa{%zX4VkN*dJ2HNeg zJw5eu+2iDptLr$WBUyq*5$;E0Z`XKnkv0a$`1hlxD>_fgLuix;Jw6I*!0BWdLlkCT zzc^r#ugedoMW3d_aWXE7Hy5BUMuluZr##|eX z7DaE6sB1y>hkpj^BJS{kVi?+b`U67?xYplSTn1^> z3sGo#|8qpgnh`igr1vWH^^i6*ML5Q!hMHPNrCye3lvapwKQ84fXj+HJ(Rlqa^x*XQ zc_^rmOmQgnH!~nDRI(;EyS~4Xu8UT#Hz1zwA{=ayghQg;?o%XIV9R@4|2XLB?%i-+ zvyJ=(FZ@7`@vMvecVYUg;rF=~t?vMFCk(AKaakQ+T`Dfg>_VhJ6Sc{KT4t6pLJK1r z$8Ps1FUoSps`Wl|MEjM}$wvW`zFOYwyR-G-IYw!qjASY$KS8dsnZS5V;iBjvzl6Xv z&FrkA%)@MO_m%m&l7lTttFMb=Z9#Dqc;%+7qAhNr+C?6+b-G7(t@;Bzpt)mHq zT#Z;a35n`)mOG;g6-#_y?%IeCIn@e5oTK0A zI%-3dTDwio*&w#VZ=EkP5qt^K@3U6~i^YEaCyNn5>YctXHe{h_+w-FFZxvf~Ihb3DK?8&!0(_?A!kGYWL@^#%0P zi#_OxsA@BRpbll(_dx!AW@JM?VQckWC1vBZI3VFqFx7)=dEs>NhlhEge1C~b`*Q*3 zV95){irRb`p)Q@N#$x?P?5`JdmR-Vn(BEofe~@eQ2g>SrRL2|2sx7Lc0ZaXN2v?-l zKN!K`53bFk>pC5Y7D0mprk{#~;CHC%iwfm*7Mv9qprW++MTvl#I&gV>LZ<4Ap@ z&6Pv=kPq}`#ojtq2PfQ~~MfswS5qh$; z<-dr=myYL(=jInL-@%P?(7!j@vk7sf{zC2WD$=mpurfotao)!nm=1mQ+~cULd!{OG zaLSzhqzeo3YIRnkMks~JuprlVd(=l zXBRsB&kde_^tR9N8Uaqd!HD>UQM$yHzH*h7r=+T2bj5Y4IDnBPmy%Q%2F@_yq0oGZ z)X3+6Q%`FnL;RvQSB5BYGDRXOyEjGQKk4Q71!H1uT#eJ8*#8B1{_SFx&T-^)-T$cG z$I1*&+tnDEr;T#Saim=``o24M6cBCKLn=@f&K{O;5izV2IoeSK&Rh#Gz30_ZeT+g` z%(i||$K7R6V~Yz=QPN81;E#%^oqbxMipOsj^mTMtQn}9;ln2<&c6@XyrYcI2VW`5W z>~fm$M-4MlM^VC}RXWA2HeRF}rGN@##}Rse-Hp=gQ0!b%sXM$j+$XY><}${UpS(Rf zbU2IhUi%IgEc}H*(WDP0=Ky;H?7_Q3`zF50#v8Xx%%Qb zI0oNw2hUZ27iXL>MOtxVes*9T_$u0kG|QUE2vrdl2`!N*BeMfwz_o&Utu?^n!a}4Z zQiZ`*MKYm~8TyNmm6@+vK^-Jb9pp{7pa74a&I5&5_a6f&1J*#XXY0qk)JVL4nirs2 zN3J}2F(iWl502xbJdb6v2Sib}>(x9khWz2!ZDzfZ-{(Bs$*+rM!6Wy=!>li9XS)4m zSbj*2Zu=)AY>g$x%gQJgmnr}LkhEpjx5Nm zGFIo)+NR}fCRaJJ+K8s1RL;hlpyCoF$n1UNLpG$j$-;5J6qdLf!vh4d9=Ol z(!0&$`_%jT%2j5YrSY(!)vr}g*{g0^%+MK|yDmCv>h2WRVE(haenJAQh&~IzUp2@I z8Ac$EC`_mnB=AavQmC2sQX7OfAA*#ePX!E(T;ATc)v$)ZxgyYxE;5y24+7cR(2ihH zrk+<6!Ll!iSeHoHT?zP>=Iq*kT$5Y&xh zn6}G>=Pk!Uy@^3c^@4sL`yR56j#lZ(WDy9Gq1fsaIv@t}ej360EnJH2!<-o%y71+> zGKq>7V#60PEu*{lB7dX1iZx3{Et2zf*h?o4@!i5YC~YjVZyY!NMoel&5kDRe4|nUI zoGL__ySiN}o1ChHOP-PWFD2_3^QR(pqa%WKa8!}Ft>d73FY62Kavwiw)*9qXK=Lbu z37n)8z%K_Gs!DyZtyV+Nf8q}&+M_7dLJDi6-|zYWzq`R8v%G_qVi30lS>0tgJ8WHt zRtD}~@VH)8-8`ON-Q~j-y|#$6qFLc@Dj7|d;Cz1jrx0c?)lbQF;l|6ov@J>1P^n#xo*>)?B+* zx#nbE@o;!xEqQ`xVQ{0aQ$$AYP00xUR$WR0&J;b)gGJ$ zD7r5lpIG28lxA5*8`$R$quJ=|8>E_8PvES!T2h|$^bD^UmbV?F92-ws6kF9s*?V6T z9T)vo$4l9X-gbj5JZ|R*>#RZcwn<90d_aV|m6``n%QFKJuXcG{)@vAWnUPgbc~-94 zqR}E-x;o}pEC%7+T|V$AG`*Fp+}}>jpo%%Wx>pwW^a?KulohJUdavfYZK^x!d0tz2 zIq-OO$K{{Xjarsc*KyO1eyq)x6J`($zJQ*SG@$D)`q@&L4_8=oZq+XjU!MSr^Jq|d zf*vMW#S=tHpI39?W$M>TN0XOMD3V_~4|H6euF|!tRS@8vuLg%Jm9kKHuZb$ZsD zef+imTnOwbgA1gFy7#KM6G>lzHW=Xg38NIdo-3^oHW`;hPSL$NiC{JE5_P%zZ?rus+Q@QL8V@ z-|})>&h4y;z#HRwQ(J<5iw@GK37xrjYtrdh!|&ZNhfv^hyNCLTJY+T9Dc#UhtB4Xk0wYi_i5 zlmh+T7vT1Ng0MpsdLzgXXc>jrqA+d%XkyX7cCHjQMM7rvt6I154ldpUYTu-Y%`=Op zf?+ZD@|2w0MXw--&aRhidClyuJX^##vlW@0rTGuXCx2gJls>J|wcdX<(D9X!qyC!r zQ|);CA(@q(&p;)tFb(t`1|_wMEM619^Jx*xP(N`{Byffn9u&V)Z*tu*60c$pvJ*;% z&rHkwnGU6}a>vm|&xURrCeF*deo%YSAcy4xZ@(`hR`~&(+vTDzXn9`f+ihYKYrIMv z9>;=7!z8YaP5#N(Jb`z~!@vf!G;8iUqV-xFP?0A%+b&6(1p=c~a<;GR@jWLI8z#4& zF4RR3`XY82*V_7abHX^4wRv-IB2_n5!QZAcf7m){j%=@^HTX8qZP9A))cz@N{SzeE zr9fzLYKxwpK9?JMR&q8Xm%}5FODQjG5nYF06v44_*`f8IR8{dR)S9@4CU@51HM~C! zJy=UoCknQF+gR8&LCyen?Gah~S9Z*sw%$PlOXVgnQx)eD-^xc+cp36^LCACfuVJ@H z9E|0KGUC&?w{7i^k6!=x=gIvC1ABDP&qdp$F-oDkFOQh}1)|42OUn$E(scg5ArA{% zjhSn8ZBv$t5a8M5@Se*ml8(!Ve>~AbpiHGZF!?pNPIG?3f66TedBL_b3{gr7S_uwa zI4{RAryXkE;69a^(OKA0FE@00{(4s>f(D$+mkB-wx3XQfR&0e$iZU-}Ma7k<_I8h5 zDT?YjUot99*<5pCdgl?j~gEgF& z;0$y`dm_e-g4W?b=miF@6TPqtxW>udALBESED}P*$wz^F4?cI>eO-CoFanyLfx;%S z3G+fh$~}uQs1xI;`C_reJg+u`Jq9N8SUg2aVO*i$5T0r@Tow{Jt$O7UZ#*NMdf7N2 zf01{K&W1~SsF-hrC^i3Dwf+S{ylz;PO0kz4uZk>{liR)4Y96__-zHx=7+BKWo%QPx zCECmjiqC2|#<`KFY2K{|r@Pmo45d82M5DEj&oMddSgPxIX>XM!{%DZoXtKKsmZ>$@ zF+31(7JvfNeZ0a27*W07!i$Fi3@Q@wTqay%C_^pPPo{Gq*|5EVlH-AQMHpLBy<@X2mPp0JV@ zS9t-+vvFg2wxOXzaMNvY)s*-2y4|$dHe!uj0dNBe%wrErE}aw>;bd(bO#{1K77PpG z9@?Wj-9Zv=P0+<^4}@%7G;m`y{e1R6#@T6?VoyaDHt4VWXb$c^Tb>3k6Sib`uJrr| z#4RDQKW@Kqrk-!@}f1GlLEmD;o~`D^PR5EQs|rl zIktMhAhPyFN87cRp+AtaZ1Y<^G|G^n-B-?Sr=%1?zB>u3DAcF2qVSZWI+s2e?h zrY|L>zZ`YYz|bh({9$<2g`&TChjzOfWrk<7k2}9Mi z9b-?#tEZMxxavpSBT(il07DY1nvOsK`)t2(0*S1w5j0n!)CN&xwOvnc;xm53tG#C= zWv+Nxjw+$^5=B`M1zf(ost_g@dis2Gq2_fTD#r+ZmQQq3E%W@-$5l&mSoK=5h1~m* zw!8!9hK1sM3z);;ESv_r;oi@096YIV1PZWv)M#~Q+S^Q=2a*%hu+F^8QsgyA)OE(V zOmgdHC%2_tRD7ns z=MgP$6*{j~*}qUDPcnf<3Z&zyg7{Heo!V4i=`CRlc(?#jyZb46<-6ie$U{=j0~*#b za`(NIk}{N-v6k6n(touX8^iQYlXNlv{bQ`?^HmhUq9MjV`sivwcpFs7|Jg)5#er9Q zdVD}vDrxuC$8}oNZmG&5CT1e<*M-B)pr>%1b9A4H@RsSeXhEguXT6K_7?19+3ZmE? z4@zkPd+!0K>ga0o6vhq$G7u2C?(l9;O%ltF;H5z|mfm>*(o*8h$Yb{AS;ma!lKaJ2 zqsAnmVWpGhc{1q5?MPXc&l?rmp~r}$j+= z6KeyjLy=;jUw0lvEeYsa!ifD4Td%6JN;`{Ps|VfLyU@6Y+m?0()zBhbJ<9T{nFi}G zbLwkmO05CL+o0e@rKYMB(h!*BbbrC0%E!Rl4laRVj0ar-oDN^O<{X!7&pXeQ{kloC zKeQW!NCXRcblg9$w$JQaGb=&p-Ds4eF?|(${2VMto6GImZq*h@UHmv?m#A>+5@C(nnv2#J zCdvFK94*vc5MnI4<@0p6a(V17B!)mgUrKNG4TDL!hXAx68WWXPZR_?>ON*62i_?WD zyHt^rrchqGFYyv*VWo-yI2Qrr>^K0C8RU*N5wS>QBT@Uj;1vH3zP`#Q?}sTA%uMCP zvks$egh>fbcE;s6ugTfJFeB#}Ug+cSqR3psE`!)CWk$OAp=**&5rnpo-G>Z+C zp=wps`~=3mxJA7{+h^&-N#Z>@yu~uT5(B#2t1P|m4mq1INXmFtUSyrq(K6SCODfC{ zIk4wufA3w-M?F@8Hk=x7%(TNE){6e*54}7bF9AAo%*3#F)$AKJ(8Okb+AYW=4nHg0 ziLpwG7*~ZA{E@um2)a#41^-Asc z)?i~#JU$*Tng5UeVCHvDW$0IcgRQ2&8J_H8`kqGT*o2d_sT{WS!tjAF#PTAFb}CvRW!*)D+vZplBEibWiHN<)<%Z=z z=z2$NyB-(qE_WZumwLySzwU!A>?z$6W?L*!@Fx;g#qZ;IuA=2()jNK;jIXj%C97dJ z+BEeJcKA;kl|brUSC)*8+T2u1ylMg(v*CQ_c^g;9BZUi%;l}#7v$5;y-HNwwhq-&9OuU{@HD2VV6BDWd-^pvZsdg< z`TOMJGXIJ(t}9p9uhmQMuFK=i2ODp~o^tTbMR!Oyo`wwJ8T>2MF3 z$^MV1vkGgoYuYx_0;M>`B{&6&JH_4I-QC^Y-QC?OF2UU`NO6k0yZ(9JZ{y#~UXD9i z_nMjOI%j5VEELn^^`0tI^DTbwiL-b=vbfv=zO|Fvj)fGB zM)d>-yD|l!k>G1-w*VCF^Ngp4(E{#GE|p>rby*Jrk{56|Vtt_zc3iGt{MdxpT}>p~ zbqW%iAoOck!xt#T{2m9yV|N0nI5jzw>=Kf#Ov4-AU+`tXYy}ROYf-LcQM-NKHSN-M zR-*($@Bm3OiK8*J7bk`LeWQz<_qtg{eiT`2`+Fj|UVl>GO)ec!k@L6DV~KD6+ENkO++-s~M{_VDoBSpEi@~EV z?xtW4`?v_U#Hx#TWi>e=8JYpx=j)pkqcm*7_Me2|A?#jp*pz1*T)hxJzK?o#ML;_C zBo9FOcTzn@CiEra?RjLfH{-Jar2EmMST1Q!w+5|k$Mfz!tI&l}I69F@wgw-wu76fj z&&aB-k~_TEpF3>j?evM zrC5kv&5?*@UA-N@CR`1EO%mNoA>|ZwGcu3lUaS8yyL@N>!9VtwW8YP>Yrn_Zb~%}I zYv=RUz3}fFJL(j7YR$Jk_4>t`rqWePI5YWwa4`ptduFqX85k?8)$*WkGVqN=ECUl# z^F8;B?p25}wa(qRX*7q)%)|2&TTPc5yz$p=X#>T}ppBPp=@_5*8`158&hCx%Uo9KJ zixbz64VF0|EsneEA5FK_(F8gS8ac8FwdXN+jGFE=>at}- zhkf~GIDt?_)(#DJL^GqOaMbQ}G)v%`& za}#b$`oq)H^Btu}cVK&-nzH}aRkMjKF|YTROuAnfGRA2r6kRRKUGulWF?8wXRk=nj zY`6I5hn8G#B>jFjL8QE``G^uhVfi_UL;d+E!FMov#H3vDVRv+XpEC*eZ|{6%_XIRz zj?sH1Dfz_e-_I%XtVei+L)W*%)^!T&bGkT=TuAmt_BVD-wE)f^rF9IC4ukN?rlkYY z3OX!hoSjQAFk&_fnAWuHxiwQ>-m`t-fx-(MmOu|w7T#21cN3eRNG%ot%31O; zVmPwdIn7`1OTU$@%`u%I>7p$(Yv00fu9?;C*r9AW1eD+JP&yhNx5VH-jwnqHrPT)o zo$;DlHqat}9{6d0d#$F%?J4UVuekbbmd^Auq&y6?yM}i9xNCd2=~N%X=mWc1T#9{) z8G~p)mK4%kxaRG6FZx*zazKdw0botdEhXSk(`Zj@>=Zk=1)oycQ-EA!9`qQJu-|Tp z>Tpu5z~VNAgS9q&D(8ojPjDx&j@Nv2sN?zQp`Ie95Qff4Fc~FJy4wbC@ z;!M)K!_3S~j80=pUD-5GRGr~09KSgGQ{52_pQHryyv*u0dfpa=cwdKnBwCT*kn2<+ zaEax)Q(XEkCs1KCL7my(hI0Lrp+)x?8GV^1MQ$(rH%Rqv+RkoOA99jo z-crsl)8rO1vCiWw$Xq_Vj#nh)f6G$E#{DF!$;r$>&=;4~q$P#$*}!syrMpn&ZnzHc zBSyN@m@7x8lATW3SL6C(hwiNtyORYrHI##AZK2+BQjlsM}PF8PSG zMqvsz)zf-a2$+FwSsnW<9i#|KqA(2lW#47btD(>>ZyAZcSoBeK>~ItLvasoX?hami zf>RnfO!!P*6mk>1(iK;pRMS#l{}R>y&kWyMc}9J|Rl46Su~lo&b1|n+AbUF7ah$>E zSeA8jN>PquA5*@er2e@t5xi#Syv#aT`~KBGo}94_a4_j{Jhc=>gldkd`91vWqM?vS z#L5B}kQVR&(i&Xx=oX%2UMam#mit05)UH8iO!V& zm=zUO%Vc{A^~}B&kKN2UjEc*so#Kj_y!e;UR5)TL4br)zC8jlq{> zokHFyM2m;nSM=6)r#$_Auq_4&mzZa`d-EX_*ae3RJ}4}mlb!Xe!J;3#>iiQhf;@)C%yIB_1x8 zQGTsMfc)2m_Xcp^T>fi@u>{-#S)s`5eYa)Aa?L*}MDY zY=nEy%@4kepvlQ;BdiX#(I`=uZIux9Q;&BmVJHCylYHV7o`q$XjFN5D1P`l9dNQKt zrgnVWb-|<7`yZjl3LA%?a6Hr*6{eK=J{E>vthy)SBsr(WJSHv=g+g@ z5fQAC5IoU!aZX_7c{3gRf4ZYyLGzn^6?E?FytaK@&A?ZH;QJA`66?cXYRXs4{cS4d zE2&#y_T}Ma>aA2V_vRrgyW$Iu{@@{}1YuBfjE4|~aE%Hr_sr6PP8#rHKgXPdFA%DN zP6R7vZjUofOk*eP5GD6%Ta!PYaJ(%pX6lp0##)y*e(wJI$P(79x5|}-YNc9yI&DNB zf^%$`Lu6lwUg*+d^2KnmYim-DW%Z^S$pVI1HoZgVCetNHX)Dl>Y_07pYi{v| zWo!QNYGFt8}f2YiVNfQYBk+T3iEc#Gb=GB%x36U zmc|Xw>Z#li0VjG=8jI2$#G|wXySUbg^MQ?_0M-#K=0AajioVAbJ?~#YSsod4N+OGR zo_9ONrB=+8Dmz&WM9T3{*z@Rsc>QW6Ch-#f)G|YAs*p&wLI55F&m#1_tl#H|xHq^C zeqZ>n4$e*^>{JlQdQdL12BPul$@qrXMV1bejQg!m*X07Mo=;vthRr9nd1aX~&n6Ee z%H`7jgYYQ^rRxYiNhLeVPd~EAi-tK*J&RWKyk|AX${pLVGAoOo8xV+bL++KSE~*ip z`u^UyP{9TLnjN;p?eZo1`}qzg#-;qSIZ*Yu6X)hWdJl@6TX_XRVg}*gH7oIa(EojG zoO`#QT(H6Q9wv=3<}I>Ll@CX@=4P8lnORY~$rQ!Lz<5Ym{%a_O%&eKxRuW;SA({Wf z5Sr<-Ku8}16GVvFh8>w}VNU|};Xj`URdRd&@Wl6KL#70ltYR&|iKs%&h`b0DWr@}F z{V3a+5o_}kvHDO@`Z_bgxa{B;jgJnmRt>!wxiS+!Rd>^H!>@9`K}Vvn1-~c>ycil7 zX~wYY1gmw@O|6(~Vd|}r(KMNoZ3`>Q;82PZ=6?UFT>oB)5yAcsAhv6Q06WOvt`?IT zXY9;;l+X0;T*s>jI@Fi{L;qTo_%~+TTiv_uobd4U-q6cKdTMkitRgb=3;+2^^Lnvk zeqYnD9WKFDQYB~6%Ic5IgkfH6gKKs^Q(W5eMg`6*3QhN}o+ofk(mH%k#pX#S z;uSa__sN`?-li{Uh&f|)_w|^e0%%;vqu;SU8n(cn(SJ1Mct=T3aAu0I0#RV%eHu$DARbhPTLTxb#CT^%LrohkQ=a@j{ zsHCV(_Ae}6D%!6RG*S>1M1*KrpQnEfvi)-0vCW>PWtWqaFP6Dd;PeMQ@bn0?(eg(7|!WO8i)IP2W*mdYgqC5 zJSz9k$YtcH5gWHw%}u_X(#hj!o!r;A9pR-JMW^Ey)gt#}}?i$R}Fk^t^x~UlhV27)6$$1lNfWnHujz zBTe?N93XF8xN;R7XP-FLqi3k^mLuY|PUfRw zZ*&x`jEn@$8ZvZ=7JbPX#X1&}@dKweg&-PK0qpT=M`wl{h;tH|I|dfuUuEIc7<=j+ z3y<+WD-d1DAz?vU+@5gA-La|HLep~)!_UTAsIu+OFN^=_L-l7DEfc`!lO0>$$A3cz zRl_sISOq+}Ph{5~)nNJrV}=U-eKF zvy;CwGtW3N+^H42ta}&SEnHl9&007n`n)KkOW^rRMRG--P$2#Op<0|9wG&Is(dInn z2A@fEca4GaK7GjK9Qu;EYjVaa4!RCs?=!$TjZmV9v2`~7yrJIPzS`VnQ8b2eMVntK zzj{?!C)|*Dvjb|STbz_iHkl)*7!W+04ylHeNDQXmlHW5jjl05SEK?;>t6eQi<^G2#cdY|`l z-kPdAxQtCUJ~)ds<=FkAIUe4Q;~wc#>MRoTEhf?PMD>dvO~uSoDOt*s(qIlkT_VE1 zNHpfO1}(8VZ19*NgIrNcV48wQ1jO8VpyvgeObR;AWjK;D`qabe91HUUBn!Dv)&eT+ z@X2!4y|>H8hTg{RXIndm&#VtjeL+z)AB_}q8emBer9bA4gpe48I&zE;P zQizRGBPv6Tv7H4mvAz)3x6=$BnBkn(r`G`=wcgfDpJ#PyFxTR;Kzo0su(FdXd>`5d zqtlDU(S);GFmv&%U}&k5YAr=1z^X+mi>S`Opq;=g1cQi~x`@7_#zwr5AI=Jzyy6Bm zb7V$TMeMbRQWv@=`{J@>ry1v}Q2SLi$T$|!uC5PnGp6=DmTSi*g}e<1Vz@91?xr`=Y(jJP^I%3GZ;q; zWzC#Peg<2F7XvPl)@2>*JnIO?{&qYXG-o~A`bd_-@R?t|;w&s6{i@4{AI%LGm3nvKiZM{CXoiMILe*CVk$gOg2Ss?wSfT&D}NE|K|G8KhW3OVEerkG*k5ZUsR zirKD(&N3^fYvee++fBG3v|Qy`yska~0)ezfMw`IA`O|`kV@T)kc;U}udeUp~jXh*` z%`aO@pLV8dcvw}BT;VE4YLtMf`OnXNbHlopk5-QP)5c9N-uK|Qm=g&L1%zRUC}$7@ zbR|NzHh-+K51x53wRCyN5jg6{h{C_gYzea62$6Qv_c+A{s%_6%QI!T}qhe=jS>-s- z{l0Gj28>fWGRf>Z19|b4oB$AFOw6tXCv`H($PGcJwlfMPU@Ov&jK;Mt$%+ zwG!`ILJo-a#Ol$u$uJtHd6P?~a`ykFqe)EfW?6`d_9N7>20{ zRQ{Z6O~-ryi^kScA{0Bxuc2YP6?RsE@S%Xf z%T9(J*8Esj7rW`9u%)TX8FSaWVciE^#7w%K-7>O16MGjw+%;ZbJ9WS9diykk0J?g5 zg!s%~t^=)TiD!i$f>3;zF;u~o4|>M8MqclPUMd| z1viA2_5+}^<9NS#G8wJe>=Bx&$(dLqiGkoeabg;$JPW(tAGYDz$B+X^Gw~+KkbIxw z@Zg)U0Cl!<6e`Y}cT>Ct>h++>{XM=LZDmU$+FWN7A&u z;qj%MWqQvp{`3(YHhIAFgJmr)DVC!!;CImU*<3gVC2JRRRq#U*%yVuV8ag1XLF!CtYip&J1&$*k`bvC1=ki+tbP7jxg0tV<77Q7R{f^6UUWL>0=^}B}|2?bg_KV5ZTJ5A!n42gm{=}LS9~QK*3Y`}2YLC<0vk$=g;my`_N5loq?KC*WdSg#-UhGbHpASN*xqX% z?*7p7bf}D|Y1Z~?VVj|*f`rt;%r}by=u`xSQ?rvYEg5R--Dwt~KHVxDeA6pD3(x}P z4Y#1Yvp9TL0NM?dFsuJ8gtzOT9DU8oe?9oNHeCR0RnKD=(9^zdnT*lsIwnMA znxc@AN%8fNdUeK*s5~%cmKGJ(HU}MsXWPZ{eT8wO$hE`pR=>8{!>*^p)U)xWal8bp zZk@lM8hNpyzG~p^qvL3ev#=1ST!2~82QmcIEn((e;U&Wg5a`6mt>1sw12>M14^{C?E`<2+;?gU1D-b32mea7C4eqJ_hnxD%LgPhDW`L-O83%FXJiFqsX z+?nQP(JD@#NA_LZfZ7GjFZTE>8evbb?uK8d8JJnbzx5Q0rHJKl{Vu`X4b%A}yQU5j znO*{KFJ$e#C{XN;uTsV$DH3fd%#nZSnN*?eo#p?wZ~SNW;_}V5n(oF8bV8ywV{Co0 zRR}E?B!Y-~aOZ%Xn5!55Q+2pIaI<0g?Cmg>`-)-|q9&BVe17#) z<9KaM^v`9WGMcA}8vToF1KJsl)z=r+{<&X2LhV_h%;yxl(#I8HT$p=G(zEb~; z{+wV{orX86W@GdJfT@)O2WY}8{ z2y`s{)onc{ZQh@KA1+IvtE*&q02p2>`7l`RSXj--hWRhY8a!U=wf72{dxjw#-ZrCYAZt!{2JO?v@I;mLVft_ zenY7K3pGc89!l)Ob$0W3lb2L`*(nX>4J}m}1v%*4Gk)^SM;s!~by)U;?wTeKh%ptH z<=6SAV33EUKF~BBhZ&k^tXbk+5*_bcwod}xda+J=`QRJ5;^Q}w8X!9_V zjfRsVj=T7zcC?+4&Qv){0yOdas$O9;%_*x!{@qzI3t#r)K6%jM!8JDj()3<>>MY!9 z(Be~j6GXxFLjFgpxwcYtd2Y(1r{nghcKUq7B3N*E^0+RBLc^gsez*Hrtz5J| zf?novB6&xKVpdX34w_)P1Cmv4VpQ5M6pS!1{uJ@aja5#fA>|7ELqQFvU=h7&^4gN< zL-HTIgnq0V7^+X(L`r>~hKs(qAid95A zss6@MY4>4<+qL1h8+S)*aip)KB2Ies-r4cU7N4bBu|iIxX1^ic-Jb28rWfi_ufaUE zb#ei6#-zjLsux1BQlUP!4@8DL!Z3hz)%hwAe4J~x*Q`nc>-L=*nmuw*;4)LnC74JU zevK9TTA^RlYRYi=?qB2oU_H?%Fh8X_H(K?S=KFLa!}R+&9BdX$5yIgq6e>Wk%}%b3 z8TRhsB~*$66yoeqAazH%znR?rd9q)dD$6G0rXprWav<3=D=~|zjr>PuRtDh{oGKRq zQ2`%v5Va)@4V)8%;l>Ri{5}sMAdfI;k((ie{Ow)#`w}5G>)Y;M{x`7)#IvES34^=p z)<0Em64?CHIVld2Lt&~-Tf_{2!zb}-;A7O(#_r8O2PX>|;a7d5Q0)rwwFQ~eWG*aR z5mDVNxY~ncQ>(4%aG7{zfOrgDUxFpd51sjqGuLo99ayF>k1dyMak%vwqp8T!Fs!21 zmFo+z3@MXm>&ywhE985NH_?&@?n=2J7YFCSGBb#x`xIy&|q8eBn5T(#3t!-3o(q4#6VOOizQPCE9a~8jI(tbdT{0BtGUkq>j3Ye zFMahjUQ4>E`8MphE>Ikh<`$QAK6U`e!AQi3Y!g5;FU-ktUHAiPnY#}UkZfv6-5Ogu zcqX7{3Fn7zLqI(aVc(pmKP*Wrz>X4oLv30mAF5%|ZTTMY@d8YU{_iDh0H4iE#;{U% zU3QxJ>!I1Owit6`vpOQr&W-gMK!=tyJ{Hyym+61$ArG{KQ2bn4MpG}-YUwHVtW~7~ zqgIx}ocFP{6Jd^Xs`i&MsERO69P0ZNNg7m_WF}z?sONMUx&{ENHfNGj0^?fk%rIC5 zQC2Ig$mx3V{xE3NwBg#PkBh?bNq11dC26scGS4o|W3)7PkJdfWFIdV=s*za{pAjCE zsd#2*N*>Rr7c;rSnpMh$1Nr$*P3ROMvIG-!-m4C|zJz)y$e)XgE`NpmwvBUDiKBeD zmNNTfc`f9)Wp0t=#)1ib`ntb(?p;rk^Y8u~ob(niG1$pcutC&hS4-HbE#CzzwfDcXe%{$e$#-y=ADA1$$Q)l!MW9e3cH}%D@(?4722`bd zHL+qYK#*~|VElve%L_N>&njLVvO$xmhz{W(#T>05`?!ZqSJh&Jb{}Sj_pp+Y`5Ldkfsn4^fdqT!n6mJgF&Le?I-QI@94bNT0?<^;I+8BW z{r-YhQD)UxCF4B9APF99j9)d?We))?B;JMgh#Sh1iHhq`jitUQ@!6I6H*|}g^^Q|M zk!q`2xL1{d{0%fWIISlCtU_(nt+~!KxxBn~G4Qr)d5g+3ezCu$qpu{3M9Q1q#7Dyy z#NWtp&p|wKONFW-7+t61s+t@Q5e!9p)oRGKFrrSClf)<-^o!OrOZ7`lpE!g69*4Zn z-N2R@$qy{)h}qQyeAH6p?C4yZHdw_BJ~%s>*m7kr;f@oa>4;m_{rwxB<K}RgDkZ~%Fs7SE6ol+-Dg*f4$V3sfkB^F{4TS$?)DOyqMc)ajL zR5&xF^qNK(r^X09fBltU0+y+}-Yg$0({?$`%FFhbie^s*iOR4)g#cw?|x!=88G zhIJ5jp%j5ZZ$NP`ZDBBic=f(yuS1H6+g%#*6zF4iXCi3V!Dd1p(y?@bRwc_EOnzLS z9*+9kT%;j)$X$o(jS8v)9`8yy!CC+6S>5mU(BgdxY(>PZgqbWgPQ5fq+xUz+>ozss zvJ31)En(-{b%1RM&-!&;O*WrAf$XE7y9hcuF=B@s$+-%Rcw@vJs`=p#xPdC<$ zgoMmSeEwpjQ)a)xBk_=zijADZ zD!lnXN&QKpjLKp6dr^=33_LOxsPG)3JEGW;y@;a5Fw*UKqf)5F$jP*hnMcp1q}SsS z*_MvB4I0z3IJaP{BONaTrz~r-K;nMLv01$uST$wYtj&iHtJP9_#5=Fvr#emcQ3_d{ zt$&Kb=CXuam-i|l^ zU&YRk8&MrY&c!#Gr@CS3wi;ybbnW*OOPn+i|9Uza{D03b(xjhJ*#Sa}_-Xj5j z3Eo<#wK$srZKT4K<*z!?%WV6q zb?M)kj0g_Opo0nrJQLD{ID_2FG>NWlHl3_Tvabc)9rWTYqYChw@TbMm*h@m;`V)>W zve-iC$>EH}H?O78pQ{Pcs@#NJG^87~BkN}d*!|i~EV7fd5kq#WQCYSh?(7P2htBn% zyg+q@#c6A@8dE!p8p7sMH@r;G3f|yy%ZL(dn@}065O`4zYX5%`GJsB(r!%enYrwv) z?49Wx6{rugg5;Hr-H*Mc<--mA(NT4JFPutfplRn8@pVrc(HHEz{#6hC&?`y3I7CLC zc-?=Qx4d{<8H~(?(J?+*iF0ry@UZVf#iinODK5-|=WJ~DN|d6wAjCsNn8+Z44=mVV z#TdNOe1CanrFYERR8mS51kk)dyOpl*zK%ykyRySh&~{xcf!(SLp#!V@44K?i`u1et z>6~2D{%&0w>10kINKdQ0jJ$#MO3Q*&#q_aS?KE?=)< z>}qG0zXDt;-8eD*;*`+GVfnAcTdre1|8XKIovjAn^6HQW|BFmV8ivjSFCL-{yqK2& z_R|Y=liS0`vI-#I2$f zyf?rW)J8M+6&id$+4^Y6s003gjW=)mYe)OHC3Q%(naNs)zR@u=GK-Z&oh4LbKAQVN zX%d=-iSd5}KRSC4$C;#W@Mx327*|5k1jU#bpdt2uttnE(glazOu~BRBCZp{5GU|HD z%-Z}2$*N>*W^Hxb!%?xJ;^r5U+R7zyyr9vZF&BZuE-?Me7ue82$e_?t3oDK(yOb&1 z*sQ_VjRdU3>ClS8hxO<9$MX~GIBjmf-iZ+|td2qUtB|zK%;$FQ2w1vCeg27&ENCjZ zoU4;lI=p0`}?=sMTVWm;Qn3$yO4{knDb=vt0I6M*{wC}R5mBL+^k1)>hDlw zr6Y`~srZJaW0xuHJo_va)i78qH?_JI&kGIt?(MD~i{KDQK}5<(jH{6m621N9cob3z z`%G$0R^#2pI%q+!%r>5yV6;`b(!-| zBst0PIAI*9inu2>iweRk)*XCfo$e-h@3LGZTac(tDdKz7qceUSMV z-n^(2LKh0d>0hbciK}hZ62EUClSV{*FC{a5<`*@KyV4q_ipdiLRY_U{gLs40|IJPJDpsW2WnVDifeu-2$dxgq#zBYnax!>S zefHRJGF-8kfuf&t0kz`)ER0JLMWLx;1H)X2!Rp`x&AY{_Z^;gLMzHdYCf91QX@d?R z^BDbVX?QwC|AqC`SBUFr?QmD$Q-5#WqmB{WD+6C{D%xWqx!e>a*mN8tAz5Bg%{0Hj zm3lLz5q=R9F0f5G#q^FI+{yx>8|r`Eek0;ME?x%@L(;LfjReQw$Bvn^C9{5_!JRO7 zQHs~|eI{_B%z*WQs&!!cq;bXEl%iON@!AY7SvOu z-pvVi#h?B-Xz(W6z5N~gMWs5rbOSQacG=9x@=Se+F!5s;1r234SkFzZzEwc ze-J(`QCl1D>ygC0AkQ7{8t6z%%*<=-CQWL>*(UdxQP3jbQsAe)yG_Nl2HS8J_MFU@ zd#;$hTPt0bRB{=gN9@`nED!y+*UJyKht(T9bV|>0F{a!!A)hhp0bWKWFMy**M2qW3 zM)qSAE!0{28eJ`bko{ByHZ5WdK{T5|Vo} z&Wj)G7!G!R)(C58p3XA&=W{*nv=#Z+lej!fDb_|E@Y~J0`C;SPd>ZVS1HDOhsW=&k zbI+H9j7`sl)+L)*Qf>Fc_6>nL`Y0bwoQet=4hXr-5y-R{;Jm}m@6^;LhhljtG zIK$}4OPv~9HEsfo+?1>(BC~hHIgEtuc|BteGCfD~^lt70nc#3^!+NS=!(k8b9qbhU zyNJ5@28@qx5g*f!9kT$6#j#*#Qnm9)yKv^Q&HHH622~IXX3PiNNk%4rn9w8`cbfBd zFuHcfJ-ko?9(EP#nn;)S9a82Qa~y<16+31ZvPrUyUY0Y+popO(IldhXfo;ZR*O?3} z9NTVYPc6ozIcPMCFlF7yi>IUnAj>R9t{Tr9$a^z!0$$jvM%{n? x4ugpMXc6O-F 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�WTZkZFuryS(ypHzQoP1}d|h&5S+Twr z$2x(fn*o|AS-K~T2v(%kyCLs{uix&@hA2{p69h`(d6Zu_(t)-=xV3aSf)-`q�wR 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 fq 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
); } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_form/hooks/use_get_custom_notification_unavailable_component.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_form/hooks/use_get_custom_notification_unavailable_component.tsx new file mode 100644 index 0000000000000..4f7593fb2df8c --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_form/hooks/use_get_custom_notification_unavailable_component.tsx @@ -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. + */ + +import type React from 'react'; +import { useUpsellingComponent } from '../../../../../../common/hooks/use_upselling'; + +export const useGetCustomNotificationUnavailableComponent = (): React.ComponentType | null => { + return useUpsellingComponent('endpoint_custom_notification'); +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.test.ts b/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.test.ts index 66a20569bdee8..d63435a9ece4a 100644 --- a/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.test.ts @@ -14,11 +14,14 @@ import { ALL_PRODUCT_FEATURE_KEYS } from '@kbn/security-solution-features/keys'; import { turnOffPolicyProtectionsIfNotSupported } from './turn_off_policy_protections'; import { FleetPackagePolicyGenerator } from '../../../common/endpoint/data_generators/fleet_package_policy_generator'; import type { PolicyData } from '../../../common/endpoint/types'; -import type { PackagePolicyClient } from '@kbn/fleet-plugin/server'; -import type { PromiseResolvedValue } from '../../../common/endpoint/types/utility_types'; -import { ensureOnlyEventCollectionIsAllowed } from '../../../common/endpoint/models/policy_config_helpers'; +import { + ensureOnlyEventCollectionIsAllowed, + resetCustomNotifications, +} from '../../../common/endpoint/models/policy_config_helpers'; import type { ProductFeaturesService } from '../../lib/product_features_service/product_features_service'; import { createProductFeaturesServiceMock } from '../../lib/product_features_service/mocks'; +import { merge } from 'lodash'; +import { DefaultPolicyNotificationMessage } from '../../../common/endpoint/models/policy_config'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { createEndpointFleetServicesFactoryMock } from '../services/fleet/endpoint_fleet_services_factory.mocks'; @@ -31,307 +34,433 @@ describe('Turn Off Policy Protections Migration', () => { const callTurnOffPolicyProtections = () => turnOffPolicyProtectionsIfNotSupported(esClient, fleetServices, productFeatureService, logger); + const mockPolicyListResponse = ( + { total, items, page }: { total?: number; items?: PolicyData[]; page?: number } = { + total: 1, + page: 2, + items: [], + } + ) => { + const packagePolicyListSrv = fleetServices.packagePolicy.list as jest.Mock; + return packagePolicyListSrv.mockResolvedValueOnce({ + total, + page, + perPage: 1500, + items, + }); + }; + const generatePolicyMock = ( - policyGenerator: FleetPackagePolicyGenerator, withDisabledProtections = false, - withDisabledProtectionUpdates = true + withCustomProtectionUpdates = true, + withCustomNotifications = true ): PolicyData => { - const policy = policyGenerator.generateEndpointPackagePolicy(); - - if (!withDisabledProtections && withDisabledProtectionUpdates) { - return policy; - } else if (!withDisabledProtections && !withDisabledProtectionUpdates) { - policy.inputs[0].config.policy.value.global_manifest_version = '2023-01-01'; - return policy; - } else if (withDisabledProtections && !withDisabledProtectionUpdates) { + const policy = new FleetPackagePolicyGenerator('seed').generateEndpointPackagePolicy(); + if (withDisabledProtections) { policy.inputs[0].config.policy.value = ensureOnlyEventCollectionIsAllowed( policy.inputs[0].config.policy.value ); + } + if (withCustomProtectionUpdates) { policy.inputs[0].config.policy.value.global_manifest_version = '2023-01-01'; - return policy; - } else { - policy.inputs[0].config.policy.value = ensureOnlyEventCollectionIsAllowed( - policy.inputs[0].config.policy.value + } + if (!withCustomNotifications) { + policy.inputs[0].config.policy.value = merge( + {}, + policy.inputs[0].config.policy.value, + resetCustomNotifications() + ); + } else if (withCustomNotifications) { + policy.inputs[0].config.policy.value = merge( + {}, + policy.inputs[0].config.policy.value, + resetCustomNotifications('custom test') ); - return policy; // This is the only one that shouldn't be updated since it has default values for disabled features } + return policy; }; + // I’ve decided to keep the content hardcoded for better readability instead of generating it dynamically. + const generateExpectedPolicyMock = ({ + defaultProtections, + defaultNotes, + defaultUpdates, + id, + }: { + id: string; + defaultProtections: boolean; + defaultNotes: boolean; + defaultUpdates: boolean; + }) => + expect.arrayContaining([ + expect.objectContaining({ + id, + inputs: [ + expect.objectContaining({ + config: expect.objectContaining({ + policy: expect.objectContaining({ + value: expect.objectContaining({ + global_manifest_version: defaultUpdates ? 'latest' : '2023-01-01', + linux: expect.objectContaining({ + behavior_protection: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + memory_protection: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + malware: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + popup: expect.objectContaining({ + behavior_protection: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + memory_protection: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + malware: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + }), + }), + mac: expect.objectContaining({ + behavior_protection: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + memory_protection: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + malware: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + popup: expect.objectContaining({ + behavior_protection: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + memory_protection: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + malware: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + }), + }), + windows: expect.objectContaining({ + behavior_protection: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + memory_protection: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + malware: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + ransomware: expect.objectContaining({ + mode: defaultProtections ? 'off' : 'prevent', + }), + popup: expect.objectContaining({ + behavior_protection: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + memory_protection: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + malware: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + ransomware: expect.objectContaining({ + message: defaultNotes ? DefaultPolicyNotificationMessage : 'custom test', + }), + }), + }), + }), + }), + }), + }), + ], + }), + ]); + + const createFilteredProductFeaturesServiceMock = ( + keysToExclude: string[] = [ + 'endpoint_policy_protections', + 'endpoint_custom_notification', + 'endpoint_protection_updates', + ] + ) => + createProductFeaturesServiceMock( + ALL_PRODUCT_FEATURE_KEYS.filter((key) => !keysToExclude.includes(key)) + ); + beforeEach(() => { const endpointContextStartContract = createMockEndpointAppContextServiceStartContract(); logger = loggingSystemMock.createLogger(); ({ esClient } = endpointContextStartContract); - productFeatureService = endpointContextStartContract.productFeaturesService; - - fleetServices = createEndpointFleetServicesFactoryMock().service.asInternalUser(); - }); + productFeatureService = createFilteredProductFeaturesServiceMock(); - describe('and both `endpointPolicyProtections` and `endpointProtectionUpdates` is enabled', () => { - it('should do nothing', async () => { - await callTurnOffPolicyProtections(); + // productFeatureService = endpointContextStartContract.productFeaturesService; - expect(fleetServices.packagePolicy.list as jest.Mock).not.toHaveBeenCalled(); - expect(logger.info).toHaveBeenNthCalledWith( - 1, - 'App feature [endpoint_policy_protections] is enabled. Nothing to do!' - ); - expect(logger.info).toHaveBeenLastCalledWith( - 'App feature [endpoint_protection_updates] is enabled. Nothing to do!' - ); - }); + fleetServices = createEndpointFleetServicesFactoryMock().service.asInternalUser(); }); - describe('and `endpointProtectionUpdates` is disabled but `endpointPolicyProtections` is enabled', () => { - let policyGenerator: FleetPackagePolicyGenerator; - let page1Items: PolicyData[] = []; - let page2Items: PolicyData[] = []; - let bulkUpdateResponse: PromiseResolvedValue>; - + describe('when merging policy updates for different product features', () => { beforeEach(() => { - policyGenerator = new FleetPackagePolicyGenerator('seed'); - const packagePolicyListSrv = fleetServices.packagePolicy.list as jest.Mock; - - productFeatureService = createProductFeaturesServiceMock( - ALL_PRODUCT_FEATURE_KEYS.filter((key) => key !== 'endpoint_protection_updates') - ); - - page1Items = [ - generatePolicyMock(policyGenerator, false), - generatePolicyMock(policyGenerator, false, false), - ]; - page2Items = [ - generatePolicyMock(policyGenerator, false, false), - generatePolicyMock(policyGenerator, false), - ]; - - packagePolicyListSrv - .mockImplementationOnce(async () => { - return { - total: 1500, - page: 1, - perPage: 1000, - items: page1Items, - }; - }) - .mockImplementationOnce(async () => { - return { - total: 1500, - page: 2, - perPage: 1000, - items: page2Items, - }; - }); - - bulkUpdateResponse = { - updatedPolicies: [page1Items[1], page2Items[0]], + // We only check for the `bulkUpdate` call, so we mock it to avoid side effects + fleetServices.packagePolicy.bulkUpdate = jest.fn().mockResolvedValue({ + updatedPolicies: [], failedPolicies: [], - }; - - (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mockImplementation(async () => { - return bulkUpdateResponse; }); }); + describe('All policies compliant', () => { + it('should not update if all all features are enabled', async () => { + productFeatureService = createProductFeaturesServiceMock(); - afterEach(() => { - jest.clearAllMocks(); - }); + const items = [generatePolicyMock(false, true, true)]; // Custom protections, custom manifest, custom notifications set - it('should update only policies that have non default manifest versions set', async () => { - await callTurnOffPolicyProtections(); + mockPolicyListResponse({ items }); - expect(fleetServices.packagePolicy.list as jest.Mock).toHaveBeenCalledTimes(2); - expect(fleetServices.packagePolicy.bulkUpdate as jest.Mock).toHaveBeenCalledWith( - fleetServices.savedObjects.createInternalScopedSoClient({ readonly: false }), - esClient, - [ - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![0].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![1].id }), - ], - { user: { username: 'elastic' } } - ); - }); - }); + await callTurnOffPolicyProtections(); - describe('and `endpointPolicyProtections` is disabled, but `endpointProtectionUpdates` is enabled', () => { - let policyGenerator: FleetPackagePolicyGenerator; - let page1Items: PolicyData[] = []; - let page2Items: PolicyData[] = []; - let bulkUpdateResponse: PromiseResolvedValue>; + expect(fleetServices.packagePolicy.bulkUpdate).not.toHaveBeenCalled(); + }); - beforeEach(() => { - policyGenerator = new FleetPackagePolicyGenerator('seed'); - const packagePolicyListSrv = fleetServices.packagePolicy.list as jest.Mock; + it('should not update if all policies are compliant', async () => { + const items = [generatePolicyMock(true, false, false)]; // Custom protections, default manifest, default notifications set - productFeatureService = createProductFeaturesServiceMock( - ALL_PRODUCT_FEATURE_KEYS.filter((key) => key !== 'endpoint_policy_protections') - ); + mockPolicyListResponse({ items }); - page1Items = [ - generatePolicyMock(policyGenerator, false, false), - generatePolicyMock(policyGenerator, true, false), - ]; - page2Items = [ - generatePolicyMock(policyGenerator, true, false), - generatePolicyMock(policyGenerator, false, false), - ]; - - packagePolicyListSrv - .mockImplementationOnce(async () => { - return { - total: 1500, - page: 1, - perPage: 1000, - items: page1Items, - }; - }) - .mockImplementationOnce(async () => { - return { - total: 1500, - page: 2, - perPage: 1000, - items: page2Items, - }; - }); - - bulkUpdateResponse = { - updatedPolicies: [page1Items[0], page2Items[1]], - failedPolicies: [], - }; + await callTurnOffPolicyProtections(); - (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mockImplementation(async () => { - return bulkUpdateResponse; + expect(fleetServices.packagePolicy.bulkUpdate).not.toHaveBeenCalled(); }); }); - afterEach(() => { - jest.clearAllMocks(); - }); + describe('Single feature not compliant with product features', () => { + it('should update properly if only `endpointPolicyProtections` changed', async () => { + const items = [ + generatePolicyMock(false, false, false), // Custom protections, default manifest, default notifications set + generatePolicyMock(true, false, false), // Compliant policy + ]; + + mockPolicyListResponse({ items }); + + await callTurnOffPolicyProtections(); + + const mockCalls = (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mock.calls; + expect(mockCalls.length).toBeGreaterThan(0); + const mockArguments = mockCalls[0][2]; + expect(mockArguments.length).toBe(1); // Only one policy should be updated + expect(mockArguments).toEqual( + generateExpectedPolicyMock({ + id: items[0].id, // Only the first policy should be updated + defaultProtections: true, + defaultNotes: true, + defaultUpdates: true, + }) + ); + }); - it('should update only policies that have protections turn on', async () => { - await callTurnOffPolicyProtections(); + it('should update properly if only `endpointPolicyProtections` changed across 2 result pages', async () => { + const packagePolicyListSrv = fleetServices.packagePolicy.list as jest.Mock; + + const allPolicies = [ + generatePolicyMock(false, false, false), // Custom protections, default manifest, default notifications set + generatePolicyMock(false, false, false), // Custom protections, default manifest, default notifications set + ]; + + mockPolicyListResponse({ total: 1500, items: [allPolicies[0]] }); + mockPolicyListResponse({ total: 1500, items: [allPolicies[1]] }); + + await callTurnOffPolicyProtections(); + expect(packagePolicyListSrv).toHaveBeenCalledTimes(2); + expect(fleetServices.packagePolicy.bulkUpdate).toHaveBeenCalledTimes(1); + + const mockCalls = (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mock.calls; + const mockArguments = mockCalls[0][2]; + expect(mockArguments.length).toBe(2); + expect(mockArguments[0].inputs[0].config.policy.value.global_manifest_version).toBe( + 'latest' + ); + expect(mockArguments[1].inputs[0].config.policy.value.windows.ransomware.mode).toBe('off'); + expect(mockArguments[0].inputs[0].config.policy.value.windows.ransomware.mode).toBe('off'); + }); - expect(fleetServices.packagePolicy.list as jest.Mock).toHaveBeenCalledTimes(2); - expect(fleetServices.packagePolicy.bulkUpdate as jest.Mock).toHaveBeenCalledWith( - fleetServices.savedObjects.createInternalScopedSoClient({ readonly: false }), - esClient, - [ - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![0].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![1].id }), - ], - { user: { username: 'elastic' } } - ); - expect(logger.info).toHaveBeenCalledWith( - 'Found 2 policies that need updates:\n' + - `Policy [${bulkUpdateResponse.updatedPolicies![0].id}][${ - bulkUpdateResponse.updatedPolicies![0].name - }] updated to disable protections. Trigger: [property [mac.malware.mode] is set to [prevent]]\n` + - `Policy [${bulkUpdateResponse.updatedPolicies![1].id}][${ - bulkUpdateResponse.updatedPolicies![1].name - }] updated to disable protections. Trigger: [property [mac.malware.mode] is set to [prevent]]` - ); - expect(logger.info).toHaveBeenCalledWith('Done. All updates applied successfully'); - }); + it('should update properly if only `endpointProtectionUpdates` not compliant', async () => { + const allPolicies = [ + generatePolicyMock(true, false, false), // Compliant policy + generatePolicyMock(true, true, false), // Default protections, custom manifest, default notifications set + ]; + + mockPolicyListResponse({ total: 2, items: allPolicies }); + + await callTurnOffPolicyProtections(); + + const mockCalls = (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mock.calls; + expect(mockCalls.length).toBeGreaterThan(0); + const mockArguments = mockCalls[0][2]; + expect(mockArguments.length).toBe(1); // Only one policy should be updated + expect(mockArguments).toEqual( + generateExpectedPolicyMock({ + id: allPolicies[1].id, // Only the second policy should be updated + defaultProtections: true, + defaultNotes: true, + defaultUpdates: true, + }) + ); + }); - it('should log failures', async () => { - bulkUpdateResponse.failedPolicies.push({ - error: new Error('oh oh'), - packagePolicy: bulkUpdateResponse.updatedPolicies![0], + it('should update properly if only `endpointCustomNote` not compliant', async () => { + const allPolicies = [ + generatePolicyMock(true, false, true), // Default protections, default manifest, custom notifications set + generatePolicyMock(true, false, false), // Compliant policy + ]; + + mockPolicyListResponse({ total: 2, items: allPolicies }); + + await callTurnOffPolicyProtections(); + + const mockCalls = (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mock.calls; + expect(mockCalls.length).toBeGreaterThan(0); + const mockArguments = mockCalls[0][2]; + expect(mockArguments.length).toBe(1); // Only one policy should be updated + expect(mockArguments).toEqual( + generateExpectedPolicyMock({ + id: allPolicies[0].id, // Only the first policy should be updated + defaultProtections: true, + defaultNotes: true, + defaultUpdates: true, + }) + ); }); - await callTurnOffPolicyProtections(); - expect(logger.error).toHaveBeenCalledWith( - expect.stringContaining('Done. 1 out of 2 failed to update:') - ); + it('should update properly if only `endpointCustomNote` and `endpointProtectionUpdates` not compliant across 2 policies', async () => { + const allPolicies = [ + generatePolicyMock(true, false, true), // Default protections, default manifest, custom notifications set + generatePolicyMock(true, true, false), // Default protections, custom manifest, default notifications set + generatePolicyMock(true, false, false), // Default protections, default manifest, default notifications set + ]; + + mockPolicyListResponse({ total: 3, items: allPolicies }); + + await callTurnOffPolicyProtections(); + + const mockCalls = (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mock.calls; + expect(mockCalls.length).toBeGreaterThan(0); + const mockArguments = mockCalls[0][2]; + expect(mockArguments.length).toBe(2); // Two policies should be updated + expect(mockArguments[0].inputs[0].config.policy.value.global_manifest_version).toBe( + 'latest' + ); + expect(mockArguments[1].inputs[0].config.policy.value.global_manifest_version).toBe( + 'latest' + ); + expect( + mockArguments[0].inputs[0].config.policy.value.windows.popup.memory_protection.message + ).toBe(DefaultPolicyNotificationMessage); + expect( + mockArguments[1].inputs[0].config.policy.value.windows.popup.memory_protection.message + ).toBe(DefaultPolicyNotificationMessage); + }); }); - }); - - describe('and both `endpointPolicyProtections` and `endpointProtectionUpdates` is disabled', () => { - let policyGenerator: FleetPackagePolicyGenerator; - let page1Items: PolicyData[] = []; - let page2Items: PolicyData[] = []; - let bulkUpdateResponse: PromiseResolvedValue>; - - beforeEach(() => { - policyGenerator = new FleetPackagePolicyGenerator('seed'); - const packagePolicyListSrv = fleetServices.packagePolicy.list as jest.Mock; - - productFeatureService = createProductFeaturesServiceMock( - ALL_PRODUCT_FEATURE_KEYS.filter( - (key) => key !== 'endpoint_policy_protections' && key !== 'endpoint_protection_updates' - ) - ); - page1Items = [ - generatePolicyMock(policyGenerator), - generatePolicyMock(policyGenerator, true), // This is the only one that shouldn't be updated since it has default values for disabled features - generatePolicyMock(policyGenerator, true, false), - generatePolicyMock(policyGenerator, false, false), - ]; - - page2Items = [ - generatePolicyMock(policyGenerator, false, false), - generatePolicyMock(policyGenerator, true, false), - generatePolicyMock(policyGenerator, true), // This is the only one that shouldn't be updated since it has default values for disabled features - generatePolicyMock(policyGenerator), - ]; - - packagePolicyListSrv - .mockImplementationOnce(async () => { - return { - total: 1500, - page: 1, - perPage: 1000, - items: page1Items, - }; - }) - .mockImplementationOnce(async () => { - return { - total: 1500, - page: 2, - perPage: 1000, - items: page2Items, - }; - }); - - bulkUpdateResponse = { - updatedPolicies: [ - page1Items[0], - page1Items[2], - page1Items[3], - page2Items[0], - page2Items[1], - page2Items[3], - ], - failedPolicies: [], + describe('Multiple features not compliant with product features', () => { + const verifyGeneratedPolicies = (policies: PolicyData[]) => { + expect(policies[0].inputs[0].config.policy.value.global_manifest_version).toBe( + '2023-01-01' + ); + expect(policies[0].inputs[0].config.policy.value.windows.memory_protection.mode).toBe( + 'prevent' + ); + expect( + policies[0].inputs[0].config.policy.value.windows.popup.memory_protection.message + ).toBe('custom test'); }; - (fleetServices.packagePolicy.bulkUpdate as jest.Mock).mockImplementation(async () => { - return bulkUpdateResponse; + it('should merge updates for `endpointPolicyProtections` and `endpointCustomNotification`', async () => { + productFeatureService = createFilteredProductFeaturesServiceMock([ + 'endpoint_custom_notification', + 'endpoint_policy_protections', + ]); + + const policiesNeedingUpdate = [ + generatePolicyMock(false, true, true), // Custom protections, custom manifest, custom notifications set + ]; + + // Sanity check to ensure the policies are generated correctly + verifyGeneratedPolicies(policiesNeedingUpdate); + + mockPolicyListResponse({ total: 1, items: policiesNeedingUpdate }); + + await callTurnOffPolicyProtections(); + + expect(fleetServices.packagePolicy.bulkUpdate).toHaveBeenCalledWith( + fleetServices.savedObjects.createInternalScopedSoClient({ readonly: false }), + esClient, + generateExpectedPolicyMock({ + id: policiesNeedingUpdate[0].id, + defaultProtections: true, + defaultNotes: true, + defaultUpdates: false, + }), + { user: { username: 'elastic' } } + ); }); - }); - afterEach(() => { - jest.clearAllMocks(); - }); + it('should merge updates for `endpointProtectionUpdates` and `endpointCustomNotification`', async () => { + productFeatureService = createFilteredProductFeaturesServiceMock([ + 'endpoint_custom_notification', + 'endpoint_protection_updates', + ]); + + const policiesNeedingUpdate = [ + generatePolicyMock(false, true, true), // Custom protections, custom manifest, custom notifications set + ]; + + // Sanity check to ensure the policies are generated correctly + verifyGeneratedPolicies(policiesNeedingUpdate); + + mockPolicyListResponse({ total: 1, items: policiesNeedingUpdate }); + + await callTurnOffPolicyProtections(); + + expect(fleetServices.packagePolicy.bulkUpdate).toHaveBeenCalledWith( + fleetServices.savedObjects.createInternalScopedSoClient({ readonly: false }), + esClient, + generateExpectedPolicyMock({ + id: policiesNeedingUpdate[0].id, + defaultProtections: false, + defaultNotes: true, + defaultUpdates: true, + }), + { user: { username: 'elastic' } } + ); + }); - it('should update only policies that have protections and protection updates turned on', async () => { - await callTurnOffPolicyProtections(); - - expect(fleetServices.packagePolicy.list as jest.Mock).toHaveBeenCalledTimes(2); - expect(fleetServices.packagePolicy.bulkUpdate as jest.Mock).toHaveBeenCalledWith( - fleetServices.savedObjects.createInternalUnscopedSoClient(), - esClient, - [ - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![0].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![1].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![2].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![3].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![4].id }), - expect.objectContaining({ id: bulkUpdateResponse.updatedPolicies![5].id }), - ], - { user: { username: 'elastic' } } - ); + it('should merge updates for `endpointPolicyProtections`, `endpointProtectionUpdates`, and `endpointCustomNotification`', async () => { + const policiesNeedingUpdate = [ + generatePolicyMock(false, true, true), // Custom protections, custom manifest, custom notifications set + ]; + + // Sanity check to ensure the policies are generated correctly + verifyGeneratedPolicies(policiesNeedingUpdate); + + mockPolicyListResponse({ total: 1, items: policiesNeedingUpdate }); + + await callTurnOffPolicyProtections(); + + expect(fleetServices.packagePolicy.bulkUpdate).toHaveBeenCalledWith( + fleetServices.savedObjects.createInternalUnscopedSoClient(), + esClient, + generateExpectedPolicyMock({ + id: policiesNeedingUpdate[0].id, + defaultProtections: true, + defaultNotes: true, + defaultUpdates: true, + }), + { user: { username: 'elastic' } } + ); + }); }); }); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.ts b/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.ts index 43e30b25b4168..ffc7141a6979c 100644 --- a/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.ts +++ b/x-pack/plugins/security_solution/server/endpoint/migrations/turn_off_policy_protections.ts @@ -9,9 +9,12 @@ import type { ElasticsearchClient, Logger } from '@kbn/core/server'; import type { UpdatePackagePolicy } from '@kbn/fleet-plugin/common'; import type { AuthenticatedUser } from '@kbn/security-plugin/common'; import { ProductFeatureSecurityKey } from '@kbn/security-solution-features/keys'; +import { merge } from 'lodash'; import { + checkIfPopupMessagesContainCustomNotifications, ensureOnlyEventCollectionIsAllowed, isPolicySetToEventCollectionOnly, + resetCustomNotifications, } from '../../../common/endpoint/models/policy_config_helpers'; import type { PolicyData } from '../../../common/endpoint/types'; import type { EndpointInternalFleetServicesInterface } from '../services/fleet'; @@ -24,63 +27,44 @@ export const turnOffPolicyProtectionsIfNotSupported = async ( productFeaturesService: ProductFeaturesService, logger: Logger ): Promise => { - const log = logger.get('endpoint', 'policyProtections'); + const log = logger.get('endpoint', 'policyProtectionsComplianceChecks'); const isProtectionUpdatesFeatureEnabled = productFeaturesService.isEnabled( ProductFeatureSecurityKey.endpointProtectionUpdates ); - const isPolicyProtectionsEnabled = productFeaturesService.isEnabled( ProductFeatureSecurityKey.endpointPolicyProtections ); + const isCustomNotificationEnabled = productFeaturesService.isEnabled( + ProductFeatureSecurityKey.endpointCustomNotification + ); - if (isPolicyProtectionsEnabled) { - log.info( - `App feature [${ProductFeatureSecurityKey.endpointPolicyProtections}] is enabled. Nothing to do!` - ); - } - - if (isProtectionUpdatesFeatureEnabled) { - log.info( - `App feature [${ProductFeatureSecurityKey.endpointProtectionUpdates}] is enabled. Nothing to do!` - ); - } - - if (isPolicyProtectionsEnabled && isProtectionUpdatesFeatureEnabled) { + if ( + isPolicyProtectionsEnabled && + isProtectionUpdatesFeatureEnabled && + isCustomNotificationEnabled + ) { + log.info('All relevant features are enabled. Nothing to do!'); return; } - if (!isPolicyProtectionsEnabled) { - log.info( - `App feature [${ProductFeatureSecurityKey.endpointPolicyProtections}] is disabled. Checking endpoint integration policies for compliance` - ); - } - - if (!isProtectionUpdatesFeatureEnabled) { - log.info( - `App feature [${ProductFeatureSecurityKey.endpointProtectionUpdates}] is disabled. Checking endpoint integration policies for compliance` - ); - } - const { packagePolicy, savedObjects, endpointPolicyKuery } = fleetServices; const internalSoClient = savedObjects.createInternalScopedSoClient({ readonly: false }); const updates: UpdatePackagePolicy[] = []; const messages: string[] = []; const perPage = 1000; let hasMoreData = true; - let total = 0; let page = 1; - do { - const currentPage = page++; - const { items, total: totalPolicies } = await packagePolicy.list(internalSoClient, { - page: currentPage, + while (hasMoreData) { + const { items, total } = await packagePolicy.list(internalSoClient, { + page, kuery: endpointPolicyKuery, perPage, }); - total = totalPolicies; - hasMoreData = currentPage * perPage < total; + hasMoreData = page * perPage < total; + page++; for (const item of items) { const integrationPolicy = item as PolicyData; @@ -88,56 +72,58 @@ export const turnOffPolicyProtectionsIfNotSupported = async ( const { message, isOnlyCollectingEvents } = isPolicySetToEventCollectionOnly(policySettings); const shouldDowngradeProtectionUpdates = !isProtectionUpdatesFeatureEnabled && policySettings.global_manifest_version !== 'latest'; - - if (!isPolicyProtectionsEnabled && !isOnlyCollectingEvents) { - messages.push( - `Policy [${integrationPolicy.id}][${integrationPolicy.name}] updated to disable protections. Trigger: [${message}]` - ); - + const shouldDowngradeCustomNotifications = + !isCustomNotificationEnabled && + checkIfPopupMessagesContainCustomNotifications(policySettings); + + if ( + (!isPolicyProtectionsEnabled && !isOnlyCollectingEvents) || + shouldDowngradeProtectionUpdates || + shouldDowngradeCustomNotifications + ) { + if (!isPolicyProtectionsEnabled && !isOnlyCollectingEvents) { + messages.push( + `Policy [${integrationPolicy.id}][${integrationPolicy.name}] updated to disable protections. Trigger: [${message}]` + ); + } if (shouldDowngradeProtectionUpdates) { messages.push( `Policy [${integrationPolicy.id}][${integrationPolicy.name}] updated to downgrade protection updates.` ); } + if (shouldDowngradeCustomNotifications) { + messages.push( + `Policy [${integrationPolicy.id}][${integrationPolicy.name}] updated to reset custom notifications.` + ); + } - integrationPolicy.inputs[0].config.policy.value = { - ...ensureOnlyEventCollectionIsAllowed(policySettings), - ...(shouldDowngradeProtectionUpdates ? { global_manifest_version: 'latest' } : {}), - }; - - updates.push({ - ...getPolicyDataForUpdate(integrationPolicy), - id: integrationPolicy.id, - }); - } else if (shouldDowngradeProtectionUpdates) { - messages.push( - `Policy [${integrationPolicy.id}][${integrationPolicy.name}] updated to downgrade protection updates.` + integrationPolicy.inputs[0].config.policy.value = merge( + {}, + policySettings, + !isPolicyProtectionsEnabled && !isOnlyCollectingEvents + ? ensureOnlyEventCollectionIsAllowed(policySettings) + : {}, + shouldDowngradeProtectionUpdates ? { global_manifest_version: 'latest' } : {}, + shouldDowngradeCustomNotifications ? resetCustomNotifications() : {} ); - integrationPolicy.inputs[0].config.policy.value.global_manifest_version = 'latest'; - updates.push({ ...getPolicyDataForUpdate(integrationPolicy), id: integrationPolicy.id, }); } } - } while (hasMoreData); + } if (updates.length > 0) { log.info(`Found ${updates.length} policies that need updates:\n${messages.join('\n')}`); - const bulkUpdateResponse = await fleetServices.packagePolicy.bulkUpdate( internalSoClient, esClient, updates, - { - user: { username: 'elastic' } as AuthenticatedUser, - } + { user: { username: 'elastic' } as AuthenticatedUser } ); - log.debug(() => `Bulk update response:\n${JSON.stringify(bulkUpdateResponse, null, 2)}`); - if (bulkUpdateResponse.failedPolicies.length > 0) { log.error( `Done. ${bulkUpdateResponse.failedPolicies.length} out of ${ @@ -145,9 +131,9 @@ export const turnOffPolicyProtectionsIfNotSupported = async ( } failed to update:\n${JSON.stringify(bulkUpdateResponse.failedPolicies, null, 2)}` ); } else { - log.info(`Done. All updates applied successfully`); + log.info('Done. All updates applied successfully'); } } else { - log.info(`Done. Checked ${total} policies and no updates needed`); + log.info(`Done. Checked ${page * perPage} policies and no updates needed`); } }; 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 81bfbf1cdd979..6accb29354ee4 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 @@ -600,7 +600,29 @@ describe('ingest_integration tests ', () => { await expect(() => callback(policyConfig, soClient, esClient, requestContextMock.convertContext(ctx), req) ).rejects.toThrow( - 'To modify protection updates, you must add at least Endpoint Complete to your project.' + 'To modify protection updates, you must add Endpoint Complete to your project.' + ); + }); + + it('should throw if endpointCustomNotification productFeature is disabled and user modifies popup.[protection].message', async () => { + productFeaturesService = createProductFeaturesServiceMock( + ALL_PRODUCT_FEATURE_KEYS.filter((key) => key !== 'endpoint_custom_notification') + ); + const callback = getPackagePolicyUpdateCallback( + logger, + licenseService, + endpointAppContextStartContract.featureUsageService, + endpointMetadataService, + cloudService, + esClient, + productFeaturesService + ); + const policyConfig = generator.generatePolicyPackagePolicy(); + policyConfig.inputs[0]!.config!.policy.value.windows.popup.ransomware.message = 'foo'; + await expect(() => + callback(policyConfig, soClient, esClient, requestContextMock.convertContext(ctx), req) + ).rejects.toThrow( + 'To customize the user notification, you must add Endpoint Protection Complete to your project.' ); }); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/validate_policy_against_product_features.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/validate_policy_against_product_features.ts index 78db424deaa01..e477006b3dfdc 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/handlers/validate_policy_against_product_features.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/validate_policy_against_product_features.ts @@ -7,6 +7,7 @@ import type { NewPackagePolicyInput } from '@kbn/fleet-plugin/common'; import { ProductFeatureSecurityKey } from '@kbn/security-solution-features/keys'; +import { checkIfPopupMessagesContainCustomNotifications } from '../../../common/endpoint/models/policy_config_helpers'; import type { ProductFeaturesService } from '../../lib/product_features_service'; export const validatePolicyAgainstProductFeatures = ( @@ -14,15 +15,36 @@ export const validatePolicyAgainstProductFeatures = ( productFeaturesService: ProductFeaturesService ): void => { const input = inputs.find((i) => i.type === 'endpoint'); - if (input?.config?.policy?.value?.global_manifest_version) { - const globalManifestVersion = input.config.policy.value.global_manifest_version; + const policySettings = input?.config?.policy?.value; + + if (policySettings) { + const globalManifestVersion = policySettings.global_manifest_version; + + if (globalManifestVersion) { + if ( + globalManifestVersion !== 'latest' && + !productFeaturesService.isEnabled(ProductFeatureSecurityKey.endpointProtectionUpdates) + ) { + const productFeatureError: Error & { statusCode?: number; apiPassThrough?: boolean } = + new Error( + 'To modify protection updates, you must add Endpoint Complete to your project.' + ); + productFeatureError.statusCode = 403; + productFeatureError.apiPassThrough = true; + throw productFeatureError; + } + } + + const popupMessagesContainCustomNotifications = + checkIfPopupMessagesContainCustomNotifications(policySettings); + if ( - globalManifestVersion !== 'latest' && - !productFeaturesService.isEnabled(ProductFeatureSecurityKey.endpointProtectionUpdates) + popupMessagesContainCustomNotifications && + !productFeaturesService.isEnabled(ProductFeatureSecurityKey.endpointCustomNotification) ) { const productFeatureError: Error & { statusCode?: number; apiPassThrough?: boolean } = new Error( - 'To modify protection updates, you must add at least Endpoint Complete to your project.' + 'To customize the user notification, you must add Endpoint Protection Complete to your project.' ); productFeatureError.statusCode = 403; productFeatureError.apiPassThrough = true; diff --git a/x-pack/plugins/security_solution_serverless/common/pli/pli_config.ts b/x-pack/plugins/security_solution_serverless/common/pli/pli_config.ts index e817679db1c31..6d3155f1b6ad1 100644 --- a/x-pack/plugins/security_solution_serverless/common/pli/pli_config.ts +++ b/x-pack/plugins/security_solution_serverless/common/pli/pli_config.ts @@ -42,6 +42,7 @@ export const PLI_PRODUCT_FEATURES: PliProductFeatures = { ProductFeatureKey.endpointResponseActions, ProductFeatureKey.osqueryAutomatedResponseActions, ProductFeatureKey.endpointAgentTamperProtection, + ProductFeatureKey.endpointCustomNotification, ProductFeatureKey.endpointProtectionUpdates, ], }, diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/endpoint_custom_notification.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/endpoint_custom_notification.tsx new file mode 100644 index 0000000000000..79af4662e7fe2 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/endpoint_custom_notification.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiCard, EuiIcon, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import styled from '@emotion/styled'; + +const CARD_TITLE = i18n.translate( + 'xpack.securitySolutionServerless.endpointCustomNotification.cardTitle', + { + defaultMessage: 'Custom notification', + } +); +const CARD_MESSAGE = i18n.translate( + 'xpack.securitySolutionServerless.endpointCustomNotification.cardMessage', + { + defaultMessage: + 'To customize the user notification, you must add Endpoint Protection Complete to your project.', + } +); +const BADGE_TEXT = i18n.translate( + 'xpack.securitySolutionServerless.endpointCustomNotification.badgeText', + { + defaultMessage: 'Endpoint Complete', + } +); + +const CardDescription = styled.p` + padding: 0 33.3%; +`; + +/** + * Component displayed when a given product tier is not allowed to use endpoint policy protections. + */ +export const EndpointCustomNotification = memo(() => { + return ( + <> + + } + betaBadgeProps={{ + 'data-test-subj': 'endpointPolicy-customNotificationLockedCard-badge', + label: BADGE_TEXT, + }} + title={ +

+ {CARD_TITLE} +

+ } + > + {CARD_MESSAGE} +
+ + ); +}); +EndpointCustomNotification.displayName = 'EndpointCustomNotification'; diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/index.ts b/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/index.ts index 3858f3bc38029..6797cc0d29fbf 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/index.ts +++ b/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management/index.ts @@ -13,6 +13,12 @@ export const EndpointPolicyProtectionsLazy = lazy(() => })) ); +export const EndpointCustomNotificationLazy = lazy(() => + import('./endpoint_custom_notification').then(({ EndpointCustomNotification }) => ({ + default: EndpointCustomNotification, + })) +); + export const RuleDetailsEndpointExceptionsLazy = lazy(() => import('./rule_details_endpoint_exceptions').then(({ RuleDetailsEndpointExceptions }) => ({ default: RuleDetailsEndpointExceptions, diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/upsellings.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/upsellings.tsx index bbc873ef137e7..f61f429ff9e88 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/upsellings.tsx +++ b/x-pack/plugins/security_solution_serverless/public/upselling/upsellings.tsx @@ -19,6 +19,7 @@ import React from 'react'; import { CloudSecurityPostureIntegrationPliBlockLazy } from './sections/cloud_security_posture'; import { EndpointAgentTamperProtectionLazy, + EndpointCustomNotificationLazy, EndpointPolicyProtectionsLazy, EndpointProtectionUpdatesLazy, RuleDetailsEndpointExceptionsLazy, @@ -108,6 +109,11 @@ export const upsellingSections: UpsellingSections = [ pli: ProductFeatureKey.endpointPolicyProtections, component: EndpointPolicyProtectionsLazy, }, + { + id: 'endpoint_custom_notification', + pli: ProductFeatureKey.endpointCustomNotification, + component: EndpointCustomNotificationLazy, + }, { id: 'ruleDetailsEndpointExceptions', pli: ProductFeatureKey.endpointExceptions, From 67f30433fdf1dea1793af3da8519a66a9dc4bd34 Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Tue, 1 Oct 2024 15:32:03 +0200 Subject: [PATCH 070/107] Set useEcs to true in SLO burn rate rule (#194322) ## Summary This PR sets useEcs to true in the SLO burn rate rule. (more info [here](https://docs.google.com/document/d/1mhWcMR3aIp3z4SmPywpW89RG4hHiBAjYCQIQBDUYNj0/edit?usp=sharing)) --- .../src/schemas/generated/observability_slo_schema.ts | 3 ++- .../slo/server/lib/rules/slo_burn_rate/register.ts | 2 +- x-pack/test/api_integration/apis/maps/maps_telemetry.ts | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_slo_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_slo_schema.ts index d611dd0df138c..6dcd7d95dfda8 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_slo_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_slo_schema.ts @@ -12,6 +12,7 @@ import * as rt from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; import { AlertSchema } from './alert_schema'; +import { EcsSchema } from './ecs_schema'; import { LegacyAlertSchema } from './legacy_alert_schema'; const ISO_DATE_PATTERN = /^d{4}-d{2}-d{2}Td{2}:d{2}:d{2}.d{3}Z$/; export const IsoDateString = new rt.Type( @@ -88,6 +89,6 @@ const ObservabilitySloAlertOptional = rt.partial({ }); // prettier-ignore -export const ObservabilitySloAlertSchema = rt.intersection([ObservabilitySloAlertRequired, ObservabilitySloAlertOptional, AlertSchema, LegacyAlertSchema]); +export const ObservabilitySloAlertSchema = rt.intersection([ObservabilitySloAlertRequired, ObservabilitySloAlertOptional, AlertSchema, EcsSchema, LegacyAlertSchema]); // prettier-ignore export type ObservabilitySloAlert = rt.TypeOf; diff --git a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts index 4e4c50305ef43..50e09e42512b7 100644 --- a/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts +++ b/x-pack/plugins/observability_solution/slo/server/lib/rules/slo_burn_rate/register.ts @@ -115,7 +115,7 @@ export function sloBurnRateRuleType( alerts: { context: SLO_RULE_REGISTRATION_CONTEXT, mappings: { fieldMap: { ...legacyExperimentalFieldMap, ...sloRuleFieldMap } }, - useEcs: false, + useEcs: true, useLegacyAlerts: true, shouldWrite: true, }, diff --git a/x-pack/test/api_integration/apis/maps/maps_telemetry.ts b/x-pack/test/api_integration/apis/maps/maps_telemetry.ts index acd846f77c982..3207fdbb739ef 100644 --- a/x-pack/test/api_integration/apis/maps/maps_telemetry.ts +++ b/x-pack/test/api_integration/apis/maps/maps_telemetry.ts @@ -36,8 +36,8 @@ export default function ({ getService }: FtrProviderContext) { return fieldStat.name === 'geo_point'; } ); - expect(geoPointFieldStats.count).to.be(47); - expect(geoPointFieldStats.index_count).to.be(11); + expect(geoPointFieldStats.count).to.be(55); + expect(geoPointFieldStats.index_count).to.be(12); const geoShapeFieldStats = apiResponse.cluster_stats.indices.mappings.field_types.find( (fieldStat: estypes.ClusterStatsFieldTypes) => { From 12205d51c5a6ff02737d4312de1ec598f7732608 Mon Sep 17 00:00:00 2001 From: weizijun Date: Tue, 1 Oct 2024 22:40:18 +0800 Subject: [PATCH 071/107] [Inference Endpoints View] Adds Alibaba AI Search to Deletion, search and filtering of inference endpoints (#190783) Summary Adds Alibaba AI Search support to the https://github.com/elastic/kibana/pull/186206 (relevance/inference_endpoints) management list view. The Elasticsearch PR is: https://github.com/elastic/elasticsearch/pull/111181 I'm not very familiar with kibana. I made this PR from https://github.com/elastic/kibana/pull/188670. --------- Co-authored-by: Elastic Machine Co-authored-by: Dima Arnautov Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../src/constants/trained_models.ts | 13 ++++++ .../providers/alibaba_cloud_ai_search.svg | 46 +++++++++++++++++++ .../service_provider.test.tsx | 20 ++++++++ .../service_provider.tsx | 5 ++ .../all_inference_endpoints/types.ts | 1 + 5 files changed, 85 insertions(+) create mode 100644 x-pack/plugins/search_inference_endpoints/public/assets/images/providers/alibaba_cloud_ai_search.svg diff --git a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts index caf4ce56b3482..95337518361e9 100644 --- a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts +++ b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts @@ -265,6 +265,19 @@ export type InferenceServiceSettings = url: string; }; } + | { + service: 'alibabacloud-ai-search'; + service_settings: { + api_key: string; + service_id: string; + host: string; + workspace: string; + http_schema: 'https' | 'http'; + rate_limit: { + requests_per_minute: number; + }; + }; + } | { service: 'amazonbedrock'; service_settings: { diff --git a/x-pack/plugins/search_inference_endpoints/public/assets/images/providers/alibaba_cloud_ai_search.svg b/x-pack/plugins/search_inference_endpoints/public/assets/images/providers/alibaba_cloud_ai_search.svg new file mode 100644 index 0000000000000..18534e2d0b3a1 --- /dev/null +++ b/x-pack/plugins/search_inference_endpoints/public/assets/images/providers/alibaba_cloud_ai_search.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.test.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.test.tsx index bcb6599632177..202e914e33a35 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.test.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.test.tsx @@ -268,4 +268,24 @@ describe('ServiceProvider component', () => { expect(screen.getByText('model-bedrock-xyz')).toBeInTheDocument(); }); }); + + describe('with alibabacloud-ai-search service', () => { + const mockEndpoint = { + inference_id: 'alibabacloud-ai-search-1', + service: 'alibabacloud-ai-search', + service_settings: { + service_id: 'service-123', + host: 'host-123', + workspace: 'default-123', + }, + } as any; + + it('renders the component with endpoint details', () => { + render(); + + expect(screen.getByText('AlibabaCloud AI Search')).toBeInTheDocument(); + const icon = screen.getByTestId('table-column-service-provider-alibabacloud-ai-search'); + expect(icon).toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx index b926f590335fb..574b3881f121b 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx @@ -20,6 +20,7 @@ import azureOpenAIIcon from '../../../../assets/images/providers/azure_open_ai.s import googleAIStudioIcon from '../../../../assets/images/providers/google_ai_studio.svg'; import mistralIcon from '../../../../assets/images/providers/mistral.svg'; import amazonBedrockIcon from '../../../../assets/images/providers/amazon_bedrock.svg'; +import alibabaCloudAISearchIcon from '../../../../assets/images/providers/alibaba_cloud_ai_search.svg'; import { ServiceProviderKeys } from '../../types'; import * as i18n from './translations'; @@ -33,6 +34,10 @@ interface ServiceProviderRecord { } export const SERVICE_PROVIDERS: Record = { + [ServiceProviderKeys['alibabacloud-ai-search']]: { + icon: alibabaCloudAISearchIcon, + name: 'AlibabaCloud AI Search', + }, [ServiceProviderKeys.amazonbedrock]: { icon: amazonBedrockIcon, name: 'Amazon Bedrock', diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts index 0a5da7288607d..6fb4cb0bcca6b 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts @@ -10,6 +10,7 @@ import { TaskTypes } from '../../types'; export const INFERENCE_ENDPOINTS_TABLE_PER_PAGE_VALUES = [25, 50, 100]; export enum ServiceProviderKeys { + 'alibabacloud-ai-search' = 'alibabacloud-ai-search', amazonbedrock = 'amazonbedrock', azureopenai = 'azureopenai', azureaistudio = 'azureaistudio', From c8c74399a0b282b9b687379bd324db24fea59c44 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 1 Oct 2024 10:43:52 -0400 Subject: [PATCH 072/107] Move nested declarations above rule (#193931) ## Summary > Sass's behavior for declarations that appear after nested rules will be changing to match the behavior specified by CSS in an upcoming version. To keep the existing behavior, move the declaration above the nested rule. To opt into the new behavior, wrap the declaration in & {}. I have moved the declarations above the nested rules. I had attempted to opt in to the new behavior, but the resulting CSS has duplicate selectors, which CI does not allow For more information about the new behavior, see [here](https://sass-lang.com/documentation/breaking-changes/mixed-decls/) Closes https://github.com/elastic/kibana/issues/190898 [screenshots](https://github.com/elastic/kibana/pull/193931#issuecomment-2375127180) Closes https://github.com/elastic/kibana/issues/190899 [screenshots](https://github.com/elastic/kibana/pull/193931#issuecomment-2375128228) Closes https://github.com/elastic/kibana/issues/190900 Access Page uses `authentication_state_page`, but I was unable to find 'overwrite_session` and `logged_out` pages Closes https://github.com/elastic/kibana/issues/190901 [screenshots](https://github.com/elastic/kibana/pull/193931#issuecomment-2375126897) Closes https://github.com/elastic/kibana/issues/190902 ^used on same UI Closes https://github.com/elastic/kibana/issues/190903 [screenshots](https://github.com/elastic/kibana/pull/193931#issuecomment-2375127629) Closes https://github.com/elastic/kibana/issues/190904 [screenshots](https://github.com/elastic/kibana/pull/193931#issuecomment-2375127865) --- src/plugins/interactive_setup/public/app.scss | 4 ++-- .../access_agreement/access_agreement_page.scss | 3 ++- .../authentication_state_page/authentication_state_page.scss | 4 ++-- .../login/components/login_form/login_form.scss | 4 ++-- .../security/public/authentication/login/login_page.scss | 4 ++-- .../spaces/public/nav_control/components/spaces_menu.scss | 3 ++- .../__snapshots__/space_selector.test.tsx.snap | 4 ++-- .../plugins/spaces/public/space_selector/space_selector.scss | 3 +++ .../plugins/spaces/public/space_selector/space_selector.tsx | 5 ++++- 9 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/plugins/interactive_setup/public/app.scss b/src/plugins/interactive_setup/public/app.scss index 119a2377dd7d2..837a856610a23 100644 --- a/src/plugins/interactive_setup/public/app.scss +++ b/src/plugins/interactive_setup/public/app.scss @@ -9,10 +9,10 @@ } .interactiveSetup__logo { + margin-bottom: $euiSizeXL; + @include kibanaCircleLogo; @include euiBottomShadowMedium; - - margin-bottom: $euiSizeXL; } .interactiveSetup__content { diff --git a/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.scss b/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.scss index 08e7be248619f..7a9557fb7d8d4 100644 --- a/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.scss +++ b/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.scss @@ -7,9 +7,10 @@ } .secAccessAgreementPage__text { - @include euiYScrollWithShadows; max-height: 400px; padding: $euiSize $euiSizeL 0; + + @include euiYScrollWithShadows; } .secAccessAgreementPage__footer { diff --git a/x-pack/plugins/security/public/authentication/components/authentication_state_page/authentication_state_page.scss b/x-pack/plugins/security/public/authentication/components/authentication_state_page/authentication_state_page.scss index 3b162dc962400..401e821aa3e76 100644 --- a/x-pack/plugins/security/public/authentication/components/authentication_state_page/authentication_state_page.scss +++ b/x-pack/plugins/security/public/authentication/components/authentication_state_page/authentication_state_page.scss @@ -9,10 +9,10 @@ } .secAuthenticationStatePage__logo { + margin-bottom: $euiSizeXL; + @include kibanaCircleLogo; @include euiBottomShadowMedium; - - margin-bottom: $euiSizeXL; } .secAuthenticationStatePage__content { diff --git a/x-pack/plugins/security/public/authentication/login/components/login_form/login_form.scss b/x-pack/plugins/security/public/authentication/login/components/login_form/login_form.scss index 344cde9c7825c..a8607c4048f42 100644 --- a/x-pack/plugins/security/public/authentication/login/components/login_form/login_form.scss +++ b/x-pack/plugins/security/public/authentication/login/components/login_form/login_form.scss @@ -23,11 +23,11 @@ } &:focus { - @include euiFocusRing; - border-color: transparent; border-radius: $euiBorderRadius; + @include euiFocusRing; + .secLoginCard__title { text-decoration: underline; } diff --git a/x-pack/plugins/security/public/authentication/login/login_page.scss b/x-pack/plugins/security/public/authentication/login/login_page.scss index cdfad55ee064a..8930de1425d85 100644 --- a/x-pack/plugins/security/public/authentication/login/login_page.scss +++ b/x-pack/plugins/security/public/authentication/login/login_page.scss @@ -9,10 +9,10 @@ } .loginWelcome__logo { + margin-bottom: $euiSizeXL; + @include kibanaCircleLogo; @include euiBottomShadowMedium; - - margin-bottom: $euiSizeXL; } .loginWelcome__content { diff --git a/x-pack/plugins/spaces/public/nav_control/components/spaces_menu.scss b/x-pack/plugins/spaces/public/nav_control/components/spaces_menu.scss index f444b45192f8b..8e14b2876f429 100644 --- a/x-pack/plugins/spaces/public/nav_control/components/spaces_menu.scss +++ b/x-pack/plugins/spaces/public/nav_control/components/spaces_menu.scss @@ -3,8 +3,9 @@ } .spcMenu__spacesList { - @include euiYScrollWithShadows; max-height: $euiSizeXL * 10; + + @include euiYScrollWithShadows; } .spcMenu__searchFieldWrapper { diff --git a/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap b/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap index 8dfe89ef172d4..4419707ab45f4 100644 --- a/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap +++ b/x-pack/plugins/spaces/public/space_selector/__snapshots__/space_selector.test.tsx.snap @@ -8,7 +8,7 @@ exports[`it renders with custom logo 1`] = ` >
@@ -69,7 +69,7 @@ exports[`it renders without crashing 1`] = ` >
diff --git a/x-pack/plugins/spaces/public/space_selector/space_selector.scss b/x-pack/plugins/spaces/public/space_selector/space_selector.scss index 4629e92a201f5..f589347e592ed 100644 --- a/x-pack/plugins/spaces/public/space_selector/space_selector.scss +++ b/x-pack/plugins/spaces/public/space_selector/space_selector.scss @@ -4,6 +4,9 @@ .spcSelectorBackground { @include kibanaFullScreenGraphics; +} + +.spcSelectorBackground__nonMixinAttributes { z-index: -1; pointer-events: none; } diff --git a/x-pack/plugins/spaces/public/space_selector/space_selector.tsx b/x-pack/plugins/spaces/public/space_selector/space_selector.tsx index e90d1c4a10954..3d72392552e38 100644 --- a/x-pack/plugins/spaces/public/space_selector/space_selector.tsx +++ b/x-pack/plugins/spaces/public/space_selector/space_selector.tsx @@ -124,7 +124,10 @@ export class SpaceSelector extends Component { > {/* Portal the fixed background graphic so it doesn't affect page positioning or overlap on top of global banners */} -
+
From 9e117c3aa22f3296cfda2d4f43c1729562290057 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 1 Oct 2024 17:33:29 +0200 Subject: [PATCH 073/107] [SLOs] Try async creation of resources !! (#192836) ## Summary Try async as much as possible while creating SLO !! Also UI form won't wait now for creating burn rate rule, it will be created async loading state in toast !! ### Before ![image](https://github.com/user-attachments/assets/dc73ce58-3fc4-475f-a6ae-71ac98a6432c) ### After ![image](https://github.com/user-attachments/assets/4439bb8b-6768-4d8b-b208-1bad28f17ae5) --- ..._rule.ts => use_create_burn_rate_rule.tsx} | 35 ++++- .../slo/public/hooks/use_create_slo.tsx | 2 +- .../components/slo_edit_form_footer.tsx | 8 +- .../public/pages/slo_edit/slo_edit.test.tsx | 4 +- .../slo/server/routes/slo/route.ts | 20 +-- .../slo/server/services/create_slo.test.ts | 37 +++--- .../slo/server/services/create_slo.ts | 120 ++++++++++++------ .../slo/server/services/manage_slo.test.ts | 12 +- .../slo/server/services/manage_slo.ts | 4 +- .../slo/server/services/mocks/index.ts | 4 +- .../slo/server/services/reset_slo.test.ts | 4 +- .../slo/server/services/reset_slo.ts | 2 +- .../server/services/slo_repository.test.ts | 45 +++---- .../slo/server/services/slo_repository.ts | 38 ++++-- .../slo/server/services/update_slo.test.ts | 6 +- .../slo/server/services/update_slo.ts | 4 +- .../api_integration/apis/slos/delete_slo.ts | 12 +- .../api_integration/apis/slos/update_slo.ts | 2 +- 18 files changed, 220 insertions(+), 139 deletions(-) rename x-pack/plugins/observability_solution/slo/public/hooks/{use_create_rule.ts => use_create_burn_rate_rule.tsx} (59%) diff --git a/x-pack/plugins/observability_solution/slo/public/hooks/use_create_rule.ts b/x-pack/plugins/observability_solution/slo/public/hooks/use_create_burn_rate_rule.tsx similarity index 59% rename from x-pack/plugins/observability_solution/slo/public/hooks/use_create_rule.ts rename to x-pack/plugins/observability_solution/slo/public/hooks/use_create_burn_rate_rule.tsx index a85072d907983..906e844c14806 100644 --- a/x-pack/plugins/observability_solution/slo/public/hooks/use_create_rule.ts +++ b/x-pack/plugins/observability_solution/slo/public/hooks/use_create_burn_rate_rule.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import React from 'react'; import { useMutation } from '@tanstack/react-query'; import { i18n } from '@kbn/i18n'; import { BASE_ALERTING_API_PATH, RuleTypeParams } from '@kbn/alerting-plugin/common'; @@ -13,18 +14,23 @@ import type { CreateRuleRequestBody, CreateRuleResponse, } from '@kbn/alerting-plugin/common/routes/rule/apis/create'; +import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { useKibana } from '../utils/kibana_react'; export function useCreateRule() { const { http, + i18n: i18nStart, notifications: { toasts }, + theme, } = useKibana().services; - const createRule = useMutation< + return useMutation< CreateRuleResponse, Error, - { rule: CreateRuleRequestBody } + { rule: CreateRuleRequestBody }, + { loadingToastId?: string } >( ['createRule'], ({ rule }) => { @@ -39,6 +45,24 @@ export function useCreateRule() { } }, { + onMutate: async () => { + const loadingToast = toasts.addInfo({ + title: toMountPoint( + + + {i18n.translate('xpack.slo.rules.createRule.loadingNotification.descriptionText', { + defaultMessage: 'Creating burn rate rule ...', + })} + + + + + , + { i18n: i18nStart, theme } + ), + }); + return { loadingToastId: loadingToast.id }; + }, onError: (_err) => { toasts.addDanger( i18n.translate('xpack.slo.rules.createRule.errorNotification.descriptionText', { @@ -54,8 +78,11 @@ export function useCreateRule() { }) ); }, + onSettled: (_d, _err, _res, ctx) => { + if (ctx?.loadingToastId) { + toasts.remove(ctx?.loadingToastId); + } + }, } ); - - return createRule; } diff --git a/x-pack/plugins/observability_solution/slo/public/hooks/use_create_slo.tsx b/x-pack/plugins/observability_solution/slo/public/hooks/use_create_slo.tsx index fcb02315a847a..e5b6d2c114a84 100644 --- a/x-pack/plugins/observability_solution/slo/public/hooks/use_create_slo.tsx +++ b/x-pack/plugins/observability_solution/slo/public/hooks/use_create_slo.tsx @@ -55,7 +55,7 @@ export function useCreateSlo() { void; } -export const maxWidth = 775; - export function SloEditFormFooter({ slo, onSave }: Props) { const { application: { navigateToUrl }, @@ -45,7 +43,7 @@ export function SloEditFormFooter({ slo, onSave }: Props) { const { mutateAsync: createSlo, isLoading: isCreateSloLoading } = useCreateSlo(); const { mutateAsync: updateSlo, isLoading: isUpdateSloLoading } = useUpdateSlo(); - const { mutateAsync: createBurnRateRule, isLoading: isCreateBurnRateRuleLoading } = + const { mutate: createBurnRateRule, isLoading: isCreateBurnRateRuleLoading } = useCreateRule(); const navigate = useCallback( @@ -70,7 +68,7 @@ export function SloEditFormFooter({ slo, onSave }: Props) { } else { const processedValues = transformCreateSLOFormToCreateSLOInput(values); const resp = await createSlo({ slo: processedValues }); - await createBurnRateRule({ + createBurnRateRule({ rule: createBurnRateRuleRequestBody({ ...processedValues, id: resp.id }), }); if (onSave) { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx index dcd497da34770..f5acb4e964f08 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx @@ -23,7 +23,7 @@ import { useFetchApmSuggestions } from '../../hooks/use_fetch_apm_suggestions'; import { useFetchIndices } from '../../hooks/use_fetch_indices'; import { useFetchSloDetails } from '../../hooks/use_fetch_slo_details'; import { usePermissions } from '../../hooks/use_permissions'; -import { useCreateRule } from '../../hooks/use_create_rule'; +import { useCreateRule } from '../../hooks/use_create_burn_rate_rule'; import { useUpdateSlo } from '../../hooks/use_update_slo'; import { useKibana } from '../../utils/kibana_react'; import { kibanaStartMock } from '../../utils/kibana_react.mock'; @@ -45,7 +45,7 @@ jest.mock('../../hooks/use_create_slo'); jest.mock('../../hooks/use_update_slo'); jest.mock('../../hooks/use_fetch_apm_suggestions'); jest.mock('../../hooks/use_permissions'); -jest.mock('../../hooks/use_create_rule'); +jest.mock('../../hooks/use_create_burn_rate_rule'); const mockUseKibanaReturnValue = kibanaStartMock.startContract(); diff --git a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts index fffbd7aa1e924..703c8aab5a684 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts @@ -29,6 +29,8 @@ import { updateSLOParamsSchema, } from '@kbn/slo-schema'; import { getOverviewParamsSchema } from '@kbn/slo-schema/src/rest_specs/routes/get_overview'; +import { KibanaRequest } from '@kbn/core-http-server'; +import { RegisterRoutesDependencies } from '../register_routes'; import { GetSLOsOverview } from '../../services/get_slos_overview'; import type { IndicatorTypes } from '../../domain/models'; import { @@ -91,6 +93,11 @@ const assertPlatinumLicense = async (context: SloRequestHandlerContext) => { } }; +const getSpaceId = async (deps: RegisterRoutesDependencies, request: KibanaRequest) => { + const spaces = await deps.getSpacesStart(); + return (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; +}; + const createSLORoute = createSloServerRoute({ endpoint: 'POST /api/observability/slos 2023-10-31', options: { @@ -101,10 +108,7 @@ const createSLORoute = createSloServerRoute({ handler: async ({ context, params, logger, dependencies, request }) => { await assertPlatinumLicense(context); - const spaces = await dependencies.getSpacesStart(); const dataViews = await dependencies.getDataViewsStart(); - const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; - const core = await context.core; const scopedClusterClient = core.elasticsearch.client; const esClient = core.elasticsearch.client.asCurrentUser; @@ -112,7 +116,10 @@ const createSLORoute = createSloServerRoute({ const soClient = core.savedObjects.client; const repository = new KibanaSavedObjectsSLORepository(soClient, logger); - const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); + const [spaceId, dataViewsService] = await Promise.all([ + getSpaceId(dependencies, request), + dataViews.dataViewsServiceFactory(soClient, esClient), + ]); const transformManager = new DefaultTransformManager( transformGenerators, scopedClusterClient, @@ -125,7 +132,6 @@ const createSLORoute = createSloServerRoute({ scopedClusterClient, logger ); - const createSLO = new CreateSLO( esClient, scopedClusterClient, @@ -137,9 +143,7 @@ const createSLORoute = createSloServerRoute({ basePath ); - const response = await createSLO.execute(params.body); - - return response; + return await createSLO.execute(params.body); }, }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts b/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts index 9499294eeb89b..84edf74f18aa5 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts @@ -65,7 +65,7 @@ describe('CreateSLO', () => { const response = await createSLO.execute(sloParams); - expect(mockRepository.save).toHaveBeenCalledWith( + expect(mockRepository.create).toHaveBeenCalledWith( expect.objectContaining({ ...sloParams, id: 'unique-id', @@ -80,17 +80,14 @@ describe('CreateSLO', () => { version: 2, createdAt: expect.any(Date), updatedAt: expect.any(Date), - }), - { throwOnConflict: true } + }) ); expect(mockTransformManager.install).toHaveBeenCalled(); - expect(mockTransformManager.start).toHaveBeenCalled(); expect( mockScopedClusterClient.asSecondaryAuthUser.ingest.putPipeline.mock.calls[0] ).toMatchSnapshot(); expect(mockSummaryTransformManager.install).toHaveBeenCalled(); - expect(mockSummaryTransformManager.start).toHaveBeenCalled(); expect(mockEsClient.index.mock.calls[0]).toMatchSnapshot(); expect(response).toEqual(expect.objectContaining({ id: 'unique-id' })); @@ -108,7 +105,7 @@ describe('CreateSLO', () => { await createSLO.execute(sloParams); - expect(mockRepository.save).toHaveBeenCalledWith( + expect(mockRepository.create).toHaveBeenCalledWith( expect.objectContaining({ ...sloParams, id: expect.any(String), @@ -122,8 +119,7 @@ describe('CreateSLO', () => { enabled: true, createdAt: expect.any(Date), updatedAt: expect.any(Date), - }), - { throwOnConflict: true } + }) ); }); @@ -141,7 +137,7 @@ describe('CreateSLO', () => { await createSLO.execute(sloParams); - expect(mockRepository.save).toHaveBeenCalledWith( + expect(mockRepository.create).toHaveBeenCalledWith( expect.objectContaining({ ...sloParams, id: expect.any(String), @@ -155,8 +151,7 @@ describe('CreateSLO', () => { enabled: true, createdAt: expect.any(Date), updatedAt: expect.any(Date), - }), - { throwOnConflict: true } + }) ); }); }); @@ -173,16 +168,16 @@ describe('CreateSLO', () => { expect(mockRepository.deleteById).toHaveBeenCalled(); expect( mockScopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline - ).toHaveBeenCalledTimes(1); + ).toHaveBeenCalledTimes(2); - expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); - expect(mockSummaryTransformManager.uninstall).not.toHaveBeenCalled(); - expect(mockTransformManager.stop).not.toHaveBeenCalled(); - expect(mockTransformManager.uninstall).not.toHaveBeenCalled(); + expect(mockSummaryTransformManager.stop).toHaveBeenCalledTimes(0); + expect(mockSummaryTransformManager.uninstall).toHaveBeenCalledTimes(1); + expect(mockTransformManager.stop).toHaveBeenCalledTimes(0); + expect(mockTransformManager.uninstall).toHaveBeenCalledTimes(1); }); - it('rollbacks completed operations when summary transform start fails', async () => { - mockSummaryTransformManager.start.mockRejectedValue( + it('rollbacks completed operations when summary transform install fails', async () => { + mockSummaryTransformManager.install.mockRejectedValue( new Error('Summary transform install error') ); const sloParams = createSLOParams({ indicator: createAPMTransactionErrorRateIndicator() }); @@ -192,7 +187,7 @@ describe('CreateSLO', () => { ); expect(mockRepository.deleteById).toHaveBeenCalled(); - expect(mockTransformManager.stop).toHaveBeenCalled(); + expect(mockTransformManager.stop).not.toHaveBeenCalled(); expect(mockTransformManager.uninstall).toHaveBeenCalled(); expect( mockScopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline @@ -211,12 +206,12 @@ describe('CreateSLO', () => { ); expect(mockRepository.deleteById).toHaveBeenCalled(); - expect(mockTransformManager.stop).toHaveBeenCalled(); + expect(mockTransformManager.stop).not.toHaveBeenCalled(); expect(mockTransformManager.uninstall).toHaveBeenCalled(); expect( mockScopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline ).toHaveBeenCalledTimes(2); - expect(mockSummaryTransformManager.stop).toHaveBeenCalled(); + expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); expect(mockSummaryTransformManager.uninstall).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts b/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts index 0f6885dd44c6c..3845ec2ddbd4f 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts @@ -10,6 +10,7 @@ import { ElasticsearchClient, IBasePath, Logger } from '@kbn/core/server'; import { ALL_VALUE, CreateSLOParams, CreateSLOResponse } from '@kbn/slo-schema'; import { asyncForEach } from '@kbn/std'; import { v4 as uuidv4 } from 'uuid'; +import { IngestPutPipelineRequest } from '@elastic/elasticsearch/lib/api/types'; import { getSLOPipelineId, getSLOSummaryPipelineId, @@ -22,7 +23,7 @@ import { getSLOPipelineTemplate } from '../assets/ingest_templates/slo_pipeline_ import { getSLOSummaryPipelineTemplate } from '../assets/ingest_templates/slo_summary_pipeline_template'; import { Duration, DurationUnit, SLODefinition } from '../domain/models'; import { validateSLO } from '../domain/services'; -import { SecurityException } from '../errors'; +import { SecurityException, SLOIdConflict } from '../errors'; import { retryTransientEsErrors } from '../utils/retry'; import { SLORepository } from './slo_repository'; import { createTempSummaryDocument } from './summary_transform_generator/helpers/create_temp_summary'; @@ -47,62 +48,58 @@ export class CreateSLO { const rollbackOperations = []; - await this.repository.save(slo, { throwOnConflict: true }); - rollbackOperations.push(() => this.repository.deleteById(slo.id)); + const sloAlreadyExists = await this.repository.checkIfSLOExists(slo); + + if (sloAlreadyExists) { + throw new SLOIdConflict(`SLO [${slo.id}] already exists`); + } + + const createPromise = this.repository.create(slo); + + rollbackOperations.push(() => this.repository.deleteById(slo.id, true)); const rollupTransformId = getSLOTransformId(slo.id, slo.revision); const summaryTransformId = getSLOSummaryTransformId(slo.id, slo.revision); try { - await retryTransientEsErrors( - () => - this.scopedClusterClient.asSecondaryAuthUser.ingest.putPipeline( - getSLOPipelineTemplate(slo) - ), - { logger: this.logger } - ); - rollbackOperations.push(() => - this.scopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline( - { id: getSLOPipelineId(slo.id, slo.revision) }, - { ignore: [404] } - ) - ); + const sloPipelinePromise = this.createPipeline(getSLOPipelineTemplate(slo)); + rollbackOperations.push(() => this.deletePipeline(getSLOPipelineId(slo.id, slo.revision))); - await this.transformManager.install(slo); + const rollupTransformPromise = this.transformManager.install(slo); rollbackOperations.push(() => this.transformManager.uninstall(rollupTransformId)); - await this.transformManager.start(rollupTransformId); - rollbackOperations.push(() => this.transformManager.stop(rollupTransformId)); - - await retryTransientEsErrors( - () => - this.scopedClusterClient.asSecondaryAuthUser.ingest.putPipeline( - getSLOSummaryPipelineTemplate(slo, this.spaceId, this.basePath) - ), - { logger: this.logger } + const summaryPipelinePromise = this.createPipeline( + getSLOSummaryPipelineTemplate(slo, this.spaceId, this.basePath) ); + rollbackOperations.push(() => - this.scopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline( - { id: getSLOSummaryPipelineId(slo.id, slo.revision) }, - { ignore: [404] } - ) + this.deletePipeline(getSLOSummaryPipelineId(slo.id, slo.revision)) ); - await this.summaryTransformManager.install(slo); + const summaryTransformPromise = this.summaryTransformManager.install(slo); rollbackOperations.push(() => this.summaryTransformManager.uninstall(summaryTransformId)); - await this.summaryTransformManager.start(summaryTransformId); + const tempDocPromise = this.createTempSummaryDocument(slo); + + rollbackOperations.push(() => this.deleteTempSummaryDocument(slo)); + + await Promise.all([ + createPromise, + sloPipelinePromise, + rollupTransformPromise, + summaryPipelinePromise, + summaryTransformPromise, + tempDocPromise, + ]); + + rollbackOperations.push(() => this.transformManager.stop(rollupTransformId)); rollbackOperations.push(() => this.summaryTransformManager.stop(summaryTransformId)); - await retryTransientEsErrors( - () => - this.esClient.index({ - index: SLO_SUMMARY_TEMP_INDEX_NAME, - id: `slo-${slo.id}`, - document: createTempSummaryDocument(slo, this.spaceId, this.basePath), - refresh: true, - }), - { logger: this.logger } - ); + // transforms can only be started after the pipeline is created + + await Promise.all([ + this.transformManager.start(rollupTransformId), + this.summaryTransformManager.start(summaryTransformId), + ]); } catch (err) { this.logger.error( `Cannot install the SLO [id: ${slo.id}, revision: ${slo.revision}]. Rolling back.` @@ -126,6 +123,45 @@ export class CreateSLO { return this.toResponse(slo); } + async createTempSummaryDocument(slo: SLODefinition) { + return await retryTransientEsErrors( + () => + this.esClient.index({ + index: SLO_SUMMARY_TEMP_INDEX_NAME, + id: `slo-${slo.id}`, + document: createTempSummaryDocument(slo, this.spaceId, this.basePath), + refresh: true, + }), + { logger: this.logger } + ); + } + + async deleteTempSummaryDocument(slo: SLODefinition) { + return await retryTransientEsErrors( + () => + this.esClient.delete({ + index: SLO_SUMMARY_TEMP_INDEX_NAME, + id: `slo-${slo.id}`, + refresh: true, + }), + { logger: this.logger } + ); + } + + async createPipeline(params: IngestPutPipelineRequest) { + return await retryTransientEsErrors( + () => this.scopedClusterClient.asSecondaryAuthUser.ingest.putPipeline(params), + { logger: this.logger } + ); + } + + async deletePipeline(id: string) { + return this.scopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline( + { id }, + { ignore: [404] } + ); + } + public async inspect(params: CreateSLOParams): Promise<{ slo: CreateSLOParams; rollUpPipeline: Record; diff --git a/x-pack/plugins/observability_solution/slo/server/services/manage_slo.test.ts b/x-pack/plugins/observability_solution/slo/server/services/manage_slo.test.ts index bace47b69ff4b..d0fd587f6ed0b 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/manage_slo.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/manage_slo.test.ts @@ -38,7 +38,7 @@ describe('ManageSLO', () => { expect(mockTransformManager.start).not.toHaveBeenCalled(); expect(mockSummaryTransformManager.start).not.toHaveBeenCalled(); - expect(mockRepository.save).not.toHaveBeenCalled(); + expect(mockRepository.create).not.toHaveBeenCalled(); }); it('enables the slo when disabled', async () => { @@ -49,7 +49,9 @@ describe('ManageSLO', () => { expect(mockTransformManager.start).toMatchSnapshot(); expect(mockSummaryTransformManager.start).toMatchSnapshot(); - expect(mockRepository.save).toHaveBeenCalledWith(expect.objectContaining({ enabled: true })); + expect(mockRepository.update).toHaveBeenCalledWith( + expect.objectContaining({ enabled: true }) + ); }); }); @@ -62,7 +64,7 @@ describe('ManageSLO', () => { expect(mockTransformManager.stop).not.toHaveBeenCalled(); expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); - expect(mockRepository.save).not.toHaveBeenCalled(); + expect(mockRepository.update).not.toHaveBeenCalled(); }); it('disables the slo when enabled', async () => { @@ -73,7 +75,9 @@ describe('ManageSLO', () => { expect(mockTransformManager.stop).toMatchSnapshot(); expect(mockSummaryTransformManager.stop).toMatchSnapshot(); - expect(mockRepository.save).toHaveBeenCalledWith(expect.objectContaining({ enabled: false })); + expect(mockRepository.update).toHaveBeenCalledWith( + expect.objectContaining({ enabled: false }) + ); }); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/manage_slo.ts b/x-pack/plugins/observability_solution/slo/server/services/manage_slo.ts index 84e8e3798598b..65f59832b57a6 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/manage_slo.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/manage_slo.ts @@ -26,7 +26,7 @@ export class ManageSLO { await this.transformManager.start(getSLOTransformId(slo.id, slo.revision)); slo.enabled = true; slo.updatedAt = new Date(); - await this.repository.save(slo); + await this.repository.update(slo); } async disable(sloId: string) { @@ -39,6 +39,6 @@ export class ManageSLO { await this.transformManager.stop(getSLOTransformId(slo.id, slo.revision)); slo.enabled = false; slo.updatedAt = new Date(); - await this.repository.save(slo); + await this.repository.update(slo); } } diff --git a/x-pack/plugins/observability_solution/slo/server/services/mocks/index.ts b/x-pack/plugins/observability_solution/slo/server/services/mocks/index.ts index 4fc9d268f62dd..dc458fcdb813e 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/mocks/index.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/mocks/index.ts @@ -42,11 +42,13 @@ const createSummaryTransformManagerMock = (): jest.Mocked => { const createSLORepositoryMock = (): jest.Mocked => { return { - save: jest.fn(), + create: jest.fn(), + update: jest.fn(), findById: jest.fn(), findAllByIds: jest.fn(), deleteById: jest.fn(), search: jest.fn(), + checkIfSLOExists: jest.fn(), }; }; diff --git a/x-pack/plugins/observability_solution/slo/server/services/reset_slo.test.ts b/x-pack/plugins/observability_solution/slo/server/services/reset_slo.test.ts index efbf3eedb52e1..4e66d992b46cd 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/reset_slo.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/reset_slo.test.ts @@ -63,7 +63,7 @@ describe('ResetSLO', () => { it('resets all associated resources', async () => { const slo = createSLO({ id: 'irrelevant', version: 1 }); mockRepository.findById.mockResolvedValueOnce(slo); - mockRepository.save.mockImplementation((v) => Promise.resolve(v)); + mockRepository.update.mockImplementation((v) => Promise.resolve(v)); await resetSLO.execute(slo.id); @@ -87,7 +87,7 @@ describe('ResetSLO', () => { expect(mockEsClient.index).toMatchSnapshot(); - expect(mockRepository.save).toHaveBeenCalledWith({ + expect(mockRepository.update).toHaveBeenCalledWith({ ...slo, version: SLO_MODEL_VERSION, updatedAt: expect.anything(), diff --git a/x-pack/plugins/observability_solution/slo/server/services/reset_slo.ts b/x-pack/plugins/observability_solution/slo/server/services/reset_slo.ts index f69651ff2ad8a..634f02c8f6f90 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/reset_slo.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/reset_slo.ts @@ -104,7 +104,7 @@ export class ResetSLO { throw err; } - const updatedSlo = await this.repository.save({ + const updatedSlo = await this.repository.update({ ...slo, version: SLO_MODEL_VERSION, updatedAt: new Date(), diff --git a/x-pack/plugins/observability_solution/slo/server/services/slo_repository.test.ts b/x-pack/plugins/observability_solution/slo/server/services/slo_repository.test.ts index 1b6eec0ef4f97..243b2b5e9958b 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/slo_repository.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/slo_repository.test.ts @@ -11,7 +11,7 @@ import { MockedLogger } from '@kbn/logging-mocks'; import { sloDefinitionSchema } from '@kbn/slo-schema'; import { SLO_MODEL_VERSION } from '../../common/constants'; import { SLODefinition, StoredSLODefinition } from '../domain/models'; -import { SLOIdConflict, SLONotFound } from '../errors'; +import { SLONotFound } from '../errors'; import { SO_SLO_TYPE } from '../saved_objects'; import { aStoredSLO, createAPMTransactionDurationIndicator, createSLO } from './fixtures/slo'; import { KibanaSavedObjectsSLORepository } from './slo_repository'; @@ -82,43 +82,45 @@ describe('KibanaSavedObjectsSLORepository', () => { }); describe('saving an SLO', () => { - it('saves the new SLO', async () => { + it('checking existing id for slo', async () => { const slo = createSLO({ id: 'my-id' }); soClientMock.find.mockResolvedValueOnce(soFindResponse([])); soClientMock.create.mockResolvedValueOnce(aStoredSLO(slo)); const repository = new KibanaSavedObjectsSLORepository(soClientMock, loggerMock); - const savedSLO = await repository.save(slo); + await repository.checkIfSLOExists(slo); - expect(savedSLO).toEqual(slo); expect(soClientMock.find).toHaveBeenCalledWith({ type: SO_SLO_TYPE, - page: 1, - perPage: 1, + perPage: 0, filter: `slo.attributes.id:(${slo.id})`, }); + }); + + it('saves the new SLO', async () => { + const slo = createSLO({ id: 'my-id' }); + soClientMock.find.mockResolvedValueOnce(soFindResponse([])); + soClientMock.create.mockResolvedValueOnce(aStoredSLO(slo)); + const repository = new KibanaSavedObjectsSLORepository(soClientMock, loggerMock); + + const savedSLO = await repository.create(slo); + + expect(savedSLO).toEqual(slo); expect(soClientMock.create).toHaveBeenCalledWith( SO_SLO_TYPE, - sloDefinitionSchema.encode(slo), - { - id: undefined, - overwrite: true, - } + sloDefinitionSchema.encode(slo) ); }); - it('throws when the SLO id already exists and "throwOnConflict" is true', async () => { + it('checks when the SLO id already exists', async () => { const slo = createSLO({ id: 'my-id' }); soClientMock.find.mockResolvedValueOnce(soFindResponse([slo])); const repository = new KibanaSavedObjectsSLORepository(soClientMock, loggerMock); - await expect(repository.save(slo, { throwOnConflict: true })).rejects.toThrowError( - new SLOIdConflict(`SLO [my-id] already exists`) - ); + await expect(await repository.checkIfSLOExists(slo)).toEqual(true); expect(soClientMock.find).toHaveBeenCalledWith({ type: SO_SLO_TYPE, - page: 1, - perPage: 1, + perPage: 0, filter: `slo.attributes.id:(${slo.id})`, }); }); @@ -129,15 +131,10 @@ describe('KibanaSavedObjectsSLORepository', () => { soClientMock.create.mockResolvedValueOnce(aStoredSLO(slo)); const repository = new KibanaSavedObjectsSLORepository(soClientMock, loggerMock); - const savedSLO = await repository.save(slo); + const savedSLO = await repository.update(slo); expect(savedSLO).toEqual(slo); - expect(soClientMock.find).toHaveBeenCalledWith({ - type: SO_SLO_TYPE, - page: 1, - perPage: 1, - filter: `slo.attributes.id:(${slo.id})`, - }); + expect(soClientMock.create).toHaveBeenCalledWith( SO_SLO_TYPE, sloDefinitionSchema.encode(slo), diff --git a/x-pack/plugins/observability_solution/slo/server/services/slo_repository.ts b/x-pack/plugins/observability_solution/slo/server/services/slo_repository.ts index 9f300a148ac2e..35266ea993bfb 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/slo_repository.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/slo_repository.ts @@ -11,14 +11,16 @@ import { ALL_VALUE, Paginated, Pagination, sloDefinitionSchema } from '@kbn/slo- import { isLeft } from 'fp-ts/lib/Either'; import { SLO_MODEL_VERSION } from '../../common/constants'; import { SLODefinition, StoredSLODefinition } from '../domain/models'; -import { SLOIdConflict, SLONotFound } from '../errors'; +import { SLONotFound } from '../errors'; import { SO_SLO_TYPE } from '../saved_objects'; export interface SLORepository { - save(slo: SLODefinition, options?: { throwOnConflict: boolean }): Promise; + checkIfSLOExists(slo: SLODefinition): Promise; + create(slo: SLODefinition): Promise; + update(slo: SLODefinition): Promise; findAllByIds(ids: string[]): Promise; findById(id: string): Promise; - deleteById(id: string): Promise; + deleteById(id: string, ignoreNotFound?: boolean): Promise; search( search: string, pagination: Pagination, @@ -29,19 +31,30 @@ export interface SLORepository { export class KibanaSavedObjectsSLORepository implements SLORepository { constructor(private soClient: SavedObjectsClientContract, private logger: Logger) {} - async save(slo: SLODefinition, options = { throwOnConflict: false }): Promise { - let existingSavedObjectId; + async checkIfSLOExists(slo: SLODefinition) { + const findResponse = await this.soClient.find({ + type: SO_SLO_TYPE, + perPage: 0, + filter: `slo.attributes.id:(${slo.id})`, + }); + + return findResponse.total > 0; + } + + async create(slo: SLODefinition): Promise { + await this.soClient.create(SO_SLO_TYPE, toStoredSLO(slo)); + return slo; + } + + async update(slo: SLODefinition): Promise { + let existingSavedObjectId: string | undefined; + const findResponse = await this.soClient.find({ type: SO_SLO_TYPE, - page: 1, perPage: 1, filter: `slo.attributes.id:(${slo.id})`, }); if (findResponse.total === 1) { - if (options.throwOnConflict) { - throw new SLOIdConflict(`SLO [${slo.id}] already exists`); - } - existingSavedObjectId = findResponse.saved_objects[0].id; } @@ -73,7 +86,7 @@ export class KibanaSavedObjectsSLORepository implements SLORepository { return slo; } - async deleteById(id: string): Promise { + async deleteById(id: string, ignoreNotFound = false): Promise { const response = await this.soClient.find({ type: SO_SLO_TYPE, page: 1, @@ -82,6 +95,9 @@ export class KibanaSavedObjectsSLORepository implements SLORepository { }); if (response.total === 0) { + if (ignoreNotFound) { + return; + } throw new SLONotFound(`SLO [${id}] not found`); } diff --git a/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts b/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts index 37855bd4d8fa4..dccfe5f97d633 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts @@ -204,7 +204,7 @@ describe('UpdateSLO', () => { await updateSLO.execute(slo.id, { settings: newSettings }); expectDeletionOfOriginalSLOResources(slo); - expect(mockRepository.save).toHaveBeenCalledWith( + expect(mockRepository.update).toHaveBeenCalledWith( expect.objectContaining({ ...slo, settings: newSettings, @@ -316,7 +316,7 @@ describe('UpdateSLO', () => { updateSLO.execute(originalSlo.id, { indicator: newIndicator }) ).rejects.toThrowError('Transform install error'); - expect(mockRepository.save).toHaveBeenCalledWith(originalSlo); + expect(mockRepository.update).toHaveBeenCalledWith(originalSlo); expect( mockScopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline ).toHaveBeenCalledTimes(1); // for the sli only @@ -343,7 +343,7 @@ describe('UpdateSLO', () => { updateSLO.execute(originalSlo.id, { indicator: newIndicator }) ).rejects.toThrowError('summary transform start error'); - expect(mockRepository.save).toHaveBeenCalledWith(originalSlo); + expect(mockRepository.update).toHaveBeenCalledWith(originalSlo); expect(mockSummaryTransformManager.uninstall).toHaveBeenCalled(); expect(mockScopedClusterClient.asSecondaryAuthUser.ingest.deletePipeline).toHaveBeenCalled(); expect(mockTransformManager.stop).toHaveBeenCalled(); diff --git a/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts b/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts index 0f1967800d1df..9418bfb1ea91a 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts @@ -70,8 +70,8 @@ export class UpdateSLO { const rollbackOperations = []; - await this.repository.save(updatedSlo); - rollbackOperations.push(() => this.repository.save(originalSlo)); + await this.repository.update(updatedSlo); + rollbackOperations.push(() => this.repository.update(originalSlo)); if (!requireRevisionBump) { // At this point, we still need to update the sli and summary pipeline to include the changes (id and revision in the rollup index) and (name, desc, tags, ...) in the summary index diff --git a/x-pack/test/api_integration/apis/slos/delete_slo.ts b/x-pack/test/api_integration/apis/slos/delete_slo.ts index 19480d568a37c..979564f06be55 100644 --- a/x-pack/test/api_integration/apis/slos/delete_slo.ts +++ b/x-pack/test/api_integration/apis/slos/delete_slo.ts @@ -55,13 +55,15 @@ export default function ({ getService }: FtrProviderContext) { const { id } = response.body; - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); + 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.length).eql(1); - expect(savedObject.saved_objects[0].attributes.id).eql(id); + expect(savedObject.saved_objects[0].attributes.id).eql(id); + }); await retry.tryForTime(300 * 1000, async () => { // expect summary and rollup data to exist diff --git a/x-pack/test/api_integration/apis/slos/update_slo.ts b/x-pack/test/api_integration/apis/slos/update_slo.ts index 7bf6967bd26a3..a8f4aa1a334f8 100644 --- a/x-pack/test/api_integration/apis/slos/update_slo.ts +++ b/x-pack/test/api_integration/apis/slos/update_slo.ts @@ -14,7 +14,7 @@ import { loadTestData } from './helper/load_test_data'; import { sloData } from './fixtures/create_slo'; export default function ({ getService }: FtrProviderContext) { - describe('Update SLOs', function () { + describe('UpdateSLOs', function () { this.tags('skipCloud'); const supertestAPI = getService('supertest'); From 82d0b008cdc4f9bcfe3bc858b15d6d30e91fed89 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 1 Oct 2024 18:48:39 +0200 Subject: [PATCH 074/107] [Synthetics] Improve synthetics alerting (#186585) ## Summary Fixes https://github.com/elastic/kibana/issues/175298 Improve synthetics alerting !! User will be able to create custom synthetics status alert by defining three kind of criteria ### Monitor is down over last consective checks with threshold image ### From Locations threshold Will be considered down only when from defined number of locations image ### Over time with checks threshold just like uptime custom status alert image --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Dominique Clarke Co-authored-by: Elastic Machine Co-authored-by: Maryam Saeidi Co-authored-by: Justin Kambic --- .github/CODEOWNERS | 1 + package.json | 1 + .../generated/observability_uptime_schema.ts | 8 +- tsconfig.base.json | 2 + .../synthetics_test_data/README.md | 3 + .../synthetics_test_data/index.ts | 8 + .../synthetics_test_data/jest.config.js | 12 + .../synthetics_test_data/kibana.jsonc | 5 + .../synthetics_test_data/package.json | 8 + .../src/make_summaries.ts} | 284 ++--- .../synthetics_test_data/src/utils.ts | 16 + .../synthetics_test_data/tsconfig.json | 20 + .../alert_as_data_fields.test.ts.snap | 60 + .../common/constants/client_defaults.ts | 52 +- .../synthetics/common/field_names.ts | 1 + .../common/rules/alert_actions.test.ts | 19 +- .../common/rules/status_rule.test.ts | 38 + .../synthetics/common/rules/status_rule.ts | 97 +- .../common/rules/synthetics/translations.ts | 27 +- .../common/rules/synthetics_rule_field_map.ts | 12 + .../runtime_types/alert_rules/common.ts | 18 +- .../common/runtime_types/ping/ping.ts | 9 +- .../custom_status_alert.journey.ts | 78 ++ .../default_status_alert.journey.ts | 57 +- .../e2e/synthetics/journeys/index.ts | 3 +- .../journeys/services/data/browser_docs.ts | 30 +- .../journeys/services/synthetics_services.ts | 77 +- .../synthetics/e2e/tsconfig.json | 3 +- .../common/condition_locations_value.tsx | 59 + .../alerts/common/condition_window_value.tsx | 107 ++ .../alerts/common/field_filters.tsx | 124 ++ .../common/field_popover_expression.tsx | 74 ++ .../alerts/common/field_selector.test.tsx | 70 ++ .../alerts/common/field_selector.tsx | 110 ++ .../components/alerts/common/fields.tsx | 159 +++ .../alerts/common/for_the_last_expression.tsx | 172 +++ .../alerts/common/group_by_field.tsx | 55 + .../alerts/common/popover_expression.tsx | 41 + .../components/alerts/hooks/translations.ts | 14 +- .../hooks/use_fetch_synthetics_suggestions.ts | 66 ++ .../alerts/hooks/use_synthetics_rules.ts | 49 +- .../components/alerts/query_bar.tsx | 77 ++ .../alerts/rule_name_with_loading.tsx | 28 + .../alerts/status_rule_expression.tsx | 157 +++ .../components/alerts/status_rule_ui.tsx | 39 + .../alerts/toggle_alert_flyout_button.tsx | 163 ++- .../overview/monitor_detail_flyout.test.tsx | 4 + .../overview/overview/overview_status.tsx | 4 +- .../lazy_wrapper/monitor_status.tsx | 23 +- .../lib/alert_types/monitor_status.tsx | 2 +- .../synthetics/state/monitor_list/effects.ts | 10 +- .../synthetics/state/overview_status/index.ts | 27 +- .../apps/synthetics/state/ui/actions.ts | 7 +- .../public/apps/synthetics/state/ui/index.ts | 9 +- .../apps/synthetics/state/ui/selectors.ts | 7 +- .../__mocks__/synthetics_store.mock.ts | 2 +- .../synthetics/scripts/generate_monitors.js | 9 + .../scripts/tasks/generate_monitors.ts | 97 ++ .../server/alert_rules/common.test.ts | 331 +++++- .../synthetics/server/alert_rules/common.ts | 472 +++++--- .../alert_rules/status_rule/message_utils.ts | 209 +++- .../status_rule/monitor_status_rule.ts | 122 +- .../status_rule/queries/filter_monitors.ts | 104 ++ .../query_monitor_status_alert.ts | 159 ++- .../status_rule/status_rule_executor.test.ts | 776 ++++++++++--- .../status_rule/status_rule_executor.ts | 459 ++++++-- .../server/alert_rules/status_rule/types.ts | 52 +- .../server/alert_rules/status_rule/utils.ts | 36 + .../server/alert_rules/translations.ts | 9 + .../synthetics/server/lib.ts | 7 +- .../synthetics/server/routes/common.test.ts | 35 + .../synthetics/server/routes/common.ts | 49 +- .../get_service_locations.ts | 31 +- .../synthetics_service.test.ts | 12 + .../synthetics/tsconfig.json | 4 + .../common/rules/uptime_rule_field_map.ts | 12 + .../lib/alerts/status_check.test.ts | 5 +- .../legacy_uptime/lib/alerts/status_check.ts | 4 +- .../translations/translations/fr-FR.json | 3 - .../translations/translations/ja-JP.json | 8 - .../translations/translations/zh-CN.json | 8 - .../common/expression_items/for_the_last.tsx | 19 +- .../public/common/expression_items/value.tsx | 6 +- .../alerting_api_integration/common/config.ts | 4 + .../helpers/alerting_api_helper.ts | 8 +- .../helpers/alerting_wait_for_helpers.ts | 31 +- .../observability/index.ts | 3 +- .../synthetics/custom_status_rule.ts | 1000 +++++++++++++++++ .../data.ts} | 162 +-- .../private_location_test_service.ts | 83 ++ .../synthetics/synthetics_default_rule.ts | 131 +++ .../synthetics/synthetics_rule_helper.ts | 292 +++++ .../add_monitor_private_location.ts | 12 +- .../apis/synthetics/add_monitor_project.ts | 2 +- .../apis/synthetics/add_monitor_public_api.ts | 4 +- .../synthetics/edit_monitor_public_api.ts | 4 +- .../apis/synthetics/suggestions.ts | 31 +- .../apis/synthetics/sync_global_params.ts | 9 + x-pack/test/tsconfig.json | 5 +- yarn.lock | 4 + 100 files changed, 6139 insertions(+), 1292 deletions(-) create mode 100644 x-pack/packages/observability/synthetics_test_data/README.md create mode 100644 x-pack/packages/observability/synthetics_test_data/index.ts create mode 100644 x-pack/packages/observability/synthetics_test_data/jest.config.js create mode 100644 x-pack/packages/observability/synthetics_test_data/kibana.jsonc create mode 100644 x-pack/packages/observability/synthetics_test_data/package.json rename x-pack/{plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/sample_docs.ts => packages/observability/synthetics_test_data/src/make_summaries.ts} (53%) create mode 100644 x-pack/packages/observability/synthetics_test_data/src/utils.ts create mode 100644 x-pack/packages/observability/synthetics_test_data/tsconfig.json create mode 100644 x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.test.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/custom_status_alert.journey.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_locations_value.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_window_value.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_filters.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_popover_expression.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.test.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/fields.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/for_the_last_expression.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/group_by_field.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/popover_expression.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_fetch_synthetics_suggestions.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/rule_name_with_loading.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_expression.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_ui.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/scripts/generate_monitors.js create mode 100644 x-pack/plugins/observability_solution/synthetics/scripts/tasks/generate_monitors.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/filter_monitors.ts rename x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/{ => queries}/query_monitor_status_alert.ts (51%) create mode 100644 x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/utils.ts create mode 100644 x-pack/test/alerting_api_integration/observability/synthetics/custom_status_rule.ts rename x-pack/test/alerting_api_integration/observability/{synthetics_rule.ts => synthetics/data.ts} (59%) create mode 100644 x-pack/test/alerting_api_integration/observability/synthetics/private_location_test_service.ts create mode 100644 x-pack/test/alerting_api_integration/observability/synthetics/synthetics_default_rule.ts create mode 100644 x-pack/test/alerting_api_integration/observability/synthetics/synthetics_rule_helper.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 35d8fa1caedab..b3af3edce4585 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -656,6 +656,7 @@ x-pack/plugins/observability_solution/observability_onboarding/e2e @elastic/obs- x-pack/plugins/observability_solution/observability_onboarding @elastic/obs-ux-logs-team @elastic/obs-ux-onboarding-team x-pack/plugins/observability_solution/observability @elastic/obs-ux-management-team x-pack/plugins/observability_solution/observability_shared @elastic/observability-ui +x-pack/packages/observability/synthetics_test_data @elastic/obs-ux-management-team x-pack/packages/observability/observability_utils @elastic/observability-ui x-pack/test/security_api_integration/plugins/oidc_provider @elastic/kibana-security test/common/plugins/otel_metrics @elastic/obs-ux-infra_services-team diff --git a/package.json b/package.json index 5446bea2c12b2..1a372d63dfcf0 100644 --- a/package.json +++ b/package.json @@ -689,6 +689,7 @@ "@kbn/observability-onboarding-plugin": "link:x-pack/plugins/observability_solution/observability_onboarding", "@kbn/observability-plugin": "link:x-pack/plugins/observability_solution/observability", "@kbn/observability-shared-plugin": "link:x-pack/plugins/observability_solution/observability_shared", + "@kbn/observability-synthetics-test-data": "link:x-pack/packages/observability/synthetics_test_data", "@kbn/observability-utils": "link:x-pack/packages/observability/observability_utils", "@kbn/oidc-provider-plugin": "link:x-pack/test/security_api_integration/plugins/oidc_provider", "@kbn/open-telemetry-instrumented-plugin": "link:test/common/plugins/otel_metrics", diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_uptime_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_uptime_schema.ts index db6844688dbc6..6a746f722d612 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_uptime_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_uptime_schema.ts @@ -88,13 +88,15 @@ const ObservabilityUptimeAlertOptional = rt.partial({ value: schemaStringArray, }) ), - 'location.id': schemaString, - 'location.name': schemaString, + 'location.id': schemaStringArray, + 'location.name': schemaStringArray, 'monitor.id': schemaString, 'monitor.name': schemaString, + 'monitor.state.id': schemaString, 'monitor.tags': schemaStringArray, 'monitor.type': schemaString, - 'observer.geo.name': schemaString, + 'observer.geo.name': schemaStringArray, + 'observer.name': schemaStringArray, 'tls.server.hash.sha256': schemaString, 'tls.server.x509.issuer.common_name': schemaString, 'tls.server.x509.not_after': schemaDate, diff --git a/tsconfig.base.json b/tsconfig.base.json index 7a66911a4bee5..c0a3aed9ff3ac 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1306,6 +1306,8 @@ "@kbn/observability-plugin/*": ["x-pack/plugins/observability_solution/observability/*"], "@kbn/observability-shared-plugin": ["x-pack/plugins/observability_solution/observability_shared"], "@kbn/observability-shared-plugin/*": ["x-pack/plugins/observability_solution/observability_shared/*"], + "@kbn/observability-synthetics-test-data": ["x-pack/packages/observability/synthetics_test_data"], + "@kbn/observability-synthetics-test-data/*": ["x-pack/packages/observability/synthetics_test_data/*"], "@kbn/observability-utils": ["x-pack/packages/observability/observability_utils"], "@kbn/observability-utils/*": ["x-pack/packages/observability/observability_utils/*"], "@kbn/oidc-provider-plugin": ["x-pack/test/security_api_integration/plugins/oidc_provider"], diff --git a/x-pack/packages/observability/synthetics_test_data/README.md b/x-pack/packages/observability/synthetics_test_data/README.md new file mode 100644 index 0000000000000..922df9939572d --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/README.md @@ -0,0 +1,3 @@ +# @kbn/observability-synthetics-test-data + +Provides utilities to generate synthetics test data diff --git a/x-pack/packages/observability/synthetics_test_data/index.ts b/x-pack/packages/observability/synthetics_test_data/index.ts new file mode 100644 index 0000000000000..d1fe1034d7b1e --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/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 { makeUpSummary, makeDownSummary } from './src/make_summaries'; diff --git a/x-pack/packages/observability/synthetics_test_data/jest.config.js b/x-pack/packages/observability/synthetics_test_data/jest.config.js new file mode 100644 index 0000000000000..62001f4072246 --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/jest.config.js @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/x-pack/packages/observability/synthetics_test_data'], +}; diff --git a/x-pack/packages/observability/synthetics_test_data/kibana.jsonc b/x-pack/packages/observability/synthetics_test_data/kibana.jsonc new file mode 100644 index 0000000000000..94f80d9b59cad --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/observability-synthetics-test-data", + "owner": "@elastic/obs-ux-management-team", +} diff --git a/x-pack/packages/observability/synthetics_test_data/package.json b/x-pack/packages/observability/synthetics_test_data/package.json new file mode 100644 index 0000000000000..8ee7793e644ca --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/observability-synthetics-test-data", + "descriptio": "Utils to generate observability synthetics test data", + "author": "UX Management", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/sample_docs.ts b/x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts similarity index 53% rename from x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/sample_docs.ts rename to x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts index 62e2013ce0ff8..a44ffc15c28ec 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/sample_docs.ts +++ b/x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts @@ -6,124 +6,39 @@ */ import { v4 as uuidv4 } from 'uuid'; -import { getGeoData } from './browser_docs'; +import moment from 'moment'; +import { getGeoData } from './utils'; export interface DocOverrides { timestamp?: string; monitorId?: string; name?: string; testRunId?: string; - locationName?: string; + location?: { + id: string; + label: string; + }; configId?: string; } -export const getUpHit = ({ +export const makeUpSummary = ({ name, timestamp, monitorId, configId, testRunId, - locationName, + location, }: DocOverrides = {}) => ({ - ...getGeoData(locationName), + ...getGeoData(location), + ...commons, summary: { up: 1, down: 0, final_attempt: true, }, - tcp: { - rtt: { - connect: { - us: 22245, - }, - }, - }, - agent: { - name: 'docker-fleet-server', - id: 'dd39a87d-a1e5-45a1-8dd9-e78d6a1391c6', - type: 'heartbeat', - ephemeral_id: '264bb432-93f6-4aa6-a14d-266c53b9e7c7', - version: '8.7.0', - }, - resolve: { - rtt: { - us: 3101, - }, - ip: '142.250.181.196', - }, - elastic_agent: { - id: 'dd39a87d-a1e5-45a1-8dd9-e78d6a1391c6', - version: '8.7.0', - snapshot: true, - }, - monitor: { - duration: { - us: 155239, - }, - ip: '142.250.181.196', - origin: 'ui', - name: name ?? 'Test Monitor', - timespan: { - lt: '2022-12-18T09:55:04.211Z', - gte: '2022-12-18T09:52:04.211Z', - }, - fleet_managed: true, - id: monitorId ?? 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', - check_group: 'a039fd21-7eb9-11ed-8949-0242ac120006', - type: 'http', - status: 'up', - }, - url: { - scheme: 'https', - port: 443, - domain: 'www.google.com', - full: 'https://www.google.com', - }, + monitor: getMonitorData({ id: monitorId, name, status: 'up', timestamp }), '@timestamp': timestamp ?? '2022-12-18T09:52:04.056Z', - ecs: { - version: '8.0.0', - }, config_id: configId ?? 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', - data_stream: { - namespace: 'default', - type: 'synthetics', - dataset: 'http', - }, - tls: { - cipher: 'TLS-AES-128-GCM-SHA256', - certificate_not_valid_before: '2022-11-28T08:19:01.000Z', - established: true, - server: { - x509: { - not_after: '2023-02-20T08:19:00.000Z', - subject: { - distinguished_name: 'CN=www.google.com', - common_name: 'www.google.com', - }, - not_before: '2022-11-28T08:19:01.000Z', - public_key_curve: 'P-256', - public_key_algorithm: 'ECDSA', - signature_algorithm: 'SHA256-RSA', - serial_number: '173037077033925240295268439311466214245', - issuer: { - distinguished_name: 'CN=GTS CA 1C3,O=Google Trust Services LLC,C=US', - common_name: 'GTS CA 1C3', - }, - }, - hash: { - sha1: 'ea1b44061b864526c45619230b3299117d11bf4e', - sha256: 'a5686448de09cc82b9cdad1e96357f919552ab14244da7948dd412ec0fc37d2b', - }, - }, - rtt: { - handshake: { - us: 35023, - }, - }, - version: '1.3', - certificate_not_valid_after: '2023-02-20T08:19:00.000Z', - version_protocol: 'tls', - }, state: { duration_ms: 0, checks: 1, @@ -135,67 +50,81 @@ export const getUpHit = ({ flap_history: [], status: 'up', }, - event: { - agent_id_status: 'verified', - ingested: '2022-12-18T09:52:11Z', - dataset: 'http', - }, ...(testRunId && { test_run_id: testRunId }), - http: { - rtt: { - response_header: { - us: 144758, - }, - total: { - us: 149191, - }, - write_request: { - us: 48, - }, - content: { - us: 401, - }, - validate: { - us: 145160, - }, - }, - response: { - headers: { - Server: 'gws', - P3p: 'CP="This is not a P3P policy! See g.co/p3phelp for more info."', - Date: 'Thu, 29 Dec 2022 08:17:09 GMT', - 'X-Frame-Options': 'SAMEORIGIN', - 'Accept-Ranges': 'none', - 'Cache-Control': 'private, max-age=0', - 'X-Xss-Protection': '0', - 'Cross-Origin-Opener-Policy-Report-Only': 'same-origin-allow-popups; report-to="gws"', - Vary: 'Accept-Encoding', - Expires: '-1', - 'Content-Type': 'text/html; charset=ISO-8859-1', - }, - status_code: 200, - mime_type: 'text/html; charset=utf-8', - body: { - bytes: 13963, - hash: 'a4c2cf7dead9fb9329fc3727fc152b6a12072410926430491d02a0c6dc3a70ff', - }, - }, - }, }); -export const firstDownHit = ({ +export const makeDownSummary = ({ name, timestamp, monitorId, - locationName, + location, configId, }: DocOverrides = {}) => ({ - ...getGeoData(locationName), + ...getGeoData(location), + ...commons, summary: { up: 0, down: 1, final_attempt: true, }, + monitor: getMonitorData({ id: monitorId, name, status: 'down', timestamp }), + error: { + message: 'received status code 200 expecting [500]', + type: 'validate', + }, + '@timestamp': timestamp ?? '2022-12-18T09:49:49.976Z', + config_id: configId ?? 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', + state: { + duration_ms: 0, + checks: 1, + ends: null, + started_at: '2022-12-18T09:49:56.007551998Z', + id: 'Test private location-18524a3d9a7-0', + up: 0, + down: 1, + flap_history: [], + status: 'down', + }, +}); + +const getMonitorData = ({ + id, + name, + status, + timestamp, +}: { + id?: string; + name?: string; + status: 'up' | 'down'; + timestamp?: string; +}) => ({ + duration: { + us: 152459, + }, + origin: 'ui', + ip: '142.250.181.196', + name: name ?? 'Test Monitor', + fleet_managed: true, + check_group: uuidv4(), + timespan: { + lt: timestamp ?? '2022-12-18T09:52:50.128Z', + gte: timestamp ? moment(timestamp).subtract(3, 'minutes') : '2022-12-18T09:49:50.128Z', + }, + id: id ?? 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', + type: 'http', + status: status ?? 'down', +}); + +const commons = { + url: { + scheme: 'https', + port: 443, + domain: 'www.google.com', + full: 'https://www.google.com', + }, + ecs: { + version: '8.0.0', + }, tcp: { rtt: { connect: { @@ -203,6 +132,11 @@ export const firstDownHit = ({ }, }, }, + event: { + agent_id_status: 'verified', + ingested: '2022-12-18T09:49:57Z', + dataset: 'http', + }, agent: { name: 'docker-fleet-server', id: 'dd39a87d-a1e5-45a1-8dd9-e78d6a1391c6', @@ -210,54 +144,22 @@ export const firstDownHit = ({ ephemeral_id: '264bb432-93f6-4aa6-a14d-266c53b9e7c7', version: '8.7.0', }, - resolve: { - rtt: { - us: 3234, - }, - ip: '142.250.181.196', - }, elastic_agent: { id: 'dd39a87d-a1e5-45a1-8dd9-e78d6a1391c6', version: '8.7.0', snapshot: true, }, - monitor: { - duration: { - us: 152459, - }, - origin: 'ui', - ip: '142.250.181.196', - name: name ?? 'Test Monitor', - fleet_managed: true, - check_group: uuidv4(), - timespan: { - lt: '2022-12-18T09:52:50.128Z', - gte: '2022-12-18T09:49:50.128Z', - }, - id: monitorId ?? 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', - type: 'http', - status: 'down', - }, - error: { - message: 'received status code 200 expecting [500]', - type: 'validate', - }, - url: { - scheme: 'https', - port: 443, - domain: 'www.google.com', - full: 'https://www.google.com', - }, - '@timestamp': timestamp ?? '2022-12-18T09:49:49.976Z', - ecs: { - version: '8.0.0', - }, - config_id: configId ?? 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', data_stream: { namespace: 'default', type: 'synthetics', dataset: 'http', }, + resolve: { + rtt: { + us: 3101, + }, + ip: '142.250.181.196', + }, tls: { established: true, cipher: 'TLS-AES-128-GCM-SHA256', @@ -293,22 +195,6 @@ export const firstDownHit = ({ certificate_not_valid_after: '2023-02-20T08:19:00.000Z', version_protocol: 'tls', }, - state: { - duration_ms: 0, - checks: 1, - ends: null, - started_at: '2022-12-18T09:49:56.007551998Z', - id: 'Test private location-18524a3d9a7-0', - up: 0, - down: 1, - flap_history: [], - status: 'down', - }, - event: { - agent_id_status: 'verified', - ingested: '2022-12-18T09:49:57Z', - dataset: 'http', - }, http: { rtt: { response_header: { @@ -349,4 +235,4 @@ export const firstDownHit = ({ }, }, }, -}); +}; diff --git a/x-pack/packages/observability/synthetics_test_data/src/utils.ts b/x-pack/packages/observability/synthetics_test_data/src/utils.ts new file mode 100644 index 0000000000000..cf35a93491d54 --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/src/utils.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const getGeoData = ({ id, label }: { label?: string; id?: string } = {}) => ({ + observer: { + geo: { + name: label ?? 'Dev Service', + location: '41.8780, 93.0977', + }, + name: id ?? 'dev', + }, +}); diff --git a/x-pack/packages/observability/synthetics_test_data/tsconfig.json b/x-pack/packages/observability/synthetics_test_data/tsconfig.json new file mode 100644 index 0000000000000..86d57b8d692f7 --- /dev/null +++ b/x-pack/packages/observability/synthetics_test_data/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + ] +} diff --git a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap index 2ce82a1b3925f..478957afb1d66 100644 --- a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap +++ b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap @@ -9852,10 +9852,12 @@ Object { "type": "keyword", }, "location.id": Object { + "array": true, "required": false, "type": "keyword", }, "location.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -9867,6 +9869,10 @@ Object { "required": false, "type": "keyword", }, + "monitor.state.id": Object { + "required": false, + "type": "keyword", + }, "monitor.tags": Object { "array": true, "required": false, @@ -9877,6 +9883,12 @@ Object { "type": "keyword", }, "observer.geo.name": Object { + "array": true, + "required": false, + "type": "keyword", + }, + "observer.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -9972,10 +9984,12 @@ Object { "type": "keyword", }, "location.id": Object { + "array": true, "required": false, "type": "keyword", }, "location.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -9987,6 +10001,10 @@ Object { "required": false, "type": "keyword", }, + "monitor.state.id": Object { + "required": false, + "type": "keyword", + }, "monitor.tags": Object { "array": true, "required": false, @@ -9997,6 +10015,12 @@ Object { "type": "keyword", }, "observer.geo.name": Object { + "array": true, + "required": false, + "type": "keyword", + }, + "observer.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -10092,10 +10116,12 @@ Object { "type": "keyword", }, "location.id": Object { + "array": true, "required": false, "type": "keyword", }, "location.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -10107,6 +10133,10 @@ Object { "required": false, "type": "keyword", }, + "monitor.state.id": Object { + "required": false, + "type": "keyword", + }, "monitor.tags": Object { "array": true, "required": false, @@ -10117,6 +10147,12 @@ Object { "type": "keyword", }, "observer.geo.name": Object { + "array": true, + "required": false, + "type": "keyword", + }, + "observer.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -10212,10 +10248,12 @@ Object { "type": "keyword", }, "location.id": Object { + "array": true, "required": false, "type": "keyword", }, "location.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -10227,6 +10265,10 @@ Object { "required": false, "type": "keyword", }, + "monitor.state.id": Object { + "required": false, + "type": "keyword", + }, "monitor.tags": Object { "array": true, "required": false, @@ -10237,6 +10279,12 @@ Object { "type": "keyword", }, "observer.geo.name": Object { + "array": true, + "required": false, + "type": "keyword", + }, + "observer.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -10338,10 +10386,12 @@ Object { "type": "keyword", }, "location.id": Object { + "array": true, "required": false, "type": "keyword", }, "location.name": Object { + "array": true, "required": false, "type": "keyword", }, @@ -10353,6 +10403,10 @@ Object { "required": false, "type": "keyword", }, + "monitor.state.id": Object { + "required": false, + "type": "keyword", + }, "monitor.tags": Object { "array": true, "required": false, @@ -10363,6 +10417,12 @@ Object { "type": "keyword", }, "observer.geo.name": Object { + "array": true, + "required": false, + "type": "keyword", + }, + "observer.name": Object { + "array": true, "required": false, "type": "keyword", }, diff --git a/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts b/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts index 07d17554e83fc..f1098c89b7caa 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/constants/client_defaults.ts @@ -54,44 +54,32 @@ export const FINAL_SUMMARY_FILTER = { }, }, { - bool: { - should: [ - { - bool: { - should: [ - { - match: { - 'summary.final_attempt': true, - }, - }, - ], - minimum_should_match: 1, - }, - }, - { - bool: { - must_not: { - bool: { - should: [ - { - exists: { - field: 'summary.final_attempt', - }, - }, - ], - minimum_should_match: 1, - }, - }, - }, - }, - ], - minimum_should_match: 1, + term: { + 'summary.final_attempt': true, }, }, ], }, }; +export const getRangeFilter = ({ from, to }: { from: string; to: string }) => ({ + range: { + '@timestamp': { + gte: from, + lte: to, + }, + }, +}); + +export const getTimespanFilter = ({ from, to }: { from: string; to: string }) => ({ + range: { + 'monitor.timespan': { + gte: from, + lte: to, + }, + }, +}); + export const SUMMARY_FILTER = { exists: { field: 'summary' } }; export const getLocationFilter = ({ diff --git a/x-pack/plugins/observability_solution/synthetics/common/field_names.ts b/x-pack/plugins/observability_solution/synthetics/common/field_names.ts index 0407fad341d8a..7b590b3a828a7 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/field_names.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/field_names.ts @@ -11,6 +11,7 @@ export const MONITOR_NAME = 'monitor.name'; export const MONITOR_TYPE = 'monitor.type'; export const URL_FULL = 'url.full'; export const URL_PORT = 'url.port'; +export const OBSERVER_NAME = 'observer.name'; export const OBSERVER_GEO_NAME = 'observer.geo.name'; export const ERROR_MESSAGE = 'error.message'; export const STATE_ID = 'monitor.state.id'; diff --git a/x-pack/plugins/observability_solution/synthetics/common/rules/alert_actions.test.ts b/x-pack/plugins/observability_solution/synthetics/common/rules/alert_actions.test.ts index 345342d1f4c62..dd7ad03b9ac32 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/rules/alert_actions.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/rules/alert_actions.test.ts @@ -53,7 +53,7 @@ describe('Alert Actions factory', () => { dedupKey: expect.any(String), eventAction: 'resolve', summary: - 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationName}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + 'The alert for monitor "{{context.monitorName}}" from {{context.locationNames}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationNames}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', }, }, { @@ -193,7 +193,7 @@ describe('Alert Actions factory', () => { dedupKey: expect.any(String), eventAction: 'resolve', summary: - 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationName}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + 'The alert for monitor "{{context.monitorName}}" from {{context.locationNames}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationNames}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', }, }, { @@ -230,8 +230,7 @@ describe('Alert Actions factory', () => { dedupKey: 'always-downxpack.uptime.alerts.actionGroups.monitorStatus', eventAction: 'trigger', severity: 'error', - summary: - 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}.\n\nDetails:\n\nMonitor name: {{context.monitorName}}\n{{context.monitorUrlLabel}}: {{{context.monitorUrl}}}\nMonitor type: {{context.monitorType}}\nFrom: {{context.locationName}}\nLatest error received: {{{context.lastErrorMessage}}}\n{{{context.linkMessage}}}', + summary: SyntheticsMonitorStatusTranslations.defaultRecoveryMessage, }, id: 'f2a3b195-ed76-499a-805d-82d24d4eeba9', }, @@ -263,11 +262,9 @@ describe('Alert Actions factory', () => { path: '', text: '', }, - message: - 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationName}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + message: SyntheticsMonitorStatusTranslations.defaultRecoveryMessage, messageHTML: null, - subject: - '"{{context.monitorName}}" ({{context.locationName}}) {{context.recoveryStatus}} - Elastic Synthetics', + subject: SyntheticsMonitorStatusTranslations.defaultRecoverySubjectMessage, to: ['test@email.com'], }, }, @@ -286,11 +283,9 @@ describe('Alert Actions factory', () => { path: '', text: '', }, - message: - '"{{context.monitorName}}" is {{{context.status}}} from {{context.locationName}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- Checked at: {{context.checkedAt}} \n- From: {{context.locationName}} \n- Error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + message: SyntheticsMonitorStatusTranslations.defaultActionMessage, messageHTML: null, - subject: - '"{{context.monitorName}}" ({{context.locationName}}) is down - Elastic Synthetics', + subject: SyntheticsMonitorStatusTranslations.defaultSubjectMessage, to: ['test@email.com'], }, }, diff --git a/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.test.ts b/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.test.ts new file mode 100644 index 0000000000000..67292f67283ad --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getConditionType } from './status_rule'; + +describe('Status Rule', () => { + it('should return the correct condition type for empty', () => { + const { useLatestChecks } = getConditionType({} as any); + expect(useLatestChecks).toBe(true); + }); + + it('should return the correct condition type check based', () => { + const { useLatestChecks, useTimeWindow } = getConditionType({ + window: { + numberOfChecks: 5, + }, + }); + expect(useLatestChecks).toBe(true); + expect(useTimeWindow).toBe(false); + }); + + it('should return the correct condition type time based', () => { + const { useTimeWindow, useLatestChecks } = getConditionType({ + window: { + time: { + unit: 'm', + size: 5, + }, + }, + }); + expect(useTimeWindow).toBe(true); + expect(useLatestChecks).toBe(false); + }); +}); diff --git a/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.ts b/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.ts index 375e0c0dd08c1..584888353cbc4 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/rules/status_rule.ts @@ -6,7 +6,102 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; +import { isEmpty } from 'lodash'; -export const StatusRulePramsSchema = schema.object({}); +export const TimeWindowSchema = schema.object({ + unit: schema.oneOf( + [schema.literal('s'), schema.literal('m'), schema.literal('h'), schema.literal('d')], + { + defaultValue: 'm', + } + ), + size: schema.number({ + defaultValue: 5, + }), +}); +export const NumberOfChecksSchema = schema.object({ + numberOfChecks: schema.number({ + defaultValue: 5, + min: 1, + max: 100, + }), +}); + +export const StatusRuleConditionSchema = schema.object({ + groupBy: schema.maybe( + schema.string({ + defaultValue: 'locationId', + }) + ), + downThreshold: schema.maybe( + schema.number({ + defaultValue: 3, + }) + ), + locationsThreshold: schema.maybe( + schema.number({ + defaultValue: 1, + }) + ), + window: schema.oneOf([ + schema.object({ + time: TimeWindowSchema, + }), + NumberOfChecksSchema, + ]), + includeRetests: schema.maybe(schema.boolean()), +}); + +export const StatusRulePramsSchema = schema.object({ + condition: schema.maybe(StatusRuleConditionSchema), + monitorIds: schema.maybe(schema.arrayOf(schema.string())), + locations: schema.maybe(schema.arrayOf(schema.string())), + tags: schema.maybe(schema.arrayOf(schema.string())), + monitorTypes: schema.maybe(schema.arrayOf(schema.string())), + projects: schema.maybe(schema.arrayOf(schema.string())), + kqlQuery: schema.maybe(schema.string()), +}); + +export type TimeWindow = TypeOf; export type StatusRuleParams = TypeOf; +export type StatusRuleCondition = TypeOf; + +export const getConditionType = (condition?: StatusRuleCondition) => { + let numberOfChecks = 1; + let timeWindow: TimeWindow = { unit: 'm', size: 1 }; + if (isEmpty(condition) || !condition?.window) { + return { + isLocationBased: false, + useTimeWindow: false, + timeWindow, + useLatestChecks: true, + numberOfChecks, + downThreshold: 1, + locationsThreshold: 1, + isDefaultRule: true, + }; + } + const useTimeWindow = condition.window && 'time' in condition.window; + const useLatestChecks = condition.window && 'numberOfChecks' in condition.window; + + if (useLatestChecks) { + numberOfChecks = + condition && 'numberOfChecks' in condition.window ? condition.window.numberOfChecks : 1; + } + + if (useTimeWindow) { + timeWindow = condition.window.time; + numberOfChecks = condition?.downThreshold ?? 1; + } + + return { + useTimeWindow, + timeWindow, + useLatestChecks, + numberOfChecks, + locationsThreshold: condition?.locationsThreshold ?? 1, + downThreshold: condition?.downThreshold ?? 1, + isDefaultRule: isEmpty(condition), + }; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics/translations.ts b/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics/translations.ts index 84a02ac9b7f92..0161b55273a01 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics/translations.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics/translations.ts @@ -12,7 +12,7 @@ export const SyntheticsMonitorStatusTranslations = { 'xpack.synthetics.alerts.syntheticsMonitorStatus.defaultActionMessage', { // the extra spaces before `\n` are needed to properly convert this from markdown to an HTML email - defaultMessage: `"{monitorName}" is {status} from {locationName}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- Monitor type: {monitorType} \n- Checked at: {checkedAt} \n- From: {locationName} \n- Error received: {lastErrorMessage} \n{linkMessage}`, + defaultMessage: `Monitor "{monitorName}" is {status} from {locationNames}.{pendingLastRunAt} - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- Monitor type: {monitorType} \n- Checked at: {checkedAt} \n- From: {locationNames} \n- Reason: {reason} \n- Error received: {lastErrorMessage} \n{linkMessage}`, values: { monitorName: '{{context.monitorName}}', monitorType: '{{context.monitorType}}', @@ -20,29 +20,32 @@ export const SyntheticsMonitorStatusTranslations = { monitorUrlLabel: '{{context.monitorUrlLabel}}', status: '{{{context.status}}}', lastErrorMessage: '{{{context.lastErrorMessage}}}', - locationName: '{{context.locationName}}', + locationNames: '{{context.locationNames}}', checkedAt: '{{context.checkedAt}}', linkMessage: '{{{context.linkMessage}}}', + pendingLastRunAt: '{{{context.pendingLastRunAt}}}', + reason: '{{{context.reason}}}', }, } ), defaultSubjectMessage: i18n.translate( 'xpack.synthetics.alerts.syntheticsMonitorStatus.defaultSubjectMessage', { - defaultMessage: '"{monitorName}" ({locationName}) is down - Elastic Synthetics', + defaultMessage: 'Monitor "{monitorName}" ({locationNames}) is down - Elastic Synthetics', values: { monitorName: '{{context.monitorName}}', - locationName: '{{context.locationName}}', + locationNames: '{{context.locationNames}}', }, } ), defaultRecoverySubjectMessage: i18n.translate( 'xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoverySubjectMessage', { - defaultMessage: '"{monitorName}" ({locationName}) {recoveryStatus} - Elastic Synthetics', + defaultMessage: + 'Monitor "{monitorName}" ({locationNames}) {recoveryStatus} - Elastic Synthetics', values: { recoveryStatus: '{{context.recoveryStatus}}', - locationName: '{{context.locationName}}', + locationNames: '{{context.locationNames}}', monitorName: '{{context.monitorName}}', }, } @@ -52,13 +55,13 @@ export const SyntheticsMonitorStatusTranslations = { { // the extra spaces before `\n` are needed to properly convert this from markdown to an HTML email defaultMessage: - 'The alert for "{monitorName}" from {locationName} is no longer active: {recoveryReason}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- Monitor type: {monitorType} \n- From: {locationName} \n- Last error received: {lastErrorMessage} \n{linkMessage}', + 'The alert for monitor "{monitorName}" from {locationNames} is no longer active: {recoveryReason}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- Monitor type: {monitorType} \n- From: {locationNames} \n- Last error received: {lastErrorMessage} \n{linkMessage}', values: { monitorName: '{{context.monitorName}}', monitorUrlLabel: '{{context.monitorUrlLabel}}', monitorUrl: '{{{context.monitorUrl}}}', monitorType: '{{context.monitorType}}', - locationName: '{{context.locationName}}', + locationNames: '{{context.locationNames}}', recoveryReason: '{{context.recoveryReason}}', lastErrorMessage: '{{{context.lastErrorMessage}}}', linkMessage: '{{{context.linkMessage}}}', @@ -75,7 +78,7 @@ export const SyntheticsMonitorStatusTranslations = { export const TlsTranslations = { defaultActionMessage: i18n.translate('xpack.synthetics.rules.tls.defaultActionMessage', { - defaultMessage: `TLS certificate {commonName} {status} - Elastic Synthetics\n\nDetails:\n\n- Summary: {summary}\n- Common name: {commonName}\n- Issuer: {issuer}\n- Monitor: {monitorName} \n- Monitor URL: {monitorUrl} \n- Monitor type: {monitorType} \n- From: {locationName}`, + defaultMessage: `TLS certificate {commonName} {status} - Elastic Synthetics\n\nDetails:\n\n- Summary: {summary}\n- Common name: {commonName}\n- Issuer: {issuer}\n- Monitor: {monitorName} \n- Monitor URL: {monitorUrl} \n- Monitor type: {monitorType} \n- From: {locationNames}`, values: { commonName: '{{context.commonName}}', issuer: '{{context.issuer}}', @@ -84,11 +87,11 @@ export const TlsTranslations = { monitorName: '{{context.monitorName}}', monitorUrl: '{{{context.monitorUrl}}}', monitorType: '{{context.monitorType}}', - locationName: '{{context.locationName}}', + locationNames: '{{context.locationNames}}', }, }), defaultRecoveryMessage: i18n.translate('xpack.synthetics.rules.tls.defaultRecoveryMessage', { - defaultMessage: `TLS alert for monitor "{monitorName}" has recovered - Elastic Synthetics\n\nDetails:\n\n- Summary: {summary}\n- New status : {newStatus}\n- Previous status: {previousStatus}\n- Monitor: {monitorName} \n- URL: {monitorUrl} \n- Monitor type: {monitorType} \n- From: {locationName}`, + defaultMessage: `TLS alert for monitor "{monitorName}" has recovered - Elastic Synthetics\n\nDetails:\n\n- Summary: {summary}\n- New status : {newStatus}\n- Previous status: {previousStatus}\n- Monitor: {monitorName} \n- URL: {monitorUrl} \n- Monitor type: {monitorType} \n- From: {locationNames}`, values: { summary: '{{context.summary}}', previousStatus: '{{context.previousStatus}}', @@ -96,7 +99,7 @@ export const TlsTranslations = { monitorName: '{{context.monitorName}}', monitorUrl: '{{{context.monitorUrl}}}', monitorType: '{{context.monitorType}}', - locationName: '{{context.locationName}}', + locationNames: '{{context.locationNames}}', }, }), name: i18n.translate('xpack.synthetics.rules.tls.clientName', { diff --git a/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics_rule_field_map.ts b/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics_rule_field_map.ts index 97ed491b320c9..79d83359132dc 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics_rule_field_map.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/rules/synthetics_rule_field_map.ts @@ -17,8 +17,14 @@ export const syntheticsRuleFieldMap: FieldMap = { type: 'keyword', required: false, }, + 'observer.name': { + type: 'keyword', + array: true, + required: false, + }, 'observer.geo.name': { type: 'keyword', + array: true, required: false, }, // monitor status alert fields @@ -43,6 +49,10 @@ export const syntheticsRuleFieldMap: FieldMap = { array: true, required: false, }, + 'monitor.state.id': { + type: 'keyword', + required: false, + }, configId: { type: 'keyword', required: false, @@ -53,10 +63,12 @@ export const syntheticsRuleFieldMap: FieldMap = { }, 'location.id': { type: 'keyword', + array: true, required: false, }, 'location.name': { type: 'keyword', + array: true, required: false, }, // tls alert fields diff --git a/x-pack/plugins/observability_solution/synthetics/common/runtime_types/alert_rules/common.ts b/x-pack/plugins/observability_solution/synthetics/common/runtime_types/alert_rules/common.ts index 790ce35264752..6a07615ac1644 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/runtime_types/alert_rules/common.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/runtime_types/alert_rules/common.ts @@ -25,14 +25,7 @@ export const SyntheticsCommonStateCodec = t.intersection([ export type SyntheticsCommonState = t.TypeOf; -export const SyntheticsMonitorStatusAlertStateCodec = t.type({ - configId: t.string, - locationId: t.string, - locationName: t.string, - errorStartedAt: t.string, - lastErrorMessage: t.string, - stateId: t.string, -}); +export const SyntheticsMonitorStatusAlertStateCodec = t.type({}); export type SyntheticsMonitorStatusAlertState = t.TypeOf< typeof SyntheticsMonitorStatusAlertStateCodec @@ -45,6 +38,10 @@ export const AlertStatusMetaDataCodec = t.interface({ locationId: t.string, timestamp: t.string, ping: OverviewPingCodec, + checks: t.type({ + downWithinXChecks: t.number, + down: t.number, + }), }); export const StaleAlertStatusMetaDataCodec = t.intersection([ @@ -69,9 +66,6 @@ export const AlertPendingStatusMetaDataCodec = t.intersection([ ]); export const AlertStatusCodec = t.interface({ - up: t.number, - down: t.number, - pending: t.number, upConfigs: t.record(t.string, AlertStatusMetaDataCodec), downConfigs: t.record(t.string, AlertStatusMetaDataCodec), pendingConfigs: t.record(t.string, AlertPendingStatusMetaDataCodec), @@ -79,7 +73,7 @@ export const AlertStatusCodec = t.interface({ staleDownConfigs: t.record(t.string, StaleAlertStatusMetaDataCodec), }); -export type AlertPendingStatusMetaData = t.TypeOf; export type StaleDownConfig = t.TypeOf; export type AlertStatusMetaData = t.TypeOf; export type AlertOverviewStatus = t.TypeOf; +export type AlertStatusConfigs = Record; diff --git a/x-pack/plugins/observability_solution/synthetics/common/runtime_types/ping/ping.ts b/x-pack/plugins/observability_solution/synthetics/common/runtime_types/ping/ping.ts index cf06fb899c948..073a00e5665df 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/runtime_types/ping/ping.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/runtime_types/ping/ping.ts @@ -96,6 +96,10 @@ export const MonitorType = t.intersection([ status: t.string, type: t.string, check_group: t.string, + timespan: t.type({ + gte: t.string, + lt: t.string, + }), }), t.partial({ duration: t.type({ @@ -103,10 +107,7 @@ export const MonitorType = t.intersection([ }), ip: t.string, name: t.string, - timespan: t.type({ - gte: t.string, - lt: t.string, - }), + fleet_managed: t.boolean, project: t.type({ id: t.string, diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/custom_status_alert.journey.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/custom_status_alert.journey.ts new file mode 100644 index 0000000000000..161a58d650e6c --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/custom_status_alert.journey.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { journey, step, before, after, expect } from '@elastic/synthetics'; +import { RetryService } from '@kbn/ftr-common-functional-services'; +import { syntheticsAppPageProvider } from '../../page_objects/synthetics_app'; +import { SyntheticsServices } from '../services/synthetics_services'; + +journey(`CustomStatusAlert`, async ({ page, params }) => { + const syntheticsApp = syntheticsAppPageProvider({ page, kibanaUrl: params.kibanaUrl, params }); + + const services = new SyntheticsServices(params); + const getService = params.getService; + const retry: RetryService = getService('retry'); + + const firstCheckTime = new Date(Date.now()).toISOString(); + + let configId: string; + + before(async () => { + await services.cleaUp(); + }); + + after(async () => { + await services.cleaUp(); + }); + + step('Go to monitors page', async () => { + await syntheticsApp.navigateToOverview(true, 15); + }); + + step('add test monitor', async () => { + configId = await services.addTestMonitor( + 'Test Monitor', + { + type: 'http', + urls: 'https://www.google.com', + locations: ['us_central'], + }, + configId + ); + await services.addTestSummaryDocument({ timestamp: firstCheckTime, configId }); + }); + + step('should create status rule', async () => { + await page.getByTestId('syntheticsRefreshButtonButton').click(); + await page.getByTestId('syntheticsAlertsRulesButton').click(); + await page.getByTestId('manageStatusRuleName').click(); + await page.getByTestId('createNewStatusRule').click(); + + await page.getByTestId('ruleNameInput').fill('Synthetics status rule'); + await page.getByTestId('saveRuleButton').click(); + await page.getByTestId('confirmModalConfirmButton').click(); + + await page.waitForSelector(`text='Created rule "Synthetics status rule"'`); + }); + + step('verify rule creation', async () => { + await retry.try(async () => { + const rules = await services.getRules(); + expect(rules.length).toBe(3); + expect(rules[2].params).toStrictEqual({ + condition: { + downThreshold: 3, + locationsThreshold: 1, + groupBy: 'locationId', + window: { + numberOfChecks: 5, + }, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts index 4807255cc28ee..e2285d499a0f2 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alert_rules/default_status_alert.journey.ts @@ -29,20 +29,27 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { before(async () => { await services.cleaUp(); - await services.enableMonitorManagedViaApi(); + }); + + after(async () => { + await services.cleaUp(); + }); + + step('setup monitor', async () => { + const connectorId = await services.setupTestConnector(); + await services.setupSettings(connectorId.id); + configId = await services.addTestMonitor('Test Monitor', { type: 'http', urls: 'https://www.google.com', - custom_heartbeat_id: 'b9d9e146-746f-427f-bbf5-6e786b5b4e73', locations: [ { id: 'us_central', label: 'North America - US Central', isServiceManaged: true }, ], }); - await services.addTestSummaryDocument({ timestamp: firstCheckTime, configId }); - }); - - after(async () => { - await services.cleaUp(); + await services.addTestSummaryDocument({ + timestamp: firstCheckTime, + configId, + }); }); step('Go to monitors page', async () => { @@ -50,21 +57,22 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { }); step('should create default status alert', async () => { - await page.click(byTestId('xpack.synthetics.alertsPopover.toggleButton')); - await page.isDisabled(byTestId('xpack.synthetics.toggleAlertFlyout')); - await page.click(byTestId('xpack.synthetics.toggleAlertFlyout')); + await page.getByTestId('syntheticsAlertsRulesButton').click(); + await page.getByTestId('manageStatusRuleName').click(); + await page.isDisabled(byTestId('editDefaultStatusRule')); + await page.getByTestId('editDefaultStatusRule').click(); + await page.waitForSelector('text=Monitor status rule'); - expect(await page.locator(`[data-test-subj="intervalFormRow"]`).count()).toEqual(0); + await page.getByTestId('intervalInputUnit').selectOption('second'); + await page.getByTestId('intervalInput').fill('20'); await page.click(byTestId('saveEditedRuleButton')); await page.waitForSelector("text=Updated 'Synthetics status internal rule'"); }); step('Monitor is as up in overview page', async () => { await retry.tryForTime(90 * 1000, async () => { - const totalDown = await page.textContent( - byTestId('xpack.uptime.synthetics.overview.status.up') - ); - expect(totalDown).toBe('1Up'); + const totalUp = await page.textContent(byTestId('syntheticsOverviewUp')); + expect(totalUp).toBe('1Up'); }); await page.hover('text=Test Monitor'); @@ -74,6 +82,8 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { step('Disable default alert for monitor', async () => { await page.click('text=Disable status alert'); await page.waitForSelector(`text=Alerts are now disabled for the monitor "Test Monitor".`); + await page.getByTestId('Test Monitor-us_central-metric-item').hover(); + await page.click('[aria-label="Open actions menu"]'); await page.click('text=Enable status alert'); }); @@ -91,9 +101,7 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { await page.waitForTimeout(5 * 1000); - const totalDown = await page.textContent( - byTestId('xpack.uptime.synthetics.overview.status.down') - ); + const totalDown = await page.textContent(byTestId('syntheticsOverviewDown')); expect(totalDown).toBe('1Down'); }); @@ -103,14 +111,17 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { const reasonMessage = getReasonMessage({ name: 'Test Monitor', location: 'North America - US Central', - timestamp: downCheckTime, status: 'down', + checks: { + downWithinXChecks: 1, + down: 1, + }, }); await retry.tryForTime(3 * 60 * 1000, async () => { await page.click(byTestId('querySubmitButton')); - const alerts = await page.waitForSelector(`text=1 Alert`, { timeout: 20 * 1000 }); + const alerts = await page.waitForSelector(`text=1 Alert`, { timeout: 5 * 1000 }); expect(await alerts.isVisible()).toBe(true); const text = await page.textContent(`${byTestId('dataGridRowCell')} .euiLink`); @@ -164,8 +175,11 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { const reasonMessage = getReasonMessage({ name, location: 'North America - US Central', - timestamp: downCheckTime, status: 'down', + checks: { + downWithinXChecks: 1, + down: 1, + }, }); await retry.tryForTime(3 * 60 * 1000, async () => { @@ -194,6 +208,5 @@ journey(`DefaultStatusAlert`, async ({ page, params }) => { await page.waitForTimeout(10 * 1000); await page.click('[aria-label="View in app"]'); - await page.click(byTestId('breadcrumb /app/synthetics/monitors')); }); }); diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/index.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/index.ts index a35e62ec4fe6a..1e2b17b34e096 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/index.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/index.ts @@ -18,7 +18,8 @@ export * from './private_locations.journey'; export * from './alerting_default.journey'; export * from './global_parameters.journey'; export * from './detail_flyout'; -// export * from './alert_rules/default_status_alert.journey'; +export * from './alert_rules/default_status_alert.journey'; +export * from './alert_rules/custom_status_alert.journey'; export * from './test_now_mode.journey'; export * from './monitor_details_page/monitor_summary.journey'; export * from './test_run_details.journey'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/browser_docs.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/browser_docs.ts index d3964692a38f0..af5c66595cda8 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/browser_docs.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/data/browser_docs.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { DocOverrides } from './sample_docs'; +import { DocOverrides } from '@kbn/observability-synthetics-test-data/src/make_summaries'; export const getGeoData = (locationName?: string, locationId?: string) => ({ observer: { @@ -22,10 +22,10 @@ export const journeySummary = ({ timestamp, monitorId, testRunId, - locationName, + location, }: DocOverrides = {}) => { return { - ...getGeoData(locationName), + ...getGeoData(location?.label), summary: { up: 1, down: 0, @@ -105,9 +105,9 @@ export const journeyStart = ({ timestamp, monitorId, testRunId, - locationName, + location, }: DocOverrides = {}) => ({ - ...getGeoData(locationName), + ...getGeoData(location?.label), test_run_id: testRunId ?? '07e339f4-4d56-4cdb-b314-96faacaee645', agent: { name: 'job-88fe737c53c39aea-lp69x', @@ -167,14 +167,8 @@ export const journeyStart = ({ }, }); -export const step1 = ({ - name, - timestamp, - monitorId, - testRunId, - locationName, -}: DocOverrides = {}) => ({ - ...getGeoData(locationName), +export const step1 = ({ name, timestamp, monitorId, testRunId, location }: DocOverrides = {}) => ({ + ...getGeoData(location?.label), test_run_id: testRunId ?? 'c16b1614-7f48-4791-8f46-9ccf3a896e20', agent: { name: 'job-76905d93798e6fff-z6nsb', @@ -249,14 +243,8 @@ export const step1 = ({ }, }); -export const step2 = ({ - name, - timestamp, - monitorId, - testRunId, - locationName, -}: DocOverrides = {}) => ({ - ...getGeoData(locationName), +export const step2 = ({ name, timestamp, monitorId, testRunId, location }: DocOverrides = {}) => ({ + ...getGeoData(location?.label), test_run_id: testRunId ?? 'c16b1614-7f48-4791-8f46-9ccf3a896e20', agent: { name: 'job-76905d93798e6fff-z6nsb', diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts index 028f8a736e93c..23c5ef45d1383 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/services/synthetics_services.ts @@ -9,10 +9,10 @@ import axios from 'axios'; import type { Client } from '@elastic/elasticsearch'; import { KbnClient } from '@kbn/test'; import pMap from 'p-map'; +import { makeDownSummary, makeUpSummary } from '@kbn/observability-synthetics-test-data'; import { SyntheticsMonitor } from '@kbn/synthetics-plugin/common/runtime_types'; import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; import { journeyStart, journeySummary, step1, step2 } from './data/browser_docs'; -import { firstDownHit, getUpHit } from './data/sample_docs'; export class SyntheticsServices { kibanaUrl: string; @@ -113,22 +113,6 @@ export class SyntheticsServices { ); } - async enableDefaultAlertingViaApi() { - try { - await axios.post( - this.kibanaUrl + SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING, - { isDisabled: false }, - { - auth: { username: 'elastic', password: 'changeme' }, - headers: { 'kbn-xsrf': 'true', 'x-elastic-internal-origin': 'synthetics-e2e' }, - } - ); - } catch (e) { - // eslint-disable-next-line no-console - console.log(e); - } - } - async addTestSummaryDocument({ docType = 'summaryUp', timestamp = new Date(Date.now()).toISOString(), @@ -157,14 +141,22 @@ export class SyntheticsServices { let index = 'synthetics-http-default'; - const commonData = { timestamp, monitorId, name, testRunId, locationName, configId }; + const commonData = { + timestamp, + name, + testRunId, + location: { + id: 'us_central', + label: locationName ?? 'North America - US Central', + }, + configId, + monitorId: monitorId ?? configId, + }; switch (docType) { case 'stepEnd': index = 'synthetics-browser-default'; - const stepDoc = stepIndex === 1 ? step1(commonData) : step2(commonData); - document = { ...stepDoc, ...document }; break; case 'journeyEnd': @@ -177,19 +169,19 @@ export class SyntheticsServices { break; case 'summaryDown': document = { - ...firstDownHit(commonData), + ...makeDownSummary(commonData), ...document, }; break; case 'summaryUp': document = { - ...getUpHit(commonData), + ...makeUpSummary(commonData), ...document, }; break; default: document = { - ...getUpHit(commonData), + ...makeUpSummary(commonData), ...document, }; } @@ -228,4 +220,43 @@ export class SyntheticsServices { console.log(e); } } + + async getRules() { + const response = await axios.get(this.kibanaUrl + '/internal/alerting/rules/_find', { + auth: { username: 'elastic', password: 'changeme' }, + headers: { 'kbn-xsrf': 'true' }, + }); + return response.data.data; + } + + async setupTestConnector() { + const indexConnector = { + name: 'test index', + config: { index: 'test-index' }, + secrets: {}, + connector_type_id: '.index', + }; + const connector = await this.requester.request({ + path: `/api/actions/connector`, + method: 'POST', + body: indexConnector, + }); + return connector.data as any; + } + + async setupSettings(connectorId?: string) { + const settings = { + certExpirationThreshold: 30, + certAgeThreshold: 730, + defaultConnectors: [connectorId], + defaultEmail: { to: [], cc: [], bcc: [] }, + defaultStatusRuleEnabled: true, + }; + const connector = await this.requester.request({ + path: `/api/synthetics/settings`, + method: 'PUT', + body: settings, + }); + return connector.data; + } } diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json b/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json index bbc7edf10c1f6..7584c000a76fa 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json +++ b/x-pack/plugins/observability_solution/synthetics/e2e/tsconfig.json @@ -14,8 +14,9 @@ "@kbn/ftr-common-functional-services", "@kbn/apm-plugin", "@kbn/es-archiver", - "@kbn/repo-info", "@kbn/synthetics-plugin", + "@kbn/repo-info", + "@kbn/observability-synthetics-test-data", "@kbn/ftr-common-functional-ui-services" ] } diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_locations_value.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_locations_value.tsx new file mode 100644 index 0000000000000..7b5babfd38786 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_locations_value.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiFieldNumber, EuiPopoverTitle } from '@elastic/eui'; +import { StatusRuleCondition } from '../../../../../../common/rules/status_rule'; +import { PopoverExpression } from './popover_expression'; +import { StatusRuleParamsProps } from '../status_rule_ui'; + +interface Props { + ruleParams: StatusRuleParamsProps['ruleParams']; + setRuleParams: StatusRuleParamsProps['setRuleParams']; +} + +export const LocationsValueExpression = ({ ruleParams, setRuleParams }: Props) => { + const { condition } = ruleParams; + + const onLocationCountChange = useCallback( + (value: number) => { + setRuleParams('condition', { + ...ruleParams.condition, + locationsThreshold: value, + groupBy: value === 1 ? ruleParams.condition?.groupBy : 'none', + } as StatusRuleCondition); + }, + [ruleParams.condition, setRuleParams] + ); + + const locationsThreshold = + condition && 'locationsThreshold' in condition ? condition.locationsThreshold ?? 1 : 1; + return ( + + + {i18n.translate('xpack.synthetics.windowValueExpression.numberOfLocPopoverTitleLabel', { + defaultMessage: 'Number of locations', + })} + + onLocationCountChange(Number(evt.target.value))} + /> + + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_window_value.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_window_value.tsx new file mode 100644 index 0000000000000..717a15f9da4f2 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/condition_window_value.tsx @@ -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 { ForLastExpression, TIME_UNITS } from '@kbn/triggers-actions-ui-plugin/public'; +import React, { useCallback } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiFieldNumber, EuiPopoverTitle } from '@elastic/eui'; +import { PopoverExpression } from './popover_expression'; +import { getConditionType, TimeWindow } from '../../../../../../common/rules/status_rule'; +import { StatusRuleParamsProps } from '../status_rule_ui'; + +interface Props { + ruleParams: StatusRuleParamsProps['ruleParams']; + setRuleParams: StatusRuleParamsProps['setRuleParams']; +} + +export const WindowValueExpression = ({ ruleParams, setRuleParams }: Props) => { + const { condition } = ruleParams; + const timeWindow = + condition && 'time' in condition.window + ? condition.window.time ?? { + size: 5, + unit: 'm', + } + : null; + + const timeWindowSize = timeWindow?.size ?? 5; + const timeWindowUnit = timeWindow?.unit ?? 'm'; + + const numberOfChecks = + condition && 'numberOfChecks' in condition.window ? condition.window.numberOfChecks : null; + + const { useTimeWindow } = getConditionType(ruleParams.condition); + + const onTimeWindowChange = useCallback( + (value: TimeWindow) => { + setRuleParams('condition', { + ...ruleParams.condition, + window: { + ...ruleParams.condition?.window, + time: value, + }, + }); + }, + [ruleParams.condition, setRuleParams] + ); + + const onNumberOfChecksChange = useCallback( + (value: number) => { + setRuleParams('condition', { + ...ruleParams.condition, + window: { + ...ruleParams.condition?.window, + numberOfChecks: value, + }, + }); + }, + [ruleParams.condition, setRuleParams] + ); + + if (!useTimeWindow) { + return ( + + + {i18n.translate( + 'xpack.synthetics.windowValueExpression.numberOfChecksPopoverTitleLabel', + { defaultMessage: 'Number of checks' } + )} + + onNumberOfChecksChange(Number(evt.target.value))} + /> + + ); + } + + return ( + { + onTimeWindowChange({ size: val ?? 5, unit: timeWindowUnit }); + }} + onChangeWindowUnit={(val) => { + onTimeWindowChange({ size: timeWindowSize, unit: (val ?? 'm') as TIME_UNITS }); + }} + errors={{}} + description="" + /> + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_filters.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_filters.tsx new file mode 100644 index 0000000000000..31bf9e45ed8f3 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_filters.tsx @@ -0,0 +1,124 @@ +/* + * Copyright 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 { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; +import React, { useCallback, useState } from 'react'; +import { useFetchSyntheticsSuggestions } from '../hooks/use_fetch_synthetics_suggestions'; +import { StatusRuleParamsProps } from '../status_rule_ui'; +import { LocationsField, MonitorField, MonitorTypeField, ProjectsField, TagsField } from './fields'; + +type FieldKeys = 'monitorIds' | 'projects' | 'tags' | 'locations' | 'monitorTypes'; + +interface Props { + ruleParams: StatusRuleParamsProps['ruleParams']; + setRuleParams: StatusRuleParamsProps['setRuleParams']; +} + +export const FieldFilters = ({ ruleParams, setRuleParams }: Props) => { + const [search, setSearch] = useState(''); + const [selectedField, setSelectedField] = useState(); + + const { + suggestions = [], + isLoading, + allSuggestions, + } = useFetchSyntheticsSuggestions({ + search, + fieldName: selectedField, + }); + + const onFieldChange = useCallback( + (key: FieldKeys, value?: string[]) => { + setRuleParams(key, value); + }, + [setRuleParams] + ); + + return ( + <> + + + { + onFieldChange('monitorIds', val); + }} + value={ruleParams.monitorIds} + setSearch={setSearch} + suggestions={suggestions} + allSuggestions={allSuggestions} + isLoading={isLoading} + setSelectedField={setSelectedField} + selectedField={selectedField} + /> + + + { + onFieldChange('monitorTypes', val); + }} + value={ruleParams.monitorTypes} + setSearch={setSearch} + suggestions={suggestions} + allSuggestions={allSuggestions} + isLoading={isLoading} + setSelectedField={setSelectedField} + selectedField={selectedField} + /> + + + + + + { + onFieldChange('tags', val); + }} + value={ruleParams.tags} + setSearch={setSearch} + suggestions={suggestions} + allSuggestions={allSuggestions} + isLoading={isLoading} + setSelectedField={setSelectedField} + selectedField={selectedField} + /> + + + { + onFieldChange('projects', val); + }} + value={ruleParams.projects} + setSearch={setSearch} + suggestions={suggestions} + allSuggestions={allSuggestions} + isLoading={isLoading} + setSelectedField={setSelectedField} + selectedField={selectedField} + /> + + + + + + { + onFieldChange('locations', val); + }} + value={ruleParams.locations} + setSearch={setSearch} + suggestions={suggestions} + allSuggestions={allSuggestions} + isLoading={isLoading} + setSelectedField={setSelectedField} + selectedField={selectedField} + /> + + + + + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_popover_expression.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_popover_expression.tsx new file mode 100644 index 0000000000000..c5927e6c0e6b9 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_popover_expression.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactNode } from 'react'; +import { EuiExpression, EuiPopover, EuiExpressionProps } from '@elastic/eui'; +import { ALL_VALUE } from '@kbn/slo-schema'; +import { isEmpty } from 'lodash'; +import { allOptionText } from './fields'; +import { Suggestion } from '../hooks/use_fetch_synthetics_suggestions'; + +interface Props { + title?: ReactNode; + value?: string[]; + children?: ReactNode; + color?: EuiExpressionProps['color']; + selectedField?: string; + fieldName: string; + setSelectedField: (value?: string) => void; + allSuggestions?: Record; +} + +export function FieldPopoverExpression({ + title, + value, + children, + color, + selectedField, + fieldName, + setSelectedField, + allSuggestions, +}: Props) { + const isPopoverOpen = selectedField === fieldName; + + const suggestions = allSuggestions?.[fieldName]; + + let label = + !isEmpty(value) && value + ? suggestions + ?.filter((suggestion) => value.includes(suggestion.value)) + ?.map((suggestion) => suggestion.label) + .join(', ') + : allOptionText; + + if (value?.includes(ALL_VALUE)) { + label = allOptionText; + } + + const closePopover = () => setSelectedField(selectedField === fieldName ? undefined : fieldName); + return ( + + + } + repositionOnScroll + > +
{children}
+
+
+ ); +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.test.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.test.tsx new file mode 100644 index 0000000000000..0255b0014a1f0 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.test.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { onFieldChange } from './field_selector'; +import { EuiComboBoxOptionOption } from '@elastic/eui'; +import { ALL_VALUE } from '@kbn/slo-schema'; + +describe('onFieldChange', () => { + let onChangeMock: jest.Mock; + + beforeEach(() => { + onChangeMock = jest.fn(); + }); + + it('should filter out ALL_VALUE when a specific value is selected', () => { + const selected: Array> = [ + { label: 'Option 2', value: ALL_VALUE }, + { label: 'Option 1', value: 'value1' }, + ]; + + onFieldChange(selected, onChangeMock); + + expect(onChangeMock).toHaveBeenCalledWith(['value1']); + }); + + it('should return an empty array when ALL_VALUE is selected', () => { + const selected: Array> = [ + { label: 'Option 1', value: 'value1' }, + { label: 'Option 2', value: ALL_VALUE }, + ]; + + onFieldChange(selected, onChangeMock); + + expect(onChangeMock).toHaveBeenCalledWith([]); + }); + + it('should return an empty array when selected is empty', () => { + const selected: Array> = []; + + onFieldChange(selected, onChangeMock); + + expect(onChangeMock).toHaveBeenCalledWith([]); + }); + + it('should call onChange with the filtered array when no ALL_VALUE is present', () => { + const selected: Array> = [ + { label: 'Option 1', value: 'value1' }, + { label: 'Option 2', value: 'value2' }, + ]; + + onFieldChange(selected, onChangeMock); + + expect(onChangeMock).toHaveBeenCalledWith(['value1', 'value2']); + }); + + it('should return an empty array if the last selected option is ALL_VALUE', () => { + const selected: Array> = [ + { label: 'Option 1', value: 'value1' }, + { label: 'Option 2', value: ALL_VALUE }, + ]; + + onFieldChange(selected, onChangeMock); + + expect(onChangeMock).toHaveBeenCalledWith([]); + }); +}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.tsx new file mode 100644 index 0000000000000..96b44e7e5dce4 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/field_selector.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 React from 'react'; +import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; +import { ALL_VALUE } from '@kbn/slo-schema'; +import { debounce } from 'lodash'; +import { i18n } from '@kbn/i18n'; +import { Suggestion } from '../hooks/use_fetch_synthetics_suggestions'; + +interface Option { + label: string; + value: string; +} + +export interface Props { + allowAllOption?: boolean; + dataTestSubj: string; + fieldName: 'monitorIds' | 'projects' | 'tags' | 'locations' | 'monitorTypes'; + suggestions?: Suggestion[]; + isLoading?: boolean; + required?: boolean; + value?: string[]; + onChange: (selected: string[]) => void; + placeholder: string; + setSearch: (val: string) => void; + setSelectedField: (value: string) => void; +} + +const ALL_OPTION = { + label: i18n.translate('xpack.synthetics.filter.alert.allLabel', { + defaultMessage: 'All', + }), + value: ALL_VALUE, +}; + +export function FieldSelector({ + allowAllOption = true, + dataTestSubj, + value, + onChange, + isLoading, + placeholder, + suggestions, + setSearch, +}: Props) { + const options = (allowAllOption ? [ALL_OPTION] : []).concat(createOptions(suggestions)); + + const debouncedSearch = debounce((val) => setSearch(val), 200); + + return ( + + >) => { + onFieldChange(selected, onChange); + }} + onSearchChange={(val: string) => debouncedSearch(val)} + options={options} + selectedOptions={value?.map((val) => { + const option = options.find((opt) => opt.value === val); + if (option) { + return { + value: val, + label: option.label, + 'data-test-subj': `${dataTestSubj}SelectedValue`, + }; + } + return { + value: val, + label: val, + 'data-test-subj': `${dataTestSubj}SelectedValue`, + }; + })} + /> + + ); +} + +export const onFieldChange = ( + selected: Array>, + onChange: (selected: string[]) => void +) => { + // removes ALL value option if a specific value is selected + if (selected.length && selected.at(-1)?.value !== ALL_VALUE) { + onChange(selected.filter((val) => val.value !== ALL_VALUE).map((val) => val.value!)); + return; + } + // removes specific value if ALL value is selected + if (selected.length && selected.at(-1)?.value === ALL_VALUE) { + onChange([]); + return; + } + + onChange([]); +}; + +function createOptions(suggestions: Suggestion[] = []): Option[] { + return suggestions + .map((suggestion) => ({ label: suggestion.label, value: suggestion.value })) + .sort((a, b) => String(a.label).localeCompare(b.label)); +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/fields.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/fields.tsx new file mode 100644 index 0000000000000..2c2e9714d998e --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/fields.tsx @@ -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 { i18n } from '@kbn/i18n'; +import React from 'react'; +import { FieldPopoverExpression } from './field_popover_expression'; +import { Suggestion } from '../hooks/use_fetch_synthetics_suggestions'; +import { FieldSelector } from './field_selector'; + +interface FieldProps { + value?: string[]; + onChange: (value?: string[]) => void; + setSearch: (val: string) => void; + suggestions?: Suggestion[]; + allSuggestions?: Record; + isLoading?: boolean; + setSelectedField: (value?: string) => void; + selectedField?: string; +} + +export const allOptionText = i18n.translate('xpack.synthetics.filter.alert.allLabel', { + defaultMessage: 'All', +}); + +export function MonitorField({ value, onChange, ...rest }: FieldProps) { + return ( + + + + ); +} + +export function TagsField({ value, onChange, ...rest }: FieldProps) { + return ( + + + + ); +} + +export function MonitorTypeField({ value, onChange, ...rest }: FieldProps) { + const label = i18n.translate('xpack.synthetics.alerting.fields.type', { + defaultMessage: 'Type', + }); + return ( + + + + ); +} + +export function LocationsField({ value, onChange, ...rest }: FieldProps) { + const label = i18n.translate('xpack.synthetics.alerting.fields.location', { + defaultMessage: 'Locations', + }); + return ( + + + + ); +} + +export function ProjectsField({ value, onChange, ...rest }: FieldProps) { + const label = i18n.translate('xpack.synthetics.alerting.fields.project', { + defaultMessage: 'Projects', + }); + return ( + + + + ); +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/for_the_last_expression.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/for_the_last_expression.tsx new file mode 100644 index 0000000000000..81153d88be61d --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/for_the_last_expression.tsx @@ -0,0 +1,172 @@ +/* + * Copyright 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 { EuiExpression, EuiPopover, EuiPopoverTitle, EuiSelectable } from '@elastic/eui'; +import React, { useEffect, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { getConditionType, StatusRuleCondition } from '../../../../../../common/rules/status_rule'; +import { StatusRuleParamsProps } from '../status_rule_ui'; + +interface Props { + ruleParams: StatusRuleParamsProps['ruleParams']; + setRuleParams: StatusRuleParamsProps['setRuleParams']; +} + +export const WITHIN_TOTAL_CHECKS_LABEL = i18n.translate( + 'xpack.synthetics.monitorStatusRule.withinTotalChecks.label', + { + defaultMessage: 'Within total checks', + } +); + +export const WITHIN_TOTAL_CHECKS_EXPRESSION = i18n.translate( + 'xpack.synthetics.monitorStatusRule.withinTotalChecks.expression', + { + defaultMessage: 'Within the last', + } +); + +export const WITHIN_TIMERANGE_EXPRESSION = i18n.translate( + 'xpack.synthetics.monitorStatusRule.withinTimerange.expression', + { + defaultMessage: 'Within the last', + } +); + +export const WITHIN_TIMERANGE_LABEL = i18n.translate( + 'xpack.synthetics.monitorStatusRule.withinTimerange.label', + { + defaultMessage: 'Within timerange', + } +); + +interface Option { + label: string; + key: 'checksWindow' | 'timeWindow' | 'locations'; +} + +const OPTIONS: Option[] = [ + { + label: WITHIN_TOTAL_CHECKS_LABEL, + key: 'checksWindow', + }, + { + label: WITHIN_TIMERANGE_LABEL, + key: 'timeWindow', + }, +]; + +export const DEFAULT_CONDITION = { + window: { numberOfChecks: 5 }, + groupBy: 'locationId', + downThreshold: 3, + locationsThreshold: 1, +}; +const getCheckedOption = (option: Option, condition?: StatusRuleCondition) => { + const { useTimeWindow, isLocationBased } = getConditionType(condition); + + if (isLocationBased && option.key === 'locations') { + return 'on'; + } + + if (option.key === 'timeWindow' && useTimeWindow && !isLocationBased) { + return 'on'; + } + if (option.key === 'checksWindow' && !useTimeWindow && !isLocationBased) { + return 'on'; + } + + return undefined; +}; + +export const ForTheLastExpression = ({ ruleParams, setRuleParams }: Props) => { + const { condition } = ruleParams; + + const { useTimeWindow } = getConditionType(condition); + + const [isOpen, setIsOpen] = useState(false); + + const [options, setOptions] = useState(OPTIONS); + + useEffect(() => { + if (!condition) { + setRuleParams('condition', DEFAULT_CONDITION); + } + }, [condition, setRuleParams]); + + useEffect(() => { + setOptions( + OPTIONS.map((option) => ({ + key: option.key as 'checksWindow' | 'timeWindow', + label: option.label, + checked: getCheckedOption(option, condition), + })) + ); + }, [condition, useTimeWindow]); + + const getDescriptiveText = () => { + if (useTimeWindow) { + return WITHIN_TIMERANGE_EXPRESSION; + } + return WITHIN_TOTAL_CHECKS_EXPRESSION; + }; + + return ( + setIsOpen(!isOpen)} + /> + } + isOpen={isOpen} + closePopover={() => setIsOpen(false)} + anchorPosition="downLeft" + > + + singleSelection="always" + options={options} + onChange={(selectedValues) => { + const selectedValue = selectedValues.filter((v) => v.checked === 'on')?.[0]; + switch (selectedValue?.key) { + case 'checksWindow': + setRuleParams('condition', { + ...ruleParams.condition, + downThreshold: 5, + locationsThreshold: 1, + window: { numberOfChecks: 5 }, + }); + break; + case 'timeWindow': + setRuleParams('condition', { + ...ruleParams.condition, + downThreshold: 5, + locationsThreshold: 1, + window: { time: { unit: 'm', size: 5 } }, + }); + break; + default: + break; + } + }} + > + {(list) => ( +
+ + {i18n.translate('xpack.synthetics.forTheLastExpression.whenPopoverTitleLabel', { + defaultMessage: 'When', + })} + + {list} +
+ )} + +
+ ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/group_by_field.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/group_by_field.tsx new file mode 100644 index 0000000000000..92cc2abe3517c --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/group_by_field.tsx @@ -0,0 +1,55 @@ +/* + * Copyright 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 { EuiFlexGroup, EuiFlexItem, EuiIconTip, EuiSwitch } from '@elastic/eui'; + +export const GroupByExpression = ({ + onChange, + groupByLocation, + locationsThreshold, +}: { + locationsThreshold: number; + groupByLocation: boolean; + onChange: (val: boolean) => void; +}) => { + const disabledGroupBy = locationsThreshold > 1; + + return ( + + + onChange(e.target.checked)} + /> + + + {disabledGroupBy ? ( + + ) : ( + + )} + + + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/popover_expression.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/popover_expression.tsx new file mode 100644 index 0000000000000..3841f25ac2a8b --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/common/popover_expression.tsx @@ -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 React, { useState, ReactNode } from 'react'; +import { EuiExpression, EuiPopover, EuiExpressionProps } from '@elastic/eui'; + +interface Props { + title?: ReactNode; + value: ReactNode; + children?: ReactNode; + color?: EuiExpressionProps['color']; +} + +export function PopoverExpression(props: Props) { + const { title, value, children, color } = props; + const [popoverOpen, setPopoverOpen] = useState(false); + + return ( + setPopoverOpen(false)} + button={ + setPopoverOpen((state) => !state)} + /> + } + repositionOnScroll + > + {children} + + ); +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/translations.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/translations.ts index 2901b67820485..eb54c108b5de3 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/translations.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/translations.ts @@ -21,12 +21,6 @@ export const ToggleFlyoutTranslations = { toggleTlsAriaLabel: i18n.translate('xpack.synthetics.toggleAlertFlyout.tls.ariaLabel', { defaultMessage: 'Open add tls rule flyout', }), - toggleMonitorStatusContent: i18n.translate('xpack.synthetics.toggleAlertButton.content', { - defaultMessage: 'Monitor status rule', - }), - toggleTlsContent: i18n.translate('xpack.synthetics.toggleTlsAlertButton.label.content', { - defaultMessage: 'TLS certificate rule', - }), navigateToAlertingUIAriaLabel: i18n.translate('xpack.synthetics.app.navigateToAlertingUi', { defaultMessage: 'Leave Synthetics and go to Alerting Management page', }), @@ -40,3 +34,11 @@ export const ToggleFlyoutTranslations = { defaultMessage: 'Alerts and rules', }), }; + +export const TLS_RULE_NAME = i18n.translate('xpack.synthetics.toggleTlsAlertButton.label.content', { + defaultMessage: 'TLS certificate rule', +}); + +export const STATUS_RULE_NAME = i18n.translate('xpack.synthetics.toggleAlertButton.content', { + defaultMessage: 'Monitor status rule', +}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_fetch_synthetics_suggestions.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_fetch_synthetics_suggestions.ts new file mode 100644 index 0000000000000..a5f16ffab8b7a --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_fetch_synthetics_suggestions.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { useFetcher } from '@kbn/observability-shared-plugin/public'; +import { ClientPluginsStart } from '../../../../../plugin'; + +export interface Suggestion { + label: string; + value: string; + count: number; +} + +export interface UseFetchSyntheticsSuggestions { + suggestions: Suggestion[]; + isLoading: boolean; + allSuggestions?: Record; +} + +export interface Params { + fieldName?: string; + filters?: { + locations?: string[]; + monitorIds?: string[]; + tags?: string[]; + projects?: string[]; + }; + search: string; +} + +type ApiResponse = Record; + +export function useFetchSyntheticsSuggestions({ + filters, + fieldName, + search, +}: Params): UseFetchSyntheticsSuggestions { + const { http } = useKibana().services; + const { locations, monitorIds, tags, projects } = filters || {}; + + const { loading, data } = useFetcher( + async ({ signal }) => { + return await http.get('/internal/synthetics/suggestions', { + query: { + locations: locations || [], + monitorQueryIds: monitorIds || [], + tags: tags || [], + projects: projects || [], + query: search, + }, + signal, + }); + }, + [http, locations, monitorIds, tags, projects, search] + ); + + return { + suggestions: fieldName ? data?.[fieldName] ?? [] : [], + allSuggestions: data, + isLoading: Boolean(loading), + }; +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_synthetics_rules.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_synthetics_rules.ts index 6e03b69b5d60c..5ffb17b639768 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_synthetics_rules.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/hooks/use_synthetics_rules.ts @@ -8,6 +8,8 @@ import { useDispatch, useSelector } from 'react-redux'; import { useCallback, useEffect, useMemo } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { selectDynamicSettings } from '../../../state/settings'; import { useSyntheticsSettingsContext } from '../../../contexts'; import { selectSyntheticsAlerts, @@ -20,6 +22,7 @@ import { import { SYNTHETICS_TLS_RULE } from '../../../../../../common/constants/synthetics_alerts'; import { selectAlertFlyoutVisibility, + selectIsNewRule, selectMonitorListState, setAlertFlyoutVisible, } from '../../../state'; @@ -31,12 +34,16 @@ export const useSyntheticsRules = (isOpen: boolean) => { const defaultRules = useSelector(selectSyntheticsAlerts); const loading = useSelector(selectSyntheticsAlertsLoading); const alertFlyoutVisible = useSelector(selectAlertFlyoutVisibility); + const isNewRule = useSelector(selectIsNewRule); + const { settings } = useSelector(selectDynamicSettings); const { canSave } = useSyntheticsSettingsContext(); const { loaded, data: monitors } = useSelector(selectMonitorListState); const hasMonitors = loaded && monitors.absoluteTotal && monitors.absoluteTotal > 0; + const defaultRulesEnabled = + settings && (settings?.defaultStatusRuleEnabled || settings?.defaultTLSRuleEnabled); const getOrCreateAlerts = useCallback(() => { if (canSave) { @@ -47,7 +54,7 @@ export const useSyntheticsRules = (isOpen: boolean) => { }, [canSave, dispatch]); useEffect(() => { - if (hasMonitors) { + if (hasMonitors && defaultRulesEnabled) { if (!defaultRules) { // on initial load we prioritize loading the app setTimeout(() => { @@ -59,22 +66,52 @@ export const useSyntheticsRules = (isOpen: boolean) => { } // we don't want to run this on defaultRules change // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dispatch, isOpen, hasMonitors]); + }, [dispatch, isOpen, hasMonitors, defaultRulesEnabled]); const { triggersActionsUi } = useKibana().services; const EditAlertFlyout = useMemo(() => { const initialRule = alertFlyoutVisible === SYNTHETICS_TLS_RULE ? defaultRules?.tlsRule : defaultRules?.statusRule; - if (!initialRule) { + if (!initialRule || isNewRule) { return null; } return triggersActionsUi.getEditRuleFlyout({ onClose: () => dispatch(setAlertFlyoutVisible(null)), - hideInterval: true, initialRule, }); - }, [defaultRules, dispatch, triggersActionsUi, alertFlyoutVisible]); + }, [ + alertFlyoutVisible, + defaultRules?.tlsRule, + defaultRules?.statusRule, + isNewRule, + triggersActionsUi, + dispatch, + ]); - return useMemo(() => ({ loading, EditAlertFlyout }), [EditAlertFlyout, loading]); + const NewRuleFlyout = useMemo(() => { + if (!isNewRule || !alertFlyoutVisible) { + return null; + } + return triggersActionsUi.getAddRuleFlyout({ + consumer: 'uptime', + ruleTypeId: alertFlyoutVisible, + onClose: () => dispatch(setAlertFlyoutVisible(null)), + initialValues: { + name: + alertFlyoutVisible === SYNTHETICS_TLS_RULE + ? i18n.translate('xpack.synthetics.alerting.defaultRuleName.tls', { + defaultMessage: 'Synthetics monitor TLS rule', + }) + : i18n.translate('xpack.synthetics.alerting.defaultRuleName', { + defaultMessage: 'Synthetics monitor status rule', + }), + }, + }); + }, [isNewRule, triggersActionsUi, dispatch, alertFlyoutVisible]); + + return useMemo( + () => ({ loading, EditAlertFlyout, NewRuleFlyout }), + [EditAlertFlyout, loading, NewRuleFlyout] + ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx new file mode 100644 index 0000000000000..11d17abb6c81a --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx @@ -0,0 +1,77 @@ +/* + * Copyright 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 } from 'react'; +import { i18n } from '@kbn/i18n'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { Filter } from '@kbn/es-query'; +import { EuiFormRow } from '@elastic/eui'; +import { useSyntheticsDataView } from '../../contexts/synthetics_data_view_context'; +import { ClientPluginsStart } from '../../../../plugin'; + +export function AlertSearchBar({ + kqlQuery, + onChange, +}: { + kqlQuery: string; + onChange: (val: { kqlQuery?: string; filters?: Filter[] }) => void; +}) { + const { + data: { query }, + unifiedSearch: { + ui: { QueryStringInput }, + }, + } = useKibana().services; + + const dataView = useSyntheticsDataView(); + + useEffect(() => { + const sub = query.state$.subscribe(() => { + const queryState = query.getState(); + onChange({ + kqlQuery: String(queryState.query), + }); + }); + + return sub.unsubscribe; + }, [onChange, query]); + + return ( + + { + onChange({ + kqlQuery: String(queryN.query), + }); + }} + onSubmit={(queryN) => { + if (queryN) { + onChange({ + kqlQuery: String(queryN.query), + }); + } + }} + query={{ query: String(kqlQuery), language: 'kuery' }} + autoSubmit={true} + disableLanguageSwitcher={true} + /> + + ); +} + +const PLACEHOLDER = i18n.translate('xpack.synthetics.list.search', { + defaultMessage: 'Filter by KQL query', +}); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/rule_name_with_loading.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/rule_name_with_loading.tsx new file mode 100644 index 0000000000000..4f4b8b5d60ddf --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/rule_name_with_loading.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 { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; +import React from 'react'; + +export const RuleNameWithLoading = ({ + ruleName, + isLoading, +}: { + ruleName: string; + isLoading: boolean; +}) => { + return ( + + {ruleName} + {isLoading && ( + + + + )} + + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_expression.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_expression.tsx new file mode 100644 index 0000000000000..b3a701d474802 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_expression.tsx @@ -0,0 +1,157 @@ +/* + * Copyright 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 { + EuiExpression, + EuiFlexItem, + EuiFlexGroup, + EuiSpacer, + EuiTitle, + EuiHorizontalRule, + EuiIconTip, +} from '@elastic/eui'; +import React, { useCallback } from 'react'; +import { ValueExpression } from '@kbn/triggers-actions-ui-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { GroupByExpression } from './common/group_by_field'; +import { WindowValueExpression } from './common/condition_window_value'; +import { DEFAULT_CONDITION, ForTheLastExpression } from './common/for_the_last_expression'; +import { StatusRuleParamsProps } from './status_rule_ui'; +import { LocationsValueExpression } from './common/condition_locations_value'; + +interface Props { + ruleParams: StatusRuleParamsProps['ruleParams']; + setRuleParams: StatusRuleParamsProps['setRuleParams']; +} + +export const StatusRuleExpression: React.FC = ({ ruleParams, setRuleParams }) => { + const condition = ruleParams.condition ?? DEFAULT_CONDITION; + const downThreshold = condition?.downThreshold ?? DEFAULT_CONDITION.downThreshold; + + const locationsThreshold = condition?.locationsThreshold ?? DEFAULT_CONDITION.locationsThreshold; + + const onThresholdChange = useCallback( + (value: number) => { + const prevCondition = ruleParams.condition ?? DEFAULT_CONDITION; + setRuleParams('condition', { + ...prevCondition, + downThreshold: value, + }); + }, + [ruleParams.condition, setRuleParams] + ); + + const onGroupByChange = useCallback( + (groupByLocation: boolean) => { + setRuleParams('condition', { + ...(ruleParams?.condition ?? DEFAULT_CONDITION), + groupBy: groupByLocation ? 'locationId' : 'none', + }); + }, + [ruleParams?.condition, setRuleParams] + ); + + return ( + <> + + + + +

+ {i18n.translate('xpack.synthetics.rules.status.condition.title', { + defaultMessage: 'Condition', + })} +

+
+
+ + + +
+ + + + + + + { + onThresholdChange(val); + }} + description={StatusTranslations.isDownDescription} + errors={[]} + /> + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export const StatusTranslations = { + criteriaAriaLabel: i18n.translate('xpack.synthetics.rules.status.criteriaExpression.ariaLabel', { + defaultMessage: + 'An expression displaying the criteria for the monitors that are being watched by this alert', + }), + criteriaDescription: i18n.translate( + 'xpack.synthetics.alerts.tls.criteriaExpression.description', + { + defaultMessage: 'when', + } + ), + criteriaValue: i18n.translate('xpack.synthetics.status.criteriaExpression.value', { + defaultMessage: 'monitor', + }), + isDownDescription: i18n.translate('xpack.synthetics.status.expirationExpression.description', { + defaultMessage: 'is down ', + }), + fromLocationsDescription: i18n.translate( + 'xpack.synthetics.status.locationsThreshold.description', + { + defaultMessage: 'from at least', + } + ), +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_ui.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_ui.tsx new file mode 100644 index 0000000000000..70278c8951773 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/status_rule_ui.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, { useCallback } from 'react'; +import { RuleTypeParamsExpressionProps } from '@kbn/triggers-actions-ui-plugin/public'; +import { Filter } from '@kbn/es-query'; +import { EuiSpacer } from '@elastic/eui'; +import { FieldFilters } from './common/field_filters'; +import { AlertSearchBar } from './query_bar'; +import { StatusRuleExpression } from './status_rule_expression'; +import { StatusRuleParams } from '../../../../../common/rules/status_rule'; + +export type StatusRuleParamsProps = RuleTypeParamsExpressionProps; + +export const StatusRuleComponent: React.FC<{ + ruleParams: StatusRuleParamsProps['ruleParams']; + setRuleParams: StatusRuleParamsProps['setRuleParams']; +}> = ({ ruleParams, setRuleParams }) => { + const onFiltersChange = useCallback( + (val: { kqlQuery?: string; filters?: Filter[] }) => { + setRuleParams('kqlQuery', val.kqlQuery); + }, + [setRuleParams] + ); + + return ( + <> + + + + + + + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/toggle_alert_flyout_button.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/toggle_alert_flyout_button.tsx index 0a8e5abf37f1a..6203652578480 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/toggle_alert_flyout_button.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/toggle_alert_flyout_button.tsx @@ -11,21 +11,18 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { EuiContextMenu, EuiContextMenuPanelDescriptor, - EuiContextMenuPanelItemDescriptor, - EuiFlexGroup, - EuiFlexItem, EuiHeaderLink, - EuiLoadingSpinner, EuiPopover, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { RuleNameWithLoading } from './rule_name_with_loading'; import { SYNTHETICS_STATUS_RULE, SYNTHETICS_TLS_RULE, } from '../../../../../common/constants/synthetics_alerts'; import { ManageRulesLink } from '../common/links/manage_rules_link'; import { ClientPluginsStart } from '../../../../plugin'; -import { ToggleFlyoutTranslations } from './hooks/translations'; +import { STATUS_RULE_NAME, TLS_RULE_NAME, ToggleFlyoutTranslations } from './hooks/translations'; import { useSyntheticsRules } from './hooks/use_synthetics_rules'; import { selectAlertFlyoutVisibility, @@ -40,67 +37,84 @@ export const ToggleAlertFlyoutButton = () => { const { application } = useKibana().services; const hasUptimeWrite = application?.capabilities.uptime?.save ?? false; - const { EditAlertFlyout, loading } = useSyntheticsRules(isOpen); - + const { EditAlertFlyout, loading, NewRuleFlyout } = useSyntheticsRules(isOpen); const { loaded, data: monitors } = useSelector(selectMonitorListState); const hasMonitors = loaded && monitors.absoluteTotal && monitors.absoluteTotal > 0; - const monitorStatusAlertContextMenuItem: EuiContextMenuPanelItemDescriptor = { - 'aria-label': ToggleFlyoutTranslations.toggleMonitorStatusAriaLabel, - 'data-test-subj': 'xpack.synthetics.toggleAlertFlyout', - name: ( - - {ToggleFlyoutTranslations.toggleMonitorStatusContent} - {loading && ( - - - - )} - - ), - onClick: () => { - dispatch(setAlertFlyoutVisible(SYNTHETICS_STATUS_RULE)); - setIsOpen(false); - }, - toolTipContent: !hasUptimeWrite ? noWritePermissionsTooltipContent : null, - disabled: !hasUptimeWrite || loading, - icon: 'bell', - }; - - const tlsAlertContextMenuItem: EuiContextMenuPanelItemDescriptor = { - 'aria-label': ToggleFlyoutTranslations.toggleMonitorStatusAriaLabel, - 'data-test-subj': 'xpack.synthetics.toggleAlertFlyout.tls', - name: ( - - {ToggleFlyoutTranslations.toggleTlsContent} - {loading && ( - - - - )} - - ), - onClick: () => { - dispatch(setAlertFlyoutVisible(SYNTHETICS_TLS_RULE)); - setIsOpen(false); - }, - toolTipContent: !hasUptimeWrite ? noWritePermissionsTooltipContent : null, - disabled: !hasUptimeWrite || loading, - icon: 'bell', - }; - - const managementContextItem: EuiContextMenuPanelItemDescriptor = { - 'aria-label': ToggleFlyoutTranslations.navigateToAlertingUIAriaLabel, - 'data-test-subj': 'xpack.synthetics.navigateToAlertingUi', - name: , - icon: 'tableOfContents', - }; - const panels: EuiContextMenuPanelDescriptor[] = [ { id: 0, - items: [monitorStatusAlertContextMenuItem, tlsAlertContextMenuItem, managementContextItem], + items: [ + { + name: STATUS_RULE_NAME, + 'data-test-subj': 'manageStatusRuleName', + panel: 1, + }, + { + name: TLS_RULE_NAME, + 'data-test-subj': 'manageTlsRuleName', + panel: 2, + }, + { + 'aria-label': ToggleFlyoutTranslations.navigateToAlertingUIAriaLabel, + 'data-test-subj': 'xpack.synthetics.navigateToAlertingUi', + name: , + icon: 'tableOfContents', + }, + ], + }, + { + id: 1, + items: [ + { + name: CREATE_STATUS_RULE, + 'data-test-subj': 'createNewStatusRule', + icon: 'plusInCircle', + onClick: () => { + dispatch(setAlertFlyoutVisible({ id: SYNTHETICS_STATUS_RULE, isNewRuleFlyout: true })); + setIsOpen(false); + }, + }, + { + 'aria-label': ToggleFlyoutTranslations.toggleMonitorStatusAriaLabel, + 'data-test-subj': 'editDefaultStatusRule', + name: , + onClick: () => { + dispatch(setAlertFlyoutVisible({ id: SYNTHETICS_STATUS_RULE, isNewRuleFlyout: false })); + setIsOpen(false); + }, + toolTipContent: !hasUptimeWrite ? noWritePermissionsTooltipContent : null, + disabled: !hasUptimeWrite || loading, + icon: 'bell', + }, + ], + }, + { + id: 2, + items: [ + { + name: CREATE_TLS_RULE_NAME, + 'data-test-subj': 'createNewTLSRule', + icon: 'plusInCircle', + onClick: () => { + dispatch(setAlertFlyoutVisible({ id: SYNTHETICS_TLS_RULE, isNewRuleFlyout: true })); + setIsOpen(false); + }, + }, + { + 'aria-label': ToggleFlyoutTranslations.toggleMonitorStatusAriaLabel, + 'data-test-subj': 'editDefaultTlsRule', + name: , + onClick: () => { + dispatch(setAlertFlyoutVisible({ id: SYNTHETICS_TLS_RULE, isNewRuleFlyout: false })); + setIsOpen(false); + }, + toolTipContent: !hasUptimeWrite ? noWritePermissionsTooltipContent : null, + disabled: !hasUptimeWrite || loading, + icon: 'bell', + }, + ], }, ]; @@ -113,7 +127,7 @@ export const ToggleAlertFlyoutButton = () => { setIsOpen(!isOpen)} @@ -130,6 +144,7 @@ export const ToggleAlertFlyoutButton = () => { {alertFlyoutVisible && EditAlertFlyout} + {alertFlyoutVisible && NewRuleFlyout} ); }; @@ -140,3 +155,31 @@ const noWritePermissionsTooltipContent = i18n.translate( defaultMessage: 'You do not have sufficient permissions to perform this action.', } ); + +export const EDIT_TLS_RULE_NAME = i18n.translate( + 'xpack.synthetics.toggleTlsAlertButton.label.default', + { + defaultMessage: 'Edit default TLS rule', + } +); + +export const EDIT_STATUS_RULE = i18n.translate( + 'xpack.synthetics.toggleStatusAlertButton.label.default', + { + defaultMessage: 'Edit default status rule', + } +); + +export const CREATE_TLS_RULE_NAME = i18n.translate( + 'xpack.synthetics.toggleTlsAlertButton.createRule', + { + defaultMessage: 'Create TLS rule', + } +); + +export const CREATE_STATUS_RULE = i18n.translate( + 'xpack.synthetics.toggleStatusAlertButton.createRule', + { + defaultMessage: 'Create status rule', + } +); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.test.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.test.tsx index a575ecc110eb4..49098f8de0225 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.test.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.test.tsx @@ -35,6 +35,10 @@ describe('Monitor Detail Flyout', () => { status: 'up', type: 'http', check_group: 'check-group', + timespan: { + gte: 'now-15m', + lt: 'now', + }, }, url: { full: 'https://www.elastic.co', diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_status.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_status.tsx index 4f089b2464ed9..88133c5c06d38 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_status.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_status.tsx @@ -97,7 +97,7 @@ export function OverviewStatus({ titleAppend }: { titleAppend?: React.ReactNode - - - + {params.id && isEmpty(ruleParams) && ( + + + + )} + + {(!params.id || !isEmpty(ruleParams)) && ( + + )} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/lib/alert_types/monitor_status.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/lib/alert_types/monitor_status.tsx index 5f63d6ac298c7..794747853642c 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/lib/alert_types/monitor_status.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/lib/alert_types/monitor_status.tsx @@ -41,7 +41,7 @@ export const initMonitorStatusAlertType: AlertTypeInitializer = ({ }, defaultActionMessage, defaultRecoveryMessage, - requiresAppContext: true, + requiresAppContext: false, format: ({ fields }) => { return { reason: fields[ALERT_REASON] || '', diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/effects.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/effects.ts index bbec528db6de2..f1c949ccf2b31 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/effects.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/effects.ts @@ -7,7 +7,7 @@ import { PayloadAction } from '@reduxjs/toolkit'; import { call, put, takeEvery, select, takeLatest, debounce } from 'redux-saga/effects'; -import { quietFetchOverviewStatusAction } from '../overview_status'; +import { fetchOverviewStatusAction, quietFetchOverviewStatusAction } from '../overview_status'; import { enableDefaultAlertingAction } from '../alert_rules'; import { ConfigKey, @@ -15,7 +15,7 @@ import { SyntheticsMonitorWithId, } from '../../../../../common/runtime_types'; import { kibanaService } from '../../../../utils/kibana_service'; -import { MonitorOverviewPageState } from '../overview'; +import { MonitorOverviewPageState, selectOverviewPageState } from '../overview'; import { selectOverviewState } from '../overview/selectors'; import { fetchEffectFactory, sendErrorToast, sendSuccessToast } from '../utils/fetch_effect'; import { serializeHttpFetchError } from '../utils/http_error'; @@ -53,7 +53,13 @@ export function* enableMonitorAlertEffect() { try { const response = yield call(fetchUpsertMonitor, action.payload); yield put(enableMonitorAlertAction.success(response as SyntheticsMonitorWithId)); + const pageState = (yield select(selectOverviewPageState)) as MonitorOverviewPageState; sendSuccessToast(action.payload.success); + yield put( + fetchOverviewStatusAction.get({ + pageState, + }) + ); if ( (response as EncryptedSyntheticsSavedMonitor)[ConfigKey.ALERT_CONFIG]?.status?.enabled ) { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/overview_status/index.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/overview_status/index.ts index 6cdadd03d15bd..2670aa913d61a 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/overview_status/index.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/overview_status/index.ts @@ -7,13 +7,7 @@ import { createReducer } from '@reduxjs/toolkit'; -import { enableMonitorAlertAction } from '../monitor_list/actions'; -import { isStatusEnabled } from '../../../../../common/runtime_types/monitor_management/alert_config'; -import { - ConfigKey, - OverviewStatusMetaData, - OverviewStatusState, -} from '../../../../../common/runtime_types'; +import { OverviewStatusMetaData, OverviewStatusState } from '../../../../../common/runtime_types'; import { IHttpSerializedFetchError } from '..'; import { clearOverviewStatusErrorAction, @@ -27,7 +21,6 @@ export interface OverviewStatusStateReducer { status: OverviewStatusState | null; allConfigs?: OverviewStatusMetaData[]; disabledConfigs?: OverviewStatusMetaData[]; - sortedByStatus?: OverviewStatusMetaData[]; error: IHttpSerializedFetchError | null; } @@ -63,24 +56,6 @@ export const overviewStatusReducer = createReducer(initialState, (builder) => { state.error = action.payload; state.loading = false; }) - .addCase(enableMonitorAlertAction.success, (state, action) => { - const monitorObject = action.payload; - if (!('errors' in monitorObject)) { - const isStatusAlertEnabled = isStatusEnabled(monitorObject[ConfigKey.ALERT_CONFIG]); - state.allConfigs = state.allConfigs?.map((monitor) => { - if ( - monitor.configId === monitorObject[ConfigKey.CONFIG_ID] || - monitor.monitorQueryId === monitorObject[ConfigKey.MONITOR_QUERY_ID] - ) { - return { - ...monitor, - isStatusAlertEnabled, - }; - } - return monitor; - }); - } - }) .addCase(clearOverviewStatusErrorAction, (state) => { state.error = null; }); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/actions.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/actions.ts index 06b9506ead191..7a9e3e2884b9a 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/actions.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/actions.ts @@ -16,9 +16,10 @@ export interface PopoverState { open: boolean; } -export const setAlertFlyoutVisible = createAction< - typeof SYNTHETICS_STATUS_RULE | typeof SYNTHETICS_TLS_RULE | null ->('[UI] TOGGLE ALERT FLYOUT'); +export const setAlertFlyoutVisible = createAction<{ + id: typeof SYNTHETICS_STATUS_RULE | typeof SYNTHETICS_TLS_RULE | null; + isNewRuleFlyout: boolean; +} | null>('[UI] TOGGLE ALERT FLYOUT'); export const setBasePath = createAction('[UI] SET BASE PATH'); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/index.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/index.ts index 2c7d5e5ce3d4c..f1314bbae4fa0 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/index.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/index.ts @@ -22,7 +22,8 @@ import { } from './actions'; export interface UiState { - alertFlyoutVisible: typeof SYNTHETICS_TLS_RULE | typeof SYNTHETICS_STATUS_RULE | null; + ruleFlyoutVisible: typeof SYNTHETICS_TLS_RULE | typeof SYNTHETICS_STATUS_RULE | null; + isNewRuleFlyout?: boolean | null; basePath: string; esKuery: string; searchText: string; @@ -31,7 +32,8 @@ export interface UiState { } const initialState: UiState = { - alertFlyoutVisible: null, + isNewRuleFlyout: false, + ruleFlyoutVisible: null, basePath: '', esKuery: '', searchText: '', @@ -45,7 +47,8 @@ export const uiReducer = createReducer(initialState, (builder) => { state.integrationsPopoverOpen = action.payload; }) .addCase(setAlertFlyoutVisible, (state, action) => { - state.alertFlyoutVisible = action.payload; + state.ruleFlyoutVisible = action.payload?.id ?? null; + state.isNewRuleFlyout = action.payload?.isNewRuleFlyout ?? null; }) .addCase(setBasePath, (state, action) => { state.basePath = action.payload; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/selectors.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/selectors.ts index f02b1fb564c37..92e5d249a583d 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/selectors.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/ui/selectors.ts @@ -12,5 +12,10 @@ const uiStateSelector = (appState: SyntheticsAppState) => appState.ui; export const selectAlertFlyoutVisibility = createSelector( uiStateSelector, - ({ alertFlyoutVisible }) => alertFlyoutVisible + ({ ruleFlyoutVisible }) => ruleFlyoutVisible +); + +export const selectIsNewRule = createSelector( + uiStateSelector, + ({ isNewRuleFlyout }) => isNewRuleFlyout ); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts index aa1743b7f27db..fe2ad5f7512cc 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts @@ -24,7 +24,7 @@ import { MonitorDetailsState } from '../../../state'; */ export const mockState: SyntheticsAppState = { ui: { - alertFlyoutVisible: null, + ruleFlyoutVisible: null, basePath: 'yyz', esKuery: '', integrationsPopoverOpen: null, diff --git a/x-pack/plugins/observability_solution/synthetics/scripts/generate_monitors.js b/x-pack/plugins/observability_solution/synthetics/scripts/generate_monitors.js new file mode 100644 index 0000000000000..c18274f04f5b2 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/scripts/generate_monitors.js @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +require('@kbn/babel-register').install(); +require('./tasks/generate_monitors').generateMonitors(); diff --git a/x-pack/plugins/observability_solution/synthetics/scripts/tasks/generate_monitors.ts b/x-pack/plugins/observability_solution/synthetics/scripts/tasks/generate_monitors.ts new file mode 100644 index 0000000000000..4e571344ce870 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/scripts/tasks/generate_monitors.ts @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import axios from 'axios'; +import moment from 'moment'; + +const UP_MONITORS = 0; +const DOWN_MONITORS = 10; + +export const generateMonitors = async () => { + // eslint-disable-next-line no-console + console.log(`Generating ${UP_MONITORS} up monitors`); + for (let i = 0; i < UP_MONITORS; i++) { + await createMonitor(getHttpMonitor()); + } + + // eslint-disable-next-line no-console + console.log(`Generating ${DOWN_MONITORS} down monitors`); + for (let i = 0; i < DOWN_MONITORS; i++) { + await createMonitor(getHttpMonitor(true)); + } +}; + +const createMonitor = async (monitor: any) => { + await axios + .request({ + data: monitor, + method: 'post', + url: 'http://127.0.0.1:5601/test/api/synthetics/monitors', + auth: { username: 'elastic', password: 'jdpAyka8HBiq81dFAIB86Nkp' }, + headers: { 'kbn-xsrf': 'true', 'elastic-api-version': '2023-10-31' }, + }) + .catch((error) => { + // eslint-disable-next-line no-console + console.error(error); + }); +}; + +const getHttpMonitor = (isDown?: boolean) => { + return { + type: 'http', + form_monitor_type: 'http', + enabled: true, + alert: { status: { enabled: true }, tls: { enabled: true } }, + schedule: { number: '3', unit: 'm' }, + 'service.name': '', + config_id: '', + tags: [], + timeout: '16', + name: 'Monitor at ' + moment().format('LTS'), + locations: [ + { id: 'us_central_staging', label: 'US Central Staging', isServiceManaged: true }, + { id: 'us_central', label: 'North America - US Central', isServiceManaged: true }, + { id: 'us_central_qa', label: 'US Central QA', isServiceManaged: true }, + ], + namespace: 'default', + origin: 'ui', + journey_id: '', + hash: '', + id: '', + params: '', + max_attempts: 2, + revision: 1, + __ui: { is_tls_enabled: false }, + urls: 'https://www.google.com', + max_redirects: '0', + 'url.port': null, + password: '', + proxy_url: '', + proxy_headers: {}, + 'check.response.body.negative': [], + 'check.response.body.positive': isDown ? ["i don't exist"] : [], + 'check.response.json': [], + 'response.include_body': 'on_error', + 'check.response.headers': {}, + 'response.include_headers': true, + 'check.response.status': [], + 'check.request.body': { type: 'text', value: '' }, + 'check.request.headers': {}, + 'check.request.method': 'GET', + username: '', + mode: 'any', + 'response.include_body_max_bytes': '1024', + ipv4: true, + ipv6: true, + 'ssl.certificate_authorities': '', + 'ssl.certificate': '', + 'ssl.key': '', + 'ssl.key_passphrase': '', + 'ssl.verification_mode': 'full', + 'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], + }; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.test.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.test.ts index 787d35c99b675..34f3be6128a3f 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.test.ts @@ -13,6 +13,9 @@ import { } from '../../common/runtime_types/alert_rules/common'; const dateFormat = 'MMM D, YYYY @ HH:mm:ss.SSS'; +const monitorName = 'test-monitor'; +const monitorId = '12345'; +const configId = '56789'; describe('updateState', () => { let spy: jest.SpyInstance; @@ -190,7 +193,6 @@ describe('updateState', () => { describe('setRecoveredAlertsContext', () => { const alertUuid = 'alert-id'; const location = 'us_west'; - const configId = '12345'; const idWithLocation = `${configId}-${location}`; const basePath = { publicBaseUrl: 'https://localhost:5601', @@ -210,10 +212,19 @@ describe('setRecoveredAlertsContext', () => { }, }, monitor: { - name: 'test-monitor', + name: monitorName, + }, + observer: { + geo: { + name: location, + }, }, } as StaleDownConfig['ping'], timestamp: new Date().toISOString(), + checks: { + downWithinXChecks: 1, + down: 0, + }, }, }; @@ -227,20 +238,23 @@ describe('setRecoveredAlertsContext', () => { alert: { getUuid: () => alertUuid, getId: () => idWithLocation, - getState: () => ({}), + getState: () => ({ + downThreshold: 1, + }), setContext: jest.fn(), }, hit: { 'kibana.alert.instance.id': idWithLocation, 'location.id': location, configId, + downThreshold: 1, }, }, ]), setAlertData: jest.fn(), isTrackedAlert: jest.fn(), }; - const staleDownConfigs: Record = { + const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = { [idWithLocation]: { configId, monitorQueryId: 'stale-config', @@ -252,11 +266,20 @@ describe('setRecoveredAlertsContext', () => { id: '123456', }, monitor: { - name: 'test-monitor', + name: monitorName, + }, + observer: { + geo: { + name: location, + }, }, } as StaleDownConfig['ping'], timestamp: new Date().toISOString(), isDeleted: true, + checks: { + downWithinXChecks: 1, + down: 1, + }, }, }; setRecoveredAlertsContext({ @@ -267,26 +290,30 @@ describe('setRecoveredAlertsContext', () => { upConfigs: {}, dateFormat, tz: 'UTC', + groupByLocation: true, }); expect(alertsClientMock.setAlertData).toBeCalledWith({ id: idWithLocation, context: { checkedAt: 'Feb 26, 2023 @ 00:00:00.000', - configId: '12345', + configId, linkMessage: '', alertDetailsUrl: 'https://localhost:5601/app/observability/alerts/alert-id', - monitorName: 'test-monitor', - recoveryReason: 'the monitor has been deleted', - 'kibana.alert.reason': 'the monitor has been deleted', + monitorName, + recoveryReason: 'has been deleted', recoveryStatus: 'has been deleted', monitorUrl: '(unavailable)', monitorUrlLabel: 'URL', reason: - 'Monitor "test-monitor" from Unnamed-location is recovered. Checked at February 25, 2023 7:00 PM.', + 'Monitor "test-monitor" from us_west is recovered. Alert when 1 out of the last 1 checks are down from at least 1 location.', stateId: '123456', status: 'recovered', locationId: location, + locationNames: location, + locationName: location, idWithLocation, + timestamp: '2023-02-26T00:00:00.000Z', + downThreshold: 1, }, }); }); @@ -301,7 +328,9 @@ describe('setRecoveredAlertsContext', () => { alert: { getUuid: () => alertUuid, getId: () => idWithLocation, - getState: () => ({}), + getState: () => ({ + downThreshold: 1, + }), setContext: jest.fn(), }, hit: { @@ -314,7 +343,7 @@ describe('setRecoveredAlertsContext', () => { setAlertData: jest.fn(), isTrackedAlert: jest.fn(), }; - const staleDownConfigs: Record = { + const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = { [idWithLocation]: { configId, monitorQueryId: 'stale-config', @@ -328,9 +357,18 @@ describe('setRecoveredAlertsContext', () => { monitor: { name: 'test-monitor', }, + observer: { + geo: { + name: 'us_west', + }, + }, } as StaleDownConfig['ping'], timestamp: new Date().toISOString(), isLocationRemoved: true, + checks: { + downWithinXChecks: 1, + down: 1, + }, }, }; setRecoveredAlertsContext({ @@ -341,26 +379,30 @@ describe('setRecoveredAlertsContext', () => { upConfigs: {}, dateFormat, tz: 'UTC', + groupByLocation: true, }); expect(alertsClientMock.setAlertData).toBeCalledWith({ id: idWithLocation, context: { - configId: '12345', + configId, checkedAt: 'Feb 26, 2023 @ 00:00:00.000', monitorUrl: '(unavailable)', - reason: - 'Monitor "test-monitor" from Unnamed-location is recovered. Checked at February 25, 2023 7:00 PM.', + idWithLocation, linkMessage: '', alertDetailsUrl: 'https://localhost:5601/app/observability/alerts/alert-id', - monitorName: 'test-monitor', + monitorName, recoveryReason: 'this location has been removed from the monitor', - 'kibana.alert.reason': 'this location has been removed from the monitor', recoveryStatus: 'has recovered', stateId: '123456', status: 'recovered', monitorUrlLabel: 'URL', - idWithLocation, + timestamp: '2023-02-26T00:00:00.000Z', + locationName: location, + locationNames: location, + reason: + 'Monitor "test-monitor" from us_west is recovered. Alert when 1 out of the last 1 checks are down from at least 1 location.', locationId: location, + downThreshold: 1, }, }); }); @@ -375,7 +417,9 @@ describe('setRecoveredAlertsContext', () => { alert: { getId: () => idWithLocation, getUuid: () => alertUuid, - getState: () => ({}), + getState: () => ({ + downThreshold: 1, + }), setContext: jest.fn(), }, hit: { @@ -388,7 +432,7 @@ describe('setRecoveredAlertsContext', () => { setAlertData: jest.fn(), isTrackedAlert: jest.fn(), }; - const staleDownConfigs: Record = { + const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = { [idWithLocation]: { configId, monitorQueryId: 'stale-config', @@ -405,6 +449,10 @@ describe('setRecoveredAlertsContext', () => { } as StaleDownConfig['ping'], timestamp: new Date().toISOString(), isLocationRemoved: true, + checks: { + downWithinXChecks: 1, + down: 1, + }, }, }; setRecoveredAlertsContext({ @@ -415,6 +463,7 @@ describe('setRecoveredAlertsContext', () => { upConfigs, dateFormat, tz: 'UTC', + groupByLocation: true, }); expect(alertsClientMock.setAlertData).toBeCalledWith({ id: idWithLocation, @@ -422,22 +471,250 @@ describe('setRecoveredAlertsContext', () => { configId, idWithLocation, alertDetailsUrl: 'https://localhost:5601/app/observability/alerts/alert-id', - monitorName: 'test-monitor', + monitorName, status: 'up', recoveryReason: 'the monitor is now up again. It ran successfully at Feb 26, 2023 @ 00:00:00.000', - 'kibana.alert.reason': - 'the monitor is now up again. It ran successfully at Feb 26, 2023 @ 00:00:00.000', recoveryStatus: 'is now up', locationId: location, + locationNames: location, + locationName: location, checkedAt: 'Feb 26, 2023 @ 00:00:00.000', - linkMessage: - '- Link: https://localhost:5601/app/synthetics/monitor/12345/errors/123456?locationId=us_west', + linkMessage: `- Link: https://localhost:5601/app/synthetics/monitor/${configId}/errors/123456?locationId=us_west`, + monitorUrl: '(unavailable)', + monitorUrlLabel: 'URL', + reason: + 'Monitor "test-monitor" from us_west is recovered. Alert when 1 out of the last 1 checks are down from at least 1 location.', + timestamp: '2023-02-26T00:00:00.000Z', + downThreshold: 1, + stateId: '123456', + }, + }); + }); + + it('sets the correct default recovery summary', () => { + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(10), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn().mockReturnValue([ + { + alert: { + getId: () => idWithLocation, + getUuid: () => alertUuid, + getState: () => ({ + downThreshold: 1, + }), + setContext: jest.fn(), + }, + hit: { + 'kibana.alert.instance.id': idWithLocation, + 'location.id': location, + 'monitor.name': monitorName, + 'monitor.id': monitorId, + '@timestamp': new Date().toISOString(), + 'agent.name': 'test-host', + 'observer.geo.name': 'Unnamed-location', + 'observer.name.keyword': 'Unnamed-location-id', + 'monitor.type': 'HTTP', + 'error.message': 'test-error-message', + configId, + }, + }, + ]), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), + }; + const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = {}; + setRecoveredAlertsContext({ + alertsClient: alertsClientMock, + basePath, + spaceId: 'default', + staleDownConfigs, + upConfigs: {}, + dateFormat, + tz: 'UTC', + groupByLocation: true, + }); + expect(alertsClientMock.setAlertData).toBeCalledWith({ + id: idWithLocation, + context: { + configId, + idWithLocation, + alertDetailsUrl: 'https://localhost:5601/app/observability/alerts/alert-id', + monitorName, + monitorId, + status: 'recovered', + recoveryReason: 'the alert condition is no longer met', + recoveryStatus: 'has recovered', + locationId: location, + checkedAt: 'Feb 26, 2023 @ 00:00:00.000', + linkMessage: '', monitorUrl: '(unavailable)', monitorUrlLabel: 'URL', reason: - 'Monitor "test-monitor" from Unnamed-location is recovered. Checked at February 25, 2023 7:00 PM.', - stateId: null, + 'Monitor "test-monitor" from Unnamed-location is recovered. Alert when 1 out of the last 1 checks are down from at least 1 location.', + timestamp: '2023-02-26T00:00:00.000Z', + downThreshold: 1, + locationNames: 'Unnamed-location', + locationName: 'Unnamed-location', + lastErrorMessage: 'test-error-message', + monitorType: 'HTTP', + hostName: 'test-host', + }, + }); + }); + + it('sets the recovery summary for recovered custom alerts', () => { + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(10), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn().mockReturnValue([ + { + alert: { + getId: () => idWithLocation, + getUuid: () => alertUuid, + getState: () => ({ + downThreshold: 1, + configId, + }), + setContext: jest.fn(), + }, + hit: { + 'kibana.alert.instance.id': idWithLocation, + 'location.id': ['us_central', 'us_west'], + 'monitor.name': monitorName, + 'monitor.id': monitorId, + 'monitor.type': 'HTTP', + 'monitor.state.id': '123456', + '@timestamp': new Date().toISOString(), + 'observer.geo.name': ['us-central', 'us-east'], + 'error.message': 'test-error-message', + 'url.full': 'http://test_url.com', + configId, + 'agent.name': 'test-agent', + }, + }, + ]), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), + }; + const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = {}; + setRecoveredAlertsContext({ + alertsClient: alertsClientMock, + basePath, + spaceId: 'default', + staleDownConfigs, + upConfigs: {}, + dateFormat, + tz: 'UTC', + groupByLocation: true, + }); + expect(alertsClientMock.setAlertData).toBeCalledWith({ + id: idWithLocation, + context: { + configId, + idWithLocation, + alertDetailsUrl: 'https://localhost:5601/app/observability/alerts/alert-id', + monitorName, + monitorId, + status: 'recovered', + recoveryReason: 'the alert condition is no longer met', + recoveryStatus: 'has recovered', + locationId: 'us_central and us_west', + checkedAt: 'Feb 26, 2023 @ 00:00:00.000', + linkMessage: + '- Link: https://localhost:5601/app/synthetics/monitor/56789/errors/123456?locationId=us_central', + monitorUrl: 'http://test_url.com', + hostName: 'test-agent', + monitorUrlLabel: 'URL', + reason: + 'Monitor "test-monitor" from us-central and us-east is recovered. Alert when 1 out of the last 1 checks are down from at least 1 location.', + stateId: '123456', + timestamp: '2023-02-26T00:00:00.000Z', + downThreshold: 1, + locationNames: 'us-central and us-east', + locationName: 'us-central and us-east', + monitorType: 'HTTP', + lastErrorMessage: 'test-error-message', + }, + }); + }); + + it('handles ungrouped recoveries', () => { + const alertsClientMock = { + report: jest.fn(), + getAlertLimitValue: jest.fn().mockReturnValue(10), + setAlertLimitReached: jest.fn(), + getRecoveredAlerts: jest.fn().mockReturnValue([ + { + alert: { + getId: () => idWithLocation, + getUuid: () => alertUuid, + getState: () => ({ + downThreshold: 1, + configId, + }), + setContext: jest.fn(), + }, + hit: { + 'kibana.alert.instance.id': idWithLocation, + 'location.id': location, + 'monitor.name': monitorName, + 'monitor.type': 'HTTP', + 'monitor.id': monitorId, + 'agent.name': 'test-agent', + '@timestamp': new Date().toISOString(), + 'observer.geo.name': ['us-central', 'us-east'], + 'error.message': 'test-error-message', + 'url.full': 'http://test_url.com', + 'monitor.state.id': '123456', + configId, + }, + }, + ]), + setAlertData: jest.fn(), + isTrackedAlert: jest.fn(), + }; + const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = {}; + setRecoveredAlertsContext({ + alertsClient: alertsClientMock, + basePath, + spaceId: 'default', + staleDownConfigs, + upConfigs: {}, + dateFormat, + tz: 'UTC', + groupByLocation: false, + }); + expect(alertsClientMock.setAlertData).toBeCalledWith({ + id: idWithLocation, + context: { + configId, + idWithLocation, + alertDetailsUrl: 'https://localhost:5601/app/observability/alerts/alert-id', + monitorName, + monitorId, + status: 'recovered', + recoveryReason: 'the alert condition is no longer met', + recoveryStatus: 'has recovered', + locationId: location, + checkedAt: 'Feb 26, 2023 @ 00:00:00.000', + linkMessage: + '- Link: https://localhost:5601/app/synthetics/monitor/56789/errors/123456?locationId=us_west', + monitorUrl: 'http://test_url.com', + hostName: 'test-agent', + monitorUrlLabel: 'URL', + reason: + 'Monitor "test-monitor" from us-central and us-east is recovered. Alert when 1 out of the last 1 checks are down from at least 1 location.', + stateId: '123456', + timestamp: '2023-02-26T00:00:00.000Z', + downThreshold: 1, + locationNames: 'us-central and us-east', + locationName: 'us-central and us-east', + monitorType: 'HTTP', + lastErrorMessage: 'test-error-message', }, }); }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.ts index 18ade57662ed3..c1bf18e18e90b 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.ts @@ -4,24 +4,26 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import moment, { Moment } from 'moment'; +import moment from 'moment'; import { isRight } from 'fp-ts/lib/Either'; import Mustache from 'mustache'; import { IBasePath } from '@kbn/core/server'; import { - IRuleTypeAlerts, ActionGroupIdsOf, AlertInstanceContext as AlertContext, AlertInstanceState as AlertState, + IRuleTypeAlerts, } from '@kbn/alerting-plugin/server'; import { getAlertDetailsUrl } from '@kbn/observability-plugin/common'; import { addSpaceIdToPath } from '@kbn/spaces-plugin/common'; import { i18n } from '@kbn/i18n'; import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; -import { legacyExperimentalFieldMap, ObservabilityUptimeAlert } from '@kbn/alerts-as-data-utils'; -import { PublicAlertsClient } from '@kbn/alerting-plugin/server/alerts_client/types'; -import { ALERT_REASON } from '@kbn/rule-data-utils'; +import { legacyExperimentalFieldMap } from '@kbn/alerts-as-data-utils'; +import { + PublicAlertsClient, + RecoveredAlertData, +} from '@kbn/alerting-plugin/server/alerts_client/types'; +import { StatusRuleParams, TimeWindow } from '../../common/rules/status_rule'; import { syntheticsRuleFieldMap } from '../../common/rules/synthetics_rule_field_map'; import { combineFiltersAndUserSearch, stringifyKueries } from '../../common/lib'; import { @@ -29,17 +31,18 @@ import { SYNTHETICS_RULE_TYPES_ALERT_CONTEXT, } from '../../common/constants/synthetics_alerts'; import { getUptimeIndexPattern, IndexPatternTitleAndFields } from '../queries/get_index_pattern'; -import { StatusCheckFilters } from '../../common/runtime_types'; +import { OverviewPing, StatusCheckFilters } from '../../common/runtime_types'; import { SyntheticsEsClient } from '../lib'; import { getMonitorSummary } from './status_rule/message_utils'; import { AlertOverviewStatus, SyntheticsCommonState, SyntheticsCommonStateCodec, + SyntheticsMonitorStatusAlertState, } from '../../common/runtime_types/alert_rules/common'; import { getSyntheticsErrorRouteFromMonitorId } from '../../common/utils/get_synthetics_monitor_url'; import { ALERT_DETAILS_URL, RECOVERY_REASON } from './action_variables'; -import type { MonitorSummaryStatusRule } from './status_rule/types'; +import type { MonitorStatusAlertDocument, MonitorSummaryStatusRule } from './status_rule/types'; export const updateState = ( state: SyntheticsCommonState, @@ -124,70 +127,58 @@ export const getRelativeViewInAppUrl = ({ stateId: string; locationId: string; }) => { - const relativeViewInAppUrl = getSyntheticsErrorRouteFromMonitorId({ + return getSyntheticsErrorRouteFromMonitorId({ configId, stateId, locationId, }); - - return relativeViewInAppUrl; -}; - -export const getErrorDuration = (startedAt: Moment, endsAt: Moment) => { - const diffInDays = endsAt.diff(startedAt, 'days'); - if (diffInDays > 1) { - return i18n.translate('xpack.synthetics.errorDetails.errorDuration.days', { - defaultMessage: '{value} days', - values: { value: diffInDays }, - }); - } - const diffInHours = endsAt.diff(startedAt, 'hours'); - if (diffInHours > 1) { - return i18n.translate('xpack.synthetics.errorDetails.errorDuration.hours', { - defaultMessage: '{value} hours', - values: { value: diffInHours }, - }); - } - const diffInMinutes = endsAt.diff(startedAt, 'minutes'); - return i18n.translate('xpack.synthetics.errorDetails.errorDuration.mins', { - defaultMessage: '{value} mins', - values: { value: diffInMinutes }, - }); }; export const setRecoveredAlertsContext = ({ alertsClient, basePath, spaceId, - staleDownConfigs, + staleDownConfigs = {}, upConfigs, dateFormat, tz, + params, + groupByLocation, }: { alertsClient: PublicAlertsClient< - ObservabilityUptimeAlert, - AlertState, + MonitorStatusAlertDocument, + SyntheticsMonitorStatusAlertState, AlertContext, ActionGroupIdsOf >; basePath?: IBasePath; spaceId?: string; + params?: StatusRuleParams; staleDownConfigs: AlertOverviewStatus['staleDownConfigs']; upConfigs: AlertOverviewStatus['upConfigs']; dateFormat: string; tz: string; + groupByLocation: boolean; }) => { const recoveredAlerts = alertsClient.getRecoveredAlerts() ?? []; for (const recoveredAlert of recoveredAlerts) { const recoveredAlertId = recoveredAlert.alert.getId(); const alertUuid = recoveredAlert.alert.getUuid(); - - const state = recoveredAlert.alert.getState(); const alertHit = recoveredAlert.hit; - const locationId = alertHit?.['location.id']; + const alertState = recoveredAlert.alert.getState(); const configId = alertHit?.configId; + const locationIds = alertHit?.['location.id'] ? [alertHit?.['location.id']].flat() : []; + const locationName = alertHit?.['observer.geo.name'] + ? [alertHit?.['observer.geo.name']].flat() + : []; + let syntheticsStateId = alertHit?.['monitor.state.id']; - let recoveryReason = ''; + let recoveryReason = i18n.translate( + 'xpack.synthetics.alerts.monitorStatus.defaultRecovery.reason', + { + defaultMessage: `the alert condition is no longer met`, + } + ); let recoveryStatus = i18n.translate( 'xpack.synthetics.alerts.monitorStatus.defaultRecovery.status', { @@ -195,107 +186,94 @@ export const setRecoveredAlertsContext = ({ } ); let isUp = false; - let linkMessage = ''; - let monitorSummary: MonitorSummaryStatusRule | null = null; - let lastErrorMessage; - - if (recoveredAlertId && locationId && staleDownConfigs[recoveredAlertId]) { - const downConfig = staleDownConfigs[recoveredAlertId]; - const { ping } = downConfig; - monitorSummary = getMonitorSummary( - ping, - RECOVERED_LABEL, - locationId, - downConfig.configId, + let linkMessage = getDefaultLinkMessage({ + basePath, + spaceId, + syntheticsStateId, + configId, + locationId: locationIds[0], + }); + let monitorSummary: MonitorSummaryStatusRule | undefined = getDefaultRecoveredSummary({ + recoveredAlert, + tz, + dateFormat, + params, + }); + let lastErrorMessage = alertHit?.['error.message']; + + if (!groupByLocation && monitorSummary) { + const formattedLocationNames = locationName.join(` ${AND_LABEL} `); + const formattedLocationIds = locationIds.join(` ${AND_LABEL} `); + monitorSummary.locationNames = formattedLocationNames; + monitorSummary.locationName = formattedLocationNames; + monitorSummary.locationId = formattedLocationIds; + } + + if (recoveredAlertId && locationIds && staleDownConfigs[recoveredAlertId]) { + const summary = getDeletedMonitorOrLocationSummary({ + staleDownConfigs, + recoveredAlertId, + locationIds, dateFormat, - tz - ); - lastErrorMessage = monitorSummary.lastErrorMessage; - - if (downConfig.isDeleted) { - recoveryStatus = i18n.translate( - 'xpack.synthetics.alerts.monitorStatus.deleteMonitor.status', - { - defaultMessage: `has been deleted`, - } - ); - recoveryReason = i18n.translate( - 'xpack.synthetics.alerts.monitorStatus.deleteMonitor.reason', - { - defaultMessage: `the monitor has been deleted`, - } - ); - } else if (downConfig.isLocationRemoved) { - recoveryStatus = i18n.translate( - 'xpack.synthetics.alerts.monitorStatus.removedLocation.status', - { - defaultMessage: `has recovered`, - } - ); - recoveryReason = i18n.translate( - 'xpack.synthetics.alerts.monitorStatus.removedLocation.reason', - { - defaultMessage: `this location has been removed from the monitor`, - } - ); + tz, + params, + }); + if (summary) { + monitorSummary = { + ...monitorSummary, + ...summary.monitorSummary, + }; + recoveryStatus = summary.recoveryStatus; + recoveryReason = summary.recoveryReason; + lastErrorMessage = summary.lastErrorMessage; + syntheticsStateId = summary.stateId ? summary.stateId : syntheticsStateId; } + // Cannot display link message for deleted monitors or deleted locations + linkMessage = ''; } - if (configId && recoveredAlertId && locationId && upConfigs[recoveredAlertId]) { - // pull the last error from state, since it is not available on the up ping - lastErrorMessage = alertHit?.['error.message']; - - const upConfig = upConfigs[recoveredAlertId]; - isUp = Boolean(upConfig) || false; - const ping = upConfig.ping; - - monitorSummary = getMonitorSummary( - ping, - RECOVERED_LABEL, - locationId, + if (configId && recoveredAlertId && locationIds && upConfigs[recoveredAlertId]) { + const summary = getUpMonitorRecoverySummary({ + upConfigs, + recoveredAlertId, + alertHit, + locationIds, configId, + basePath, + spaceId, dateFormat, - tz - ); - - // When alert is flapping, the stateId is not available on ping.state.ends.id, use state instead - const stateId = ping.state?.ends?.id || state.stateId; - const upTimestamp = ping['@timestamp']; - const checkedAt = moment(upTimestamp).tz(tz).format(dateFormat); - recoveryStatus = i18n.translate('xpack.synthetics.alerts.monitorStatus.upCheck.status', { - defaultMessage: `is now up`, + tz, + params, }); - recoveryReason = i18n.translate( - 'xpack.synthetics.alerts.monitorStatus.upCheck.reasonWithoutDuration', - { - defaultMessage: `the monitor is now up again. It ran successfully at {checkedAt}`, - values: { - checkedAt, - }, - } - ); - - if (basePath && spaceId && stateId) { - const relativeViewInAppUrl = getRelativeViewInAppUrl({ - configId, - locationId, - stateId, - }); - linkMessage = getFullViewInAppMessage(basePath, spaceId, relativeViewInAppUrl); + if (summary) { + monitorSummary = { + ...monitorSummary, + ...summary.monitorSummary, + }; + recoveryStatus = summary.recoveryStatus; + recoveryReason = summary.recoveryReason; + isUp = summary.isUp; + lastErrorMessage = summary.lastErrorMessage; + linkMessage = summary.linkMessage ? summary.linkMessage : linkMessage; + syntheticsStateId = summary.stateId ? summary.stateId : syntheticsStateId; } } const context = { - ...state, + ...alertState, ...(monitorSummary ? monitorSummary : {}), - locationId, + locationId: locationIds.join(` ${AND_LABEL} `), idWithLocation: recoveredAlertId, lastErrorMessage, recoveryStatus, linkMessage, + stateId: syntheticsStateId, ...(isUp ? { status: 'up' } : {}), - ...(recoveryReason ? { [RECOVERY_REASON]: recoveryReason } : {}), - ...(recoveryReason ? { [ALERT_REASON]: recoveryReason } : {}), + ...(recoveryReason + ? { + [RECOVERY_REASON]: recoveryReason, + } + : {}), ...(basePath && spaceId && alertUuid ? { [ALERT_DETAILS_URL]: getAlertDetailsUrl(basePath, spaceId, alertUuid) } : {}), @@ -304,6 +282,220 @@ export const setRecoveredAlertsContext = ({ } }; +export const getDefaultLinkMessage = ({ + basePath, + spaceId, + syntheticsStateId, + configId, + locationId, +}: { + basePath?: IBasePath; + spaceId?: string; + syntheticsStateId?: string; + configId?: string; + locationId?: string; +}) => { + if (basePath && spaceId && syntheticsStateId && configId && locationId) { + const relativeViewInAppUrl = getRelativeViewInAppUrl({ + configId, + locationId, + stateId: syntheticsStateId, + }); + return getFullViewInAppMessage(basePath, spaceId, relativeViewInAppUrl); + } else { + return ''; + } +}; + +export const getDefaultRecoveredSummary = ({ + recoveredAlert, + tz, + dateFormat, + params, +}: { + recoveredAlert: RecoveredAlertData< + MonitorStatusAlertDocument, + AlertState, + AlertContext, + ActionGroupIdsOf + >; + tz: string; + dateFormat: string; + params?: StatusRuleParams; +}) => { + if (!recoveredAlert.hit) return; // TODO: handle this case + const hit = recoveredAlert.hit; + const locationId = hit['location.id']; + const configId = hit.configId; + return getMonitorSummary({ + monitorInfo: { + monitor: { + id: hit['monitor.id'], + name: hit['monitor.name'], + type: hit['monitor.type'], + }, + config_id: configId, + observer: { + geo: { + name: hit['observer.geo.name'] || hit['location.name'], + }, + name: locationId, + }, + agent: { + name: hit['agent.name'] || '', + }, + '@timestamp': String(hit['@timestamp']), + ...(hit['error.message'] ? { error: { message: hit['error.message'] } } : {}), + ...(hit['url.full'] ? { url: { full: hit['url.full'] } } : {}), + } as unknown as OverviewPing, + statusMessage: RECOVERED_LABEL, + locationId, + configId, + dateFormat, + tz, + params, + }); +}; + +export const getDeletedMonitorOrLocationSummary = ({ + staleDownConfigs, + recoveredAlertId, + locationIds, + dateFormat, + tz, + params, +}: { + staleDownConfigs: AlertOverviewStatus['staleDownConfigs']; + recoveredAlertId: string; + locationIds: string[]; + dateFormat: string; + tz: string; + params?: StatusRuleParams; +}) => { + const downConfig = staleDownConfigs[recoveredAlertId]; + const { ping } = downConfig; + const monitorSummary = getMonitorSummary({ + monitorInfo: ping, + statusMessage: RECOVERED_LABEL, + locationId: locationIds, + configId: downConfig.configId, + dateFormat, + tz, + params, + }); + const lastErrorMessage = monitorSummary.lastErrorMessage; + + if (downConfig.isDeleted) { + return { + lastErrorMessage, + monitorSummary, + stateId: ping.state?.id, + recoveryStatus: i18n.translate('xpack.synthetics.alerts.monitorStatus.deleteMonitor.status', { + defaultMessage: `has been deleted`, + }), + recoveryReason: i18n.translate('xpack.synthetics.alerts.monitorStatus.deleteMonitor.status', { + defaultMessage: `has been deleted`, + }), + }; + } else if (downConfig.isLocationRemoved) { + return { + monitorSummary, + lastErrorMessage, + stateId: ping.state?.id, + recoveryStatus: i18n.translate( + 'xpack.synthetics.alerts.monitorStatus.removedLocation.status', + { + defaultMessage: `has recovered`, + } + ), + recoveryReason: i18n.translate( + 'xpack.synthetics.alerts.monitorStatus.removedLocation.reason', + { + defaultMessage: `this location has been removed from the monitor`, + } + ), + }; + } +}; + +export const getUpMonitorRecoverySummary = ({ + upConfigs, + recoveredAlertId, + alertHit, + locationIds, + configId, + basePath, + spaceId, + dateFormat, + tz, + params, +}: { + upConfigs: AlertOverviewStatus['upConfigs']; + recoveredAlertId: string; + alertHit: any; + locationIds: string[]; + configId: string; + basePath?: IBasePath; + spaceId?: string; + dateFormat: string; + tz: string; + params?: StatusRuleParams; +}) => { + // pull the last error from state, since it is not available on the up ping + const lastErrorMessage = alertHit?.['error.message']; + let linkMessage = ''; + + const upConfig = upConfigs[recoveredAlertId]; + const isUp = Boolean(upConfig) || false; + const ping = upConfig.ping; + + const monitorSummary = getMonitorSummary({ + monitorInfo: ping, + statusMessage: RECOVERED_LABEL, + locationId: locationIds, + configId, + dateFormat, + tz, + params, + }); + + // When alert is flapping, the stateId is not available on ping.state.ends.id, use state instead + const stateId = ping.state?.ends?.id; + const upTimestamp = ping['@timestamp']; + const checkedAt = moment(upTimestamp).tz(tz).format(dateFormat); + const recoveryStatus = i18n.translate('xpack.synthetics.alerts.monitorStatus.upCheck.status', { + defaultMessage: `is now up`, + }); + const recoveryReason = i18n.translate( + 'xpack.synthetics.alerts.monitorStatus.upCheck.reasonWithoutDuration', + { + defaultMessage: `the monitor is now up again. It ran successfully at {checkedAt}`, + values: { + checkedAt, + }, + } + ); + + if (basePath && spaceId && stateId) { + const relativeViewInAppUrl = getRelativeViewInAppUrl({ + configId, + locationId: locationIds[0], + stateId, + }); + linkMessage = getFullViewInAppMessage(basePath, spaceId, relativeViewInAppUrl); + } + + return { + monitorSummary, + lastErrorMessage, + recoveryStatus, + recoveryReason, + isUp, + linkMessage, + stateId, + }; +}; + export const RECOVERED_LABEL = i18n.translate('xpack.synthetics.monitorStatus.recoveredLabel', { defaultMessage: 'recovered', }); @@ -355,9 +547,39 @@ export const syntheticsRuleTypeFieldMap = { ...legacyExperimentalFieldMap, }; -export const SyntheticsRuleTypeAlertDefinition: IRuleTypeAlerts = { +export const SyntheticsRuleTypeAlertDefinition: IRuleTypeAlerts = { context: SYNTHETICS_RULE_TYPES_ALERT_CONTEXT, mappings: { fieldMap: syntheticsRuleTypeFieldMap }, useLegacyAlerts: true, shouldWrite: true, }; + +export function getTimeUnitLabel(timeWindow: TimeWindow) { + const { size: timeValue = 1, unit: timeUnit } = timeWindow; + switch (timeUnit) { + case 's': + return i18n.translate('xpack.synthetics.timeUnits.secondLabel', { + defaultMessage: '{timeValue, plural, one {second} other {seconds}}', + values: { timeValue }, + }); + case 'm': + return i18n.translate('xpack.synthetics.timeUnits.minuteLabel', { + defaultMessage: '{timeValue, plural, one {minute} other {minutes}}', + values: { timeValue }, + }); + case 'h': + return i18n.translate('xpack.synthetics.timeUnits.hourLabel', { + defaultMessage: '{timeValue, plural, one {hour} other {hours}}', + values: { timeValue }, + }); + case 'd': + return i18n.translate('xpack.synthetics.timeUnits.dayLabel', { + defaultMessage: '{timeValue, plural, one {day} other {days}}', + values: { timeValue }, + }); + } +} + +export const AND_LABEL = i18n.translate('xpack.synthetics.alerts.monitorStatus.andLabel', { + defaultMessage: 'and', +}); diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/message_utils.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/message_utils.ts index 22b15b5cdefd0..a0a14ddaebfed 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/message_utils.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/message_utils.ts @@ -8,6 +8,9 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; import { ALERT_REASON } from '@kbn/rule-data-utils'; +import { AlertStatusMetaData } from '../../../common/runtime_types/alert_rules/common'; +import { getConditionType, StatusRuleParams } from '../../../common/rules/status_rule'; +import { AND_LABEL, getTimeUnitLabel } from '../common'; import { ALERT_REASON_MSG } from '../action_variables'; import { MonitorSummaryStatusRule } from './types'; import { @@ -15,6 +18,7 @@ import { MONITOR_TYPE, MONITOR_NAME, OBSERVER_GEO_NAME, + OBSERVER_NAME, URL_FULL, ERROR_MESSAGE, AGENT_NAME, @@ -23,33 +27,64 @@ import { import { OverviewPing } from '../../../common/runtime_types'; import { UNNAMED_LOCATION } from '../../../common/constants'; -export const getMonitorAlertDocument = (monitorSummary: MonitorSummaryStatusRule) => ({ +export const getMonitorAlertDocument = ( + monitorSummary: MonitorSummaryStatusRule, + locationNames: string[], + locationIds: string[], + useLatestChecks: boolean +) => ({ [MONITOR_ID]: monitorSummary.monitorId, [MONITOR_TYPE]: monitorSummary.monitorType, [MONITOR_NAME]: monitorSummary.monitorName, [URL_FULL]: monitorSummary.monitorUrl, - [OBSERVER_GEO_NAME]: monitorSummary.locationName, + [OBSERVER_GEO_NAME]: locationNames, + [OBSERVER_NAME]: locationIds, [ERROR_MESSAGE]: monitorSummary.lastErrorMessage, [AGENT_NAME]: monitorSummary.hostName, [ALERT_REASON]: monitorSummary.reason, [STATE_ID]: monitorSummary.stateId, - 'location.id': monitorSummary.locationId, - 'location.name': monitorSummary.locationName, + 'location.id': locationIds, + 'location.name': locationNames, configId: monitorSummary.configId, + 'kibana.alert.evaluation.threshold': monitorSummary.downThreshold, + 'kibana.alert.evaluation.value': + (useLatestChecks ? monitorSummary.checks?.downWithinXChecks : monitorSummary.checks?.down) ?? 1, 'monitor.tags': monitorSummary.monitorTags ?? [], }); -export const getMonitorSummary = ( - monitorInfo: OverviewPing, - statusMessage: string, - locationId: string, - configId: string, - dateFormat: string, - tz: string -): MonitorSummaryStatusRule => { - const monitorName = monitorInfo.monitor?.name ?? monitorInfo.monitor?.id; - const observerLocation = monitorInfo.observer?.geo?.name ?? UNNAMED_LOCATION; - const checkedAt = moment(monitorInfo['@timestamp']).tz(tz).format(dateFormat); +export interface MonitorSummaryData { + monitorInfo: OverviewPing; + statusMessage: string; + locationId: string[]; + configId: string; + dateFormat: string; + tz: string; + checks?: { + downWithinXChecks: number; + down: number; + }; + params?: StatusRuleParams; +} + +export const getMonitorSummary = ({ + monitorInfo, + locationId, + configId, + tz, + dateFormat, + statusMessage, + checks, + params, +}: MonitorSummaryData): MonitorSummaryStatusRule => { + const { downThreshold } = getConditionType(params?.condition); + const monitorName = monitorInfo?.monitor?.name ?? monitorInfo?.monitor?.id; + const locationName = monitorInfo?.observer?.geo?.name ?? UNNAMED_LOCATION; + const formattedLocationName = Array.isArray(locationName) + ? locationName.join(` ${AND_LABEL} `) + : locationName; + const checkedAt = moment(monitorInfo?.['@timestamp']) + .tz(tz || 'UTC') + .format(dateFormat); const typeToLabelMap: Record = { http: 'HTTP', tcp: 'TCP', @@ -65,11 +100,11 @@ export const getMonitorSummary = ( browser: 'URL', }; const monitorType = monitorInfo.monitor?.type; - const stateId = monitorInfo.state?.id || null; + const stateId = monitorInfo.state?.id; return { checkedAt, - locationId, + locationId: locationId?.join?.(` ${AND_LABEL} `) ?? '', configId, monitorUrl: monitorInfo.url?.full || UNAVAILABLE_LABEL, monitorUrlLabel: typeToUrlLabelMap[monitorType] || 'URL', @@ -77,40 +112,162 @@ export const getMonitorSummary = ( monitorName, monitorType: typeToLabelMap[monitorInfo.monitor?.type] || monitorInfo.monitor?.type, lastErrorMessage: monitorInfo.error?.message!, - locationName: monitorInfo.observer?.geo?.name!, + locationName: formattedLocationName, + locationNames: formattedLocationName, hostName: monitorInfo.agent?.name!, status: statusMessage, stateId, [ALERT_REASON_MSG]: getReasonMessage({ name: monitorName, - location: observerLocation, + location: formattedLocationName, status: statusMessage, - timestamp: monitorInfo['@timestamp'], + checks, + params, }), + checks, + downThreshold, + timestamp: monitorInfo['@timestamp'], monitorTags: monitorInfo.tags, }; }; +export const getUngroupedReasonMessage = ({ + statusConfigs, + monitorName, + params, + status = DOWN_LABEL, +}: { + statusConfigs: AlertStatusMetaData[]; + monitorName: string; + params: StatusRuleParams; + status?: string; + checks?: { + downWithinXChecks: number; + down: number; + }; +}) => { + const { useLatestChecks, numberOfChecks, timeWindow, downThreshold, locationsThreshold } = + getConditionType(params.condition); + + return i18n.translate( + 'xpack.synthetics.alertRules.monitorStatus.reasonMessage.location.ungrouped.multiple', + { + defaultMessage: `Monitor "{name}" is {status} {locationDetails}. Alert when down {threshold} {threshold, plural, one {time} other {times}} {condition} from at least {locationsThreshold} {locationsThreshold, plural, one {location} other {locations}}.`, + values: { + name: monitorName, + status, + threshold: downThreshold, + locationsThreshold, + condition: useLatestChecks + ? i18n.translate( + 'xpack.synthetics.alertRules.monitorStatus.reasonMessage.condition.latestChecks', + { + defaultMessage: 'out of the last {numberOfChecks} checks', + values: { numberOfChecks }, + } + ) + : i18n.translate( + 'xpack.synthetics.alertRules.monitorStatus.reasonMessage.condition.timeWindow', + { + defaultMessage: 'within the last {time} {unit}', + values: { + time: timeWindow.size, + unit: getTimeUnitLabel(timeWindow), + }, + } + ), + locationDetails: statusConfigs + .map((c) => { + return i18n.translate( + 'xpack.synthetics.alertRules.monitorStatus.reasonMessage.locationDetails', + { + defaultMessage: + '{downCount} {downCount, plural, one {time} other {times}} from {locName}', + values: { + locName: c.ping.observer.geo?.name, + downCount: useLatestChecks ? c.checks?.downWithinXChecks : c.checks?.down, + }, + } + ); + }) + .join(` ${AND_LABEL} `), + }, + } + ); +}; + export const getReasonMessage = ({ name, status, location, - timestamp, + checks, + params, }: { name: string; location: string; status: string; - timestamp: string; + checks?: { + downWithinXChecks: number; + down: number; + }; + params?: StatusRuleParams; }) => { - const checkedAt = moment(timestamp).format('LLL'); + const { useTimeWindow, numberOfChecks, locationsThreshold, downThreshold } = getConditionType( + params?.condition + ); + if (useTimeWindow) { + return getReasonMessageForTimeWindow({ + name, + location, + status, + params, + }); + } + return i18n.translate('xpack.synthetics.alertRules.monitorStatus.reasonMessage.new', { + defaultMessage: `Monitor "{name}" from {location} is {status}. {checksSummary}Alert when {downThreshold} out of the last {numberOfChecks} checks are down from at least {locationsThreshold} {locationsThreshold, plural, one {location} other {locations}}.`, + values: { + name, + status, + location, + downThreshold, + locationsThreshold, + numberOfChecks, + checksSummary: checks + ? i18n.translate('xpack.synthetics.alertRules.monitorStatus.reasonMessage.checksSummary', { + defaultMessage: + 'Monitor is down {downChecks} {downChecks, plural, one {time} other {times}} within the last {numberOfChecks} checks. ', + values: { + downChecks: checks.downWithinXChecks, + numberOfChecks, + }, + }) + : '', + }, + }); +}; - return i18n.translate('xpack.synthetics.alertRules.monitorStatus.reasonMessage', { - defaultMessage: `Monitor "{name}" from {location} is {status}. Checked at {checkedAt}.`, +export const getReasonMessageForTimeWindow = ({ + name, + location, + status = DOWN_LABEL, + params, +}: { + name: string; + location: string; + status?: string; + params?: StatusRuleParams; +}) => { + const { timeWindow, locationsThreshold, downThreshold } = getConditionType(params?.condition); + return i18n.translate('xpack.synthetics.alertRules.monitorStatus.reasonMessage.timeBased', { + defaultMessage: `Monitor "{name}" from {location} is {status}. Alert when {downThreshold} checks are down within the last {size} {unitLabel} from at least {locationsThreshold} {locationsThreshold, plural, one {location} other {locations}}.`, values: { name, status, location, - checkedAt, + downThreshold, + unitLabel: getTimeUnitLabel(timeWindow), + locationsThreshold, + size: timeWindow.size, }, }); }; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/monitor_status_rule.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/monitor_status_rule.ts index a5d530f2ec53b..ff4516a861225 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/monitor_status_rule.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/monitor_status_rule.ts @@ -7,25 +7,15 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { isEmpty } from 'lodash'; -import { ActionGroupIdsOf } from '@kbn/alerting-plugin/common'; -import { - GetViewInAppRelativeUrlFnOpts, - AlertInstanceContext as AlertContext, - RuleExecutorOptions, - AlertsClientError, -} from '@kbn/alerting-plugin/server'; -import { getAlertDetailsUrl, observabilityPaths } from '@kbn/observability-plugin/common'; -import { ObservabilityUptimeAlert } from '@kbn/alerts-as-data-utils'; +import { GetViewInAppRelativeUrlFnOpts, AlertsClientError } from '@kbn/alerting-plugin/server'; +import { observabilityPaths } from '@kbn/observability-plugin/common'; +import apm from 'elastic-apm-node'; +import { AlertOverviewStatus } from '../../../common/runtime_types/alert_rules/common'; +import { StatusRuleExecutorOptions } from './types'; import { syntheticsRuleFieldMap } from '../../../common/rules/synthetics_rule_field_map'; import { SyntheticsPluginsSetupDependencies, SyntheticsServerSetup } from '../../types'; -import { DOWN_LABEL, getMonitorAlertDocument, getMonitorSummary } from './message_utils'; -import { - AlertOverviewStatus, - SyntheticsCommonState, - SyntheticsMonitorStatusAlertState, -} from '../../../common/runtime_types/alert_rules/common'; import { StatusRuleExecutor } from './status_rule_executor'; -import { StatusRulePramsSchema, StatusRuleParams } from '../../../common/rules/status_rule'; +import { StatusRulePramsSchema } from '../../../common/rules/status_rule'; import { MONITOR_STATUS, SYNTHETICS_ALERT_RULE_TYPES, @@ -33,22 +23,12 @@ import { import { setRecoveredAlertsContext, updateState, - getViewInAppUrl, - getRelativeViewInAppUrl, - getFullViewInAppMessage, SyntheticsRuleTypeAlertDefinition, } from '../common'; -import { ALERT_DETAILS_URL, getActionVariables, VIEW_IN_APP_URL } from '../action_variables'; +import { getActionVariables } from '../action_variables'; import { STATUS_RULE_NAME } from '../translations'; import { SyntheticsMonitorClient } from '../../synthetics_service/synthetics_monitor/synthetics_monitor_client'; -type MonitorStatusRuleTypeParams = StatusRuleParams; -type MonitorStatusActionGroups = ActionGroupIdsOf; -type MonitorStatusRuleTypeState = SyntheticsCommonState; -type MonitorStatusAlertState = SyntheticsMonitorStatusAlertState; -type MonitorStatusAlertContext = AlertContext; -type MonitorStatusAlert = ObservabilityUptimeAlert; - export const registerSyntheticsStatusCheckRule = ( server: SyntheticsServerSetup, plugins: SyntheticsPluginsSetupDependencies, @@ -74,94 +54,44 @@ export const registerSyntheticsStatusCheckRule = ( isExportable: true, minimumLicenseRequired: 'basic', doesSetRecoveryContext: true, - executor: async ( - options: RuleExecutorOptions< - MonitorStatusRuleTypeParams, - MonitorStatusRuleTypeState, - MonitorStatusAlertState, - MonitorStatusAlertContext, - MonitorStatusActionGroups, - MonitorStatusAlert - > - ) => { - const { state: ruleState, params, services, spaceId, previousStartedAt, startedAt } = options; - const { alertsClient, savedObjectsClient, scopedClusterClient, uiSettingsClient } = services; + executor: async (options: StatusRuleExecutorOptions) => { + apm.setTransactionName('Synthetics Status Rule Executor'); + const { state: ruleState, params, services, spaceId } = options; + const { alertsClient, uiSettingsClient } = services; if (!alertsClient) { throw new AlertsClientError(); } const { basePath } = server; - const dateFormat = await uiSettingsClient.get('dateFormat'); - const timezone = await uiSettingsClient.get('dateFormat:tz'); + + const [dateFormat, timezone] = await Promise.all([ + uiSettingsClient.get('dateFormat'), + uiSettingsClient.get('dateFormat:tz'), + ]); const tz = timezone === 'Browser' ? 'UTC' : timezone; - const statusRule = new StatusRuleExecutor( - previousStartedAt, - params, - savedObjectsClient, - scopedClusterClient.asCurrentUser, - server, - syntheticsMonitorClient - ); + const groupBy = params?.condition?.groupBy ?? 'locationId'; + const groupByLocation = groupBy === 'locationId'; + + const statusRule = new StatusRuleExecutor(server, syntheticsMonitorClient, options); const { downConfigs, staleDownConfigs, upConfigs } = await statusRule.getDownChecks( ruleState.meta?.downConfigs as AlertOverviewStatus['downConfigs'] ); - Object.entries(downConfigs).forEach(([idWithLocation, { ping, configId }]) => { - const locationId = ping.observer.name ?? ''; - const alertId = idWithLocation; - const monitorSummary = getMonitorSummary( - ping, - DOWN_LABEL, - locationId, - configId, - dateFormat, - tz - ); - - const { uuid, start } = alertsClient.report({ - id: alertId, - actionGroup: MONITOR_STATUS.id, - }); - const errorStartedAt = start ?? startedAt.toISOString(); - - let relativeViewInAppUrl = ''; - if (monitorSummary.stateId) { - relativeViewInAppUrl = getRelativeViewInAppUrl({ - configId, - stateId: monitorSummary.stateId, - locationId, - }); - } - - const payload = getMonitorAlertDocument(monitorSummary); - - const context = { - ...monitorSummary, - idWithLocation, - errorStartedAt, - linkMessage: monitorSummary.stateId - ? getFullViewInAppMessage(basePath, spaceId, relativeViewInAppUrl) - : '', - [VIEW_IN_APP_URL]: getViewInAppUrl(basePath, spaceId, relativeViewInAppUrl), - [ALERT_DETAILS_URL]: getAlertDetailsUrl(basePath, spaceId, uuid), - }; - - alertsClient.setAlertData({ - id: alertId, - payload, - context, - }); + statusRule.handleDownMonitorThresholdAlert({ + downConfigs, }); setRecoveredAlertsContext({ alertsClient, basePath, spaceId, - staleDownConfigs, - upConfigs, dateFormat, tz, + params, + groupByLocation, + staleDownConfigs, + upConfigs, }); return { diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/filter_monitors.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/filter_monitors.ts new file mode 100644 index 0000000000000..c850c2b6d6d30 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/filter_monitors.ts @@ -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 { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { StatusRuleParams } from '../../../../common/rules/status_rule'; +import { SyntheticsEsClient } from '../../../lib'; +import { + FINAL_SUMMARY_FILTER, + getRangeFilter, + getTimeSpanFilter, +} from '../../../../common/constants/client_defaults'; + +export async function queryFilterMonitors({ + spaceId, + esClient, + ruleParams, +}: { + spaceId: string; + esClient: SyntheticsEsClient; + ruleParams: StatusRuleParams; +}) { + if (!ruleParams.kqlQuery) { + return; + } + const filters = toElasticsearchQuery(fromKueryExpression(ruleParams.kqlQuery)); + const { body: result } = await esClient.search({ + body: { + size: 0, + query: { + bool: { + filter: [ + FINAL_SUMMARY_FILTER, + getRangeFilter({ from: 'now-24h/m', to: 'now/m' }), + getTimeSpanFilter(), + { + term: { + 'meta.space_id': spaceId, + }, + }, + { + bool: { + should: filters, + }, + }, + ...getFilters(ruleParams), + ], + }, + }, + aggs: { + ids: { + terms: { + size: 10000, + field: 'config_id', + }, + }, + }, + }, + }); + + return result.aggregations?.ids.buckets.map((bucket) => bucket.key as string); +} + +const getFilters = (ruleParams: StatusRuleParams) => { + const { monitorTypes, locations, tags, projects } = ruleParams; + const filters: QueryDslQueryContainer[] = []; + if (monitorTypes?.length) { + filters.push({ + terms: { + 'monitor.type': monitorTypes, + }, + }); + } + + if (locations?.length) { + filters.push({ + terms: { + 'observer.name': locations, + }, + }); + } + + if (tags?.length) { + filters.push({ + terms: { + tags, + }, + }); + } + + if (projects?.length) { + filters.push({ + terms: { + 'monitor.project.id': projects, + }, + }); + } + + return filters; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/query_monitor_status_alert.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/query_monitor_status_alert.ts similarity index 51% rename from x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/query_monitor_status_alert.ts rename to x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/query_monitor_status_alert.ts index 9c8e2fa1fa21b..965c30d9c33ae 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/query_monitor_status_alert.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/queries/query_monitor_status_alert.ts @@ -8,15 +8,15 @@ import pMap from 'p-map'; import times from 'lodash/times'; import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { cloneDeep, intersection } from 'lodash'; +import { intersection } from 'lodash'; +import { AlertStatusMetaData } from '../../../../common/runtime_types/alert_rules/common'; import { - AlertOverviewStatus, - AlertPendingStatusMetaData, - AlertStatusMetaData, -} from '../../../common/runtime_types/alert_rules/common'; -import { createEsParams, SyntheticsEsClient } from '../../lib'; -import { OverviewPing } from '../../../common/runtime_types'; -import { FINAL_SUMMARY_FILTER } from '../../../common/constants/client_defaults'; + FINAL_SUMMARY_FILTER, + getTimespanFilter, + SUMMARY_FILTER, +} from '../../../../common/constants/client_defaults'; +import { OverviewPing } from '../../../../common/runtime_types'; +import { createEsParams, SyntheticsEsClient } from '../../../lib'; const DEFAULT_MAX_ES_BUCKET_SIZE = 10000; @@ -32,23 +32,35 @@ const fields = [ 'state', 'tags', ]; +type StatusConfigs = Record; -export async function queryMonitorStatusForAlert( - esClient: SyntheticsEsClient, - monitorLocationIds: string[], - range: { from: string; to: string }, - monitorQueryIds: string[], - monitorLocationsMap: Record, - monitorQueryIdToConfigIdMap: Record -): Promise { +export interface AlertStatusResponse { + upConfigs: StatusConfigs; + downConfigs: StatusConfigs; + enabledMonitorQueryIds: string[]; +} + +export async function queryMonitorStatusAlert({ + esClient, + monitorLocationIds, + range, + monitorQueryIds, + monitorLocationsMap, + numberOfChecks, + includeRetests = true, +}: { + esClient: SyntheticsEsClient; + monitorLocationIds: string[]; + range: { from: string; to: string }; + monitorQueryIds: string[]; + monitorLocationsMap: Record; + numberOfChecks: number; + includeRetests?: boolean; +}): Promise { const idSize = Math.trunc(DEFAULT_MAX_ES_BUCKET_SIZE / monitorLocationIds.length || 1); const pageCount = Math.ceil(monitorQueryIds.length / idSize); - let up = 0; - let down = 0; - const upConfigs: Record = {}; - const downConfigs: Record = {}; - const monitorsWithoutData = new Map(Object.entries(cloneDeep(monitorLocationsMap))); - const pendingConfigs: Record = {}; + const upConfigs: StatusConfigs = {}; + const downConfigs: StatusConfigs = {}; await pMap( times(pageCount), @@ -60,15 +72,8 @@ export async function queryMonitorStatusForAlert( query: { bool: { filter: [ - FINAL_SUMMARY_FILTER, - { - range: { - '@timestamp': { - gte: range.from, - lte: range.to, - }, - }, - }, + ...(includeRetests ? [SUMMARY_FILTER] : [FINAL_SUMMARY_FILTER]), + getTimespanFilter({ from: range.from, to: range.to }), { terms: { 'monitor.id': idsToQuery, @@ -90,9 +95,18 @@ export async function queryMonitorStatusForAlert( size: monitorLocationIds.length || 100, }, aggs: { - status: { + downChecks: { + filter: { + range: { + 'summary.down': { + gte: '1', + }, + }, + }, + }, + totalChecks: { top_hits: { - size: 1, + size: numberOfChecks, sort: [ { '@timestamp': { @@ -121,62 +135,60 @@ export async function queryMonitorStatusForAlert( }); } - const { body: result } = await esClient.search( - params, - 'getCurrentStatusOverview' + i - ); + const { body: result } = await esClient.search(params); result.aggregations?.id.buckets.forEach(({ location, key: queryId }) => { - const locationSummaries = location.buckets.map(({ status, key: locationName }) => { - const ping = status.hits.hits[0]._source; - return { location: locationName, ping }; - }); + const locationSummaries = location.buckets.map( + ({ key: locationId, totalChecks, downChecks }) => { + return { locationId, totalChecks, downChecks }; + } + ); // discard any locations that are not in the monitorLocationsMap for the given monitor as well as those which are // in monitorLocationsMap but not in listOfLocations const monLocations = monitorLocationsMap?.[queryId]; const monQueriedLocations = intersection(monLocations, monitorLocationIds); - monQueriedLocations?.forEach((monLocation) => { + monQueriedLocations?.forEach((monLocationId) => { const locationSummary = locationSummaries.find( - (summary) => summary.location === monLocation + (summary) => summary.locationId === monLocationId ); if (locationSummary) { - const { ping } = locationSummary; - const downCount = ping.summary?.down ?? 0; - const upCount = ping.summary?.up ?? 0; - const configId = ping.config_id; - const monitorQueryId = ping.monitor.id; + const { totalChecks, downChecks } = locationSummary; + const latestPing = totalChecks.hits.hits[0]._source; + const downCount = downChecks.doc_count; + const isLatestPingUp = (latestPing.summary?.up ?? 0) > 0; + const configId = latestPing.config_id; + const monitorQueryId = latestPing.monitor.id; - const meta = { - ping, + const meta: AlertStatusMetaData = { + ping: latestPing, configId, monitorQueryId, - locationId: monLocation, - timestamp: ping['@timestamp'], + locationId: monLocationId, + timestamp: latestPing['@timestamp'], + checks: { + downWithinXChecks: totalChecks.hits.hits.reduce( + (acc, curr) => acc + ((curr._source.summary.down ?? 0) > 0 ? 1 : 0), + 0 + ), + down: downCount, + }, + status: 'up', }; if (downCount > 0) { - down += 1; - downConfigs[`${configId}-${monLocation}`] = { + downConfigs[`${configId}-${monLocationId}`] = { ...meta, status: 'down', }; - } else if (upCount > 0) { - up += 1; - upConfigs[`${configId}-${monLocation}`] = { + } + if (isLatestPingUp) { + upConfigs[`${configId}-${monLocationId}`] = { ...meta, status: 'up', }; } - const monitorsMissingData = monitorsWithoutData.get(monitorQueryId) || []; - monitorsWithoutData.set( - monitorQueryId, - monitorsMissingData?.filter((loc) => loc !== monLocation) - ); - if (!monitorsWithoutData.get(monitorQueryId)?.length) { - monitorsWithoutData.delete(monitorQueryId); - } } }); }); @@ -184,26 +196,9 @@ export async function queryMonitorStatusForAlert( { concurrency: 5 } ); - // identify the remaining monitors without data, to determine pending monitors - for (const [queryId, locs] of monitorsWithoutData) { - locs.forEach((loc) => { - pendingConfigs[`${monitorQueryIdToConfigIdMap[queryId]}-${loc}`] = { - configId: `${monitorQueryIdToConfigIdMap[queryId]}`, - monitorQueryId: queryId, - status: 'unknown', - locationId: loc, - }; - }); - } - return { - up, - down, - pending: Object.values(pendingConfigs).length, upConfigs, downConfigs, - pendingConfigs, enabledMonitorQueryIds: monitorQueryIds, - staleDownConfigs: {}, }; } diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.test.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.test.ts index 02373c34ac6a5..76c05d6fa2930 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.test.ts @@ -4,10 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import moment from 'moment'; import { loggerMock } from '@kbn/logging-mocks'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { StatusRuleExecutor } from './status_rule_executor'; +import { coreMock } from '@kbn/core/server/mocks'; +import { getDoesMonitorMeetLocationThreshold, StatusRuleExecutor } from './status_rule_executor'; import { mockEncryptedSO } from '../../synthetics_service/utils/mocks'; import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { SyntheticsMonitorClient } from '../../synthetics_service/synthetics_monitor/synthetics_monitor_client'; @@ -16,8 +16,12 @@ import * as monitorUtils from '../../saved_objects/synthetics_monitor/get_all_mo import * as locationsUtils from '../../synthetics_service/get_all_locations'; import type { PublicLocation } from '../../../common/runtime_types'; import { SyntheticsServerSetup } from '../../types'; +import { AlertStatusMetaData } from '../../../common/runtime_types/alert_rules/common'; describe('StatusRuleExecutor', () => { + // @ts-ignore + Date.now = jest.fn(() => new Date('2024-05-13T12:33:37.000Z')); + const mockEsClient = elasticsearchClientMock.createElasticsearchClient(); const logger = loggerMock.create(); const soClient = savedObjectsClientMock.create(); @@ -59,166 +63,611 @@ describe('StatusRuleExecutor', () => { const monitorClient = new SyntheticsMonitorClient(syntheticsService, serverMock); - it('should only query enabled monitors', async () => { - const spy = jest.spyOn(monitorUtils, 'getAllMonitors').mockResolvedValue([]); - const statusRule = new StatusRuleExecutor( - moment().toDate(), - {}, - soClient, - mockEsClient, - serverMock, - monitorClient - ); - const { downConfigs, staleDownConfigs } = await statusRule.getDownChecks({}); - - expect(downConfigs).toEqual({}); - expect(staleDownConfigs).toEqual({}); - - expect(spy).toHaveBeenCalledWith({ - filter: 'synthetics-monitor.attributes.alert.status.enabled: true', - soClient, + const mockStart = coreMock.createStart(); + const uiSettingsClient = mockStart.uiSettings.asScopedToClient(soClient); + + const statusRule = new StatusRuleExecutor(serverMock, monitorClient, { + params: {}, + services: { + uiSettingsClient, + savedObjectsClient: soClient, + scopedClusterClient: { asCurrentUser: mockEsClient }, + }, + rule: { + name: 'test', + }, + } as any); + + describe('DefaultRule', () => { + it('should only query enabled monitors', async () => { + const spy = jest.spyOn(monitorUtils, 'getAllMonitors').mockResolvedValue([]); + + const { downConfigs, staleDownConfigs } = await statusRule.getDownChecks({}); + + expect(downConfigs).toEqual({}); + expect(staleDownConfigs).toEqual({}); + + expect(spy).toHaveBeenCalledWith({ + filter: 'synthetics-monitor.attributes.alert.status.enabled: true', + soClient, + }); }); - }); - it('marks deleted configs as expected', async () => { - jest.spyOn(monitorUtils, 'getAllMonitors').mockResolvedValue(testMonitors); - const statusRule = new StatusRuleExecutor( - moment().toDate(), - {}, - soClient, - mockEsClient, - serverMock, - monitorClient - ); - - const { downConfigs } = await statusRule.getDownChecks({}); - - expect(downConfigs).toEqual({}); - - const staleDownConfigs = await statusRule.markDeletedConfigs({ - id1: { - locationId: 'us-east-1', - configId: 'id1', - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - monitorQueryId: 'test', - ping: {} as any, - }, - '2548dab3-4752-4b4d-89a2-ae3402b6fb04-us_central_dev': { - locationId: 'us_central_dev', - configId: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - monitorQueryId: 'test', - ping: {} as any, - }, - '2548dab3-4752-4b4d-89a2-ae3402b6fb04-us_central_qa': { - locationId: 'us_central_qa', - configId: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - monitorQueryId: 'test', - ping: {} as any, - }, + it('marks deleted configs as expected', async () => { + jest.spyOn(monitorUtils, 'getAllMonitors').mockResolvedValue(testMonitors); + + const { downConfigs } = await statusRule.getDownChecks({}); + + expect(downConfigs).toEqual({}); + + const staleDownConfigs = await statusRule.markDeletedConfigs({ + id2: { + locationId: 'us-east-1', + configId: 'id2', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: {} as any, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_dev': { + locationId: 'us_central_dev', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: {} as any, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_qa': { + locationId: 'us_central_qa', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: {} as any, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }); + + expect(staleDownConfigs).toEqual({ + id2: { + configId: 'id2', + isDeleted: true, + locationId: 'us-east-1', + monitorQueryId: 'test', + ping: {}, + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_dev': { + configId: 'id1', + isLocationRemoved: true, + locationId: 'us_central_dev', + monitorQueryId: 'test', + ping: {}, + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }); }); - expect(staleDownConfigs).toEqual({ - id1: { - configId: 'id1', - isDeleted: true, - locationId: 'us-east-1', - monitorQueryId: 'test', - ping: {}, - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - }, - '2548dab3-4752-4b4d-89a2-ae3402b6fb04-us_central_dev': { - configId: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', - isLocationRemoved: true, - locationId: 'us_central_dev', - monitorQueryId: 'test', - ping: {}, - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - }, + it('does not mark deleted config when monitor does not contain location label', async () => { + jest.spyOn(monitorUtils, 'getAllMonitors').mockResolvedValue([ + { + ...testMonitors[0], + attributes: { + ...testMonitors[0].attributes, + locations: [ + { + geo: { lon: -95.86, lat: 41.25 }, + isServiceManaged: true, + id: 'us_central_qa', + }, + ], + }, + }, + ]); + + const { downConfigs } = await statusRule.getDownChecks({}); + + expect(downConfigs).toEqual({}); + + const staleDownConfigs = await statusRule.markDeletedConfigs({ + id2: { + locationId: 'us-east-1', + configId: 'id2', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: {} as any, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_dev': { + locationId: 'us_central_dev', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: {} as any, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_qa': { + locationId: 'us_central_qa', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: {} as any, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }); + + expect(staleDownConfigs).toEqual({ + id2: { + configId: 'id2', + isDeleted: true, + locationId: 'us-east-1', + monitorQueryId: 'test', + ping: {}, + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_dev': { + configId: 'id1', + isLocationRemoved: true, + locationId: 'us_central_dev', + monitorQueryId: 'test', + ping: {}, + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }); }); }); - it('does not mark deleted config when monitor does not contain location label', async () => { - jest.spyOn(monitorUtils, 'getAllMonitors').mockResolvedValue([ - { - ...testMonitors[0], - attributes: { - ...testMonitors[0].attributes, - locations: [ - { - geo: { lon: -95.86, lat: 41.25 }, - isServiceManaged: true, - id: 'us_central_qa', + describe('handleDownMonitorThresholdAlert', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should alert if monitor meet location threshold', async () => { + const spy = jest.spyOn(statusRule, 'scheduleAlert'); + statusRule.handleDownMonitorThresholdAlert({ + downConfigs: { + 'id1-us_central_qa': { + locationId: 'us_central_qa', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: testPing, + checks: { + downWithinXChecks: 1, + down: 1, }, - ], + }, }, - }, - ]); - const statusRule = new StatusRuleExecutor( - moment().toDate(), - {}, - soClient, - mockEsClient, - serverMock, - monitorClient - ); - - const { downConfigs } = await statusRule.getDownChecks({}); - - expect(downConfigs).toEqual({}); - - const staleDownConfigs = await statusRule.markDeletedConfigs({ - id1: { - locationId: 'us-east-1', - configId: 'id1', - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - monitorQueryId: 'test', - ping: {} as any, - }, - '2548dab3-4752-4b4d-89a2-ae3402b6fb04-us_central_dev': { - locationId: 'us_central_dev', - configId: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - monitorQueryId: 'test', - ping: {} as any, - }, - '2548dab3-4752-4b4d-89a2-ae3402b6fb04-us_central_qa': { - locationId: 'us_central_qa', - configId: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - monitorQueryId: 'test', - ping: {} as any, - }, + }); + expect(spy).toHaveBeenCalledWith({ + alertId: 'id1-us_central_qa', + downThreshold: 1, + idWithLocation: 'id1-us_central_qa', + locationNames: ['Test location'], + locationIds: ['test'], + monitorSummary: { + checkedAt: '2024-05-13T12:33:37Z', + checks: { down: 1, downWithinXChecks: 1 }, + configId: 'id1', + downThreshold: 1, + hostName: undefined, + lastErrorMessage: undefined, + locationId: 'us_central_qa', + locationName: 'Test location', + locationNames: 'Test location', + monitorId: 'test', + monitorName: 'test monitor', + monitorTags: ['dev'], + monitorType: 'browser', + monitorUrl: 'https://www.google.com', + monitorUrlLabel: 'URL', + reason: + 'Monitor "test monitor" from Test location is down. Monitor is down 1 time within the last 1 checks. Alert when 1 out of the last 1 checks are down from at least 1 location.', + stateId: undefined, + status: 'down', + timestamp: '2024-05-13T12:33:37.000Z', + }, + statusConfig: { + checks: { down: 1, downWithinXChecks: 1 }, + configId: 'id1', + locationId: 'us_central_qa', + monitorQueryId: 'test', + ping: testPing, + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + useLatestChecks: true, + }); }); - expect(staleDownConfigs).toEqual({ - id1: { - configId: 'id1', - isDeleted: true, - locationId: 'us-east-1', - monitorQueryId: 'test', - ping: {}, - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - }, - '2548dab3-4752-4b4d-89a2-ae3402b6fb04-us_central_dev': { - configId: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', - isLocationRemoved: true, - locationId: 'us_central_dev', - monitorQueryId: 'test', - ping: {}, - status: 'down', - timestamp: '2021-06-01T00:00:00.000Z', - }, + it('should not alert if monitor do not meet location threshold', async () => { + statusRule.params = { + condition: { + window: { + numberOfChecks: 1, + }, + downThreshold: 1, + locationsThreshold: 2, + }, + }; + + const spy = jest.spyOn(statusRule, 'scheduleAlert'); + statusRule.handleDownMonitorThresholdAlert({ + downConfigs: { + 'id1-us_central_qa': { + locationId: 'us_central_qa', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: testPing, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }, + }); + expect(spy).toHaveBeenCalledTimes(0); + }); + + it('should send 2 alerts', async () => { + statusRule.params = { + condition: { + window: { + numberOfChecks: 1, + }, + downThreshold: 1, + locationsThreshold: 1, + }, + }; + const spy = jest.spyOn(statusRule, 'scheduleAlert'); + statusRule.handleDownMonitorThresholdAlert({ + downConfigs: { + 'id1-us_central_qa': { + locationId: 'us_central_qa', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: testPing, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_dev': { + locationId: 'us_central_dev', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: testPing, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }, + }); + expect(spy).toHaveBeenCalledTimes(2); + }); + + it('should send 1 alert for un-grouped', async () => { + statusRule.params = { + condition: { + groupBy: 'none', + window: { + numberOfChecks: 1, + }, + downThreshold: 1, + locationsThreshold: 1, + }, + }; + const spy = jest.spyOn(statusRule, 'scheduleAlert'); + statusRule.handleDownMonitorThresholdAlert({ + downConfigs: { + 'id1-us_central_qa': { + locationId: 'us_central_qa', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: testPing, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + 'id1-us_central_dev': { + locationId: 'us_central_dev', + configId: 'id1', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + monitorQueryId: 'test', + ping: testPing, + checks: { + downWithinXChecks: 1, + down: 1, + }, + }, + }, + }); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith({ + alertId: 'id1', + downThreshold: 1, + idWithLocation: 'id1', + locationIds: ['test', 'test'], + locationNames: ['Test location', 'Test location'], + monitorSummary: { + checkedAt: '2024-05-13T12:33:37Z', + checks: { down: 1, downWithinXChecks: 1 }, + configId: 'id1', + downThreshold: 1, + hostName: undefined, + lastErrorMessage: undefined, + locationId: 'test and test', + locationName: 'Test location', + locationNames: 'Test location and Test location', + monitorId: 'test', + monitorName: 'test monitor', + monitorTags: ['dev'], + monitorType: 'browser', + monitorUrl: 'https://www.google.com', + monitorUrlLabel: 'URL', + reason: + 'Monitor "test monitor" is down 1 time from Test location and 1 time from Test location. Alert when down 1 time out of the last 1 checks from at least 1 location.', + status: 'down', + timestamp: '2024-05-13T12:33:37.000Z', + }, + statusConfig: { + checks: { down: 1, downWithinXChecks: 1 }, + configId: 'id1', + locationId: 'us_central_qa', + monitorQueryId: 'test', + ping: testPing, + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + useLatestChecks: true, + }); + }); + }); +}); + +describe('getDoesMonitorMeetLocationThreshold', () => { + describe('when useTimeWindow is false', () => { + it('should return false if monitor does not meets location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 0, downWithinXChecks: 0 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 1, + downThreshold: 1, + useTimeWindow: false, + }); + expect(res).toBe(false); + }); + + it('should return true if monitor meets location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 1, downWithinXChecks: 1 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 1, + downThreshold: 1, + useTimeWindow: false, + }); + expect(res).toBe(true); + }); + + it('should return false if monitor does not meets 2 location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 1, downWithinXChecks: 1 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 2, + downThreshold: 1, + useTimeWindow: false, + }); + expect(res).toBe(false); + }); + + it('should return true if monitor meets 2 location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 1, downWithinXChecks: 1 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + { + checks: { down: 1, downWithinXChecks: 1 }, + locationId: 'us_central', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 2, + downThreshold: 1, + useTimeWindow: false, + }); + expect(res).toBe(true); + }); + }); + + describe('when useTimeWindow is true', () => { + it('should return false if monitor does not meets location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 0, downWithinXChecks: 0 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 1, + downThreshold: 1, + useTimeWindow: true, + }); + expect(res).toBe(false); + }); + + it('should return true if monitor meets location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 1, downWithinXChecks: 0 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 1, + downThreshold: 1, + useTimeWindow: true, + }); + expect(res).toBe(true); + }); + + it('should return false if monitor does not meets 2 location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 1, downWithinXChecks: 0 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 2, + downThreshold: 1, + useTimeWindow: true, + }); + expect(res).toBe(false); + }); + + it('should return true if monitor meets 2 location threshold', () => { + const matchesByLocation: AlertStatusMetaData[] = [ + { + checks: { down: 1, downWithinXChecks: 0 }, + locationId: 'us_central_qa', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + { + checks: { down: 1, downWithinXChecks: 1 }, + locationId: 'us_central', + ping: testPing, + configId: 'id1', + monitorQueryId: 'test', + status: 'down', + timestamp: '2021-06-01T00:00:00.000Z', + }, + ]; + const res = getDoesMonitorMeetLocationThreshold({ + matchesByLocation, + locationsThreshold: 2, + downThreshold: 1, + useTimeWindow: true, + }); + expect(res).toBe(true); }); }); }); @@ -226,7 +675,7 @@ describe('StatusRuleExecutor', () => { const testMonitors = [ { type: 'synthetics-monitor', - id: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', + id: 'id1', attributes: { type: 'browser', form_monitor_type: 'multistep', @@ -234,7 +683,7 @@ const testMonitors = [ alert: { status: { enabled: false } }, schedule: { unit: 'm', number: '10' }, 'service.name': '', - config_id: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', + config_id: 'id1', tags: [], timeout: null, name: 'https://www.google.com', @@ -250,7 +699,7 @@ const testMonitors = [ origin: 'ui', journey_id: '', hash: '', - id: '2548dab3-4752-4b4d-89a2-ae3402b6fb04', + id: 'id1', project_id: '', playwright_options: '', __ui: { @@ -289,3 +738,22 @@ const testMonitors = [ sort: ['https://www.google.com', 1889], }, ] as any; + +const testPing = { + '@timestamp': '2024-05-13T12:33:37.000Z', + monitor: { + id: 'test', + name: 'test monitor', + type: 'browser', + }, + tags: ['dev'], + url: { + full: 'https://www.google.com', + }, + observer: { + name: 'test', + geo: { + name: 'Test location', + }, + }, +} as any; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.ts index 691176fad6e74..7dcea3a6084f0 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/status_rule_executor.ts @@ -9,9 +9,31 @@ import { SavedObjectsClientContract, SavedObjectsFindResult, } from '@kbn/core-saved-objects-api-server'; -import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { AlertOverviewStatus } from '../../../common/runtime_types/alert_rules/common'; -import { queryMonitorStatusForAlert } from './query_monitor_status_alert'; +import { Logger } from '@kbn/core/server'; +import { intersection, isEmpty, uniq } from 'lodash'; +import { getAlertDetailsUrl } from '@kbn/observability-plugin/common'; +import { + AlertOverviewStatus, + AlertStatusConfigs, + AlertStatusMetaData, + StaleDownConfig, +} from '../../../common/runtime_types/alert_rules/common'; +import { queryFilterMonitors } from './queries/filter_monitors'; +import { MonitorSummaryStatusRule, StatusRuleExecutorOptions } from './types'; +import { + AND_LABEL, + getFullViewInAppMessage, + getRelativeViewInAppUrl, + getViewInAppUrl, +} from '../common'; +import { + DOWN_LABEL, + getMonitorAlertDocument, + getMonitorSummary, + getUngroupedReasonMessage, +} from './message_utils'; +import { queryMonitorStatusAlert } from './queries/query_monitor_status_alert'; +import { parseArrayFilters } from '../../routes/common'; import { SyntheticsServerSetup } from '../../types'; import { SyntheticsEsClient } from '../../lib'; import { SYNTHETICS_INDEX_PATTERN } from '../../../common/constants'; @@ -19,11 +41,13 @@ import { getAllMonitors, processMonitors, } from '../../saved_objects/synthetics_monitor/get_all_monitors'; -import { StatusRuleParams } from '../../../common/rules/status_rule'; +import { getConditionType, StatusRuleParams } from '../../../common/rules/status_rule'; import { ConfigKey, EncryptedSyntheticsMonitorAttributes } from '../../../common/runtime_types'; import { SyntheticsMonitorClient } from '../../synthetics_service/synthetics_monitor/synthetics_monitor_client'; import { monitorAttributes } from '../../../common/types/saved_objects'; import { AlertConfigKey } from '../../../common/constants/monitor_management'; +import { ALERT_DETAILS_URL, VIEW_IN_APP_URL } from '../action_variables'; +import { MONITOR_STATUS } from '../../../common/constants/synthetics_alerts'; export class StatusRuleExecutor { previousStartedAt: Date | null; @@ -33,106 +57,176 @@ export class StatusRuleExecutor { server: SyntheticsServerSetup; syntheticsMonitorClient: SyntheticsMonitorClient; monitors: Array> = []; + hasCustomCondition: boolean; + monitorLocationsMap: Record; // monitorId: locationIds + dateFormat?: string; + tz?: string; + options: StatusRuleExecutorOptions; + logger: Logger; + ruleName: string; constructor( - previousStartedAt: Date | null, - p: StatusRuleParams, - soClient: SavedObjectsClientContract, - scopedClient: ElasticsearchClient, server: SyntheticsServerSetup, - syntheticsMonitorClient: SyntheticsMonitorClient + syntheticsMonitorClient: SyntheticsMonitorClient, + options: StatusRuleExecutorOptions ) { + const { services, params, previousStartedAt, rule } = options; + const { scopedClusterClient, savedObjectsClient } = services; + this.ruleName = rule.name; + this.logger = server.logger; this.previousStartedAt = previousStartedAt; - this.params = p; - this.soClient = soClient; - this.esClient = new SyntheticsEsClient(this.soClient, scopedClient, { + this.params = params; + this.soClient = savedObjectsClient; + this.esClient = new SyntheticsEsClient(this.soClient, scopedClusterClient.asCurrentUser, { heartbeatIndices: SYNTHETICS_INDEX_PATTERN, }); this.server = server; this.syntheticsMonitorClient = syntheticsMonitorClient; + this.hasCustomCondition = !isEmpty(this.params); + this.monitorLocationsMap = {}; + this.options = options; + } + + debug(message: string) { + this.logger.debug(`[Status Rule Executor][${this.ruleName}] ${message}`); + } + + async init() { + const { uiSettingsClient } = this.options.services; + this.dateFormat = await uiSettingsClient.get('dateFormat'); + const timezone = await uiSettingsClient.get('dateFormat:tz'); + this.tz = timezone === 'Browser' ? 'UTC' : timezone; } async getMonitors() { + const baseFilter = !this.hasCustomCondition + ? `${monitorAttributes}.${AlertConfigKey.STATUS_ENABLED}: true` + : ''; + + const configIds = await queryFilterMonitors({ + spaceId: this.options.spaceId, + esClient: this.esClient, + ruleParams: this.params, + }); + + const { filtersStr } = parseArrayFilters({ + configIds, + filter: baseFilter, + tags: this.params?.tags, + locations: this.params?.locations, + monitorTypes: this.params?.monitorTypes, + monitorQueryIds: this.params?.monitorIds, + projects: this.params?.projects, + }); + this.monitors = await getAllMonitors({ soClient: this.soClient, - filter: `${monitorAttributes}.${AlertConfigKey.STATUS_ENABLED}: true`, + filter: filtersStr, }); - const { - allIds, - enabledMonitorQueryIds, - monitorLocationIds, - monitorLocationsMap, - projectMonitorsCount, - monitorQueryIdToConfigIdMap, - } = processMonitors(this.monitors); - - return { - enabledMonitorQueryIds, - monitorLocationIds, - allIds, - monitorLocationsMap, - projectMonitorsCount, - monitorQueryIdToConfigIdMap, - }; + this.debug(`Found ${this.monitors.length} monitors for params ${JSON.stringify(this.params)}`); + return processMonitors(this.monitors); } - async getDownChecks( - prevDownConfigs: AlertOverviewStatus['downConfigs'] = {} - ): Promise { - const { - monitorLocationIds, - enabledMonitorQueryIds, - monitorLocationsMap, - monitorQueryIdToConfigIdMap, - } = await this.getMonitors(); - const from = this.previousStartedAt - ? moment(this.previousStartedAt).subtract(1, 'minute').toISOString() - : 'now-2m'; + async getDownChecks(prevDownConfigs: AlertStatusConfigs = {}): Promise { + await this.init(); + const { enabledMonitorQueryIds, maxPeriod, monitorLocationIds, monitorLocationsMap } = + await this.getMonitors(); - if (enabledMonitorQueryIds.length > 0) { - const currentStatus = await queryMonitorStatusForAlert( - this.esClient, - monitorLocationIds, - { - to: 'now', - from, - }, - enabledMonitorQueryIds, - monitorLocationsMap, - monitorQueryIdToConfigIdMap - ); + const range = this.getRange(maxPeriod); - const downConfigs = currentStatus.downConfigs; - const upConfigs = currentStatus.upConfigs; - - Object.keys(prevDownConfigs).forEach((locId) => { - if (!downConfigs[locId] && !upConfigs[locId]) { - downConfigs[locId] = prevDownConfigs[locId]; - } - }); - - const staleDownConfigs = this.markDeletedConfigs(downConfigs); + const { numberOfChecks } = getConditionType(this.params.condition); + if (enabledMonitorQueryIds.length === 0) { + const staleDownConfigs = this.markDeletedConfigs(prevDownConfigs); return { - ...currentStatus, + downConfigs: { ...prevDownConfigs }, + upConfigs: {}, staleDownConfigs, + enabledMonitorQueryIds, + pendingConfigs: {}, }; } - const staleDownConfigs = this.markDeletedConfigs(prevDownConfigs); + + const queryLocations = this.params?.locations; + + // Account for locations filter + const listOfLocationAfterFilter = queryLocations + ? intersection(monitorLocationIds, queryLocations) + : monitorLocationIds; + + const currentStatus = await queryMonitorStatusAlert({ + esClient: this.esClient, + monitorLocationIds: listOfLocationAfterFilter, + range, + monitorQueryIds: enabledMonitorQueryIds, + numberOfChecks, + monitorLocationsMap, + includeRetests: this.params.condition?.includeRetests, + }); + + const { downConfigs, upConfigs } = currentStatus; + + this.debug( + `Found ${Object.keys(downConfigs).length} down configs and ${ + Object.keys(upConfigs).length + } up configs` + ); + + const downConfigsById = getConfigsByIds(downConfigs); + const upConfigsById = getConfigsByIds(upConfigs); + + uniq([...downConfigsById.keys(), ...upConfigsById.keys()]).forEach((configId) => { + const downCount = downConfigsById.get(configId)?.length ?? 0; + const upCount = upConfigsById.get(configId)?.length ?? 0; + const name = this.monitors.find((m) => m.id === configId)?.attributes.name ?? configId; + this.debug( + `Monitor: ${name} with id ${configId} has ${downCount} down check and ${upCount} up check` + ); + }); + + Object.keys(prevDownConfigs).forEach((locId) => { + if (!downConfigs[locId] && !upConfigs[locId]) { + downConfigs[locId] = prevDownConfigs[locId]; + } + }); + + const staleDownConfigs = this.markDeletedConfigs(downConfigs); + return { - downConfigs: { ...prevDownConfigs }, - upConfigs: {}, - pendingConfigs: {}, + ...currentStatus, staleDownConfigs, - down: 0, - up: 0, - pending: 0, - enabledMonitorQueryIds, + pendingConfigs: {}, }; } - markDeletedConfigs(downConfigs: AlertOverviewStatus['downConfigs']) { + getRange = (maxPeriod: number) => { + let from = this.previousStartedAt + ? moment(this.previousStartedAt).subtract(1, 'minute').toISOString() + : 'now-2m'; + + const condition = this.params.condition; + if (condition && 'numberOfChecks' in condition?.window) { + const numberOfChecks = condition.window.numberOfChecks; + from = moment() + .subtract(maxPeriod * numberOfChecks, 'milliseconds') + .subtract(5, 'minutes') + .toISOString(); + } else if (condition && 'time' in condition.window) { + const time = condition.window.time; + const { unit, size } = time; + + from = moment().subtract(size, unit).toISOString(); + } + + this.debug( + `Using range from ${from} to now, diff of ${moment().diff(from, 'minutes')} minutes` + ); + + return { from, to: 'now' }; + }; + + markDeletedConfigs(downConfigs: AlertStatusConfigs): Record { const monitors = this.monitors; const staleDownConfigs: AlertOverviewStatus['staleDownConfigs'] = {}; Object.keys(downConfigs).forEach((locPlusId) => { @@ -158,4 +252,221 @@ export class StatusRuleExecutor { return staleDownConfigs; } + + handleDownMonitorThresholdAlert = ({ downConfigs }: { downConfigs: AlertStatusConfigs }) => { + const { useTimeWindow, useLatestChecks, downThreshold, locationsThreshold } = getConditionType( + this.params?.condition + ); + const groupBy = this.params?.condition?.groupBy ?? 'locationId'; + + if (groupBy === 'locationId' && locationsThreshold === 1) { + Object.entries(downConfigs).forEach(([idWithLocation, statusConfig]) => { + const doesMonitorMeetLocationThreshold = getDoesMonitorMeetLocationThreshold({ + matchesByLocation: [statusConfig], + locationsThreshold, + downThreshold, + useTimeWindow: useTimeWindow || false, + }); + if (doesMonitorMeetLocationThreshold) { + const alertId = idWithLocation; + const monitorSummary = this.getMonitorDownSummary({ + statusConfig, + }); + + return this.scheduleAlert({ + idWithLocation, + alertId, + monitorSummary, + statusConfig, + downThreshold, + useLatestChecks, + locationNames: [statusConfig.ping.observer.geo?.name!], + locationIds: [statusConfig.ping.observer.name!], + }); + } + }); + } else { + const downConfigsById = getConfigsByIds(downConfigs); + + for (const [configId, configs] of downConfigsById) { + const doesMonitorMeetLocationThreshold = getDoesMonitorMeetLocationThreshold({ + matchesByLocation: configs, + locationsThreshold, + downThreshold, + useTimeWindow: useTimeWindow || false, + }); + + if (doesMonitorMeetLocationThreshold) { + const alertId = configId; + const monitorSummary = this.getUngroupedDownSummary({ + statusConfigs: configs, + }); + return this.scheduleAlert({ + idWithLocation: configId, + alertId, + monitorSummary, + statusConfig: configs[0], + downThreshold, + useLatestChecks, + locationNames: configs.map((c) => c.ping.observer.geo?.name!), + locationIds: configs.map((c) => c.ping.observer.name!), + }); + } + } + } + }; + + getMonitorDownSummary({ statusConfig }: { statusConfig: AlertStatusMetaData }) { + const { ping, configId, locationId, checks } = statusConfig; + + return getMonitorSummary({ + monitorInfo: ping, + statusMessage: DOWN_LABEL, + locationId: [locationId], + configId, + dateFormat: this.dateFormat ?? 'Y-MM-DD HH:mm:ss', + tz: this.tz ?? 'UTC', + checks, + params: this.params, + }); + } + + getUngroupedDownSummary({ statusConfigs }: { statusConfigs: AlertStatusMetaData[] }) { + const sampleConfig = statusConfigs[0]; + const { ping, configId, checks } = sampleConfig; + const baseSummary = getMonitorSummary({ + monitorInfo: ping, + statusMessage: DOWN_LABEL, + locationId: statusConfigs.map((c) => c.ping.observer.name!), + configId, + dateFormat: this.dateFormat!, + tz: this.tz!, + checks, + params: this.params, + }); + baseSummary.reason = getUngroupedReasonMessage({ + statusConfigs, + monitorName: baseSummary.monitorName, + params: this.params, + }); + if (statusConfigs.length > 1) { + baseSummary.locationNames = statusConfigs + .map((c) => c.ping.observer.geo?.name!) + .join(` ${AND_LABEL} `); + } + + return baseSummary; + } + + scheduleAlert({ + idWithLocation, + alertId, + monitorSummary, + statusConfig, + downThreshold, + useLatestChecks = false, + locationNames, + locationIds, + }: { + idWithLocation: string; + alertId: string; + monitorSummary: MonitorSummaryStatusRule; + statusConfig: AlertStatusMetaData; + downThreshold: number; + useLatestChecks?: boolean; + locationNames: string[]; + locationIds: string[]; + }) { + const { configId, locationId, checks } = statusConfig; + const { spaceId, startedAt } = this.options; + const { alertsClient } = this.options.services; + const { basePath } = this.server; + if (!alertsClient) return; + + const { uuid: alertUuid, start } = alertsClient.report({ + id: alertId, + actionGroup: MONITOR_STATUS.id, + }); + const errorStartedAt = start ?? startedAt.toISOString() ?? monitorSummary.timestamp; + + let relativeViewInAppUrl = ''; + if (monitorSummary.stateId) { + relativeViewInAppUrl = getRelativeViewInAppUrl({ + configId, + locationId, + stateId: monitorSummary.stateId, + }); + } + + const context = { + ...monitorSummary, + idWithLocation, + checks, + downThreshold, + errorStartedAt, + linkMessage: monitorSummary.stateId + ? getFullViewInAppMessage(basePath, spaceId, relativeViewInAppUrl) + : '', + [VIEW_IN_APP_URL]: getViewInAppUrl(basePath, spaceId, relativeViewInAppUrl), + [ALERT_DETAILS_URL]: getAlertDetailsUrl(basePath, spaceId, alertUuid), + }; + + const alertDocument = getMonitorAlertDocument( + monitorSummary, + locationNames, + locationIds, + useLatestChecks + ); + + alertsClient.setAlertData({ + id: alertId, + payload: alertDocument, + context, + }); + } } + +export const getDoesMonitorMeetLocationThreshold = ({ + matchesByLocation, + locationsThreshold, + downThreshold, + useTimeWindow, +}: { + matchesByLocation: AlertStatusMetaData[]; + locationsThreshold: number; + downThreshold: number; + useTimeWindow: boolean; +}) => { + // for location based we need to make sure, monitor is down for the threshold for all locations + const getMatchingLocationsWithDownThresholdWithXChecks = (matches: AlertStatusMetaData[]) => { + return matches.filter((config) => (config.checks?.downWithinXChecks ?? 1) >= downThreshold); + }; + const getMatchingLocationsWithDownThresholdWithinTimeWindow = ( + matches: AlertStatusMetaData[] + ) => { + return matches.filter((config) => (config.checks?.down ?? 1) >= downThreshold); + }; + if (useTimeWindow) { + const matchingLocationsWithDownThreshold = + getMatchingLocationsWithDownThresholdWithinTimeWindow(matchesByLocation); + return matchingLocationsWithDownThreshold.length >= locationsThreshold; + } else { + const matchingLocationsWithDownThreshold = + getMatchingLocationsWithDownThresholdWithXChecks(matchesByLocation); + return matchingLocationsWithDownThreshold.length >= locationsThreshold; + } +}; + +export const getConfigsByIds = ( + downConfigs: AlertStatusConfigs +): Map => { + const downConfigsById = new Map(); + Object.entries(downConfigs).forEach(([_, config]) => { + const { configId } = config; + if (!downConfigsById.has(configId)) { + downConfigsById.set(configId, []); + } + downConfigsById.get(configId)?.push(config); + }); + return downConfigsById; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/types.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/types.ts index 16f8318b04f2e..3190881d728c4 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/types.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/types.ts @@ -5,6 +5,47 @@ * 2.0. */ +import { ObservabilityUptimeAlert } from '@kbn/alerts-as-data-utils'; +import { ActionGroupIdsOf } from '@kbn/alerting-types'; +import { + AlertInstanceContext as AlertContext, + RuleExecutorOptions, +} from '@kbn/alerting-plugin/server'; +import { StatusRuleParams } from '../../../common/rules/status_rule'; +import { MONITOR_STATUS } from '../../../common/constants/synthetics_alerts'; +import { + SyntheticsCommonState, + SyntheticsMonitorStatusAlertState, +} from '../../../common/runtime_types/alert_rules/common'; + +type MonitorStatusRuleTypeParams = StatusRuleParams; +type MonitorStatusActionGroups = ActionGroupIdsOf; +type MonitorStatusRuleTypeState = SyntheticsCommonState; +type MonitorStatusAlertState = SyntheticsMonitorStatusAlertState; +type MonitorStatusAlertContext = AlertContext; + +export type StatusRuleExecutorOptions = RuleExecutorOptions< + MonitorStatusRuleTypeParams, + MonitorStatusRuleTypeState, + MonitorStatusAlertState, + MonitorStatusAlertContext, + MonitorStatusActionGroups, + MonitorStatusAlertDocument +>; + +export type MonitorStatusAlertDocument = ObservabilityUptimeAlert & + Required< + Pick< + ObservabilityUptimeAlert, + | 'monitor.id' + | 'monitor.type' + | 'monitor.name' + | 'configId' + | 'observer.geo.name' + | 'location.name' + | 'location.id' + > + >; export interface MonitorSummaryStatusRule { reason: string; status: string; @@ -17,8 +58,15 @@ export interface MonitorSummaryStatusRule { monitorType: string; monitorName: string; locationName: string; - lastErrorMessage: string; - stateId: string | null; + locationNames: string; monitorUrlLabel: string; monitorTags?: string[]; + downThreshold: number; + checks?: { + downWithinXChecks: number; + down: number; + }; + stateId?: string; + lastErrorMessage?: string; + timestamp: string; } diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/utils.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/utils.ts new file mode 100644 index 0000000000000..608526c3b39e3 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/utils.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import moment from 'moment'; +import { EncryptedSyntheticsMonitorAttributes, OverviewPing } from '../../../common/runtime_types'; + +export const getMonitorToPing = ( + monitor: EncryptedSyntheticsMonitorAttributes, + locationId: string +) => { + const location = monitor.locations.find((loc) => loc.id === locationId); + return { + monitor: { + id: monitor.id, + name: monitor.name, + type: monitor.type, + }, + observer: { + name: location?.id, + geo: { + name: location?.label, + }, + }, + config_id: monitor.config_id, + } as OverviewPing; +}; + +export const getIntervalFromTimespan = (timespan: { gte: string; lt: string }) => { + const start = moment(timespan.gte); + const end = moment(timespan.lt); + return end.diff(start, 'seconds'); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/translations.ts b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/translations.ts index 5dced6f8928e5..37a4cd1e12e97 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/alert_rules/translations.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/alert_rules/translations.ts @@ -88,6 +88,15 @@ export const commonMonitorStateI18: Array<{ } ), }, + { + name: 'locationNames', + description: i18n.translate( + 'xpack.synthetics.alertRules.monitorStatus.actionVariables.state.locationNames', + { + defaultMessage: 'Location names from which the checks are performed.', + } + ), + }, { name: 'locationId', description: i18n.translate( diff --git a/x-pack/plugins/observability_solution/synthetics/server/lib.ts b/x-pack/plugins/observability_solution/synthetics/server/lib.ts index 22f5661ca532f..94150c0fb8ee5 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/lib.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/lib.ts @@ -90,7 +90,7 @@ export class SyntheticsEsClient { esRequestStatus = RequestStatus.ERROR; } const isInspectorEnabled = await this.getInspectEnabled(); - if (isInspectorEnabled && this.request) { + if ((isInspectorEnabled || this.isDev) && this.request) { this.inspectableEsQueries.push( getInspectResponse({ esError, @@ -102,7 +102,9 @@ export class SyntheticsEsClient { startTime: startTimeNow, }) ); + } + if (isInspectorEnabled && this.request) { debugESCall({ startTime, request: this.request, @@ -218,9 +220,6 @@ export class SyntheticsEsClient { return {}; } async getInspectEnabled() { - if (this.isDev) { - return true; - } if (!this.uiSettings) { return false; } diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/common.test.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/common.test.ts index 82520c68b5fc4..7e5c0d610e520 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/common.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/common.test.ts @@ -5,8 +5,43 @@ * 2.0. */ +import { parseArrayFilters } from './common'; import { getSavedObjectKqlFilter } from './common'; +describe('common utils', () => { + it('tests parseArrayFilters', () => { + const filters = parseArrayFilters({ + configIds: ['1 4', '2 6', '5'], + }); + expect(filters.filtersStr).toMatchInlineSnapshot( + `"synthetics-monitor.attributes.config_id:(\\"1 4\\" OR \\"2 6\\" OR \\"5\\")"` + ); + }); + it('tests parseArrayFilters with tags and configIds', () => { + const filters = parseArrayFilters({ + configIds: ['1', '2'], + tags: ['tag1', 'tag2'], + }); + expect(filters.filtersStr).toMatchInlineSnapshot( + `"synthetics-monitor.attributes.tags:(\\"tag1\\" OR \\"tag2\\") AND synthetics-monitor.attributes.config_id:(\\"1\\" OR \\"2\\")"` + ); + }); + it('tests parseArrayFilters with all options', () => { + const filters = parseArrayFilters({ + configIds: ['1', '2'], + tags: ['tag1', 'tag2'], + locations: ['loc1', 'loc2'], + monitorTypes: ['type1', 'type2'], + projects: ['project1', 'project2'], + monitorQueryIds: ['query1', 'query2'], + schedules: ['schedule1', 'schedule2'], + }); + expect(filters.filtersStr).toMatchInlineSnapshot( + `"synthetics-monitor.attributes.tags:(\\"tag1\\" OR \\"tag2\\") AND synthetics-monitor.attributes.project_id:(\\"project1\\" OR \\"project2\\") AND synthetics-monitor.attributes.type:(\\"type1\\" OR \\"type2\\") AND synthetics-monitor.attributes.schedule.number:(\\"schedule1\\" OR \\"schedule2\\") AND synthetics-monitor.attributes.id:(\\"query1\\" OR \\"query2\\") AND synthetics-monitor.attributes.config_id:(\\"1\\" OR \\"2\\")"` + ); + }); +}); + describe('getSavedObjectKqlFilter', () => { it('returns empty string if no values are provided', () => { expect(getSavedObjectKqlFilter({ field: 'tags' })).toBe(''); 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 bc58a866bef83..2edb17a77a635 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts @@ -7,6 +7,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 { RouteContext } from './types'; import { MonitorSortFieldSchema } from '../../common/runtime_types/monitor_management/sort_field'; @@ -110,16 +111,7 @@ export const getMonitors = async ( return context.savedObjectsClient.find(findParams); }; -export const getMonitorFilters = async ({ - tags, - filter, - locations, - projects, - monitorTypes, - schedules, - monitorQueryIds, - context, -}: { +interface Filters { filter?: string; tags?: string | string[]; monitorTypes?: string | string[]; @@ -127,10 +119,35 @@ export const getMonitorFilters = async ({ projects?: string | string[]; schedules?: string | string[]; monitorQueryIds?: string | string[]; - context: RouteContext; -}) => { +} + +export const getMonitorFilters = async ( + data: { + context: RouteContext; + } & Filters +) => { + const { context, locations } = data; const locationFilter = await parseLocationFilter(context, locations); + return parseArrayFilters({ + ...data, + locationFilter, + }); +}; + +export const parseArrayFilters = ({ + tags, + filter, + configIds, + projects, + monitorTypes, + schedules, + monitorQueryIds, + locationFilter, +}: Filters & { + locationFilter?: string | string[]; + configIds?: string[]; +}) => { const filtersStr = [ filter, getSavedObjectKqlFilter({ field: 'tags', values: tags }), @@ -139,9 +156,11 @@ export const getMonitorFilters = async ({ getSavedObjectKqlFilter({ field: 'locations.id', values: locationFilter }), getSavedObjectKqlFilter({ field: 'schedule.number', values: schedules }), getSavedObjectKqlFilter({ field: 'id', values: monitorQueryIds }), + getSavedObjectKqlFilter({ field: 'config_id', values: configIds }), ] .filter((f) => !!f) .join(' AND '); + return { filtersStr, locationFilter }; }; @@ -156,7 +175,11 @@ export const getSavedObjectKqlFilter = ({ operator?: string; searchAtRoot?: boolean; }) => { - if (!values) { + if (values === 'All' || (Array.isArray(values) && values?.includes('All'))) { + return undefined; + } + + if (isEmpty(values) || !values) { return ''; } let fieldKey = ''; diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_service_locations.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_service_locations.ts index ca45e74f89004..0f6b398fb6b68 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_service_locations.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_service_locations.ts @@ -17,21 +17,32 @@ import { LocationStatus, } from '../../common/runtime_types'; -export const getDevLocation = (devUrl: string): PublicLocation => ({ - id: 'dev', - label: 'Dev Service', - geo: { lat: 0, lon: 0 }, - url: devUrl, - isServiceManaged: true, - status: LocationStatus.EXPERIMENTAL, - isInvalid: false, -}); +export const getDevLocation = (devUrl: string): PublicLocation[] => [ + { + id: 'dev', + label: 'Dev Service', + geo: { lat: 0, lon: 0 }, + url: devUrl, + isServiceManaged: true, + status: LocationStatus.EXPERIMENTAL, + isInvalid: false, + }, + { + id: 'dev2', + label: 'Dev Service 2', + geo: { lat: 0, lon: 0 }, + url: devUrl, + isServiceManaged: true, + status: LocationStatus.EXPERIMENTAL, + isInvalid: false, + }, +]; export async function getServiceLocations(server: SyntheticsServerSetup) { let locations: PublicLocations = []; if (server.config.service?.devUrl) { - locations = [getDevLocation(server.config.service.devUrl)]; + locations = getDevLocation(server.config.service.devUrl); } const manifestUrl = server.config.service?.manifestUrl; diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.test.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.test.ts index 40f392084942b..fdc41831e8afd 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/synthetics_service.test.ts @@ -200,6 +200,18 @@ describe('SyntheticsService', () => { isServiceManaged: true, status: LocationStatus.EXPERIMENTAL, }, + { + geo: { + lat: 0, + lon: 0, + }, + id: 'dev2', + isInvalid: false, + isServiceManaged: true, + label: 'Dev Service 2', + status: 'experimental', + url: 'http://localhost', + }, ]); }); diff --git a/x-pack/plugins/observability_solution/synthetics/tsconfig.json b/x-pack/plugins/observability_solution/synthetics/tsconfig.json index d0822a733baff..24411ebdcb0c5 100644 --- a/x-pack/plugins/observability_solution/synthetics/tsconfig.json +++ b/x-pack/plugins/observability_solution/synthetics/tsconfig.json @@ -98,6 +98,10 @@ "@kbn/presentation-util-plugin", "@kbn/core-application-browser", "@kbn/dashboard-plugin", + "@kbn/search-types", + "@kbn/slo-schema", + "@kbn/alerting-types", + "@kbn/babel-register", "@kbn/slo-plugin", "@kbn/ebt-tools", "@kbn/alerting-types" diff --git a/x-pack/plugins/observability_solution/uptime/common/rules/uptime_rule_field_map.ts b/x-pack/plugins/observability_solution/uptime/common/rules/uptime_rule_field_map.ts index ca6463416de6b..3b2da879c5288 100644 --- a/x-pack/plugins/observability_solution/uptime/common/rules/uptime_rule_field_map.ts +++ b/x-pack/plugins/observability_solution/uptime/common/rules/uptime_rule_field_map.ts @@ -17,8 +17,14 @@ export const uptimeRuleFieldMap: FieldMap = { type: 'keyword', required: false, }, + 'observer.name': { + type: 'keyword', + array: true, + required: false, + }, 'observer.geo.name': { type: 'keyword', + array: true, required: false, }, // monitor status alert fields @@ -43,6 +49,10 @@ export const uptimeRuleFieldMap: FieldMap = { array: true, required: false, }, + 'monitor.state.id': { + type: 'keyword', + required: false, + }, configId: { type: 'keyword', required: false, @@ -53,10 +63,12 @@ export const uptimeRuleFieldMap: FieldMap = { }, 'location.id': { type: 'keyword', + array: true, required: false, }, 'location.name': { type: 'keyword', + array: true, required: false, }, // tls alert fields diff --git a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.test.ts b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.test.ts index 13d959000c3a8..6054866c7b608 100644 --- a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.test.ts +++ b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.test.ts @@ -113,7 +113,10 @@ const mockCommonAlertDocumentFields = (monitorInfo: GetMonitorStatusResult['moni 'monitor.name': monitorInfo.monitor.name || monitorInfo.monitor.id, 'monitor.type': monitorInfo.monitor.type, 'url.full': monitorInfo.url?.full, - 'observer.geo.name': monitorInfo.observer?.geo?.name, + 'observer.geo.name': monitorInfo.observer?.geo?.name + ? [monitorInfo.observer.geo.name] + : undefined, + 'observer.name': [], }); const mockStatusAlertDocument = ( diff --git a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.ts b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.ts index ea6edf35b6f12..0ce64bc803821 100644 --- a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.ts +++ b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/alerts/status_check.ts @@ -213,8 +213,8 @@ export const getMonitorAlertDocument = (monitorSummary: MonitorSummary) => ({ 'monitor.name': monitorSummary.monitorName, 'monitor.tags': monitorSummary.tags, 'url.full': monitorSummary.monitorUrl, - 'observer.geo.name': monitorSummary.observerLocation, - 'observer.name': monitorSummary.observerName, + 'observer.geo.name': [monitorSummary.observerLocation], + 'observer.name': [monitorSummary.observerName!], 'error.message': monitorSummary.latestErrorMessage, 'agent.name': monitorSummary.observerHostname, [ALERT_REASON]: monitorSummary.reason, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index d1d4e79320a21..c07189b1669d8 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -43888,11 +43888,9 @@ "xpack.synthetics.alertRules.monitorStatus.actionVariables.state.status": "Statut du moniteur (par ex. \"arrêté\").", "xpack.synthetics.alertRules.monitorStatus.browser.label": "navigateur", "xpack.synthetics.alertRules.monitorStatus.host.label": "Hôte", - "xpack.synthetics.alertRules.monitorStatus.reasonMessage": "Le moniteur \"{name}\" de {location} est {status}. Vérifié à {checkedAt}.", "xpack.synthetics.alertRules.monitorStatus.unavailableUrlLabel": "(indisponible)", "xpack.synthetics.alerts.monitorStatus.absoluteLink.label": "- Lien", "xpack.synthetics.alerts.monitorStatus.defaultRecovery.status": "a récupéré", - "xpack.synthetics.alerts.monitorStatus.deleteMonitor.reason": "le moniteur a été supprimé", "xpack.synthetics.alerts.monitorStatus.deleteMonitor.status": "a été supprimé", "xpack.synthetics.alerts.monitorStatus.downLabel": "bas", "xpack.synthetics.alerts.monitorStatus.relativeLink.label": "- Lien relatif", @@ -43902,7 +43900,6 @@ "xpack.synthetics.alerts.monitorStatus.upCheck.status": "est désormais disponible", "xpack.synthetics.alerts.settings.addConnector": "Ajouter un connecteur", "xpack.synthetics.alerts.syntheticsMonitorStatus.clientName": "Statut du moniteur", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoverySubjectMessage": "\"{monitorName}\" ({locationName}) {recoveryStatus} - Elastic Synthetics", "xpack.synthetics.alerts.syntheticsMonitorStatus.description": "Alerte lorsqu'un moniteur est arrêté.", "xpack.synthetics.alerts.syntheticsMonitorTLS.defaultRecoverySubjectMessage": "L'alerte a été résolue pour le certificat {commonName} - Elastic Synthetics", "xpack.synthetics.alerts.syntheticsMonitorTLS.defaultSubjectMessage": "L'alerte a été déclenchée pour le certificat {commonName} - Elastic Synthetics", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 75cf864832ceb..bc63fd4be919f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -43627,11 +43627,9 @@ "xpack.synthetics.alertRules.monitorStatus.actionVariables.state.status": "監視ステータス(例:「ダウン」)。", "xpack.synthetics.alertRules.monitorStatus.browser.label": "ブラウザー", "xpack.synthetics.alertRules.monitorStatus.host.label": "ホスト", - "xpack.synthetics.alertRules.monitorStatus.reasonMessage": "{location}のモニター\"{name}\"は{status}です。{checkedAt}に確認されました。", "xpack.synthetics.alertRules.monitorStatus.unavailableUrlLabel": "(使用不可)", "xpack.synthetics.alerts.monitorStatus.absoluteLink.label": "- リンク", "xpack.synthetics.alerts.monitorStatus.defaultRecovery.status": "回復しました", - "xpack.synthetics.alerts.monitorStatus.deleteMonitor.reason": "モニターが削除されました", "xpack.synthetics.alerts.monitorStatus.deleteMonitor.status": "が削除されました", "xpack.synthetics.alerts.monitorStatus.downLabel": "ダウン", "xpack.synthetics.alerts.monitorStatus.relativeLink.label": "- 相対リンク", @@ -43641,10 +43639,6 @@ "xpack.synthetics.alerts.monitorStatus.upCheck.status": "現在起動しています", "xpack.synthetics.alerts.settings.addConnector": "コネクターの追加", "xpack.synthetics.alerts.syntheticsMonitorStatus.clientName": "監視ステータス", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultActionMessage": "{locationName}の\"{monitorName}\"は{status}です - Elastic Synthetics\n\n詳細:\n\n- モニター名:{monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- モニタータイプ:{monitorType} \n- 確認日時:{checkedAt} \n- 開始場所:{locationName} \n- 受信したエラー:{lastErrorMessage} \n{linkMessage}", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoveryMessage": "{locationName}の\"{monitorName}\"のアラートはアクティブではありません:{recoveryReason} - Elastic Synthetics\n\n詳細:\n\n- モニター名:{monitorName} \n- {monitorUrlLabel}: {monitorUrl} \n- モニタータイプ:{monitorType} \n- 開始場所:{locationName} \n- 前回受信したエラー:{lastErrorMessage} \n{linkMessage}", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoverySubjectMessage": "\"{monitorName}\" ({locationName}) {recoveryStatus} - Elastic Synthetics", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultSubjectMessage": "\"{monitorName}\" ({locationName})は停止しています - Elastic Synthetics", "xpack.synthetics.alerts.syntheticsMonitorStatus.description": "モニターがダウンしているときにアラートを通知します。", "xpack.synthetics.alerts.syntheticsMonitorTLS.defaultRecoverySubjectMessage": "証明書{commonName}のアラートが解決しました - Elastic Synthetics", "xpack.synthetics.alerts.syntheticsMonitorTLS.defaultSubjectMessage": "証明書{commonName}のアラートがトリガーされました - Elastic Synthetics", @@ -44486,8 +44480,6 @@ "xpack.synthetics.rules.tls.agingLabel": "古すぎます", "xpack.synthetics.rules.tls.clientName": "シンセティックTLS", "xpack.synthetics.rules.tls.criteriaExpression.ariaLabel": "このアラートで監視されているモニターの条件を示す式", - "xpack.synthetics.rules.tls.defaultActionMessage": "TLS証明書{commonName} {status} - Elastic Synthetics\n\n詳細:\n\n- 概要:{summary}\n- 共通名:{commonName}\n- 発行元:{issuer}\n- モニター:{monitorName} \n- モニターURL:{monitorUrl} \n- モニタータイプ:{monitorType} \n- 開始場所:{locationName}", - "xpack.synthetics.rules.tls.defaultRecoveryMessage": "モニター\"{monitorName}\"のTLSアラートが回復しました - Elastic Synthetics\n\n詳細:\n\n- 概要:{summary}\n- 新しいステータス:{newStatus}\n- 前のステータス:{previousStatus}\n- モニター:{monitorName} \n- URL:{monitorUrl} \n- モニタータイプ:{monitorType} \n- 開始場所:{locationName}", "xpack.synthetics.rules.tls.description": "シンセティック監視のTLS証明書の有効期限が近いときにアラートを発行します。", "xpack.synthetics.rules.tls.expiredLabel": "有効期限切れです", "xpack.synthetics.rules.tls.expiringLabel": "まもなく有効期限切れです", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index d7f138cdc84a2..10a7f0e566fef 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -43678,11 +43678,9 @@ "xpack.synthetics.alertRules.monitorStatus.actionVariables.state.status": "监测状态(例如“关闭”)。", "xpack.synthetics.alertRules.monitorStatus.browser.label": "浏览器", "xpack.synthetics.alertRules.monitorStatus.host.label": "主机", - "xpack.synthetics.alertRules.monitorStatus.reasonMessage": "来自 {location} 的监测“{name}”为 {status} 状态。已于 {checkedAt} 检查。", "xpack.synthetics.alertRules.monitorStatus.unavailableUrlLabel": "(不可用)", "xpack.synthetics.alerts.monitorStatus.absoluteLink.label": "- 链接", "xpack.synthetics.alerts.monitorStatus.defaultRecovery.status": "已恢复", - "xpack.synthetics.alerts.monitorStatus.deleteMonitor.reason": "此监测已删除", "xpack.synthetics.alerts.monitorStatus.deleteMonitor.status": "已删除", "xpack.synthetics.alerts.monitorStatus.downLabel": "关闭", "xpack.synthetics.alerts.monitorStatus.relativeLink.label": "- 相对链接", @@ -43692,10 +43690,6 @@ "xpack.synthetics.alerts.monitorStatus.upCheck.status": "现已打开", "xpack.synthetics.alerts.settings.addConnector": "添加连接器", "xpack.synthetics.alerts.syntheticsMonitorStatus.clientName": "监测状态", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultActionMessage": "来自 {locationName} 的“{monitorName}”为 {status}。- Elastic Synthetics\n\n详情:\n\n- 监测名称:{monitorName} \n- {monitorUrlLabel}:{monitorUrl} \n- 监测类型:{monitorType} \n- 检查时间:{checkedAt} \n- 来自:{locationName} \n- 收到错误:{lastErrorMessage} \n{linkMessage}", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoveryMessage": "来自 {locationName} 的“{monitorName}”的告警不再处于活动状态:{recoveryReason}。- Elastic Synthetics\n\n详情:\n\n- 监测名称:{monitorName} \n- {monitorUrlLabel}:{monitorUrl} \n- 监测类型:{monitorType} \n- 来自:{locationName} \n- 收到的上一个错误:{lastErrorMessage} \n{linkMessage}", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultRecoverySubjectMessage": "“{monitorName}”({locationName}) {recoveryStatus} - Elastic Synthetics", - "xpack.synthetics.alerts.syntheticsMonitorStatus.defaultSubjectMessage": "“{monitorName}”({locationName}) 已关闭 - Elastic Synthetics", "xpack.synthetics.alerts.syntheticsMonitorStatus.description": "监测关闭时告警。", "xpack.synthetics.alerts.syntheticsMonitorTLS.defaultRecoverySubjectMessage": "告警已解析证书 {commonName} - Elastic Synthetics", "xpack.synthetics.alerts.syntheticsMonitorTLS.defaultSubjectMessage": "已针对证书 {commonName} 触发告警 - Elastic Synthetics", @@ -44537,8 +44531,6 @@ "xpack.synthetics.rules.tls.agingLabel": "过旧", "xpack.synthetics.rules.tls.clientName": "Synthetics TLS", "xpack.synthetics.rules.tls.criteriaExpression.ariaLabel": "显示正由此告警监视的监测条件的表达式", - "xpack.synthetics.rules.tls.defaultActionMessage": "TLS 证书 {commonName} {status} - Elastic Synthetics\n\n详情:\n\n- 摘要:{summary}\n- 常见名称:{commonName}\n- 颁发者:{issuer}\n- 监测:{monitorName} \n- 监测 URL:{monitorUrl} \n- 监测类型:{monitorType} \n- 来自:{locationName}", - "xpack.synthetics.rules.tls.defaultRecoveryMessage": "监测“{monitorName}”的 TLS 告警已恢复 - Elastic Synthetics\n\n详情:\n\n- 摘要:{summary}\n- 新状态:{newStatus}\n- 之前的状态:{previousStatus}\n- 监测:{monitorName} \n- URL:{monitorUrl} \n- 监测类型:{monitorType} \n- 来自:{locationName}", "xpack.synthetics.rules.tls.description": "Synthetics 监测的 TLS 证书即将到期时告警。", "xpack.synthetics.rules.tls.expiredLabel": "已过期", "xpack.synthetics.rules.tls.expiringLabel": "即将到期", diff --git a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/for_the_last.tsx b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/for_the_last.tsx index 6814fa11ddcae..808c9f8b1bae4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/for_the_last.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/for_the_last.tsx @@ -24,6 +24,7 @@ import { ClosablePopoverTitle } from './components'; import { IErrorObject } from '../../types'; export interface ForLastExpressionProps { + description?: string; timeWindowSize?: number; timeWindowUnit?: string; errors: IErrorObject; @@ -45,6 +46,12 @@ export interface ForLastExpressionProps { display?: 'fullWidth' | 'inline'; } +const FOR_LAST_LABEL = i18n.translate( + 'xpack.triggersActionsUI.common.expressionItems.forTheLast.descriptionLabel', + { + defaultMessage: 'for the last', + } +); export const ForLastExpression = ({ timeWindowSize, timeWindowUnit = 's', @@ -53,6 +60,7 @@ export const ForLastExpression = ({ onChangeWindowSize, onChangeWindowUnit, popupPosition, + description = FOR_LAST_LABEL, }: ForLastExpressionProps) => { const [alertDurationPopoverOpen, setAlertDurationPopoverOpen] = useState(false); @@ -60,12 +68,7 @@ export const ForLastExpression = ({ 0} + isInvalid={Number(errors.timeWindowSize?.length) > 0} error={errors.timeWindowSize as string[]} > 0} + isInvalid={Number(errors.timeWindowSize?.length) > 0} min={0} value={timeWindowSize || ''} onChange={(e) => { diff --git a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/value.tsx b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/value.tsx index 63c516dfea57e..5080b902c7775 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/value.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/value.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState } from 'react'; +import React, { ReactNode, useState } from 'react'; import { EuiExpression, EuiPopover, @@ -20,6 +20,7 @@ import { IErrorObject } from '../../types'; export interface ValueExpressionProps { description: string; value: number; + valueLabel?: string | ReactNode; onChangeSelectedValue: (updatedValue: number) => void; popupPosition?: | 'upCenter' @@ -41,6 +42,7 @@ export interface ValueExpressionProps { export const ValueExpression = ({ description, value, + valueLabel, onChangeSelectedValue, display = 'inline', popupPosition, @@ -53,7 +55,7 @@ export const ValueExpression = ({ { diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts index 1faadc6041634..943135565428f 100644 --- a/x-pack/test/alerting_api_integration/common/config.ts +++ b/x-pack/test/alerting_api_integration/common/config.ts @@ -354,6 +354,10 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) '--xpack.task_manager.allow_reading_invalid_state=false', '--xpack.actions.queued.max=500', `--xpack.stack_connectors.enableExperimental=${JSON.stringify(experimentalFeatures)}`, + '--xpack.uptime.service.password=test', + '--xpack.uptime.service.username=localKibanaIntegrationTestsUser', + '--xpack.uptime.service.devUrl=mockDevUrl', + '--xpack.uptime.service.manifestUrl=mockDevUrl', ], }, }; diff --git a/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts b/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts index 1a66aa2fcd9ed..c4ec1a9180541 100644 --- a/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts +++ b/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts @@ -7,6 +7,7 @@ import type { Client } from '@elastic/elasticsearch'; import type { Agent as SuperTestAgent } from 'supertest'; +import expect from '@kbn/expect'; import { ToolingLog } from '@kbn/tooling-log'; import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; import { refreshSavedObjectIndices } from './refresh_index'; @@ -62,7 +63,7 @@ export async function createRule({ logger: ToolingLog; esClient: Client; }) { - const { body } = await supertest + const { body, status } = await supertest .post(`/api/alerting/rule`) .set('kbn-xsrf', 'foo') .send({ @@ -75,8 +76,9 @@ export async function createRule({ name, rule_type_id: ruleTypeId, actions, - }) - .expect(200); + }); + + expect(status).to.eql(200, JSON.stringify(body)); await refreshSavedObjectIndices(esClient); logger.debug(`Created rule id: ${body.id}`); diff --git a/x-pack/test/alerting_api_integration/observability/helpers/alerting_wait_for_helpers.ts b/x-pack/test/alerting_api_integration/observability/helpers/alerting_wait_for_helpers.ts index 17f45b8129d91..edc5ca8d35a60 100644 --- a/x-pack/test/alerting_api_integration/observability/helpers/alerting_wait_for_helpers.ts +++ b/x-pack/test/alerting_api_integration/observability/helpers/alerting_wait_for_helpers.ts @@ -14,6 +14,7 @@ import type { SearchResponse, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { RetryService } from '@kbn/ftr-common-functional-services'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { retry } from '../../common/retry'; const TIMEOUT = 70_000; @@ -63,6 +64,7 @@ export async function waitForDocumentInIndex({ timeout = TIMEOUT, retries = RETRIES, retryDelay = RETRY_DELAY, + filters, }: { esClient: Client; indexName: string; @@ -72,6 +74,7 @@ export async function waitForDocumentInIndex({ timeout?: number; retries?: number; retryDelay?: number; + filters?: QueryDslQueryContainer[]; }): Promise>> { return await retry>>({ testFn: async () => { @@ -79,6 +82,15 @@ export async function waitForDocumentInIndex({ index: indexName, rest_total_hits_as_int: true, ignore_unavailable: true, + body: filters + ? { + query: { + bool: { + filter: filters, + }, + }, + } + : undefined, }); if (!response.hits.total || (response.hits.total as number) < docCountTarget) { logger.debug(`Document count is ${response.hits.total}, should be ${docCountTarget}`); @@ -104,12 +116,16 @@ export async function waitForAlertInIndex({ ruleId, retryService, logger, + filters = [], + retryDelay, }: { esClient: Client; indexName: string; ruleId: string; retryService: RetryService; logger: ToolingLog; + filters?: QueryDslQueryContainer[]; + retryDelay?: number; }): Promise>> { return await retry>>({ testFn: async () => { @@ -117,14 +133,21 @@ export async function waitForAlertInIndex({ index: indexName, body: { query: { - term: { - 'kibana.alert.rule.uuid': ruleId, + bool: { + filter: [ + { + term: { + 'kibana.alert.rule.uuid': ruleId, + }, + }, + ...filters, + ], }, }, }, }); if (response.hits.hits.length === 0) { - throw new Error('No hits found'); + throw new Error(`No hits found for the ruleId: ${ruleId}`); } return response; }, @@ -133,6 +156,6 @@ export async function waitForAlertInIndex({ retryService, timeout: TIMEOUT, retries: RETRIES, - retryDelay: RETRY_DELAY, + retryDelay: retryDelay ?? RETRY_DELAY, }); } diff --git a/x-pack/test/alerting_api_integration/observability/index.ts b/x-pack/test/alerting_api_integration/observability/index.ts index 812123dd96b13..547c05a46bfcd 100644 --- a/x-pack/test/alerting_api_integration/observability/index.ts +++ b/x-pack/test/alerting_api_integration/observability/index.ts @@ -21,7 +21,8 @@ export default function ({ loadTestFile }: any) { loadTestFile(require.resolve('./custom_threshold_rule_data_view')); }); describe('Synthetics', () => { - loadTestFile(require.resolve('./synthetics_rule')); + loadTestFile(require.resolve('./synthetics/synthetics_default_rule')); + loadTestFile(require.resolve('./synthetics/custom_status_rule')); }); }); } diff --git a/x-pack/test/alerting_api_integration/observability/synthetics/custom_status_rule.ts b/x-pack/test/alerting_api_integration/observability/synthetics/custom_status_rule.ts new file mode 100644 index 0000000000000..6600054e03ab9 --- /dev/null +++ b/x-pack/test/alerting_api_integration/observability/synthetics/custom_status_rule.ts @@ -0,0 +1,1000 @@ +/* + * Copyright 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 moment from 'moment'; +import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import { StatusRuleParams } from '@kbn/synthetics-plugin/common/rules/status_rule'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { SyntheticsRuleHelper, SYNTHETICS_ALERT_ACTION_INDEX } from './synthetics_rule_helper'; +import { waitForDocumentInIndex } from '../helpers/alerting_wait_for_helpers'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService }: FtrProviderContext) { + const server = getService('kibanaServer'); + const retryService = getService('retry'); + const ruleHelper = new SyntheticsRuleHelper(getService); + const logger = getService('log'); + const esClient = getService('es'); + const esDeleteAllIndices = getService('esDeleteAllIndices'); + const supertest = getService('supertest'); + + describe('SyntheticsCustomStatusRule', () => { + const SYNTHETICS_RULE_ALERT_INDEX = '.alerts-observability.uptime.alerts-default'; + + before(async () => { + await server.savedObjects.cleanStandardList(); + await esDeleteAllIndices([SYNTHETICS_ALERT_ACTION_INDEX]); + await ruleHelper.createIndexAction(); + await supertest + .put(SYNTHETICS_API_URLS.SYNTHETICS_ENABLEMENT) + .set('kbn-xsrf', 'true') + .expect(200); + }); + + after(async () => { + await server.savedObjects.cleanStandardList(); + await esDeleteAllIndices([SYNTHETICS_ALERT_ACTION_INDEX]); + await esClient.deleteByQuery({ + index: SYNTHETICS_RULE_ALERT_INDEX, + query: { match_all: {} }, + }); + }); + + /* 1. create a monitor + 2. create a custom rule + 3. create a down check scenario + 4. verify alert + 5. create an up check scenario + 6. verify recovered alert + when verifying recovered alert check: + - reason + - recoveryReason + - recoveryStatus + - locationNames + - link message + - locationId + when down recovered alert check + - reason + - locationNames + - link message + - locationId + */ + + describe('NumberOfChecks - location threshold = 1 - grouped by location - 1 location down', () => { + let ruleId = ''; + let monitor: any; + let docs: any[] = []; + + it('creates a monitor', async () => { + monitor = await ruleHelper.addMonitor('Monitor check based at ' + moment().format('LLL')); + expect(monitor).to.have.property('id'); + + docs = await ruleHelper.makeSummaries({ + monitor, + downChecks: 5, + }); + }); + + it('creates a custom rule', async () => { + const params = { + condition: { + locationsThreshold: 1, + window: { + numberOfChecks: 5, + }, + groupBy: 'locationId', + downThreshold: 5, + }, + monitorIds: [monitor.id], + }; + const rule = await ruleHelper.createCustomStatusRule({ + params, + name: 'When down 5 times from 1 location', + }); + ruleId = rule.id; + expect(rule.params).to.eql(params); + }); + + it('should trigger down alert', async function () { + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + }); + + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" from Dev Service is down. Monitor is down 5 times within the last 5 checks. Alert when 5 out of the last 5 checks are down from at least 1 location.` + ); + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(downResponse.hits.hits[0]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service is down. Monitor is down 5 times within the last 5 checks. Alert when 5 out of the last 5 checks are down from at least 1 location.` + ); + expect(downResponse.hits.hits[0]._source).property('locationNames', 'Dev Service'); + expect(downResponse.hits.hits[0]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(downResponse.hits.hits[0]._source).property('locationId', 'dev'); + }); + + it('should trigger recovered alert', async function () { + docs = await ruleHelper.makeSummaries({ + monitor, + upChecks: 1, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [{ term: { 'kibana.alert.status': 'recovered' } }], + }); + + const alert = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'recovered'); + const recoveredResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 2, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(recoveredResponse.hits.hits[1]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service is recovered. Alert when 5 out of the last 5 checks are down from at least 1 location.` + ); + expect(recoveredResponse.hits.hits[1]._source).property('locationNames', 'Dev Service'); + expect(recoveredResponse.hits.hits[1]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(recoveredResponse.hits.hits[1]._source).property('locationId', 'dev'); + expect(recoveredResponse.hits.hits[1]._source).property( + 'recoveryReason', + `the monitor is now up again. It ran successfully at ${moment(docs[0]['@timestamp']) + .tz('UTC') + .format('MMM D, YYYY @ HH:mm:ss.SSS')}` + ); + expect(recoveredResponse.hits.hits[1]._source).property('recoveryStatus', 'is now up'); + }); + }); + + describe('NumberOfChecks - Location threshold = 1 - grouped by location - 2 down locations', () => { + let ruleId = ''; + let monitor: any; + + it('creates a monitor', async () => { + monitor = await ruleHelper.addMonitor('Monitor location based at ' + moment().format('LT')); + expect(monitor).to.have.property('id'); + }); + + it('creates a custom rule with 1 location threshold grouped by location', async () => { + const params: StatusRuleParams = { + condition: { + window: { + numberOfChecks: 1, + }, + groupBy: 'locationId', + locationsThreshold: 1, + downThreshold: 1, + }, + monitorIds: [monitor.id], + }; + + const rule = await ruleHelper.createCustomStatusRule({ + params, + }); + ruleId = rule.id; + expect(rule.params).to.eql(params); + + await ruleHelper.makeSummaries({ + monitor, + downChecks: 1, + location: { + id: 'dev2', + label: 'Dev Service 2', + }, + }); + const downDocs = await ruleHelper.makeSummaries({ + monitor, + downChecks: 1, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'active' } }, + { term: { 'monitor.id': monitor.id } }, + { range: { '@timestamp': { gte: downDocs[0]['@timestamp'] } } }, + ], + }); + + response.hits.hits.forEach((hit: any) => { + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" from ${alert['location.name']} is down. Monitor is down 1 time within the last 1 checks. Alert when 1 out of the last 1 checks are down from at least 1 location.` + ); + }); + + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + locationNames: string; + locationId: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 2, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + const lastTwoHits = downResponse.hits.hits.slice(-2).map((hit) => hit._source); + + lastTwoHits.forEach((hit) => { + expect(hit).property( + 'reason', + `Monitor "${monitor.name}" from ${hit?.locationNames} is down. Monitor is down 1 time within the last 1 checks. Alert when 1 out of the last 1 checks are down from at least 1 location.` + ); + expect(hit).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=${hit?.locationId}` + ); + }); + }); + }); + + describe('NumberOfChecks - location threshold = 1 - ungrouped - 1 down location', () => { + let ruleId = ''; + let monitor: any; + let docs: any[] = []; + + it('creates a monitor', async () => { + monitor = await ruleHelper.addMonitor( + `Monitor check based at ${moment().format('LLL')} ungrouped` + ); + expect(monitor).to.have.property('id'); + }); + + it('creates a custom rule with 1 location threshold ungrouped', async () => { + const params = { + condition: { + locationsThreshold: 1, + window: { + numberOfChecks: 5, + }, + groupBy: 'none', + downThreshold: 5, + }, + monitorIds: [monitor.id], + }; + const rule = await ruleHelper.createCustomStatusRule({ + params, + name: 'Status based on number of checks', + }); + ruleId = rule.id; + expect(rule.params).to.eql(params); + }); + + it('should trigger down for ungrouped', async () => { + docs = await ruleHelper.makeSummaries({ + monitor, + downChecks: 5, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'active' } }, + { term: { 'monitor.id': monitor.id } }, + { range: { '@timestamp': { gte: docs[0]['@timestamp'] } } }, + ], + }); + + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" is down 5 times from Dev Service. Alert when down 5 times out of the last 5 checks from at least 1 location.` + ); + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 1, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(downResponse.hits.hits[0]._source).property( + 'reason', + `Monitor "${monitor.name}" is down 5 times from Dev Service. Alert when down 5 times out of the last 5 checks from at least 1 location.` + ); + expect(downResponse.hits.hits[0]._source).property('locationNames', 'Dev Service'); + expect(downResponse.hits.hits[0]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(downResponse.hits.hits[0]._source).property('locationId', 'dev'); + }); + + it('should trigger recovered alert', async () => { + const upDocs = await ruleHelper.makeSummaries({ + monitor, + upChecks: 1, + }); + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'recovered' } }, + { term: { 'monitor.id': monitor.id } }, + { range: { '@timestamp': { gte: upDocs[0]['@timestamp'] } } }, + ], + }); + expect(response.hits.hits?.[0]._source).property('kibana.alert.status', 'recovered'); + const recoveredResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 2, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(recoveredResponse.hits.hits[1]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service is recovered. Alert when 5 out of the last 5 checks are down from at least 1 location.` + ); + expect(recoveredResponse.hits.hits[1]._source).property('locationNames', 'Dev Service'); + expect(recoveredResponse.hits.hits[1]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(recoveredResponse.hits.hits[1]._source).property('locationId', 'dev'); + expect(recoveredResponse.hits.hits[1]._source).property( + 'recoveryReason', + 'the alert condition is no longer met' + ); + expect(recoveredResponse.hits.hits[1]._source).property('recoveryStatus', 'has recovered'); + }); + }); + + describe('NumberOfChecks - Location threshold > 1 - ungrouped - 2 down locations', () => { + let ruleId = ''; + let monitor: any; + + it('creates a monitor', async () => { + monitor = await ruleHelper.addMonitor( + `Monitor location based at ${moment().format('LT')} ungrouped 2 locations` + ); + expect(monitor).to.have.property('id'); + }); + + it('creates a custom rule with location threshold', async () => { + const params: StatusRuleParams = { + condition: { + locationsThreshold: 2, + window: { + numberOfChecks: 1, + }, + groupBy: 'none', + downThreshold: 1, + }, + monitorIds: [monitor.id], + }; + const rule = await ruleHelper.createCustomStatusRule({ + params, + name: 'When down from 2 locations', + }); + ruleId = rule.id; + expect(rule.params).to.eql(params); + }); + + it('should not trigger down alert based on location threshold with one location down', async () => { + // first down check from dev 1 + const docs = await ruleHelper.makeSummaries({ + monitor, + downChecks: 1, + }); + // ensure alert does not fire + try { + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'active' } }, + { + term: { 'monitor.id': monitor.id }, + }, + { + range: { + '@timestamp': { + gte: docs[0]['@timestamp'], + }, + }, + }, + ], + }); + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" is down from 1 location (Dev Service). Alert when monitor is down from 1 location.` + ); + throw new Error('Alert was triggered when condition should not be met'); + } catch (e) { + if (e.message === 'Alert was triggered when condition should not be met') { + throw e; + } + } + }); + + it('should trigger down alert based on location threshold with two locations down', async () => { + // 1st down check from dev 2 + await ruleHelper.makeSummaries({ + monitor, + downChecks: 1, + location: { + id: 'dev2', + label: 'Dev Service 2', + }, + }); + // 2nd down check from dev 1 + const downDocs = await ruleHelper.makeSummaries({ + monitor, + downChecks: 1, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'active' } }, + { + term: { 'monitor.id': monitor.id }, + }, + { + range: { + '@timestamp': { + gte: downDocs[0]['@timestamp'], + }, + }, + }, + ], + }); + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" is down 1 time from Dev Service and 1 time from Dev Service 2. Alert when down 1 time out of the last 1 checks from at least 2 locations.` + ); + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(downResponse.hits.hits[0]._source).property( + 'reason', + `Monitor "${monitor.name}" is down 1 time from Dev Service and 1 time from Dev Service 2. Alert when down 1 time out of the last 1 checks from at least 2 locations.` + ); + expect(downResponse.hits.hits[0]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(downResponse.hits.hits[0]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(downResponse.hits.hits[0]._source).property('locationId', 'dev and dev2'); + }); + + it('should trigger recovered alert', async () => { + const docs = await ruleHelper.makeSummaries({ + monitor, + upChecks: 1, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'recovered' } }, + { + term: { 'monitor.id': monitor.id }, + }, + { + range: { + '@timestamp': { + gte: docs[0]['@timestamp'], + }, + }, + }, + ], + }); + + const alert = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'recovered'); + const recoveryResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 2, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(recoveryResponse.hits.hits[1]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service and Dev Service 2 is recovered. Alert when 1 out of the last 1 checks are down from at least 2 locations.` + ); + expect(recoveryResponse.hits.hits[1]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(recoveryResponse.hits.hits[1]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(recoveryResponse.hits.hits[1]._source).property('locationId', 'dev and dev2'); + }); + + let downDocs: any[] = []; + + it('should be down again', async () => { + downDocs = await ruleHelper.makeSummaries({ + monitor, + downChecks: 1, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'active' } }, + { term: { 'monitor.id': monitor.id } }, + { range: { '@timestamp': { gte: downDocs[0]['@timestamp'] } } }, + ], + }); + + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" is down 1 time from Dev Service and 1 time from Dev Service 2. Alert when down 1 time out of the last 1 checks from at least 2 locations.` + ); + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 3, + filters: [{ term: { 'monitor.id': monitor.id } }], + }); + expect(downResponse.hits.hits[2]._source).property( + 'reason', + `Monitor "${monitor.name}" is down 1 time from Dev Service and 1 time from Dev Service 2. Alert when down 1 time out of the last 1 checks from at least 2 locations.` + ); + expect(downResponse.hits.hits[2]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(downResponse.hits.hits[2]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(downResponse.hits.hits[2]._source).property('locationId', 'dev and dev2'); + }); + + it('should trigger recovered alert when the location threshold is no longer met', async () => { + // 2nd down check from dev 1 + const upDocs = await ruleHelper.makeSummaries({ + monitor, + upChecks: 1, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'recovered' } }, + { term: { 'monitor.id': monitor.id } }, + { range: { '@timestamp': { gte: upDocs[0]['@timestamp'] } } }, + ], + }); + const alert = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'recovered'); + const recoveryResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + docCountTarget: 4, + filters: [{ term: { 'monitor.id': monitor.id } }], + }); + expect(recoveryResponse.hits.hits[3]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service and Dev Service 2 is recovered. Alert when 1 out of the last 1 checks are down from at least 2 locations.` + ); + expect(recoveryResponse.hits.hits[3]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(recoveryResponse.hits.hits[3]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(recoveryResponse.hits.hits[3]._source).property('locationId', 'dev and dev2'); + expect(recoveryResponse.hits.hits[3]._source).property( + 'recoveryReason', + 'the alert condition is no longer met' + ); + expect(recoveryResponse.hits.hits[3]._source).property('recoveryStatus', 'has recovered'); + }); + }); + + describe('TimeWindow - Location threshold = 1 - grouped by location - 1 down location', () => { + let ruleId = ''; + let monitor: any; + + it('creates a monitor', async () => { + monitor = await ruleHelper.addMonitor('Monitor time based at ' + moment().format('LT')); + expect(monitor).to.have.property('id'); + }); + + it('creates a custom rule with time based window', async () => { + const params: StatusRuleParams = { + condition: { + locationsThreshold: 1, + window: { + time: { + unit: 'm', + size: 5, + }, + }, + groupBy: 'locationId', + downThreshold: 5, + }, + monitorIds: [monitor.id], + }; + const rule = await ruleHelper.createCustomStatusRule({ + params, + name: 'Status based on checks in a time window', + }); + expect(rule).to.have.property('id'); + ruleId = rule.id; + expect(rule.params).to.eql(params); + }); + + it('should trigger down alert', async function () { + await ruleHelper.makeSummaries({ + monitor, + downChecks: 5, + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [{ term: { 'monitor.id': monitor.id } }], + }); + + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" from Dev Service is down. Alert when 5 checks are down within the last 5 minutes from at least 1 location.` + ); + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + expect(downResponse.hits.hits[0]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service is down. Alert when 5 checks are down within the last 5 minutes from at least 1 location.` + ); + expect(downResponse.hits.hits[0]._source).property('locationNames', 'Dev Service'); + expect(downResponse.hits.hits[0]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(downResponse.hits.hits[0]._source).property('locationId', 'dev'); + }); + + it('should trigger recovered alert', async function () { + // wait 1 minute for at least 1 down check to fall out of the time window + await new Promise((resolve) => setTimeout(resolve, 30_000)); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'recovered' } }, + { term: { 'monitor.id': monitor.id } }, + ], + }); + + const alert = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'recovered'); + const recoveryResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + docCountTarget: 2, + }); + expect(recoveryResponse.hits.hits[1]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service is recovered. Alert when 5 checks are down within the last 5 minutes from at least 1 location.` + ); + expect(recoveryResponse.hits.hits[1]._source).property( + 'recoveryReason', + 'the alert condition is no longer met' + ); + expect(recoveryResponse.hits.hits[1]._source).property('recoveryStatus', 'has recovered'); + expect(recoveryResponse.hits.hits[1]._source).property('locationNames', 'Dev Service'); + expect(recoveryResponse.hits.hits[1]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(recoveryResponse.hits.hits[1]._source).property('locationId', 'dev'); + }); + }); + + describe('TimeWindow - Location threshold = 1 - grouped by location - 2 down location', () => { + let ruleId = ''; + let monitor: any; + + it('creates a monitor', async () => { + monitor = await ruleHelper.addMonitor( + `Monitor time based at ${moment().format('LT')} grouped 2 locations` + ); + expect(monitor).to.have.property('id'); + }); + + it('creates a custom rule with time based window', async () => { + const params: StatusRuleParams = { + condition: { + window: { + time: { + unit: 'm', + size: 5, + }, + }, + groupBy: 'locationId', + locationsThreshold: 2, + downThreshold: 5, + }, + monitorIds: [monitor.id], + }; + const rule = await ruleHelper.createCustomStatusRule({ + params, + name: 'Status based on checks in a time window when down from 2 locations', + }); + expect(rule).to.have.property('id'); + ruleId = rule.id; + expect(rule.params).to.eql(params); + }); + + it('should trigger down alert', async function () { + // Generate data for 2 locations + await ruleHelper.makeSummaries({ + monitor, + downChecks: 5, + location: monitor.locations[0], + }); + await ruleHelper.makeSummaries({ + monitor, + downChecks: 5, + location: monitor.locations[1], + }); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [{ term: { 'monitor.id': monitor.id } }], + }); + + const alert: any = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'active'); + expect(alert['kibana.alert.reason']).to.eql( + `Monitor "${monitor.name}" is down 5 times from Dev Service and 5 times from Dev Service 2. Alert when down 5 times within the last 5 minutes from at least 2 locations.` + ); + const downResponse = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + }); + + expect(downResponse.hits.hits[0]._source).property( + 'reason', + `Monitor "${monitor.name}" is down 5 times from Dev Service and 5 times from Dev Service 2. Alert when down 5 times within the last 5 minutes from at least 2 locations.` + ); + expect(downResponse.hits.hits[0]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(downResponse.hits.hits[0]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(downResponse.hits.hits[0]._source).property('locationId', 'dev and dev2'); + }); + + it('should trigger alert action', async function () { + const alertAction = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + docCountTarget: 1, + }); + + expect(alertAction.hits.hits[0]._source).property( + 'reason', + `Monitor "${monitor.name}" is down 5 times from Dev Service and 5 times from Dev Service 2. Alert when down 5 times within the last 5 minutes from at least 2 locations.` + ); + expect(alertAction.hits.hits[0]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(alertAction.hits.hits[0]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(alertAction.hits.hits[0]._source).property('locationId', 'dev and dev2'); + }); + + it('should trigger recovered alert', async function () { + // wait 30 secs for at least 1 down check to fall out of the time window + await new Promise((resolve) => setTimeout(resolve, 30_000)); + + const response = await ruleHelper.waitForStatusAlert({ + ruleId, + filters: [ + { term: { 'kibana.alert.status': 'recovered' } }, + { term: { 'monitor.id': monitor.id } }, + ], + }); + + const alert = response.hits.hits?.[0]._source; + expect(alert).to.have.property('kibana.alert.status', 'recovered'); + const recoveryAction = await waitForDocumentInIndex<{ + ruleType: string; + alertDetailsUrl: string; + reason: string; + }>({ + esClient, + indexName: SYNTHETICS_ALERT_ACTION_INDEX, + retryService, + logger, + filters: [ + { + term: { 'monitor.id': monitor.id }, + }, + ], + docCountTarget: 2, + }); + + expect(recoveryAction.hits.hits[1]._source).property( + 'reason', + `Monitor "${monitor.name}" from Dev Service and Dev Service 2 is recovered. Alert when 5 checks are down within the last 5 minutes from at least 2 locations.` + ); + expect(recoveryAction.hits.hits[1]._source).property( + 'recoveryReason', + 'the alert condition is no longer met' + ); + expect(recoveryAction.hits.hits[1]._source).property('recoveryStatus', 'has recovered'); + expect(recoveryAction.hits.hits[1]._source).property( + 'locationNames', + 'Dev Service and Dev Service 2' + ); + expect(recoveryAction.hits.hits[1]._source).property( + 'linkMessage', + `- Link: https://localhost:5601/app/synthetics/monitor/${monitor.id}/errors/Test%20private%20location-18524a3d9a7-0?locationId=dev` + ); + expect(recoveryAction.hits.hits[1]._source).property('locationId', 'dev and dev2'); + }); + }); + + // TimeWindow - Location threshold = 1 - ungrouped - 1 down location + + // TimeWindow - Location threshold > 1 - ungrouped - 2 down locations + }); +} diff --git a/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts b/x-pack/test/alerting_api_integration/observability/synthetics/data.ts similarity index 59% rename from x-pack/test/alerting_api_integration/observability/synthetics_rule.ts rename to x-pack/test/alerting_api_integration/observability/synthetics/data.ts index 864d73a991e50..566bb410d6321 100644 --- a/x-pack/test/alerting_api_integration/observability/synthetics_rule.ts +++ b/x-pack/test/alerting_api_integration/observability/synthetics/data.ts @@ -5,132 +5,13 @@ * 2.0. */ -import expect from '@kbn/expect'; -import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; -import { omit } from 'lodash'; -import { TlsTranslations } from '@kbn/synthetics-plugin/common/rules/synthetics/translations'; -import { FtrProviderContext } from '../common/ftr_provider_context'; +import { + SyntheticsMonitorStatusTranslations, + TlsTranslations, +} from '@kbn/synthetics-plugin/common/rules/synthetics/translations'; +import { SanitizedRule } from '@kbn/alerting-types'; -// eslint-disable-next-line import/no-default-export -export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - const server = getService('kibanaServer'); - - const testActions = [ - 'custom.ssl.noCustom', - 'notification-email', - 'preconfigured-es-index-action', - 'my-deprecated-servicenow', - 'my-slack1', - ]; - - describe('SyntheticsRules', () => { - before(async () => { - await server.savedObjects.cleanStandardList(); - }); - - after(async () => { - await server.savedObjects.cleanStandardList(); - }); - - it('creates rule when settings are configured', async () => { - await supertest - .put(SYNTHETICS_API_URLS.DYNAMIC_SETTINGS) - .set('kbn-xsrf', 'true') - .send({ - certExpirationThreshold: 30, - certAgeThreshold: 730, - defaultConnectors: testActions.slice(0, 2), - defaultEmail: { to: ['test@gmail.com'], cc: [], bcc: [] }, - }) - .expect(200); - - const response = await supertest - .post(SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING) - .set('kbn-xsrf', 'true') - .send(); - const statusResult = response.body.statusRule; - const tlsResult = response.body.tlsRule; - expect(statusResult.actions.length).eql(4); - expect(tlsResult.actions.length).eql(4); - - compareRules(statusResult, statusRule); - compareRules(tlsResult, tlsRule); - - testActions.slice(0, 2).forEach((action) => { - const { recoveredAction, firingAction } = getActionById(statusRule, action); - const resultAction = getActionById(statusResult, action); - expect(firingAction).eql(resultAction.firingAction); - expect(recoveredAction).eql(resultAction.recoveredAction); - }); - - testActions.slice(0, 2).forEach((action) => { - const { recoveredAction, firingAction } = getActionById(tlsRule, action); - const resultAction = getActionById(tlsResult, action); - expect(firingAction).eql(resultAction.firingAction); - expect(recoveredAction).eql(resultAction.recoveredAction); - }); - }); - - it('updates rules when settings are updated', async () => { - await supertest - .put(SYNTHETICS_API_URLS.DYNAMIC_SETTINGS) - .set('kbn-xsrf', 'true') - .send({ - certExpirationThreshold: 30, - certAgeThreshold: 730, - defaultConnectors: testActions, - defaultEmail: { to: ['test@gmail.com'], cc: [], bcc: [] }, - }) - .expect(200); - - const response = await supertest - .put(SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING) - .set('kbn-xsrf', 'true') - .send(); - - const statusResult = response.body.statusRule; - const tlsResult = response.body.tlsRule; - expect(statusResult.actions.length).eql(9); - expect(tlsResult.actions.length).eql(9); - - compareRules(statusResult, statusRule); - compareRules(tlsResult, tlsRule); - - testActions.forEach((action) => { - const { recoveredAction, firingAction } = getActionById(statusRule, action); - const resultAction = getActionById(statusResult, action); - expect(firingAction).eql(resultAction.firingAction); - expect(recoveredAction).eql(resultAction.recoveredAction); - }); - testActions.forEach((action) => { - const { recoveredAction, firingAction } = getActionById(tlsRule, action); - const resultAction = getActionById(tlsResult, action); - expect(firingAction).eql(resultAction.firingAction); - expect(recoveredAction).eql(resultAction.recoveredAction); - }); - }); - }); -} -const compareRules = (rule1: SanitizedRule, rule2: SanitizedRule) => { - expect(rule1.alertTypeId).eql(rule2.alertTypeId); - expect(rule1.schedule).eql(rule2.schedule); -}; - -const getActionById = (rule: SanitizedRule, id: string) => { - const actions = rule.actions.filter((action) => action.id === id); - const recoveredAction = actions.find( - (action) => 'group' in action && action.group === 'recovered' - ); - const firingAction = actions.find((action) => 'group' in action && action.group !== 'recovered'); - return { - recoveredAction: omit(recoveredAction, ['uuid']), - firingAction: omit(firingAction, ['uuid']), - }; -}; - -const statusRule = { +export const statusRule = { id: 'dbbc39f0-1781-11ee-80b9-6522650f1d50', notifyWhen: null, consumer: 'uptime', @@ -152,7 +33,7 @@ const statusRule = { { group: 'recovered', params: { - body: 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationName}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + body: SyntheticsMonitorStatusTranslations.defaultRecoveryMessage, }, frequency: { notifyWhen: 'onActionGroupChange', throttle: null, summary: false }, uuid: '789f2b81-e098-4f33-9802-1d355f4fabbe', @@ -162,7 +43,7 @@ const statusRule = { { group: 'xpack.synthetics.alerts.actionGroups.monitorStatus', params: { - body: '"{{context.monitorName}}" is {{{context.status}}} from {{context.locationName}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- Checked at: {{context.checkedAt}} \n- From: {{context.locationName}} \n- Error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + body: SyntheticsMonitorStatusTranslations.defaultActionMessage, }, frequency: { notifyWhen: 'onActionGroupChange', throttle: null, summary: false }, uuid: '1b3f3958-f019-4ca0-b6b1-ccc4cf51d501', @@ -173,10 +54,8 @@ const statusRule = { group: 'recovered', params: { to: ['test@gmail.com'], - subject: - '"{{context.monitorName}}" ({{context.locationName}}) {{context.recoveryStatus}} - Elastic Synthetics', - message: - 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationName}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + subject: SyntheticsMonitorStatusTranslations.defaultRecoverySubjectMessage, + message: SyntheticsMonitorStatusTranslations.defaultRecoveryMessage, messageHTML: null, cc: [], bcc: [], @@ -191,10 +70,8 @@ const statusRule = { group: 'xpack.synthetics.alerts.actionGroups.monitorStatus', params: { to: ['test@gmail.com'], - subject: - '"{{context.monitorName}}" ({{context.locationName}}) is down - Elastic Synthetics', - message: - '"{{context.monitorName}}" is {{{context.status}}} from {{context.locationName}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- Checked at: {{context.checkedAt}} \n- From: {{context.locationName}} \n- Error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + subject: SyntheticsMonitorStatusTranslations.defaultSubjectMessage, + message: SyntheticsMonitorStatusTranslations.defaultActionMessage, messageHTML: null, cc: [], bcc: [], @@ -250,10 +127,8 @@ const statusRule = { subAction: 'pushToService', subActionParams: { incident: { - short_description: - '"{{context.monitorName}}" is {{{context.status}}} from {{context.locationName}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- Checked at: {{context.checkedAt}} \n- From: {{context.locationName}} \n- Error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', - description: - '"{{context.monitorName}}" is {{{context.status}}} from {{context.locationName}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- Checked at: {{context.checkedAt}} \n- From: {{context.locationName}} \n- Error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + short_description: SyntheticsMonitorStatusTranslations.defaultActionMessage, + description: SyntheticsMonitorStatusTranslations.defaultActionMessage, impact: '2', severity: '2', urgency: '2', @@ -275,8 +150,7 @@ const statusRule = { { group: 'recovered', params: { - message: - 'The alert for "{{context.monitorName}}" from {{context.locationName}} is no longer active: {{context.recoveryReason}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- From: {{context.locationName}} \n- Last error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + message: SyntheticsMonitorStatusTranslations.defaultRecoveryMessage, }, frequency: { notifyWhen: 'onActionGroupChange', throttle: null, summary: false }, uuid: '2d73f370-a90c-4347-8480-753cbeae719f', @@ -286,8 +160,7 @@ const statusRule = { { group: 'xpack.synthetics.alerts.actionGroups.monitorStatus', params: { - message: - '"{{context.monitorName}}" is {{{context.status}}} from {{context.locationName}}. - Elastic Synthetics\n\nDetails:\n\n- Monitor name: {{context.monitorName}} \n- {{context.monitorUrlLabel}}: {{{context.monitorUrl}}} \n- Monitor type: {{context.monitorType}} \n- Checked at: {{context.checkedAt}} \n- From: {{context.locationName}} \n- Error received: {{{context.lastErrorMessage}}} \n{{{context.linkMessage}}}', + message: SyntheticsMonitorStatusTranslations.defaultActionMessage, }, frequency: { notifyWhen: 'onActionGroupChange', throttle: null, summary: false }, uuid: '1c5d0dd1-c360-4e14-8e4f-f24aa5c640c6', @@ -339,7 +212,8 @@ const statusRule = { }, ruleTypeId: 'xpack.synthetics.alerts.monitorStatus', } as unknown as SanitizedRule; -const tlsRule = { + +export const tlsRule = { id: 'dbbc12e0-1781-11ee-80b9-6522650f1d50', notifyWhen: null, consumer: 'uptime', diff --git a/x-pack/test/alerting_api_integration/observability/synthetics/private_location_test_service.ts b/x-pack/test/alerting_api_integration/observability/synthetics/private_location_test_service.ts new file mode 100644 index 0000000000000..e9ac7237dca52 --- /dev/null +++ b/x-pack/test/alerting_api_integration/observability/synthetics/private_location_test_service.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 { v4 as uuidv4 } from 'uuid'; +import { privateLocationsSavedObjectName } from '@kbn/synthetics-plugin/common/saved_objects/private_locations'; +import { privateLocationsSavedObjectId } from '@kbn/synthetics-plugin/server/saved_objects/private_locations'; +import { SyntheticsPrivateLocations } from '@kbn/synthetics-plugin/common/runtime_types'; +import { Agent as SuperTestAgent } from 'supertest'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +export const INSTALLED_VERSION = '1.1.1'; + +export class PrivateLocationTestService { + private supertest: SuperTestAgent; + private readonly getService: FtrProviderContext['getService']; + + constructor(getService: FtrProviderContext['getService']) { + this.supertest = getService('supertest'); + this.getService = getService; + } + + async installSyntheticsPackage() { + await this.supertest.post('/api/fleet/setup').set('kbn-xsrf', 'true').send().expect(200); + const response = await this.supertest + .get(`/api/fleet/epm/packages/synthetics/${INSTALLED_VERSION}`) + .set('kbn-xsrf', 'true') + .expect(200); + if (response.body.item.status !== 'installed') { + await this.supertest + .post(`/api/fleet/epm/packages/synthetics/${INSTALLED_VERSION}`) + .set('kbn-xsrf', 'true') + .send({ force: true }) + .expect(200); + } + } + + async addTestPrivateLocation() { + const apiResponse = await this.addFleetPolicy(uuidv4()); + const testPolicyId = apiResponse.body.item.id; + return (await this.setTestLocations([testPolicyId]))[0]; + } + + async addFleetPolicy(name: string) { + return this.supertest + .post('/api/fleet/agent_policies?sys_monitoring=true') + .set('kbn-xsrf', 'true') + .send({ + name, + description: '', + namespace: 'default', + monitoring_enabled: [], + }) + .expect(200); + } + + async setTestLocations(testFleetPolicyIds: string[]) { + const server = this.getService('kibanaServer'); + + const locations: SyntheticsPrivateLocations = testFleetPolicyIds.map((id, index) => ({ + label: 'Test private location ' + index, + agentPolicyId: id, + id, + geo: { + lat: 0, + lon: 0, + }, + isServiceManaged: false, + })); + + await server.savedObjects.create({ + type: privateLocationsSavedObjectName, + id: privateLocationsSavedObjectId, + attributes: { + locations, + }, + overwrite: true, + }); + return locations; + } +} diff --git a/x-pack/test/alerting_api_integration/observability/synthetics/synthetics_default_rule.ts b/x-pack/test/alerting_api_integration/observability/synthetics/synthetics_default_rule.ts new file mode 100644 index 0000000000000..39f36b71b52ee --- /dev/null +++ b/x-pack/test/alerting_api_integration/observability/synthetics/synthetics_default_rule.ts @@ -0,0 +1,131 @@ +/* + * Copyright 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 { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import { omit } from 'lodash'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { statusRule, tlsRule } from './data'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const server = getService('kibanaServer'); + + const testActions = [ + 'custom.ssl.noCustom', + 'notification-email', + 'preconfigured-es-index-action', + 'my-deprecated-servicenow', + 'my-slack1', + ]; + + describe('SyntheticsDefaultRules', () => { + before(async () => { + await server.savedObjects.cleanStandardList(); + }); + + after(async () => { + await server.savedObjects.cleanStandardList(); + }); + + it('creates rule when settings are configured', async () => { + await supertest + .put(SYNTHETICS_API_URLS.DYNAMIC_SETTINGS) + .set('kbn-xsrf', 'true') + .send({ + certExpirationThreshold: 30, + certAgeThreshold: 730, + defaultConnectors: testActions.slice(0, 2), + defaultEmail: { to: ['test@gmail.com'], cc: [], bcc: [] }, + }) + .expect(200); + + const response = await supertest + .post(SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING) + .set('kbn-xsrf', 'true') + .send(); + const statusResult = response.body.statusRule; + const tlsResult = response.body.tlsRule; + expect(statusResult.actions.length).eql(4); + expect(tlsResult.actions.length).eql(4); + + compareRules(statusResult, statusRule); + compareRules(tlsResult, tlsRule); + + testActions.slice(0, 2).forEach((action) => { + const { recoveredAction, firingAction } = getActionById(statusRule, action); + const resultAction = getActionById(statusResult, action); + expect(firingAction).eql(resultAction.firingAction); + expect(recoveredAction).eql(resultAction.recoveredAction); + }); + + testActions.slice(0, 2).forEach((action) => { + const { recoveredAction, firingAction } = getActionById(tlsRule, action); + const resultAction = getActionById(tlsResult, action); + expect(firingAction).eql(resultAction.firingAction); + expect(recoveredAction).eql(resultAction.recoveredAction); + }); + }); + + it('updates rules when settings are updated', async () => { + await supertest + .put(SYNTHETICS_API_URLS.DYNAMIC_SETTINGS) + .set('kbn-xsrf', 'true') + .send({ + certExpirationThreshold: 30, + certAgeThreshold: 730, + defaultConnectors: testActions, + defaultEmail: { to: ['test@gmail.com'], cc: [], bcc: [] }, + }) + .expect(200); + + const response = await supertest + .put(SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING) + .set('kbn-xsrf', 'true') + .send(); + + const statusResult = response.body.statusRule; + const tlsResult = response.body.tlsRule; + expect(statusResult.actions.length).eql(9); + expect(tlsResult.actions.length).eql(9); + + compareRules(statusResult, statusRule); + compareRules(tlsResult, tlsRule); + + testActions.forEach((action) => { + const { recoveredAction, firingAction } = getActionById(statusRule, action); + const resultAction = getActionById(statusResult, action); + expect(firingAction).eql(resultAction.firingAction); + expect(recoveredAction).eql(resultAction.recoveredAction); + }); + testActions.forEach((action) => { + const { recoveredAction, firingAction } = getActionById(tlsRule, action); + const resultAction = getActionById(tlsResult, action); + expect(firingAction).eql(resultAction.firingAction); + expect(recoveredAction).eql(resultAction.recoveredAction); + }); + }); + }); +} +const compareRules = (rule1: SanitizedRule, rule2: SanitizedRule) => { + expect(rule1.alertTypeId).eql(rule2.alertTypeId); + expect(rule1.schedule).eql(rule2.schedule); +}; + +const getActionById = (rule: SanitizedRule, id: string) => { + const actions = rule.actions.filter((action) => action.id === id); + const recoveredAction = actions.find( + (action) => 'group' in action && action.group === 'recovered' + ); + const firingAction = actions.find((action) => 'group' in action && action.group !== 'recovered'); + return { + recoveredAction: omit(recoveredAction, ['uuid']), + firingAction: omit(firingAction, ['uuid']), + }; +}; diff --git a/x-pack/test/alerting_api_integration/observability/synthetics/synthetics_rule_helper.ts b/x-pack/test/alerting_api_integration/observability/synthetics/synthetics_rule_helper.ts new file mode 100644 index 0000000000000..9321bc0935a80 --- /dev/null +++ b/x-pack/test/alerting_api_integration/observability/synthetics/synthetics_rule_helper.ts @@ -0,0 +1,292 @@ +/* + * Copyright 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 { StatusRuleParams } from '@kbn/synthetics-plugin/common/rules/status_rule'; +import type { Client } from '@elastic/elasticsearch'; +import { ToolingLog } from '@kbn/tooling-log'; +import { makeDownSummary, makeUpSummary } from '@kbn/observability-synthetics-test-data'; +import { RetryService } from '@kbn/ftr-common-functional-services'; +import { EncryptedSyntheticsSavedMonitor } from '@kbn/synthetics-plugin/common/runtime_types'; +import moment from 'moment'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { Agent as SuperTestAgent } from 'supertest'; +import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import expect from '@kbn/expect'; +import { waitForAlertInIndex } from '../helpers/alerting_wait_for_helpers'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { PrivateLocationTestService } from './private_location_test_service'; +import { createIndexConnector, createRule } from '../helpers/alerting_api_helper'; + +export const SYNTHETICS_ALERT_ACTION_INDEX = 'alert-action-synthetics'; +export class SyntheticsRuleHelper { + supertest: SuperTestAgent; + logger: ToolingLog; + esClient: Client; + retryService: RetryService; + locService: PrivateLocationTestService; + alertActionIndex: string; + actionId: string | null = null; + + constructor(getService: FtrProviderContext['getService']) { + this.esClient = getService('es'); + this.supertest = getService('supertest'); + this.logger = getService('log'); + this.retryService = getService('retry'); + this.locService = new PrivateLocationTestService(getService); + this.alertActionIndex = SYNTHETICS_ALERT_ACTION_INDEX; + } + + async createIndexAction() { + await this.esClient.indices.create({ + index: this.alertActionIndex, + body: { + mappings: { + properties: { + 'monitor.id': { + type: 'keyword', + }, + }, + }, + }, + }); + const actionId = await createIndexConnector({ + supertest: this.supertest, + name: 'Index Connector: Synthetics API test', + indexName: this.alertActionIndex, + logger: this.logger, + }); + this.actionId = actionId; + } + + async createCustomStatusRule({ + params, + name, + }: { + params: StatusRuleParams; + name?: string; + actions?: any[]; + }) { + if (this.actionId === null) { + throw new Error('Index action not created. Call createIndexAction() first'); + } + return await createRule({ + params, + name: name ?? 'Custom status rule', + ruleTypeId: 'xpack.synthetics.alerts.monitorStatus', + consumer: 'alerts', + supertest: this.supertest, + esClient: this.esClient, + logger: this.logger, + schedule: { interval: '15s' }, + actions: [ + { + group: 'recovered', + id: this.actionId, + params: { + documents: [ + { + status: 'recovered', + reason: '{{context.reason}}', + locationNames: '{{context.locationNames}}', + locationId: '{{context.locationId}}', + linkMessage: '{{context.linkMessage}}', + recoveryReason: '{{context.recoveryReason}}', + recoveryStatus: '{{context.recoveryStatus}}', + 'monitor.id': '{{context.monitorId}}', + }, + ], + }, + frequency: { + notify_when: 'onActionGroupChange', + throttle: null, + summary: false, + }, + }, + { + group: 'xpack.synthetics.alerts.actionGroups.monitorStatus', + id: this.actionId, + params: { + documents: [ + { + status: 'active', + reason: '{{context.reason}}', + locationNames: '{{context.locationNames}}', + locationId: '{{context.locationId}}', + linkMessage: '{{context.linkMessage}}', + 'monitor.id': '{{context.monitorId}}', + }, + ], + }, + frequency: { + notify_when: 'onActionGroupChange', + throttle: null, + summary: false, + }, + }, + ], + }); + } + + async addMonitor(name: string) { + const testData = { + locations: [ + { id: 'dev', isServiceManaged: true, label: 'Dev Service' }, + { id: 'dev2', isServiceManaged: true, label: 'Dev Service 2' }, + ], + name, + type: 'http', + url: 'http://www.google.com', + schedule: 1, + }; + const res = await this.supertest + .post(SYNTHETICS_API_URLS.SYNTHETICS_MONITORS) + .set('kbn-xsrf', 'true') + .send(testData); + + expect(res.status).to.eql(200, JSON.stringify(res.body)); + + return res.body as EncryptedSyntheticsSavedMonitor; + } + + async deleteMonitor(monitorId: string) { + const res = await this.supertest + .delete(SYNTHETICS_API_URLS.SYNTHETICS_MONITORS + '/' + monitorId) + .set('kbn-xsrf', 'true') + .send(); + + expect(res.status).to.eql(200); + } + + async updateTestMonitor(monitorId: string, updates: Record) { + const result = await this.supertest + .put(SYNTHETICS_API_URLS.SYNTHETICS_MONITORS + `/${monitorId}`) + .set('kbn-xsrf', 'true') + .send(updates); + + expect(result.status).to.eql(200, JSON.stringify(result.body)); + + return result.body as EncryptedSyntheticsSavedMonitor; + } + + async addPrivateLocation() { + await this.locService.installSyntheticsPackage(); + return this.locService.addTestPrivateLocation(); + } + + async waitForStatusAlert({ + ruleId, + filters, + }: { + ruleId: string; + filters?: QueryDslQueryContainer[]; + }) { + return await waitForAlertInIndex({ + ruleId, + filters, + esClient: this.esClient, + retryService: this.retryService, + logger: this.logger, + indexName: '.internal.alerts-observability.uptime.alerts-default*', + retryDelay: 1000, + }); + } + + async makeSummaries({ + downChecks = 0, + upChecks = 0, + monitor, + location, + }: { + downChecks?: number; + upChecks?: number; + monitor: EncryptedSyntheticsSavedMonitor; + location?: { + id: string; + label: string; + }; + }) { + const docs = []; + // lets make some down checks + for (let i = downChecks; i > 0; i--) { + const doc = await this.addSummaryDocument({ + monitor, + location, + status: 'down', + timestamp: moment() + .subtract(i - 1, 'minutes') + .toISOString(), + }); + docs.push(doc); + } + + // lets make some up checks + for (let i = upChecks; i > 0; i--) { + const doc = await this.addSummaryDocument({ + monitor, + location, + status: 'up', + timestamp: moment() + .subtract(i - 1, 'minutes') + .toISOString(), + }); + docs.push(doc); + } + return docs; + } + + async addSummaryDocument({ + monitor, + location, + status = 'up', + timestamp = new Date(Date.now()).toISOString(), + }: { + monitor: EncryptedSyntheticsSavedMonitor; + status?: 'up' | 'down'; + timestamp?: string; + location?: { + id: string; + label: string; + }; + }) { + let document = { + '@timestamp': timestamp, + }; + + const index = 'synthetics-http-default'; + + const commonData = { + timestamp, + location, + monitorId: monitor.id, + name: monitor.name, + configId: monitor.config_id, + }; + + if (status === 'down') { + document = { + ...makeDownSummary(commonData), + ...document, + }; + } else { + document = { + ...makeUpSummary(commonData), + ...document, + }; + } + + this.logger.debug( + `created synthetics summary, status: ${status}, monitor: "${monitor.name}", location: "${location?.label}"` + ); + await this.esClient.index({ + index, + document, + refresh: true, + }); + + return document; + } +} diff --git a/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts b/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts index 044e66fe239f7..051ae14396687 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts @@ -10,7 +10,6 @@ import { v4 as uuidv4 } from 'uuid'; import { ConfigKey, HTTPFields, - LocationStatus, PrivateLocation, ServiceLocation, } from '@kbn/synthetics-plugin/common/runtime_types'; @@ -19,6 +18,7 @@ import { formatKibanaNamespace } from '@kbn/synthetics-plugin/common/formatters' import { omit } from 'lodash'; import { PackagePolicy } from '@kbn/fleet-plugin/common'; import expect from '@kbn/expect'; +import { getDevLocation } from '@kbn/synthetics-plugin/server/synthetics_service/get_service_locations'; import { FtrProviderContext } from '../../ftr_provider_context'; import { getFixtureJson } from './helper/get_fixture_json'; import { comparePolicies, getTestSyntheticsPolicy } from './sample_data/test_policy'; @@ -79,15 +79,7 @@ export default function ({ getService }: FtrProviderContext) { const apiResponse = await supertestAPI.get(SYNTHETICS_API_URLS.SERVICE_LOCATIONS); const testResponse: Array = [ - { - id: 'dev', - label: 'Dev Service', - geo: { lat: 0, lon: 0 }, - url: 'mockDevUrl', - isServiceManaged: true, - status: LocationStatus.EXPERIMENTAL, - isInvalid: false, - }, + ...getDevLocation('mockDevUrl'), { id: testFleetPolicyID, isServiceManaged: false, diff --git a/x-pack/test/api_integration/apis/synthetics/add_monitor_project.ts b/x-pack/test/api_integration/apis/synthetics/add_monitor_project.ts index bd6f94a44f6c1..9654a2bc43404 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_monitor_project.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_monitor_project.ts @@ -2036,7 +2036,7 @@ export default function ({ getService }: FtrProviderContext) { failedMonitors: [ { details: - "Invalid locations specified. Elastic managed Location(s) 'does not exist' not found. Available locations are 'dev'", + "Invalid locations specified. Elastic managed Location(s) 'does not exist' not found. Available locations are 'dev|dev2'", id: httpProjectMonitors.monitors[1].id, payload: { 'check.request': { diff --git a/x-pack/test/api_integration/apis/synthetics/add_monitor_public_api.ts b/x-pack/test/api_integration/apis/synthetics/add_monitor_public_api.ts index 5da370d1c634f..082d1aebd6d76 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_monitor_public_api.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_monitor_public_api.ts @@ -44,7 +44,7 @@ export default function ({ getService }: FtrProviderContext) { it('return error if invalid location specified', async () => { const { message } = await addMonitorAPI({ type: 'http', locations: ['mars'] }, 400); expect(message).eql( - "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev'" + "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev|dev2'" ); }); @@ -68,7 +68,7 @@ export default function ({ getService }: FtrProviderContext) { 400 ); expect(result.message).eql( - "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev' Private Location(s) 'moon' not found. No private location available to use." + "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev|dev2' Private Location(s) 'moon' not found. No private location available to use." ); }); diff --git a/x-pack/test/api_integration/apis/synthetics/edit_monitor_public_api.ts b/x-pack/test/api_integration/apis/synthetics/edit_monitor_public_api.ts index fa7c780a2d971..e52d83ce9b263 100644 --- a/x-pack/test/api_integration/apis/synthetics/edit_monitor_public_api.ts +++ b/x-pack/test/api_integration/apis/synthetics/edit_monitor_public_api.ts @@ -115,7 +115,7 @@ export default function ({ getService }: FtrProviderContext) { 400 ); expect(message).eql( - "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev'" + "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev|dev2'" ); }); @@ -141,7 +141,7 @@ export default function ({ getService }: FtrProviderContext) { 400 ); expect(result.message).eql( - "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev' Private Location(s) 'moon' not found. No private location available to use." + "Invalid locations specified. Elastic managed Location(s) 'mars' not found. Available locations are 'dev|dev2' Private Location(s) 'moon' not found. No private location available to use." ); }); diff --git a/x-pack/test/api_integration/apis/synthetics/suggestions.ts b/x-pack/test/api_integration/apis/synthetics/suggestions.ts index dab822f832c08..043c1c4da0ee6 100644 --- a/x-pack/test/api_integration/apis/synthetics/suggestions.ts +++ b/x-pack/test/api_integration/apis/synthetics/suggestions.ts @@ -154,13 +154,6 @@ export default function ({ getService }: FtrProviderContext) { value: expect.any(String), })), ]), - projects: [ - { - count: 2, - label: project, - value: project, - }, - ], monitorTypes: [ { count: 20, @@ -173,6 +166,13 @@ export default function ({ getService }: FtrProviderContext) { value: 'icmp', }, ], + projects: [ + { + count: 2, + label: project, + value: project, + }, + ], tags: expect.arrayContaining([ { count: 21, @@ -242,23 +242,18 @@ export default function ({ getService }: FtrProviderContext) { value: expect.any(String), })) ), - projects: [ + monitorTypes: [ { count: 2, - label: project, - value: project, + label: 'icmp', + value: 'icmp', }, ], - monitorTypes: [ - // { - // count: 20, - // label: 'http', - // value: 'http', - // }, + projects: [ { count: 2, - label: 'icmp', - value: 'icmp', + label: project, + value: project, }, ], tags: expect.arrayContaining([ diff --git a/x-pack/test/api_integration/apis/synthetics/sync_global_params.ts b/x-pack/test/api_integration/apis/synthetics/sync_global_params.ts index c262cc3c79bdc..8e0aaeff21580 100644 --- a/x-pack/test/api_integration/apis/synthetics/sync_global_params.ts +++ b/x-pack/test/api_integration/apis/synthetics/sync_global_params.ts @@ -82,6 +82,15 @@ export default function ({ getService }: FtrProviderContext) { status: LocationStatus.EXPERIMENTAL, isInvalid: false, }, + { + id: 'dev2', + label: 'Dev Service 2', + geo: { lat: 0, lon: 0 }, + url: 'mockDevUrl', + isServiceManaged: true, + status: LocationStatus.EXPERIMENTAL, + isInvalid: false, + }, { id: testFleetPolicyID, isInvalid: false, diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 8918b2848bc36..038e9baa5086a 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -168,6 +168,8 @@ "@kbn/reporting-server", "@kbn/data-quality-plugin", "@kbn/ml-trained-models-utils", + "@kbn/observability-synthetics-test-data", + "@kbn/ml-trained-models-utils", "@kbn/openapi-common", "@kbn/securitysolution-lists-common", "@kbn/securitysolution-exceptions-common", @@ -181,6 +183,7 @@ "@kbn/management-settings-ids", "@kbn/mock-idp-utils", "@kbn/cloud-security-posture-common", - "@kbn/saved-objects-management-plugin" + "@kbn/saved-objects-management-plugin", + "@kbn/alerting-types" ] } diff --git a/yarn.lock b/yarn.lock index acedd70e165ec..696a443817d64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5883,6 +5883,10 @@ version "0.0.0" uid "" +"@kbn/observability-synthetics-test-data@link:x-pack/packages/observability/synthetics_test_data": + version "0.0.0" + uid "" + "@kbn/observability-utils@link:x-pack/packages/observability/observability_utils": version "0.0.0" uid "" From d570d60b0bd950faaebf39e3e2f4f7481c116ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 1 Oct 2024 18:50:47 +0200 Subject: [PATCH 075/107] Upgrade http dependencies (#180986) Co-authored-by: florent-leborgne Co-authored-by: Rudolf Meijering --- docs/setup/settings.asciidoc | 2 +- package.json | 23 +- .../src/router.ts | 22 +- .../src/cookie_session_storage.ts | 4 +- .../src/http_server.ts | 2 - .../src/transform_error/index.ts | 11 +- .../src/default_validation_error_handler.ts | 4 +- renovate.json | 9 + .../http/http_server.test.ts | 15 +- .../api_emulator/lib/emulator_server.types.ts | 2 +- yarn.lock | 551 ++++++++---------- 11 files changed, 310 insertions(+), 335 deletions(-) diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 98968780f3368..1a094fc37e880 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -450,7 +450,7 @@ responses to the client from the {kib} server, and specifies what value is used. Header names and values to send on all responses to the client from the {kib} server. *Default: `{}`* [[server-shutdownTimeout]] `server.shutdownTimeout`:: -Sets the grace period for {kib} to attempt to resolve any ongoing HTTP requests after receiving a `SIGTERM`/`SIGINT` signal, and before shutting down. Any new HTTP requests received during this period are rejected with a `503` response. *Default: `30s`* +Sets the grace period for {kib} to attempt to resolve any ongoing HTTP requests after receiving a `SIGTERM`/`SIGINT` signal, and before shutting down. Any new HTTP requests received during this period are rejected, because the incoming socket is closed without further processing. *Default: `30s`* [[server-host]] `server.host`:: This setting specifies the host of the diff --git a/package.json b/package.json index 1a372d63dfcf0..9c19effacf164 100644 --- a/package.json +++ b/package.json @@ -142,14 +142,14 @@ "@formatjs/ts-transformer": "^3.13.14", "@google/generative-ai": "^0.7.0", "@grpc/grpc-js": "^1.8.22", - "@hapi/accept": "^5.0.2", - "@hapi/boom": "^9.1.4", - "@hapi/cookie": "^11.0.2", - "@hapi/h2o2": "^9.1.0", - "@hapi/hapi": "^20.2.2", - "@hapi/hoek": "^9.2.1", - "@hapi/inert": "^6.0.4", - "@hapi/wreck": "^17.1.0", + "@hapi/accept": "^6.0.3", + "@hapi/boom": "^10.0.1", + "@hapi/cookie": "^12.0.1", + "@hapi/h2o2": "^10.0.4", + "@hapi/hapi": "^21.3.10", + "@hapi/hoek": "^11.0.4", + "@hapi/inert": "^7.1.0", + "@hapi/wreck": "^18.1.0", "@hello-pangea/dnd": "16.6.0", "@kbn/aad-fixtures-plugin": "link:x-pack/test/alerting_api_integration/common/plugins/aad", "@kbn/ace": "link:packages/kbn-ace", @@ -1058,7 +1058,7 @@ "blurhash": "^2.0.1", "borc": "3.0.0", "brace": "0.11.1", - "brok": "^5.0.2", + "brok": "^6.0.0", "byte-size": "^8.1.0", "cacheable-lookup": "6", "camelcase-keys": "7.0.2", @@ -1553,10 +1553,7 @@ "@types/geojson": "^7946.0.10", "@types/getos": "^3.0.0", "@types/gulp": "^4.0.6", - "@types/hapi__cookie": "^10.1.3", - "@types/hapi__h2o2": "^8.3.3", - "@types/hapi__hapi": "^20.0.9", - "@types/hapi__inert": "^5.2.3", + "@types/hapi__cookie": "^12.0.5", "@types/has-ansi": "^3.0.0", "@types/he": "^1.1.1", "@types/history": "^4.7.9", diff --git a/packages/core/http/core-http-router-server-internal/src/router.ts b/packages/core/http/core-http-router-server-internal/src/router.ts index ddfa8980cb8f2..52363e7ea95be 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.ts @@ -270,18 +270,24 @@ export class Router; + handler: RequestHandlerEnhanced< + P, + Q, + B, + // request.method's type contains way more verbs than we currently support + typeof request.method extends RouteMethod ? typeof request.method : any + >; routeSchemas?: RouteValidator; }) { - let kibanaRequest: KibanaRequest; + let kibanaRequest: KibanaRequest< + P, + Q, + B, + typeof request.method extends RouteMethod ? typeof request.method : any + >; const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit); try { - kibanaRequest = CoreKibanaRequest.from(request, routeSchemas) as KibanaRequest< - P, - Q, - B, - typeof request.method - >; + kibanaRequest = CoreKibanaRequest.from(request, routeSchemas); } catch (error) { this.logError('400 Bad Request', 400, { request, error }); return hapiResponseAdapter.toBadRequest(error.message); diff --git a/packages/core/http/core-http-server-internal/src/cookie_session_storage.ts b/packages/core/http/core-http-server-internal/src/cookie_session_storage.ts index d10c834f6bc8a..722ba968e56b1 100644 --- a/packages/core/http/core-http-server-internal/src/cookie_session_storage.ts +++ b/packages/core/http/core-http-server-internal/src/cookie_session_storage.ts @@ -121,12 +121,12 @@ export async function createCookieSessionStorageFactory( } }, }, - validateFunc: async (req: Request, session: T | T[]) => { + validate: async (req: Request, session: T | T[]) => { const result = cookieOptions.validate(session); if (!result.isValid) { clearInvalidCookie(req, result.path); } - return { valid: result.isValid }; + return { isValid: result.isValid }; }, }); diff --git a/packages/core/http/core-http-server-internal/src/http_server.ts b/packages/core/http/core-http-server-internal/src/http_server.ts index 4f3c96518cefc..46470bac7c504 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.ts @@ -15,7 +15,6 @@ import { createServer, getServerOptions, setTlsConfig, getRequestId } from '@kbn import type { Duration } from 'moment'; import { Observable, Subscription, firstValueFrom, pairwise, take } from 'rxjs'; import apm from 'elastic-apm-node'; -// @ts-expect-error no type definition import Brok from 'brok'; import type { Logger, LoggerFactory } from '@kbn/logging'; import type { InternalExecutionContextSetup } from '@kbn/core-execution-context-server-internal'; @@ -722,7 +721,6 @@ export class HttpServer { // validation applied in ./http_tools#getServerOptions // (All NP routes are already required to specify their own validation in order to access the payload) validate, - // @ts-expect-error Types are outdated and doesn't allow `payload.multipart` to be `true` payload: [allow, override, maxBytes, output, parse, timeout?.payload].some( (x) => x !== undefined ) diff --git a/packages/kbn-securitysolution-es-utils/src/transform_error/index.ts b/packages/kbn-securitysolution-es-utils/src/transform_error/index.ts index c9882bbd456d9..3b2f15b6af7cf 100644 --- a/packages/kbn-securitysolution-es-utils/src/transform_error/index.ts +++ b/packages/kbn-securitysolution-es-utils/src/transform_error/index.ts @@ -8,7 +8,7 @@ */ import { errors } from '@elastic/elasticsearch'; -import Boom from '@hapi/boom'; +import type { Boom } from '@hapi/boom'; import { stringifyZodError } from '@kbn/zod-helpers'; import { ZodError } from '@kbn/zod'; import { BadRequestError } from '../bad_request_error'; @@ -18,8 +18,15 @@ export interface OutputError { statusCode: number; } +// We can't import `isBoom` from @hapi/boom today because we get transpilation errors in Webpack 4 +// due to the usage of the operator ?? inside the `@hapi/boom` library and its dependencies. +// TODO: Might be able to use the library's `isBoom` when Webpack 5 is merged (https://github.com/elastic/kibana/pull/191106) +function isBoom(err: unknown): err is Boom { + return err instanceof Error && `isBoom` in err && !!err.isBoom; +} + export const transformError = (err: Error & Partial): OutputError => { - if (Boom.isBoom(err)) { + if (isBoom(err)) { return { message: err.output.payload.message, statusCode: err.output.statusCode, diff --git a/packages/kbn-server-http-tools/src/default_validation_error_handler.ts b/packages/kbn-server-http-tools/src/default_validation_error_handler.ts index 02e93cfa93e7c..17ac3a4499fe9 100644 --- a/packages/kbn-server-http-tools/src/default_validation_error_handler.ts +++ b/packages/kbn-server-http-tools/src/default_validation_error_handler.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { Lifecycle, Request, ResponseToolkit, Util } from '@hapi/hapi'; +import { Lifecycle, Request, ResponseToolkit, Utils } from '@hapi/hapi'; import { ValidationError } from 'joi'; import Hoek from '@hapi/hoek'; @@ -17,7 +17,7 @@ import Hoek from '@hapi/hoek'; export interface HapiValidationError extends ValidationError { output: { statusCode: number; - headers: Util.Dictionary; + headers: Utils.Dictionary; payload: { statusCode: number; error: string; diff --git a/renovate.json b/renovate.json index eeb91efd871bf..fa304f97a0d6b 100644 --- a/renovate.json +++ b/renovate.json @@ -134,6 +134,15 @@ "minimumReleaseAge": "7 days", "enabled": true }, + { + "groupName": "HAPI ecosystem", + "matchDepNames": ["@hapi/**", "brok"], + "reviewers": ["team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Core", "backport:prev-minor"], + "minimumReleaseAge": "7 days", + "enabled": true + }, { "groupName": "babel", "matchDepNames": ["@types/babel__core"], diff --git a/src/core/server/integration_tests/http/http_server.test.ts b/src/core/server/integration_tests/http/http_server.test.ts index 6f54f3e0a5731..d6c422758a708 100644 --- a/src/core/server/integration_tests/http/http_server.test.ts +++ b/src/core/server/integration_tests/http/http_server.test.ts @@ -99,8 +99,8 @@ describe('Http server', () => { expect(response.header.connection).toBe('close'); }); - test('any requests triggered while stopping should be rejected with 503', async () => { - const [, , response] = await Promise.all([ + test('any requests triggered while stopping should be rejected', async () => { + await Promise.all([ // Trigger a request that should hold the server from stopping until fulfilled (otherwise the server will stop straight away) supertest(innerServerListener).post('/'), // Stop the server while the request is in progress @@ -111,16 +111,11 @@ describe('Http server', () => { // Trigger a new request while shutting down (should be rejected) (async () => { await new Promise((resolve) => setTimeout(resolve, (2 * shutdownTimeout) / 3)); - return supertest(innerServerListener).post('/'); + const request = supertest(innerServerListener).post('/'); + await expect(request).rejects.toThrow('socket hang up'); + await request.catch((err) => expect(err.code).toBe('ECONNRESET')); })(), ]); - expect(response.status).toBe(503); - expect(response.body).toStrictEqual({ - statusCode: 503, - error: 'Service Unavailable', - message: 'Kibana is shutting down and not accepting new incoming requests', - }); - expect(response.header.connection).toBe('close'); }); test('when no ongoing connections, the server should stop without waiting any longer', async () => { diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/lib/emulator_server.types.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/lib/emulator_server.types.ts index 5d8cb5c1ee595..165f6d8ef49e3 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/lib/emulator_server.types.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/lib/emulator_server.types.ts @@ -31,7 +31,7 @@ export interface EmulatorServerPluginRegisterOptions = any> - extends Omit, 'register'> { + extends Omit, 'register'> { register: (options: EmulatorServerPluginRegisterOptions) => void | Promise; name: string; /** diff --git a/yarn.lock b/yarn.lock index 696a443817d64..ac4dfd08d254d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2590,287 +2590,299 @@ dependencies: is-negated-glob "^1.0.0" -"@hapi/accept@^5.0.1", "@hapi/accept@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" - integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== +"@hapi/accept@^6.0.1", "@hapi/accept@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-6.0.3.tgz#eef0800a4f89cd969da8e5d0311dc877c37279ab" + integrity sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/ammo@5.x.x", "@hapi/ammo@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-5.0.1.tgz#9d34560f5c214eda563d838c01297387efaab490" - integrity sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA== +"@hapi/ammo@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-6.0.1.tgz#1bc9f7102724ff288ca03b721854fc5393ad123a" + integrity sha512-pmL+nPod4g58kXrMcsGLp05O2jF4P2Q3GiL8qYV7nKYEh3cGf+rV4P5Jyi2Uq0agGhVU63GtaSAfBEZOlrJn9w== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/b64@5.x.x": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" - integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== +"@hapi/b64@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-6.0.1.tgz#786b47dc070e14465af49e2428c1025bd06ed3df" + integrity sha512-ZvjX4JQReUmBheeCq+S9YavcnMMHWqx3S0jHNXWIM1kQDxB9cyfSycpVvjfrKcIS8Mh5N3hmu/YKo4Iag9g2Kw== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/boom@9.x.x", "@hapi/boom@^9.0.0", "@hapi/boom@^9.1.0", "@hapi/boom@^9.1.4": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" - integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== +"@hapi/boom@^10.0.0", "@hapi/boom@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-10.0.1.tgz#ebb14688275ae150aa6af788dbe482e6a6062685" + integrity sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/bounce@2.x.x", "@hapi/bounce@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-2.0.0.tgz#e6ef56991c366b1e2738b2cd83b01354d938cf3d" - integrity sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A== +"@hapi/bounce@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-3.0.1.tgz#25a51bf95733749c557c6bf948048bffa66435e4" + integrity sha512-G+/Pp9c1Ha4FDP+3Sy/Xwg2O4Ahaw3lIZFSX+BL4uWi64CmiETuZPxhKDUD4xBMOUZbBlzvO8HjiK8ePnhBadA== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/bourne@2.x.x": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d" - integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg== +"@hapi/bourne@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7" + integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w== -"@hapi/call@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@hapi/call/-/call-8.0.1.tgz#9e64cd8ba6128eb5be6e432caaa572b1ed8cd7c0" - integrity sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g== +"@hapi/call@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@hapi/call/-/call-9.0.1.tgz#569b87d5b67abf0e58fb82a3894a61aaed3ca92e" + integrity sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/catbox-memory@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-5.0.0.tgz#6c18dad1a80737480d1c33bfbefd5d028deec86d" - integrity sha512-ByuxVJPHNaXwLzbBv4GdTr6ccpe1nG+AfYt+8ftDWEJY7EWBWzD+Klhy5oPTDGzU26pNUh1e7fcYI1ILZRxAXQ== +"@hapi/catbox-memory@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-6.0.2.tgz#399fa83e85134d45a548eee978e4c3c1523e1a70" + integrity sha512-H1l4ugoFW/ZRkqeFrIo8p1rWN0PA4MDTfu4JmcoNDvnY975o29mqoZblqFTotxNHlEkMPpIiIBJTV+Mbi+aF0g== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/catbox@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-11.1.1.tgz#d277e2d5023fd69cddb33d05b224ea03065fec0c" - integrity sha512-u/8HvB7dD/6X8hsZIpskSDo4yMKpHxFd7NluoylhGrL6cUfYxdQPnvUp9YU2C6F9hsyBVLGulBd9vBN1ebfXOQ== +"@hapi/catbox@^12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-12.1.1.tgz#9339dca0a5b18b3ca0a825ac5dfc916dbc5bab83" + integrity sha512-hDqYB1J+R0HtZg4iPH3LEnldoaBsar6bYp0EonBmNQ9t5CO+1CqgCul2ZtFveW1ReA5SQuze9GPSU7/aecERhw== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/podium" "4.x.x" - "@hapi/validate" "1.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/podium" "^5.0.0" + "@hapi/validate" "^2.0.1" -"@hapi/content@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/content/-/content-5.0.2.tgz#ae57954761de570392763e64cdd75f074176a804" - integrity sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw== +"@hapi/content@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/content/-/content-6.0.0.tgz#2427af3bac8a2f743512fce2a70cbdc365af29df" + integrity sha512-CEhs7j+H0iQffKfe5Htdak5LBOz/Qc8TRh51cF+BFv0qnuph3Em4pjGVzJMkI2gfTDdlJKWJISGWS1rK34POGA== dependencies: - "@hapi/boom" "9.x.x" + "@hapi/boom" "^10.0.0" -"@hapi/cookie@^11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@hapi/cookie/-/cookie-11.0.2.tgz#7169c060157a3541146b976e5f0ca9b3f7577d7f" - integrity sha512-LRpSuHC53urzml83c5eUHSPPt7YtK1CaaPZU9KmnhZlacVVojrWJzOUIcwOADDvCZjDxowCO3zPMaOqzEm9kgg== +"@hapi/cookie@^12.0.1": + version "12.0.1" + resolved "https://registry.yarnpkg.com/@hapi/cookie/-/cookie-12.0.1.tgz#7e4da17f9843a01732a5aa875592c1aa8c6bed05" + integrity sha512-TpykARUIgTBvgbsgtYe5CrM/7XBGms2/22JD3N6dzct6bG1vcOC6pH1JWIos1O5zvQnyDSJ2pnaFk+DToHkAng== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bounce" "2.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" -"@hapi/cryptiles@5.x.x": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" - integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== +"@hapi/cryptiles@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-6.0.1.tgz#7868a9d4233567ed66f0a9caf85fdcc56e980621" + integrity sha512-9GM9ECEHfR8lk5ASOKG4+4ZsEzFqLfhiryIJ2ISePVB92OHLp/yne4m+zn7z9dgvM98TLpiFebjDFQ0UHcqxXQ== dependencies: - "@hapi/boom" "9.x.x" + "@hapi/boom" "^10.0.1" -"@hapi/file@2.x.x": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/file/-/file-2.0.0.tgz#2ecda37d1ae9d3078a67c13b7da86e8c3237dfb9" - integrity sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ== - -"@hapi/h2o2@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@hapi/h2o2/-/h2o2-9.1.0.tgz#b223f4978b6f2b0d7d9db10a84a567606c4c3551" - integrity sha512-B7E58bMhxmpiDI22clxTexoAaVShNBk1Ez6S8SQjQZu5FxxD6Tqa44sXeZQBtWrdJF7ZRbsY60/C8AHLRxagNA== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" - "@hapi/wreck" "17.x.x" - -"@hapi/hapi@^20.2.2": - version "20.2.2" - resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-20.2.2.tgz#5810efbf5c0aad367932e86d4066d82ac817e98c" - integrity sha512-crhU6TIKt7QsksWLYctDBAXogk9PYAm7UzdpETyuBHC2pCa6/+B5NykiOVLG/3FCIgHo/raPVtan8bYtByHORQ== - dependencies: - "@hapi/accept" "^5.0.1" - "@hapi/ammo" "^5.0.1" - "@hapi/boom" "^9.1.0" - "@hapi/bounce" "^2.0.0" - "@hapi/call" "^8.0.0" - "@hapi/catbox" "^11.1.1" - "@hapi/catbox-memory" "^5.0.0" - "@hapi/heavy" "^7.0.1" - "@hapi/hoek" "^9.0.4" - "@hapi/mimos" "^6.0.0" - "@hapi/podium" "^4.1.1" - "@hapi/shot" "^5.0.5" - "@hapi/somever" "^3.0.0" - "@hapi/statehood" "^7.0.4" - "@hapi/subtext" "^7.0.3" - "@hapi/teamwork" "^5.1.1" - "@hapi/topo" "^5.0.0" - "@hapi/validate" "^1.1.1" - -"@hapi/heavy@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-7.0.1.tgz#73315ae33b6e7682a0906b7a11e8ca70e3045874" - integrity sha512-vJ/vzRQ13MtRzz6Qd4zRHWS3FaUc/5uivV2TIuExGTM9Qk+7Zzqj0e2G7EpE6KztO9SalTbiIkTh7qFKj/33cA== +"@hapi/file@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/file/-/file-3.0.0.tgz#f1fd824493ac89a6fceaf89c824afc5ae2121c09" + integrity sha512-w+lKW+yRrLhJu620jT3y+5g2mHqnKfepreykvdOcl9/6up8GrQQn+l3FRTsjHTKbkbfQFkuksHpdv2EcpKcJ4Q== + +"@hapi/h2o2@^10.0.4": + version "10.0.4" + resolved "https://registry.yarnpkg.com/@hapi/h2o2/-/h2o2-10.0.4.tgz#9255328f851fcc6e647af68d5e0f464523a19133" + integrity sha512-dvD8+Y/Okc0fh0blqaYCLIrcy0+1LqIhMr7hjk8elLQZ9mkw2hKFB9dFKuRfWf+1nvHpGlW+PwccqkdebynQbg== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" + "@hapi/wreck" "^18.0.1" + +"@hapi/hapi@^21.1.0", "@hapi/hapi@^21.3.10": + version "21.3.10" + resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-21.3.10.tgz#0357db7ca49415e50e5df80ba50ad3964f2a62f3" + integrity sha512-CmEcmTREW394MaGGKvWpoOK4rG8tKlpZLs30tbaBzhCrhiL2Ti/HARek9w+8Ya4nMBGcd+kDAzvU44OX8Ms0Jg== + dependencies: + "@hapi/accept" "^6.0.1" + "@hapi/ammo" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/call" "^9.0.1" + "@hapi/catbox" "^12.1.1" + "@hapi/catbox-memory" "^6.0.2" + "@hapi/heavy" "^8.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/mimos" "^7.0.1" + "@hapi/podium" "^5.0.1" + "@hapi/shot" "^6.0.1" + "@hapi/somever" "^4.1.1" + "@hapi/statehood" "^8.1.1" + "@hapi/subtext" "^8.1.0" + "@hapi/teamwork" "^6.0.0" + "@hapi/topo" "^6.0.1" + "@hapi/validate" "^2.0.1" + +"@hapi/heavy@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-8.0.1.tgz#e2be4a6a249005b5a587f7604aafa8ed02461fb6" + integrity sha512-gBD/NANosNCOp6RsYTsjo2vhr5eYA3BEuogk6cxY0QdhllkkTaJFYtTXv46xd6qhBVMbMMqcSdtqey+UQU3//w== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" -"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.0.4", "@hapi/hoek@^9.2.1", "@hapi/hoek@^9.3.0": +"@hapi/hoek@^11.0.2", "@hapi/hoek@^11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-11.0.4.tgz#42a7f244fd3dd777792bfb74b8c6340ae9182f37" + integrity sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ== + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/inert@^6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@hapi/inert/-/inert-6.0.4.tgz#0544221eabc457110a426818358d006e70ff1f41" - integrity sha512-tpmNqtCCAd+5Ts07bJmMaA79+ZUIf0zSWnQMaWtbcO4nGrO/yXB2AzoslfzFX2JEV9vGeF3FfL8mYw0pHl8VGg== +"@hapi/inert@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@hapi/inert/-/inert-7.1.0.tgz#0bcebe4c5115230f9d7b5d6e8c3bf799ca91958e" + integrity sha512-5X+cl/Ozm0U9uPGGX1dSKhnhTQIf161bH/kkTN9OBVAZKFG+nrj8j/NMj6S1zBBZWmQrkVRNPfCUGrXzB4fCFQ== + dependencies: + "@hapi/ammo" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" + lru-cache "^7.14.1" + +"@hapi/iron@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-7.0.1.tgz#f74bace8dad9340c7c012c27c078504f070f14b5" + integrity sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ== dependencies: - "@hapi/ammo" "5.x.x" - "@hapi/boom" "9.x.x" - "@hapi/bounce" "2.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" - lru-cache "^6.0.0" + "@hapi/b64" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/cryptiles" "^6.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/iron@6.x.x", "@hapi/iron@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" - integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== +"@hapi/mimos@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-7.0.1.tgz#5b65c76bb9da28ba34b0092215891f2c72bc899d" + integrity sha512-b79V+BrG0gJ9zcRx1VGcCI6r6GEzzZUgiGEJVoq5gwzuB2Ig9Cax8dUuBauQCFKvl2YWSWyOc8mZ8HDaJOtkew== dependencies: - "@hapi/b64" "5.x.x" - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/cryptiles" "5.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" + mime-db "^1.52.0" -"@hapi/mimos@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-6.0.0.tgz#daa523d9c07222c7e8860cb7c9c5501fd6506484" - integrity sha512-Op/67tr1I+JafN3R3XN5DucVSxKRT/Tc+tUszDwENoNpolxeXkhrJ2Czt6B6AAqrespHoivhgZBWYSuANN9QXg== +"@hapi/nigel@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-5.0.1.tgz#a6dfe357e9d48d944e2ffc552bd95cb701d79ee9" + integrity sha512-uv3dtYuB4IsNaha+tigWmN8mQw/O9Qzl5U26Gm4ZcJVtDdB1AVJOwX3X5wOX+A07qzpEZnOMBAm8jjSqGsU6Nw== dependencies: - "@hapi/hoek" "9.x.x" - mime-db "1.x.x" + "@hapi/hoek" "^11.0.2" + "@hapi/vise" "^5.0.1" -"@hapi/nigel@4.x.x": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-4.0.2.tgz#8f84ef4bca4fb03b2376463578f253b0b8e863c4" - integrity sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw== +"@hapi/pez@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-6.1.0.tgz#64d9f95580fc7d8f1d13437ee4a8676709954fda" + integrity sha512-+FE3sFPYuXCpuVeHQ/Qag1b45clR2o54QoonE/gKHv9gukxQ8oJJZPR7o3/ydDTK6racnCJXxOyT1T93FCJMIg== dependencies: - "@hapi/hoek" "^9.0.4" - "@hapi/vise" "^4.0.0" + "@hapi/b64" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/content" "^6.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/nigel" "^5.0.1" -"@hapi/pez@^5.0.1": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.0.3.tgz#b75446e6fef8cbb16816573ab7da1b0522e7a2a1" - integrity sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA== +"@hapi/podium@^5.0.0", "@hapi/podium@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-5.0.1.tgz#f292b4c0ca3118747394a102c6c3340bda96662f" + integrity sha512-eznFTw6rdBhAijXFIlBOMJJd+lXTvqbrBIS4Iu80r2KTVIo4g+7fLy4NKp/8+UnSt5Ox6mJtAlKBU/Sf5080TQ== dependencies: - "@hapi/b64" "5.x.x" - "@hapi/boom" "9.x.x" - "@hapi/content" "^5.0.2" - "@hapi/hoek" "9.x.x" - "@hapi/nigel" "4.x.x" + "@hapi/hoek" "^11.0.2" + "@hapi/teamwork" "^6.0.0" + "@hapi/validate" "^2.0.1" -"@hapi/podium@4.x.x", "@hapi/podium@^4.1.1", "@hapi/podium@^4.1.3": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" - integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== +"@hapi/shot@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-6.0.1.tgz#ea84d1810b7c8599d5517c23b4ec55a529d7dc16" + integrity sha512-s5ynMKZXYoDd3dqPw5YTvOR/vjHvMTxc388+0qL0jZZP1+uwXuUD32o9DuuuLsmTlyXCWi02BJl1pBpwRuUrNA== dependencies: - "@hapi/hoek" "9.x.x" - "@hapi/teamwork" "5.x.x" - "@hapi/validate" "1.x.x" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" -"@hapi/shot@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-5.0.5.tgz#a25c23d18973bec93c7969c51bf9579632a5bebd" - integrity sha512-x5AMSZ5+j+Paa8KdfCoKh+klB78otxF+vcJR/IoN91Vo2e5ulXIW6HUsFTCU+4W6P/Etaip9nmdAx2zWDimB2A== +"@hapi/somever@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-4.1.1.tgz#b492c78408303c72cd1a39c5060f35d18a404b27" + integrity sha512-lt3QQiDDOVRatS0ionFDNrDIv4eXz58IibQaZQDOg4DqqdNme8oa0iPWcE0+hkq/KTeBCPtEOjDOBKBKwDumVg== dependencies: - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" + "@hapi/bounce" "^3.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/somever@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-3.0.0.tgz#f4e9b16a948415b926b4dd898013602b0cb45758" - integrity sha512-Upw/kmKotC9iEmK4y047HMYe4LDKsE5NWfjgX41XNKmFvxsQL7OiaCWVhuyyhU0ShDGBfIAnCH8jZr49z/JzZA== - dependencies: - "@hapi/bounce" "2.x.x" - "@hapi/hoek" "9.x.x" - -"@hapi/statehood@^7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.4.tgz#6acb9d0817b5c657089356f7d9fd60af0bce4f41" - integrity sha512-Fia6atroOVmc5+2bNOxF6Zv9vpbNAjEXNcUbWXavDqhnJDlchwUUwKS5LCi5mGtCTxRhUKKHwuxuBZJkmLZ7fw== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bounce" "2.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/cryptiles" "5.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/iron" "6.x.x" - "@hapi/validate" "1.x.x" - -"@hapi/subtext@^7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.0.3.tgz#f7440fc7c966858e1f39681e99eb6171c71e7abd" - integrity sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/content" "^5.0.2" - "@hapi/file" "2.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/pez" "^5.0.1" - "@hapi/wreck" "17.x.x" - -"@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" - integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== +"@hapi/statehood@^8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-8.1.1.tgz#db4bd14c90810a1389763cb0b0b8f221aa4179c1" + integrity sha512-YbK7PSVUA59NArAW5Np0tKRoIZ5VNYUicOk7uJmWZF6XyH5gGL+k62w77SIJb0AoAJ0QdGQMCQ/WOGL1S3Ydow== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/cryptiles" "^6.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/iron" "^7.0.1" + "@hapi/validate" "^2.0.1" + +"@hapi/subtext@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-8.1.0.tgz#58733020a6655bc4d978df9e2f75e31696ff3f91" + integrity sha512-PyaN4oSMtqPjjVxLny1k0iYg4+fwGusIhaom9B2StinBclHs7v46mIW706Y+Wo21lcgulGyXbQrmT/w4dus6ww== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/content" "^6.0.0" + "@hapi/file" "^3.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/pez" "^6.1.0" + "@hapi/wreck" "^18.0.1" + +"@hapi/teamwork@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-6.0.0.tgz#b3a173cf811ba59fc6ee22318a1b51f4561f06e0" + integrity sha512-05HumSy3LWfXpmJ9cr6HzwhAavrHkJ1ZRCmNE2qJMihdM5YcWreWPfyN0yKT2ZjCM92au3ZkuodjBxOibxM67A== -"@hapi/topo@^5.0.0", "@hapi/topo@^5.1.0": +"@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" -"@hapi/validate@1.x.x", "@hapi/validate@^1.1.1", "@hapi/validate@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" - integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== +"@hapi/topo@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4" + integrity sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" + "@hapi/hoek" "^11.0.2" -"@hapi/vise@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-4.0.0.tgz#c6a94fe121b94a53bf99e7489f7fcc74c104db02" - integrity sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg== +"@hapi/validate@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-2.0.1.tgz#45cf228c4c8cfc61ba2da7e0a5ba93ff3b9afff1" + integrity sha512-NZmXRnrSLK8MQ9y/CMqE9WSspgB9xA41/LlYR0k967aSZebWr4yNrpxIbov12ICwKy4APSlWXZga9jN5p6puPA== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" + "@hapi/topo" "^6.0.1" -"@hapi/wreck@17.x.x", "@hapi/wreck@^17.0.0", "@hapi/wreck@^17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-17.1.0.tgz#fbdc380c6f3fa1f8052dc612b2d3b6ce3e88dbec" - integrity sha512-nx6sFyfqOpJ+EFrHX+XWwJAxs3ju4iHdbB/bwR8yTNZOiYmuhA8eCe7lYPtYmb4j7vyK/SlbaQsmTtUrMvPEBw== +"@hapi/vise@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-5.0.1.tgz#5c9f16bcf1c039ddd4b6cad5f32d71eeb6bb7dac" + integrity sha512-XZYWzzRtINQLedPYlIkSkUr7m5Ddwlu99V9elh8CSygXstfv3UnWIXT0QD+wmR0VAG34d2Vx3olqcEhRRoTu9A== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" + +"@hapi/wreck@^18.0.1", "@hapi/wreck@^18.1.0": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-18.1.0.tgz#68e631fc7568ebefc6252d5b86cb804466c8dbe6" + integrity sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/hoek" "^11.0.2" "@hello-pangea/dnd@16.6.0", "@hello-pangea/dnd@^16.6.0": version "16.6.0" @@ -10537,63 +10549,14 @@ "@types/vinyl-fs" "*" chokidar "^2.1.2" -"@types/hapi__catbox@*": - version "10.2.3" - resolved "https://registry.yarnpkg.com/@types/hapi__catbox/-/hapi__catbox-10.2.3.tgz#c9279c16d709bf2987491c332e11d18124ae018f" - integrity sha512-gs6MKMKXzWpSqeYsPaDIDAxD8jLNg7aFxgAJE6Jnc+ns072Z9fuh39/NF5gSk1KNoGCLnIpeZ0etT9gY9QDCKg== - -"@types/hapi__cookie@^10.1.3": - version "10.1.3" - resolved "https://registry.yarnpkg.com/@types/hapi__cookie/-/hapi__cookie-10.1.3.tgz#b0ab2be28669e083c63253927262c43f24395c2c" - integrity sha512-v/hPXxOVfBdkTa+S4cGec88vZjvEbLaZp8xjg2MtjDhykx1/mLtY4EJHk6fI1cW5WGgFV9pgMjz5mOktjNwILw== - dependencies: - "@types/hapi__hapi" "*" - joi "^17.3.0" - -"@types/hapi__h2o2@^8.3.3": - version "8.3.3" - resolved "https://registry.yarnpkg.com/@types/hapi__h2o2/-/hapi__h2o2-8.3.3.tgz#f6c5ac480a6fd421025f7d0f78dfa916703511b7" - integrity sha512-+qWZVFVGc5Y0wuNZvVe876VJjUBCJ8eQdXovg4Rg9laHpeERQejluI7aw31xXWfLojTuHz3ThZzC6Orqras05Q== - dependencies: - "@hapi/boom" "^9.0.0" - "@hapi/wreck" "^17.0.0" - "@types/hapi__hapi" "*" - "@types/node" "*" - -"@types/hapi__hapi@*", "@types/hapi__hapi@^20.0.9": - version "20.0.9" - resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-20.0.9.tgz#9d570846c96268266a14c970c13aeeaccfc8e172" - integrity sha512-fGpKScknCKZityRXdZgpCLGbm41R1ppFgnKHerfZlqOOlCX/jI129S6ghgBqkqCE8m9A0CIu1h7Ch04lD9KOoA== - dependencies: - "@hapi/boom" "^9.0.0" - "@hapi/iron" "^6.0.0" - "@hapi/podium" "^4.1.3" - "@types/hapi__catbox" "*" - "@types/hapi__mimos" "*" - "@types/hapi__shot" "*" - "@types/node" "*" - joi "^17.3.0" - -"@types/hapi__inert@^5.2.3": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@types/hapi__inert/-/hapi__inert-5.2.3.tgz#f586eb240d5997c9968d1b4e8b37679517045ca1" - integrity sha512-I1mWQrEc7oMqGtofT0rwBgRBCBurz0wNzbq8QZsHWR+aXM0bk1j9GA6zwyGIeO53PNl2C1c2kpXlc084xCV+Tg== - dependencies: - "@types/hapi__hapi" "*" - -"@types/hapi__mimos@*": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@types/hapi__mimos/-/hapi__mimos-4.1.0.tgz#47dbf89ebfc05183c1de2797e9426793db9a0d85" - integrity sha512-hcdSoYa32wcP+sEfyf85ieGwElwokcZ/mma8eyqQ4OTHeCAGwfaoiGxjG4z1Dm+RGhIYLHlW54ji5FFwahH12A== - dependencies: - "@types/mime-db" "*" - -"@types/hapi__shot@*": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/hapi__shot/-/hapi__shot-4.1.1.tgz#c760322b90eb77f36a3003a442e8dc69e6ae3922" - integrity sha512-44Jj7jJAFgNVgfdbyVtBUbEIbYqWRKAbLR4kiQxBbVEdf8ZKfa5Hg1qg4QdzXBgjw0mopewU4wx1/eWRTVelNQ== +"@types/hapi__cookie@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@types/hapi__cookie/-/hapi__cookie-12.0.5.tgz#b28e885043d1951721ed4d8ef2087943b8b8267d" + integrity sha512-rZNcJRDuutoSLHVHNSoIACabeGZEhjYFKqdW9vmucpUgE50YfPbtGPREzXEKOf2/1RR6d+jrSkNRwxUEaUIfsQ== dependencies: + "@hapi/hapi" "^21.1.0" "@types/node" "*" + joi "^17.7.0" "@types/has-ansi@^3.0.0": version "3.0.0" @@ -10880,11 +10843,6 @@ dependencies: "@types/braces" "*" -"@types/mime-db@*": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.27.0.tgz#9bc014a1fd1fdf47649c1a54c6dd7966b8284792" - integrity sha1-m8AUof0f30dknBpUxt15ZrgoR5I= - "@types/mime-types@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" @@ -13617,13 +13575,13 @@ brfs@^2.0.0, brfs@^2.0.2: static-module "^3.0.2" through2 "^2.0.0" -brok@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/brok/-/brok-5.0.2.tgz#b77e7203ce89d30939a5b877a9bb3acb4dffc848" - integrity sha512-mqsoOGPjcP9oltC8dD4PnRCiJREmFg+ee588mVYZgZNd8YV5Zo6eOLv/fp6HxdYffaxvkKfPHjc+sRWIkuIu7A== +brok@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/brok/-/brok-6.0.0.tgz#82f081de7a180802c224955cb6c2888b81a27b28" + integrity sha512-z5ND+K0+Go4Doiq8GtEMuBicbbky2DSbNzrRqEnOFYJgqrSu85nK2HsczCRwd7UznHTSUVYEkuEpRm5HtfaCSw== dependencies: - "@hapi/hoek" "^9.0.4" - "@hapi/validate" "^1.1.3" + "@hapi/hoek" "^11.0.4" + "@hapi/validate" "^2.0.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" @@ -21641,7 +21599,7 @@ joi-to-json@^4.3.0: lodash "^4.17.21" semver-compare "^1.0.0" -joi@^17.13.3, joi@^17.3.0: +joi@^17.13.3, joi@^17.7.0: version "17.13.3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== @@ -23275,11 +23233,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.51.0, mime-db@1.x.x, "mime-db@>= 1.40.0 < 2": +mime-db@1.51.0: version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +"mime-db@>= 1.40.0 < 2", mime-db@^1.52.0: + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" From 8eceb0db4d4edb0da52564ac082859abfc6ed6e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?= Date: Tue, 1 Oct 2024 18:54:43 +0200 Subject: [PATCH 076/107] [Defend Workflows][Reusable integrations] Handling resuable integrations on endpoint onboarding page (#193518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary During onboarding on the Endpoint list page, if the user already created at least one Elastic Defend integration, we show this screen (original): image Due to the new enterprise level feature added by Fleet team, the reusable integrations, now an integration policy can be assigned **zero, one or more agent policies**, and this PR's goal is to update this onboarding screen to tackle these changes. ### One integration is added to more than one Agent Policies When creating/editing an integration, it can be added to more than one Agent Policies: image #### ✅ Solution for usecase To be able to select where to enroll an Agent, now they are listed as `Package policy - Agent policy` pairs. image ### Some integrations are not added to an Agent Policy image #### ✅ Solution for usecase A new callout is added to indicate to the user that there are some integrations that cannot be deployed to an Agent. image Clicking on the Integrations opens their editing page in a new tab. Clickin on the 'Elastic Defend Integration policies' opens the Defend integration's policies tab in a new browser tab. ### None of the integrations are added to an Agent Policy image #### ✅ Solution for usecase Another 'warning' callout is displayed indicating that there are no usable integrations. This, combined with the other callout hopefully help the user to go forward. image ### RBAC In case the user doesn't hold the required privileges, the same screen is displayed as when there are no hosts and no policies, or there are policies but no hosts. Just as before. image ### 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 - [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)) - [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)) --------- Co-authored-by: Elastic Machine Co-authored-by: Joe Peeples --- .../fleet_package_policy_generator.ts | 2 +- .../common/endpoint/generate_data.ts | 11 +- .../components/management_empty_state.tsx | 307 ++++++++++----- .../pages/endpoint_hosts/store/middleware.ts | 4 - .../pages/endpoint_hosts/view/index.test.tsx | 367 +++++++++++++----- .../pages/endpoint_hosts/view/index.tsx | 230 +++++++---- .../management/services/policies/hooks.ts | 25 +- .../management/services/policies/ingest.ts | 17 +- .../translations/translations/fr-FR.json | 3 +- .../translations/translations/ja-JP.json | 3 +- .../translations/translations/zh-CN.json | 3 +- 11 files changed, 672 insertions(+), 300 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_package_policy_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_package_policy_generator.ts index 215b2ff614379..271718d8e11fd 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_package_policy_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_package_policy_generator.ts @@ -14,7 +14,7 @@ type PartialPackagePolicy = Partial> & { inputs?: PackagePolicy['inputs']; }; -type PartialEndpointPolicyData = Partial> & { +export type PartialEndpointPolicyData = Partial> & { inputs?: PolicyData['inputs']; }; diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts index e0811ef8fa821..50ae6b4069770 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts @@ -40,6 +40,7 @@ import { import { firstNonNullValue } from './models/ecs_safety_helpers'; import type { EventOptions } from './types/generator'; import { BaseDataGenerator } from './data_generators/base_data_generator'; +import type { PartialEndpointPolicyData } from './data_generators/fleet_package_policy_generator'; import { FleetPackagePolicyGenerator } from './data_generators/fleet_package_policy_generator'; export type Event = AlertEvent | SafeEndpointEvent; @@ -1581,8 +1582,14 @@ export class EndpointDocGenerator extends BaseDataGenerator { /** * Generates a Fleet `package policy` that includes the Endpoint Policy data */ - public generatePolicyPackagePolicy(seed: string = 'seed'): PolicyData { - return new FleetPackagePolicyGenerator(seed).generateEndpointPackagePolicy(); + public generatePolicyPackagePolicy({ + seed, + overrides, + }: { + seed?: string; + overrides?: PartialEndpointPolicyData; + } = {}): PolicyData { + return new FleetPackagePolicyGenerator(seed).generateEndpointPackagePolicy(overrides); } /** diff --git a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx index 94dddba539ce2..2408dad4f39f3 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx @@ -22,12 +22,16 @@ import { EuiLoadingSpinner, EuiLink, EuiSkeletonText, + EuiCallOut, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { INTEGRATIONS_PLUGIN_ID } from '@kbn/fleet-plugin/common'; +import { pagePathGetters } from '@kbn/fleet-plugin/public'; +import type { ImmutableArray, PolicyData } from '../../../common/endpoint/types'; import { useUserPrivileges } from '../../common/components/user_privileges'; import onboardingLogo from '../images/security_administration_onboarding.svg'; -import { useKibana } from '../../common/lib/kibana'; +import { useAppUrl, useKibana } from '../../common/lib/kibana'; const TEXT_ALIGN_CENTER: CSSProperties = Object.freeze({ textAlign: 'center', @@ -103,12 +107,12 @@ const PolicyEmptyState = React.memo<{ {policyEntryPoint ? ( ) : ( )} @@ -170,107 +174,216 @@ const EndpointsEmptyState = React.memo<{ actionDisabled: boolean; handleSelectableOnChange: (o: EuiSelectableProps['options']) => void; selectionOptions: EuiSelectableProps['options']; -}>(({ loading, onActionClick, actionDisabled, handleSelectableOnChange, selectionOptions }) => { - const policySteps = useMemo( - () => [ - { - title: i18n.translate('xpack.securitySolution.endpoint.list.stepOneTitle', { - defaultMessage: 'Select the integration you want to use', - }), - children: ( + policyItems: ImmutableArray; +}>( + ({ + loading, + onActionClick, + actionDisabled, + handleSelectableOnChange, + selectionOptions, + policyItems, + }) => { + const { getAppUrl } = useAppUrl(); + const policyItemsWithoutAgentPolicy = useMemo( + () => policyItems.filter((policy) => !policy.policy_ids.length), + [policyItems] + ); + + const policiesNotAddedToAgentPolicyCallout = useMemo( + () => + !!policyItemsWithoutAgentPolicy.length && ( <> - - - - - + - {(list) => { - return loading ? ( - - - - ) : selectionOptions.length ? ( - list - ) : ( - - ); - }} - + + + + + + + +
    + {policyItemsWithoutAgentPolicy.map((policyItem) => ( +
  • + + {policyItem.name} + +
  • + ))} +
+ + + + + ), + }} + /> +
+ ), - }, - { - title: i18n.translate('xpack.securitySolution.endpoint.list.stepTwoTitle', { - defaultMessage: 'Enroll your agents enabled with Elastic Defend through Fleet', - }), - status: actionDisabled ? 'disabled' : '', - children: ( - - + [getAppUrl, policyItemsWithoutAgentPolicy] + ); + + const policySteps = useMemo( + () => [ + { + title: i18n.translate('xpack.securitySolution.endpoint.list.stepOneTitle', { + defaultMessage: 'Select the integration you want to use', + }), + children: ( + <> - - - + - - - - - ), - }, - ], - [selectionOptions, handleSelectableOnChange, loading, actionDisabled, onActionClick] - ); + {(list) => { + if (loading) { + return ( + + + + ); + } - return ( - - } - bodyComponent={ - - } - /> - ); -}); + if (!selectionOptions.length) { + return ( + + + + ); + } + + return list; + }} + + + {policiesNotAddedToAgentPolicyCallout} + + ), + }, + { + title: i18n.translate('xpack.securitySolution.endpoint.list.stepTwoTitle', { + defaultMessage: 'Enroll your agents enabled with Elastic Defend through Fleet', + }), + status: actionDisabled ? 'disabled' : '', + children: ( + + + + + + + + + + + + + ), + }, + ], + [ + selectionOptions, + loading, + handleSelectableOnChange, + policiesNotAddedToAgentPolicyCallout, + actionDisabled, + onActionClick, + ] + ); + + return ( + + } + bodyComponent={ + + } + /> + ); + } +); const ManagementEmptyState = React.memo<{ loading: boolean; @@ -284,7 +397,11 @@ const ManagementEmptyState = React.memo<{ {loading ? ( - + ) : ( diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts index ec27500a45e12..56b92e4692edc 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts @@ -156,10 +156,6 @@ const getAgentAndPoliciesForEndpointsList = async ( return; } - // We use the Agent Policy API here, instead of the Package Policy, because we can't use - // filter by ID of the Saved Object. Agent Policy, however, keeps a reference (array) of - // Package Ids that it uses, thus if a reference exists there, then the package policy (policy) - // exists. const policiesFound = ( await sendBulkGetPackagePolicies(http, policyIdsToCheck) ).items.reduce( diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index a5e09dc6d553c..adfc164e98b12 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -10,6 +10,7 @@ import * as reactTestingLibrary from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { EndpointList } from '.'; import { createUseUiSetting$Mock } from '../../../../common/lib/kibana/kibana_react.mock'; +import type { DeepPartial } from '@kbn/utility-types'; import { mockEndpointDetailsApiResult, @@ -57,6 +58,8 @@ import { getEndpointPrivilegesInitialStateMock } from '../../../../common/compon import { useGetEndpointDetails } from '../../../hooks/endpoint/use_get_endpoint_details'; import { useGetAgentStatus as _useGetAgentStatus } from '../../../hooks/agents/use_get_agent_status'; import { agentStatusMocks } from '../../../../../common/endpoint/service/response_actions/mocks/agent_status.mocks'; +import { useBulkGetAgentPolicies } from '../../../services/policies/hooks'; +import type { PartialEndpointPolicyData } from '../../../../../common/endpoint/data_generators/fleet_package_policy_generator'; const mockUserPrivileges = useUserPrivileges as jest.Mock; // not sure why this can't be imported from '../../../../common/mock/formatted_relative'; @@ -85,6 +88,14 @@ jest.mock('../../../services/policies/ingest', () => { jest.mock('../../../hooks/agents/use_get_agent_status'); const useGetAgentStatusMock = _useGetAgentStatus as jest.Mock; +jest.mock('../../../services/policies/hooks', () => ({ + ...jest.requireActual('../../../services/policies/hooks'), + useBulkGetAgentPolicies: jest.fn().mockReturnValue({}), +})); +const useBulkGetAgentPoliciesMock = useBulkGetAgentPolicies as unknown as jest.Mock< + DeepPartial> +>; + const mockUseUiSetting$ = useUiSetting$ as jest.Mock; const timepickerRanges = [ { @@ -149,6 +160,7 @@ describe('when on the endpoint list page', () => { const { act, screen, fireEvent } = reactTestingLibrary; let render: () => ReturnType; + let renderResult: reactTestingLibrary.RenderResult; let history: AppContextTestRender['history']; let store: AppContextTestRender['store']; let coreStart: AppContextTestRender['coreStart']; @@ -170,7 +182,7 @@ describe('when on the endpoint list page', () => { beforeEach(() => { const mockedContext = createAppRootMockRenderer(); ({ history, store, coreStart, middlewareSpy } = mockedContext); - render = () => mockedContext.render(); + render = () => (renderResult = mockedContext.render()); reactTestingLibrary.act(() => { history.push(`${MANAGEMENT_PATH}/endpoints`); }); @@ -186,9 +198,9 @@ describe('when on the endpoint list page', () => { endpointsResults: [], }); - const renderResult = render(); + render(); const timelineFlyout = renderResult.queryByTestId('timeline-bottom-bar-title-button'); - expect(timelineFlyout).toBeNull(); + expect(timelineFlyout).not.toBeInTheDocument(); }); describe('when there are no endpoints or polices', () => { @@ -199,47 +211,200 @@ describe('when on the endpoint list page', () => { }); it('should show the empty state when there are no hosts or polices', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedPoliciesForOnboarding'); }); // Initially, there are no hosts or policies, so we prompt to add policies first. const table = await renderResult.findByTestId('emptyPolicyTable'); - expect(table).not.toBeNull(); + expect(table).toBeInTheDocument(); }); }); describe('when there are policies, but no hosts', () => { - let renderResult: ReturnType; - beforeEach(async () => { - const policyData = mockPolicyResultList({ total: 3 }).items; + const getOptionsTexts = async () => { + const onboardingPolicySelect = await renderResult.findByTestId('onboardingPolicySelect'); + const options = onboardingPolicySelect.querySelectorAll('[role=option]'); + + return [...options].map(({ textContent }) => textContent); + }; + + const setupPolicyDataMocks = ( + partialPolicyData: PartialEndpointPolicyData[] = [ + { name: 'Package 1', policy_ids: ['policy-1'] }, + ] + ) => { + const policyData = partialPolicyData.map((overrides) => + docGenerator.generatePolicyPackagePolicy({ overrides }) + ); + setEndpointListApiMockImplementation(coreStart.http, { endpointsResults: [], endpointPackagePolicies: policyData, }); + }; - renderResult = render(); - await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedPoliciesForOnboarding'); + beforeEach(async () => { + useBulkGetAgentPoliciesMock.mockReturnValue({ + data: [ + { id: 'policy-1', name: 'Agent Policy 1' }, + { id: 'policy-2', name: 'Agent Policy 2' }, + { id: 'policy-3', name: 'Agent Policy 3' }, + ], + isLoading: false, }); + + setupPolicyDataMocks(); }); + afterEach(() => { jest.clearAllMocks(); }); - it('should show the no hosts empty state', async () => { + it('should show loading spinner while Agent Policies are loading', async () => { + useBulkGetAgentPoliciesMock.mockReturnValue({ isLoading: true }); + render(); + expect( + await renderResult.findByTestId('management-empty-state-loading-spinner') + ).toBeInTheDocument(); + }); + + it('should show the no hosts empty state without loading spinner', async () => { + render(); + + expect( + renderResult.queryByTestId('management-empty-state-loading-spinner') + ).not.toBeInTheDocument(); + const emptyHostsTable = await renderResult.findByTestId('emptyHostsTable'); - expect(emptyHostsTable).not.toBeNull(); + expect(emptyHostsTable).toBeInTheDocument(); }); it('should display the onboarding steps', async () => { + render(); const onboardingSteps = await renderResult.findByTestId('onboardingSteps'); - expect(onboardingSteps).not.toBeNull(); + expect(onboardingSteps).toBeInTheDocument(); }); - it('should show policy selection', async () => { - const onboardingPolicySelect = await renderResult.findByTestId('onboardingPolicySelect'); - expect(onboardingPolicySelect).not.toBeNull(); + describe('policy selection', () => { + it('should show policy selection', async () => { + render(); + const onboardingPolicySelect = await renderResult.findByTestId('onboardingPolicySelect'); + expect(onboardingPolicySelect).toBeInTheDocument(); + }); + + it('should show discrete `package policy - agent policy` pairs', async () => { + setupPolicyDataMocks([ + { name: 'Package 1', policy_ids: ['policy-1'] }, + { name: 'Package 2', policy_ids: ['policy-2'] }, + ]); + + render(); + const optionsTexts = await getOptionsTexts(); + + expect(optionsTexts).toStrictEqual([ + 'Package 1 - Agent Policy 1', + 'Package 2 - Agent Policy 2', + ]); + }); + + it('should display the same package policy with multiple Agent Policies multiple times', async () => { + setupPolicyDataMocks([ + { name: 'Package 1', policy_ids: ['policy-1', 'policy-2', 'policy-3'] }, + ]); + + render(); + const optionsTexts = await getOptionsTexts(); + + expect(optionsTexts).toStrictEqual([ + 'Package 1 - Agent Policy 1', + 'Package 1 - Agent Policy 2', + 'Package 1 - Agent Policy 3', + ]); + }); + + it('should not display a package policy without agent policy', async () => { + setupPolicyDataMocks([ + { name: 'Package 1', policy_ids: [] }, + { name: 'Package 2', policy_ids: ['policy-1'] }, + ]); + + render(); + const optionsTexts = await getOptionsTexts(); + + expect(optionsTexts).toStrictEqual(['Package 2 - Agent Policy 1']); + }); + + it("should fallback to agent policy ID if it's not found", async () => { + setupPolicyDataMocks([{ name: 'Package 1', policy_ids: ['agent-policy-id'] }]); + + render(); + const optionsTexts = await getOptionsTexts(); + expect( + renderResult.queryByTestId('noIntegrationsAddedToAgentPoliciesCallout') + ).not.toBeInTheDocument(); + + expect(optionsTexts).toStrictEqual(['Package 1 - agent-policy-id']); + }); + + it('should show callout indicating that none of the integrations are added to agent policies', async () => { + setupPolicyDataMocks([{ name: 'Package 1', policy_ids: [] }]); + + render(); + + expect( + await renderResult.findByTestId('noIntegrationsAddedToAgentPoliciesCallout') + ).toBeInTheDocument(); + }); + }); + + describe('integration not added to agent policy callout', () => { + it('should not display callout if all integrations are added to agent policies', async () => { + setupPolicyDataMocks([ + { name: 'Package 1', policy_ids: ['policy-1'] }, + { name: 'Package 2', policy_ids: ['policy-2'] }, + ]); + + render(); + await getOptionsTexts(); + + expect( + renderResult.queryByTestId('integrationsNotAddedToAgentPolicyCallout') + ).not.toBeInTheDocument(); + }); + + it('should display callout if an integration is not added to an agent policy', async () => { + setupPolicyDataMocks([ + { name: 'Package 1', policy_ids: ['policy-1'] }, + { name: 'Package 2', policy_ids: [] }, + ]); + + render(); + + expect( + await renderResult.findByTestId('integrationsNotAddedToAgentPolicyCallout') + ).toBeInTheDocument(); + }); + + it('should list all integrations which are not added to an agent policy', async () => { + setupPolicyDataMocks([ + { name: 'Package 1', policy_ids: ['policy-1'] }, + { name: 'Package 2', policy_ids: [] }, + { name: 'Package 3', policy_ids: [] }, + { name: 'Package 4', policy_ids: [] }, + ]); + + render(); + + const integrations = await renderResult.findAllByTestId( + 'integrationWithoutAgentPolicyListItem' + ); + expect(integrations.map(({ textContent }) => textContent)).toStrictEqual([ + 'Package 2', + 'Package 3', + 'Package 4', + ]); + }); }); }); @@ -349,7 +514,7 @@ describe('when on the endpoint list page', () => { }); it('should display rows in the table', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -357,7 +522,7 @@ describe('when on the endpoint list page', () => { expect(rows).toHaveLength(6); }); it('should show total', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -365,7 +530,7 @@ describe('when on the endpoint list page', () => { expect(total.textContent).toEqual('Showing 5 endpoints'); }); it('should agent status', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -380,7 +545,7 @@ describe('when on the endpoint list page', () => { }); it('should display correct policy status', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -394,12 +559,12 @@ describe('when on the endpoint list page', () => { POLICY_STATUS_TO_HEALTH_COLOR[generatedPolicyStatuses[index]] }]` ) - ).not.toBeNull(); + ).toBeInTheDocument(); }); }); it('should display policy out-of-date warning when changes pending', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -412,12 +577,12 @@ describe('when on the endpoint list page', () => { }); it('should display policy name as a link', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const firstPolicyName = (await renderResult.findAllByTestId('policyNameCellLink-link'))[0]; - expect(firstPolicyName).not.toBeNull(); + expect(firstPolicyName).toBeInTheDocument(); expect(firstPolicyName.getAttribute('href')).toEqual( `${APP_PATH}${MANAGEMENT_PATH}/policy/${firstPolicyID}/settings` ); @@ -425,7 +590,6 @@ describe('when on the endpoint list page', () => { describe('when the user clicks the first hostname in the table', () => { const endpointDetails: HostInfo = mockEndpointDetailsApiResult(); - let renderResult: reactTestingLibrary.RenderResult; beforeEach(async () => { mockUseGetEndpointDetails.mockReturnValue({ data: { @@ -447,7 +611,7 @@ describe('when on the endpoint list page', () => { }, }, }); - renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -459,20 +623,20 @@ describe('when on the endpoint list page', () => { it('should show the flyout', async () => { return renderResult.findByTestId('endpointDetailsFlyout').then((flyout) => { - expect(flyout).not.toBeNull(); + expect(flyout).toBeInTheDocument(); }); }); }); it('should show revision number', async () => { - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const firstPolicyRevElement = ( await renderResult.findAllByTestId('policyNameCellLink-revision') )[0]; - expect(firstPolicyRevElement).not.toBeNull(); + expect(firstPolicyRevElement).toBeInTheDocument(); expect(firstPolicyRevElement.textContent).toEqual(`rev. ${firstPolicyRev}`); }); }); @@ -502,7 +666,7 @@ describe('when on the endpoint list page', () => { }); it('should update data after some time', async () => { - let renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); @@ -518,7 +682,7 @@ describe('when on the endpoint list page', () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); - renderResult = render(); + render(); const updatedTotal = await renderResult.findAllByTestId('endpointListTableTotal'); expect(updatedTotal[0].textContent).toEqual('1 Host'); @@ -601,33 +765,33 @@ describe('when on the endpoint list page', () => { }); it('should show the flyout and footer', async () => { - const renderResult = render(); - expect(renderResult.getByTestId('endpointDetailsFlyout')).not.toBeNull(); - expect(renderResult.getByTestId('endpointDetailsFlyoutFooter')).not.toBeNull(); + render(); + expect(renderResult.getByTestId('endpointDetailsFlyout')).toBeInTheDocument(); + expect(renderResult.getByTestId('endpointDetailsFlyoutFooter')).toBeInTheDocument(); }); it('should display policy name value as a link', async () => { - const renderResult = render(); + render(); const policyDetailsLink = await renderResult.findByTestId('policyNameCellLink-link'); - expect(policyDetailsLink).not.toBeNull(); + expect(policyDetailsLink).toBeInTheDocument(); expect(policyDetailsLink.getAttribute('href')).toEqual( `${APP_PATH}${MANAGEMENT_PATH}/policy/${hostInfo.metadata.Endpoint.policy.applied.id}/settings` ); }); it('should display policy revision number', async () => { - const renderResult = render(); + render(); const policyDetailsRevElement = await renderResult.findByTestId( 'policyNameCellLink-revision' ); - expect(policyDetailsRevElement).not.toBeNull(); + expect(policyDetailsRevElement).toBeInTheDocument(); expect(policyDetailsRevElement.textContent).toEqual( `rev. ${hostInfo.metadata.Endpoint.policy.applied.endpoint_policy_version}` ); }); it('should update the URL when policy name link is clicked', async () => { - const renderResult = render(); + render(); const policyDetailsLink = await renderResult.findByTestId('policyNameCellLink-link'); const userChangedUrlChecker = middlewareSpy.waitForAction('userChangedUrl'); reactTestingLibrary.act(() => { @@ -640,7 +804,7 @@ describe('when on the endpoint list page', () => { }); it('should update the URL when policy status link is clicked', async () => { - const renderResult = render(); + render(); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); const userChangedUrlChecker = middlewareSpy.waitForAction('userChangedUrl'); reactTestingLibrary.act(() => { @@ -654,7 +818,7 @@ describe('when on the endpoint list page', () => { it('should display Success overall policy status', async () => { getMockUseEndpointDetails(HostPolicyResponseActionStatus.success); - const renderResult = render(); + render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(renderResult.getByTestId('policyStatusValue-success')).toBeTruthy(); expect(policyStatusBadge.textContent).toEqual('Success'); @@ -662,7 +826,7 @@ describe('when on the endpoint list page', () => { it('should display Warning overall policy status', async () => { getMockUseEndpointDetails(HostPolicyResponseActionStatus.warning); - const renderResult = render(); + render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Warning'); expect(renderResult.getByTestId('policyStatusValue-warning')).toBeTruthy(); @@ -670,7 +834,7 @@ describe('when on the endpoint list page', () => { it('should display Failed overall policy status', async () => { getMockUseEndpointDetails(HostPolicyResponseActionStatus.failure); - const renderResult = render(); + render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Failed'); expect(renderResult.getByTestId('policyStatusValue-failure')).toBeTruthy(); @@ -678,15 +842,15 @@ describe('when on the endpoint list page', () => { it('should display Unknown overall policy status', async () => { getMockUseEndpointDetails('' as HostPolicyResponseActionStatus); - const renderResult = render(); + render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Unknown'); expect(renderResult.getByTestId('policyStatusValue-')).toBeTruthy(); }); it('should show the Take Action button', async () => { - const renderResult = render(); - expect(renderResult.getByTestId('endpointDetailsActionsButton')).not.toBeNull(); + render(); + expect(renderResult.getByTestId('endpointDetailsActionsButton')).toBeInTheDocument(); }); describe('Activity Log tab', () => { @@ -705,8 +869,8 @@ describe('when on the endpoint list page', () => { }); describe('when `canReadActionsLogManagement` is TRUE', () => { - it('should start with the activity log tab as unselected', async () => { - const renderResult = await render(); + it('should start with the activity log tab as unselected', () => { + render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.getByTestId( 'endpoint-details-flyout-tab-activity_log' @@ -714,12 +878,14 @@ describe('when on the endpoint list page', () => { expect(detailsTab).toHaveAttribute('aria-selected', 'true'); expect(activityLogTab).toHaveAttribute('aria-selected', 'false'); - expect(renderResult.getByTestId('endpointDetailsFlyoutBody')).not.toBeNull(); - expect(renderResult.queryByTestId('endpointActivityLogFlyoutBody')).toBeNull(); + expect(renderResult.getByTestId('endpointDetailsFlyoutBody')).toBeInTheDocument(); + expect( + renderResult.queryByTestId('endpointActivityLogFlyoutBody') + ).not.toBeInTheDocument(); }); it('should show the activity log content when selected', async () => { - const renderResult = await render(); + render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.getByTestId( 'endpoint-details-flyout-tab-activity_log' @@ -728,13 +894,13 @@ describe('when on the endpoint list page', () => { await userEvent.click(activityLogTab); expect(detailsTab).toHaveAttribute('aria-selected', 'false'); expect(activityLogTab).toHaveAttribute('aria-selected', 'true'); - expect(renderResult.getByTestId('endpointActivityLogFlyoutBody')).not.toBeNull(); - expect(renderResult.queryByTestId('endpointDetailsFlyoutBody')).toBeNull(); + expect(renderResult.getByTestId('endpointActivityLogFlyoutBody')).toBeInTheDocument(); + expect(renderResult.queryByTestId('endpointDetailsFlyoutBody')).not.toBeInTheDocument(); }); }); describe('when `canReadActionsLogManagement` is FALSE', () => { - it('should not show the response actions history tab', async () => { + it('should not show the response actions history tab', () => { mockUserPrivileges.mockReturnValue({ ...mockInitialUserPrivilegesState(), endpointPrivileges: { @@ -744,15 +910,15 @@ describe('when on the endpoint list page', () => { canAccessFleet: true, }, }); - const renderResult = await render(); + render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.queryByTestId( 'endpoint-details-flyout-tab-activity_log' ); expect(detailsTab).toHaveAttribute('aria-selected', 'true'); - expect(activityLogTab).toBeNull(); - expect(renderResult.findByTestId('endpointDetailsFlyoutBody')).not.toBeNull(); + expect(activityLogTab).not.toBeInTheDocument(); + expect(renderResult.getByTestId('endpointDetailsFlyoutBody')).toBeInTheDocument(); }); it('should show the overview tab when force loading actions history tab via URL', async () => { @@ -769,7 +935,7 @@ describe('when on the endpoint list page', () => { history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1&show=activity_log`); }); - const renderResult = await render(); + render(); await middlewareSpy.waitForAction('serverFinishedInitialization'); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); @@ -778,14 +944,13 @@ describe('when on the endpoint list page', () => { ); expect(detailsTab).toHaveAttribute('aria-selected', 'true'); - expect(activityLogTab).toBeNull(); - expect(renderResult.findByTestId('endpointDetailsFlyoutBody')).not.toBeNull(); + expect(activityLogTab).not.toBeInTheDocument(); + expect(renderResult.getByTestId('endpointDetailsFlyoutBody')).toBeInTheDocument(); }); }); }); describe('when showing host Policy Response panel', () => { - let renderResult: ReturnType; beforeEach(async () => { coreStart.http.post.mockImplementation(async (requestOptions) => { if (requestOptions.path === HOST_METADATA_LIST_ROUTE) { @@ -793,7 +958,7 @@ describe('when on the endpoint list page', () => { } throw new Error(`POST to '${requestOptions.path}' does not have a mock response!`); }); - renderResult = await render(); + render(); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); const userChangedUrlChecker = middlewareSpy.waitForAction('userChangedUrl'); reactTestingLibrary.act(() => { @@ -806,14 +971,14 @@ describe('when on the endpoint list page', () => { it('should hide the host details panel', async () => { const endpointDetailsFlyout = renderResult.queryByTestId('endpointDetailsFlyoutBody'); - expect(endpointDetailsFlyout).toBeNull(); + expect(endpointDetailsFlyout).not.toBeInTheDocument(); }); it('should display policy response sub-panel', async () => { - expect(await renderResult.findByTestId('flyoutSubHeaderBackButton')).not.toBeNull(); + expect(await renderResult.findByTestId('flyoutSubHeaderBackButton')).toBeInTheDocument(); expect( await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutBody') - ).not.toBeNull(); + ).toBeInTheDocument(); }); it('should include the back to details link', async () => { @@ -862,14 +1027,13 @@ describe('when on the endpoint list page', () => { }; let isolateApiMock: ReturnType; - let renderResult: ReturnType; beforeEach(async () => { getKibanaServicesMock.mockReturnValue(coreStart); reactTestingLibrary.act(() => { history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1&show=isolate`); }); - renderResult = render(); + render(); await middlewareSpy.waitForAction('serverFinishedInitialization'); // Need to reset `http.post` and adjust it so that the mock for http host @@ -880,7 +1044,7 @@ describe('when on the endpoint list page', () => { }); it('should show the isolate form', () => { - expect(renderResult.getByTestId('host_isolation_comment')).not.toBeNull(); + expect(renderResult.getByTestId('host_isolation_comment')).toBeInTheDocument(); }); it('should take you back to details when back link below the flyout header is clicked', async () => { @@ -922,7 +1086,7 @@ describe('when on the endpoint list page', () => { it('should isolate endpoint host when confirm is clicked', async () => { await confirmIsolateAndWaitForApiResponse(); - expect(renderResult.getByTestId('hostIsolateSuccessMessage')).not.toBeNull(); + expect(renderResult.getByTestId('hostIsolateSuccessMessage')).toBeInTheDocument(); }); it('should navigate to details when the Complete button on success message is clicked', async () => { @@ -946,7 +1110,7 @@ describe('when on the endpoint list page', () => { }); await confirmIsolateAndWaitForApiResponse('failure'); - expect(renderResult.getByText('oh oh. something went wrong')).not.toBeNull(); + expect(renderResult.getByText('oh oh. something went wrong')).toBeInTheDocument(); }); it('should reset isolation state and show form again', async () => { @@ -954,7 +1118,7 @@ describe('when on the endpoint list page', () => { // (`show` is NOT `isolate`), then the state should be reset so that the form show up again the next // time `isolate host` is clicked await confirmIsolateAndWaitForApiResponse(); - expect(renderResult.getByTestId('hostIsolateSuccessMessage')).not.toBeNull(); + expect(renderResult.getByTestId('hostIsolateSuccessMessage')).toBeInTheDocument(); // Close flyout const changeUrlAction = middlewareSpy.waitForAction('userChangedUrl'); @@ -975,7 +1139,7 @@ describe('when on the endpoint list page', () => { }); it('should NOT show the flyout footer', () => { - expect(renderResult.queryByTestId('endpointDetailsFlyoutFooter')).toBeNull(); + expect(renderResult.queryByTestId('endpointDetailsFlyoutFooter')).not.toBeInTheDocument(); }); }); }); @@ -985,7 +1149,6 @@ describe('when on the endpoint list page', () => { let hostInfo: HostInfo[]; let agentId: string; let agentPolicyId: string; - let renderResult: ReturnType; let endpointActionsButton: HTMLElement; // 2nd endpoint only has isolation capabilities @@ -1069,7 +1232,7 @@ describe('when on the endpoint list page', () => { history.push(`${MANAGEMENT_PATH}/endpoints`); }); - renderResult = render(); + render(); await middlewareSpy.waitForAction('serverReturnedEndpointList'); await middlewareSpy.waitForAction('serverReturnedEndpointAgentPolicies'); @@ -1130,7 +1293,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.fireEvent.click(endpointActionsButton); }); const isolateLink = screen.queryByTestId('isolateLink'); - expect(isolateLink).toBeNull(); + expect(isolateLink).not.toBeInTheDocument(); }); it('navigates to the Security Solution Host Details page', async () => { @@ -1179,7 +1342,7 @@ describe('when on the endpoint list page', () => { }); render(); const banner = screen.queryByTestId('callout-endpoints-list-transform-failed'); - expect(banner).toBeNull(); + expect(banner).not.toBeInTheDocument(); }); it('is not displayed when non-relevant transform is failing', () => { @@ -1193,7 +1356,7 @@ describe('when on the endpoint list page', () => { }); render(); const banner = screen.queryByTestId('callout-endpoints-list-transform-failed'); - expect(banner).toBeNull(); + expect(banner).not.toBeInTheDocument(); }); it('is not displayed when no endpoint policy', () => { @@ -1207,7 +1370,7 @@ describe('when on the endpoint list page', () => { }); render(); const banner = screen.queryByTestId('callout-endpoints-list-transform-failed'); - expect(banner).toBeNull(); + expect(banner).not.toBeInTheDocument(); }); it('is displayed when relevant transform state is failed state', async () => { @@ -1268,12 +1431,12 @@ describe('when on the endpoint list page', () => { canAccessFleet: true, }), }); - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedPoliciesForOnboarding'); }); const onboardingSteps = await renderResult.findByTestId('onboardingSteps'); - expect(onboardingSteps).not.toBeNull(); + expect(onboardingSteps).toBeInTheDocument(); }); it('user has endpoint list READ and fleet All and can view entire onboarding screen', async () => { mockUserPrivileges.mockReturnValue({ @@ -1283,12 +1446,12 @@ describe('when on the endpoint list page', () => { canAccessFleet: true, }), }); - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedPoliciesForOnboarding'); }); const onboardingSteps = await renderResult.findByTestId('onboardingSteps'); - expect(onboardingSteps).not.toBeNull(); + expect(onboardingSteps).toBeInTheDocument(); }); it('user has endpoint list ALL/READ and fleet NONE and can view a modified onboarding screen with no actions link to fleet', async () => { mockUserPrivileges.mockReturnValue({ @@ -1298,28 +1461,26 @@ describe('when on the endpoint list page', () => { canAccessFleet: false, }), }); - const renderResult = render(); + render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedPoliciesForOnboarding'); }); const onboardingSteps = await renderResult.findByTestId('policyOnboardingInstructions'); - expect(onboardingSteps).not.toBeNull(); + expect(onboardingSteps).toBeInTheDocument(); const noPrivilegesPage = await renderResult.findByTestId('noFleetAccess'); - expect(noPrivilegesPage).not.toBeNull(); + expect(noPrivilegesPage).toBeInTheDocument(); const startButton = renderResult.queryByTestId('onboardingStartButton'); - expect(startButton).toBeNull(); + expect(startButton).not.toBeInTheDocument(); }); }); describe('endpoint list take action with RBAC controls', () => { - let renderResult: ReturnType; - const renderAndClickActionsButton = async (tableRow: number = 0) => { reactTestingLibrary.act(() => { history.push(`${MANAGEMENT_PATH}/endpoints`); }); - renderResult = render(); + render(); await middlewareSpy.waitForAction('serverReturnedEndpointList'); await middlewareSpy.waitForAction('serverReturnedEndpointAgentPolicies'); @@ -1408,7 +1569,7 @@ describe('when on the endpoint list page', () => { }); await renderAndClickActionsButton(); const isolateLink = await renderResult.findByTestId('isolateLink'); - expect(isolateLink).not.toBeNull(); + expect(isolateLink).toBeInTheDocument(); }); it('hides Isolate host option if canIsolateHost is NONE', async () => { mockUserPrivileges.mockReturnValue({ @@ -1420,7 +1581,7 @@ describe('when on the endpoint list page', () => { }); await renderAndClickActionsButton(); const isolateLink = screen.queryByTestId('isolateLink'); - expect(isolateLink).toBeNull(); + expect(isolateLink).not.toBeInTheDocument(); }); it('shows unisolate host option if canUnHostIsolate is READ/ALL', async () => { mockUserPrivileges.mockReturnValue({ @@ -1432,7 +1593,7 @@ describe('when on the endpoint list page', () => { }); await renderAndClickActionsButton(1); const unisolateLink = await renderResult.findByTestId('unIsolateLink'); - expect(unisolateLink).not.toBeNull(); + expect(unisolateLink).toBeInTheDocument(); }); it('hides unisolate host option if canUnIsolateHost is NONE', async () => { mockUserPrivileges.mockReturnValue({ @@ -1444,7 +1605,7 @@ describe('when on the endpoint list page', () => { }); await renderAndClickActionsButton(1); const unisolateLink = renderResult.queryByTestId('unIsolateLink'); - expect(unisolateLink).toBeNull(); + expect(unisolateLink).not.toBeInTheDocument(); }); it('shows the Responder option when at least one rbac privilege from host isolation, process operation and file operation, is set to TRUE', async () => { @@ -1457,7 +1618,7 @@ describe('when on the endpoint list page', () => { }); await renderAndClickActionsButton(); const responderButton = await renderResult.findByTestId('console'); - expect(responderButton).not.toBeNull(); + expect(responderButton).toBeInTheDocument(); }); it('hides the Responder option when host isolation, process operation and file operations are ALL set to NONE', async () => { @@ -1470,13 +1631,13 @@ describe('when on the endpoint list page', () => { }); await renderAndClickActionsButton(); const responderButton = renderResult.queryByTestId('console'); - expect(responderButton).toBeNull(); + expect(responderButton).not.toBeInTheDocument(); }); it('always shows the Host details link', async () => { mockUserPrivileges.mockReturnValue(getUserPrivilegesMockDefaultValue()); await renderAndClickActionsButton(); const hostLink = await renderResult.findByTestId('hostLink'); - expect(hostLink).not.toBeNull(); + expect(hostLink).toBeInTheDocument(); }); it('shows Agent Policy, View Agent Details and Reassign Policy Links when canReadFleetAgents,canWriteFleetAgents,canReadFleetAgentPolicies RBAC control is enabled', async () => { mockUserPrivileges.mockReturnValue({ @@ -1493,9 +1654,9 @@ describe('when on the endpoint list page', () => { const agentPolicyLink = await renderResult.findByTestId('agentPolicyLink'); const agentDetailsLink = await renderResult.findByTestId('agentDetailsLink'); const agentPolicyReassignLink = await renderResult.findByTestId('agentPolicyReassignLink'); - expect(agentPolicyLink).not.toBeNull(); - expect(agentDetailsLink).not.toBeNull(); - expect(agentPolicyReassignLink).not.toBeNull(); + expect(agentPolicyLink).toBeInTheDocument(); + expect(agentDetailsLink).toBeInTheDocument(); + expect(agentPolicyReassignLink).toBeInTheDocument(); }); it('hides Agent Policy, View Agent Details and Reassign Policy Links when canAccessFleet RBAC control is NOT enabled', async () => { mockUserPrivileges.mockReturnValue({ @@ -1509,9 +1670,9 @@ describe('when on the endpoint list page', () => { const agentPolicyLink = renderResult.queryByTestId('agentPolicyLink'); const agentDetailsLink = renderResult.queryByTestId('agentDetailsLink'); const agentPolicyReassignLink = renderResult.queryByTestId('agentPolicyReassignLink'); - expect(agentPolicyLink).toBeNull(); - expect(agentDetailsLink).toBeNull(); - expect(agentPolicyReassignLink).toBeNull(); + expect(agentPolicyLink).not.toBeInTheDocument(); + expect(agentDetailsLink).not.toBeInTheDocument(); + expect(agentPolicyReassignLink).not.toBeInTheDocument(); }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index 2ed2b20ab78a7..162d05f54ec21 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -40,7 +40,7 @@ import { EndpointListNavLink } from './components/endpoint_list_nav_link'; import { AgentStatus } from '../../../../common/components/endpoint/agents/agent_status'; import { EndpointDetailsFlyout } from './details'; import * as selectors from '../store/selectors'; -import { nonExistingPolicies } from '../store/selectors'; +import type { nonExistingPolicies } from '../store/selectors'; import { useEndpointSelector } from './hooks'; import { POLICY_STATUS_TO_HEALTH_COLOR, POLICY_STATUS_TO_TEXT } from './host_constants'; import type { CreateStructuredSelector } from '../../../../common/store'; @@ -69,6 +69,7 @@ import { APP_UI_ID } from '../../../../../common/constants'; import { ManagementEmptyStateWrapper } from '../../../components/management_empty_state_wrapper'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; import { BackToPolicyListButton } from './components/back_to_policy_list_button'; +import { useBulkGetAgentPolicies } from '../../../services/policies/hooks'; const MAX_PAGINATED_ITEM = 9999; @@ -338,8 +339,8 @@ export const EndpointList = () => { patternsError, metadataTransformStats, isInitialized, + nonExistingPolicies: missingPolicies, } = useEndpointSelector(selector); - const missingPolicies = useEndpointSelector(nonExistingPolicies); const { canReadEndpointList, canAccessFleet, @@ -353,24 +354,22 @@ export const EndpointList = () => { // cap ability to page at 10k records. (max_result_window) const maxPageCount = totalItemCount > MAX_PAGINATED_ITEM ? MAX_PAGINATED_ITEM : totalItemCount; - const hasPolicyData = useMemo(() => policyItems && policyItems.length > 0, [policyItems]); - const hasListData = useMemo(() => listData && listData.length > 0, [listData]); + const hasPolicyData = policyItems && policyItems.length > 0; + const hasListData = listData && listData.length > 0; const refreshStyle = useMemo(() => { return { display: endpointsExist ? 'flex' : 'none', maxWidth: 200 }; }, [endpointsExist]); - const refreshIsPaused = useMemo(() => { - return !endpointsExist ? false : hasSelectedEndpoint ? true : !isAutoRefreshEnabled; - }, [endpointsExist, hasSelectedEndpoint, isAutoRefreshEnabled]); + const refreshIsPaused = !endpointsExist + ? false + : hasSelectedEndpoint + ? true + : !isAutoRefreshEnabled; - const refreshInterval = useMemo(() => { - return !endpointsExist ? DEFAULT_POLL_INTERVAL : autoRefreshInterval; - }, [endpointsExist, autoRefreshInterval]); + const refreshInterval = !endpointsExist ? DEFAULT_POLL_INTERVAL : autoRefreshInterval; - const shouldShowKQLBar = useMemo(() => { - return endpointsExist && !patternsError; - }, [endpointsExist, patternsError]); + const shouldShowKQLBar = endpointsExist && !patternsError; const paginationSetup = useMemo(() => { return { @@ -465,6 +464,57 @@ export const EndpointList = () => { [dispatch] ); + const stateToDisplay: + | 'loading' + | 'policyEmptyState' + | 'policyEmptyStateWithoutFleetAccess' + | 'hostsEmptyState' + | 'endpointTable' + | 'listError' = useMemo(() => { + if (!isInitialized) { + return 'loading'; + } else if (listError) { + return 'listError'; + } else if (endpointsExist) { + return 'endpointTable'; + } else if (canReadEndpointList && !canAccessFleet) { + return 'policyEmptyStateWithoutFleetAccess'; + } else if (!policyItemsLoading && hasPolicyData) { + return 'hostsEmptyState'; + } else { + return 'policyEmptyState'; + } + }, [ + canAccessFleet, + canReadEndpointList, + endpointsExist, + hasPolicyData, + isInitialized, + listError, + policyItemsLoading, + ]); + + const referencedAgentPolicyIds: string[] = useMemo( + // Agent Policy IDs should be unique as one Agent Policy can have only one Defend integration + () => policyItems.flatMap((item) => item.policy_ids), + [policyItems] + ); + + const { data: referencedAgentPolicies, isLoading: isAgentPolicesLoading } = + useBulkGetAgentPolicies({ + isEnabled: stateToDisplay === 'hostsEmptyState', + policyIds: referencedAgentPolicyIds, + }); + + const agentPolicyNameMap = useMemo( + () => + referencedAgentPolicies?.reduce>((acc, policy) => { + acc[policy.id] = policy.name; + return acc; + }, {}) ?? {}, + [referencedAgentPolicies] + ); + // Used for an auto-refresh super date picker version without any date/time selection const onTimeChange = useCallback(() => {}, []); @@ -526,86 +576,92 @@ export const EndpointList = () => { ); const mutableListData = useMemo(() => [...listData], [listData]); + const renderTableOrEmptyState = useMemo(() => { - if (!isInitialized) { - return ( - - } - title={ -

- {i18n.translate('xpack.securitySolution.endpoint.list.loadingEndpointManagement', { - defaultMessage: 'Loading Endpoint Management', - })} -

- } + switch (stateToDisplay) { + case 'loading': + return ( + + } + title={ +

+ {i18n.translate( + 'xpack.securitySolution.endpoint.list.loadingEndpointManagement', + { + defaultMessage: 'Loading Endpoint Management', + } + )} +

+ } + /> +
+ ); + case 'listError': + return ( + + {listError?.error}} + body={

{listError?.message}

} + /> +
+ ); + case 'endpointTable': + return ( + -
- ); - } else if (listError) { - return ( - - {listError.error}} - body={

{listError.message}

} + ); + case 'policyEmptyStateWithoutFleetAccess': + return ( + + + + ); + case 'hostsEmptyState': + const selectionOptions: EuiSelectableProps['options'] = policyItems.flatMap((policy) => + // displaying Package Policy - Agent Policy pairs + policy.policy_ids.map((agentPolicyId) => ({ + key: agentPolicyId, + label: `${policy.name} - ${agentPolicyNameMap[agentPolicyId] || agentPolicyId}`, + checked: selectedPolicyId === agentPolicyId ? 'on' : undefined, + })) + ); + + return ( + -
- ); - } else if (endpointsExist) { - return ( - - ); - } else if (canReadEndpointList && !canAccessFleet) { - return ( - - - - ); - } else if (!policyItemsLoading && hasPolicyData) { - const selectionOptions: EuiSelectableProps['options'] = policyItems - .filter((item) => item.policy_id) - .map((item) => { - return { - key: item.policy_id as string, - label: item.name, - checked: selectedPolicyId === item.policy_id ? 'on' : undefined, - }; - }); - return ( - - ); - } else { - return ( - - - - ); + ); + case 'policyEmptyState': + default: + return ( + + + + ); } }, [ - isInitialized, + stateToDisplay, listError, - endpointsExist, - canReadEndpointList, - canAccessFleet, policyItemsLoading, - hasPolicyData, mutableListData, columns, paginationSetup, @@ -615,6 +671,8 @@ export const EndpointList = () => { sorting, endpointPrivilegesLoading, policyItems, + agentPolicyNameMap, + isAgentPolicesLoading, handleDeployEndpointsClick, selectedPolicyId, handleSelectableOnChange, diff --git a/x-pack/plugins/security_solution/public/management/services/policies/hooks.ts b/x-pack/plugins/security_solution/public/management/services/policies/hooks.ts index 34ccf5677d144..0e823c985c696 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/hooks.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/hooks.ts @@ -7,13 +7,14 @@ import type { QueryObserverResult, UseQueryOptions } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; -import type { GetInfoResponse } from '@kbn/fleet-plugin/common'; +import type { BulkGetAgentPoliciesResponse } from '@kbn/fleet-plugin/common'; +import { type GetInfoResponse } from '@kbn/fleet-plugin/common'; import { firstValueFrom } from 'rxjs'; import type { IKibanaSearchResponse } from '@kbn/search-types'; import { ENDPOINT_PACKAGE_POLICIES_STATS_STRATEGY } from '../../../../common/endpoint/constants'; import { useHttp, useKibana } from '../../../common/lib/kibana'; import { MANAGEMENT_DEFAULT_PAGE_SIZE } from '../../common/constants'; -import { sendGetEndpointSecurityPackage } from './ingest'; +import { sendBulkGetAgentPolicies, sendGetEndpointSecurityPackage } from './ingest'; import type { GetPolicyListResponse } from '../../pages/policy/types'; import { sendGetEndpointSpecificPackagePolicies } from './policies'; import type { ServerApiError } from '../../../common/types'; @@ -83,3 +84,23 @@ export function useGetEndpointSecurityPackage({ customQueryOptions ); } + +export function useBulkGetAgentPolicies({ + isEnabled, + policyIds, +}: { + isEnabled: boolean; + policyIds: string[]; +}): QueryObserverResult { + const http = useHttp(); + + return useQuery( + ['agentPolicies', policyIds], + + async () => { + return (await sendBulkGetAgentPolicies({ http, requestBody: { ids: policyIds } }))?.items; + }, + + { enabled: isEnabled, refetchOnWindowFocus: false, retry: 1 } + ); +} diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts index c125464bffdb9..2437e3d267a11 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts @@ -10,9 +10,12 @@ import type { GetAgentStatusResponse, GetPackagePoliciesResponse, GetInfoResponse, + BulkGetAgentPoliciesResponse, } from '@kbn/fleet-plugin/common'; -import { epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; +import { epmRouteService, API_VERSIONS, agentPolicyRouteService } from '@kbn/fleet-plugin/common'; +import type { BulkGetAgentPoliciesRequestSchema } from '@kbn/fleet-plugin/server/types'; +import type { TypeOf } from '@kbn/config-schema'; import type { NewPolicyData } from '../../../../common/endpoint/types'; import type { GetPolicyResponse, UpdatePolicyResponse } from '../../pages/policy/types'; @@ -120,3 +123,15 @@ export const sendGetEndpointSecurityPackage = async ( } return endpointPackageInfo; }; + +export const sendBulkGetAgentPolicies = async ({ + http, + requestBody, +}: { + http: HttpStart; + requestBody: TypeOf; +}): Promise => + http.post(agentPolicyRouteService.getBulkGetPath(), { + version: API_VERSIONS.public.v1, + body: JSON.stringify(requestBody), + }); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c07189b1669d8..67324e7024bfc 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -37775,7 +37775,6 @@ "xpack.securitySolution.endpoint.list.loadingPolicies": "Chargement des intégrations", "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "Vous avez ajouté l'intégration Elastic Defend. Vous pouvez maintenant enregistrer vos agents en suivant la procédure ci-dessous.", "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "Étape suivante : Enregistrer un agent avec Elastic Defend", - "xpack.securitySolution.endpoint.list.noPolicies": "Il n'existe aucune intégration.", "xpack.securitySolution.endpoint.list.os": "Système d'exploitation", "xpack.securitySolution.endpoint.list.pageSubTitle": "Hôtes exécutant Elastic Defend", "xpack.securitySolution.endpoint.list.pageTitle": "Points de terminaison", @@ -47699,4 +47698,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "Ce champ est requis.", "xpack.watcher.watcherDescription": "Détectez les modifications survenant dans vos données en créant, gérant et monitorant des alertes." } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index bc63fd4be919f..ae40b40dd5573 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -37517,7 +37517,6 @@ "xpack.securitySolution.endpoint.list.loadingPolicies": "統合を読み込んでいます", "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "Elastic Defend統合を追加しました。次の手順を使用して、エージェントを登録してください。", "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "次のステップ:Elastic Defendにエージェントを登録する", - "xpack.securitySolution.endpoint.list.noPolicies": "統合はありません。", "xpack.securitySolution.endpoint.list.os": "OS", "xpack.securitySolution.endpoint.list.pageSubTitle": "Elastic Defendを実行しているホスト", "xpack.securitySolution.endpoint.list.pageTitle": "エンドポイント", @@ -47436,4 +47435,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "フィールドを選択してください。", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 10a7f0e566fef..130727459f54d 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -37563,7 +37563,6 @@ "xpack.securitySolution.endpoint.list.loadingPolicies": "正在加载集成", "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "您已添加 Elastic Defend 集成。现在,按照以下步骤注册您的代理。", "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "下一步:将代理注册到 Elastic Defend", - "xpack.securitySolution.endpoint.list.noPolicies": "没有集成。", "xpack.securitySolution.endpoint.list.os": "OS", "xpack.securitySolution.endpoint.list.pageSubTitle": "运行 Elastic Defend 的主机", "xpack.securitySolution.endpoint.list.pageTitle": "终端", @@ -47490,4 +47489,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "此字段必填。", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } -} +} \ No newline at end of file From 39ac875b764019e2c570b175f3cc57e0c02b20ec Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Tue, 1 Oct 2024 13:30:47 -0500 Subject: [PATCH 077/107] [Security Solution][Notes] - move notes management page under manage section instead of timeline (#194250) --- packages/deeplinks/security/deep_links.ts | 2 +- .../security_solution/common/constants.ts | 2 +- .../solution_navigation/links/app_links.ts | 21 ++- .../links/sections/investigations_links.ts | 26 ++- .../sections/investigations_translations.ts | 7 + .../public/app/translations.ts | 2 +- .../security_solution/public/app_links.ts | 3 + .../link_to/redirect_to_timelines.tsx | 2 +- .../public/management/common/breadcrumbs.ts | 2 + .../public/management/common/constants.ts | 1 + .../public/management/links.ts | 22 +++ .../public/management/pages/index.tsx | 18 ++ .../public/management/pages/notes/index.tsx | 21 +++ .../public/management/types.ts | 1 + .../public/notes/components/translations.ts | 53 ------ .../security_solution/public/notes/links.ts | 25 +++ .../notes/pages/note_management_page.tsx | 39 +++-- .../public/notes/pages/translations.ts | 73 ++++++++ .../security_solution/public/notes/routes.tsx | 42 +++++ .../components/open_timeline/index.tsx | 4 +- .../open_timeline/open_timeline.tsx | 164 +++++++++--------- .../components/open_timeline/types.ts | 1 - .../open_timeline/use_timeline_types.tsx | 28 +-- .../public/timelines/links.ts | 11 +- .../public/timelines/pages/index.tsx | 2 +- .../public/timelines/pages/timelines_page.tsx | 5 +- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 29 files changed, 372 insertions(+), 211 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/management/pages/notes/index.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/links.ts create mode 100644 x-pack/plugins/security_solution/public/notes/pages/translations.ts create mode 100644 x-pack/plugins/security_solution/public/notes/routes.tsx diff --git a/packages/deeplinks/security/deep_links.ts b/packages/deeplinks/security/deep_links.ts index c7d5b54fb202a..54b18dcaf9206 100644 --- a/packages/deeplinks/security/deep_links.ts +++ b/packages/deeplinks/security/deep_links.ts @@ -87,5 +87,5 @@ export enum SecurityPageName { entityAnalyticsManagement = 'entity_analytics-management', entityAnalyticsAssetClassification = 'entity_analytics-asset-classification', coverageOverview = 'coverage-overview', - notesManagement = 'notes-management', + notes = 'notes', } diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 5da9b87a4e267..e2b85fd123f91 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -133,7 +133,7 @@ export const APP_HOST_ISOLATION_EXCEPTIONS_PATH = export const APP_BLOCKLIST_PATH = `${APP_PATH}${BLOCKLIST_PATH}` as const; export const APP_RESPONSE_ACTIONS_HISTORY_PATH = `${APP_PATH}${RESPONSE_ACTIONS_HISTORY_PATH}` as const; -export const NOTES_MANAGEMENT_PATH = `/notes_management` as const; +export const NOTES_PATH = `${MANAGEMENT_PATH}/notes` as const; // cloud logs to exclude from default index pattern export const EXCLUDE_ELASTIC_CLOUD_INDICES = ['-*elastic-cloud-logs-*']; diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts index 3107bb93de269..f6a51f1d25f4f 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/app_links.ts @@ -6,9 +6,13 @@ */ import { SecurityPageName } from '@kbn/security-solution-navigation'; -import { cloneDeep, remove } from 'lodash'; +import { cloneDeep, remove, find } from 'lodash'; import type { AppLinkItems, LinkItem } from '../../../common/links/types'; -import { createInvestigationsLinkFromTimeline } from './sections/investigations_links'; +import { + createInvestigationsLinkFromNotes, + createInvestigationsLinkFromTimeline, + updateInvestigationsLinkFromNotes, +} from './sections/investigations_links'; import { mlAppLink } from './sections/ml_links'; import { createAssetsLinkFromManage } from './sections/assets_links'; import { createSettingsLinksFromManage } from './sections/settings_links'; @@ -26,6 +30,19 @@ export const solutionAppLinksSwitcher = (appLinks: AppLinkItems): AppLinkItems = solutionAppLinks.push(createInvestigationsLinkFromTimeline(timelineLinkItem)); } + // Remove note link + const investigationsLinkItem = find(solutionAppLinks, { id: SecurityPageName.investigations }); + const [noteLinkItem] = remove(solutionAppLinks, { id: SecurityPageName.notes }); + if (noteLinkItem) { + if (!investigationsLinkItem) { + solutionAppLinks.push(createInvestigationsLinkFromNotes(noteLinkItem)); + } else { + solutionAppLinks.push( + updateInvestigationsLinkFromNotes(investigationsLinkItem, noteLinkItem) + ); + } + } + // Remove manage link const [manageLinkItem] = remove(solutionAppLinks, { id: SecurityPageName.administration }); diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_links.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_links.ts index 33bc73ee3ef77..3c4d059474993 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_links.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_links.ts @@ -6,6 +6,7 @@ */ import { ExternalPageName, SecurityPageName } from '@kbn/security-solution-navigation'; +import IconFilebeatChart from './icons/filebeat_chart'; import { INVESTIGATIONS_PATH } from '../../../../../common/constants'; import { SERVER_APP_ID } from '../../../../../common'; import type { LinkItem } from '../../../../common/links/types'; @@ -21,7 +22,7 @@ const investigationsAppLink: LinkItem = { capabilities: [`${SERVER_APP_ID}.show`], hideTimeline: true, skipUrlState: true, - links: [], // timeline link are added in createInvestigationsLinkFromTimeline + links: [], // timeline and note links are added via the methods below }; export const createInvestigationsLinkFromTimeline = (timelineLink: LinkItem): LinkItem => { @@ -33,6 +34,29 @@ export const createInvestigationsLinkFromTimeline = (timelineLink: LinkItem): Li }; }; +export const createInvestigationsLinkFromNotes = (noteLink: LinkItem): LinkItem => { + return { + ...investigationsAppLink, + links: [{ ...noteLink, description: i18n.NOTE_DESCRIPTION, landingIcon: IconTimelineLazy }], + }; +}; + +export const updateInvestigationsLinkFromNotes = ( + investigationsLink: LinkItem, + noteLink: LinkItem +): LinkItem => { + const currentLinks = investigationsLink.links ?? []; + currentLinks.push({ + ...noteLink, + description: i18n.NOTE_DESCRIPTION, + landingIcon: IconFilebeatChart, + }); + return { + ...investigationsLink, + links: currentLinks, + }; +}; + // navLinks define the navigation links for the Security Solution pages and External pages as well export const investigationsNavLinks: SolutionNavLink[] = [ { diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts index 55c6fe74f846d..d70717783870a 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts @@ -21,6 +21,13 @@ export const TIMELINE_DESCRIPTION = i18n.translate( } ); +export const NOTE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.navLinks.investigations.note.title', + { + defaultMessage: 'Oversee, revise and revisit the annotations within each document and timeline', + } +); + export const OSQUERY_TITLE = i18n.translate( 'xpack.securitySolution.navLinks.investigations.osquery.title', { diff --git a/x-pack/plugins/security_solution/public/app/translations.ts b/x-pack/plugins/security_solution/public/app/translations.ts index dcadd74245f24..97f07ee6706b9 100644 --- a/x-pack/plugins/security_solution/public/app/translations.ts +++ b/x-pack/plugins/security_solution/public/app/translations.ts @@ -25,7 +25,7 @@ export const ENTITY_ANALYTICS_RISK_SCORE = i18n.translate( } ); -export const NOTES = i18n.translate('xpack.securitySolution.navigation.notesManagement', { +export const NOTES = i18n.translate('xpack.securitySolution.navigation.notes', { defaultMessage: 'Notes', }); diff --git a/x-pack/plugins/security_solution/public/app_links.ts b/x-pack/plugins/security_solution/public/app_links.ts index 4140f6bfcd322..334209b744580 100644 --- a/x-pack/plugins/security_solution/public/app_links.ts +++ b/x-pack/plugins/security_solution/public/app_links.ts @@ -6,6 +6,7 @@ */ import type { CoreStart } from '@kbn/core/public'; +import { links as notesLink } from './notes/links'; import { links as attackDiscoveryLinks } from './attack_discovery/links'; import type { AppLinkItems } from './common/links/types'; import { indicatorsLinks } from './threat_intelligence/links'; @@ -35,6 +36,7 @@ export const appLinks: AppLinkItems = Object.freeze([ rulesLinks, gettingStartedLinks, managementLinks, + notesLink, ]); export const getFilteredLinks = async ( @@ -55,5 +57,6 @@ export const getFilteredLinks = async ( rulesLinks, gettingStartedLinks, managementFilteredLinks, + notesLink, ]); }; diff --git a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx index 3fa8cd2be11bc..07ff05f507029 100644 --- a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx +++ b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx @@ -9,7 +9,7 @@ import { isEmpty } from 'lodash/fp'; import type { TimelineType } from '../../../../common/api/timeline'; import { appendSearch } from './helpers'; -export const getTimelineTabsUrl = (tabName: TimelineType | 'notes', search?: string) => +export const getTimelineTabsUrl = (tabName: TimelineType, search?: string) => `/${tabName}${appendSearch(search)}`; export const getTimelineUrl = (id: string, graphEventId?: string) => diff --git a/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts b/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts index aca8f865fce8a..82b321abdcd6e 100644 --- a/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts +++ b/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts @@ -14,6 +14,7 @@ import { BLOCKLIST, RESPONSE_ACTIONS_HISTORY, PROTECTION_UPDATES, + NOTES, } from '../../app/translations'; const TabNameMappedToI18nKey: Record = { @@ -25,6 +26,7 @@ const TabNameMappedToI18nKey: Record = { [AdministrationSubTab.blocklist]: BLOCKLIST, [AdministrationSubTab.responseActionsHistory]: RESPONSE_ACTIONS_HISTORY, [AdministrationSubTab.protectionUpdates]: PROTECTION_UPDATES, + [AdministrationSubTab.notes]: NOTES, }; export function getTrailingBreadcrumbs(params: AdministrationRouteSpyState): ChromeBreadcrumb[] { diff --git a/x-pack/plugins/security_solution/public/management/common/constants.ts b/x-pack/plugins/security_solution/public/management/common/constants.ts index 4b050266f3ac3..b319adbd0faeb 100644 --- a/x-pack/plugins/security_solution/public/management/common/constants.ts +++ b/x-pack/plugins/security_solution/public/management/common/constants.ts @@ -18,6 +18,7 @@ export const MANAGEMENT_ROUTING_POLICY_DETAILS_EVENT_FILTERS_PATH = `${MANAGEMEN export const MANAGEMENT_ROUTING_POLICY_DETAILS_HOST_ISOLATION_EXCEPTIONS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId/hostIsolationExceptions`; export const MANAGEMENT_ROUTING_POLICY_DETAILS_BLOCKLISTS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId/blocklists`; export const MANAGEMENT_ROUTING_POLICY_DETAILS_PROTECTION_UPDATES_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId/protectionUpdates`; +export const MANAGEMENT_ROUTING_NOTES_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.notes})`; /** @deprecated use the paths defined above instead */ export const MANAGEMENT_ROUTING_POLICY_DETAILS_PATH_OLD = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId`; export const MANAGEMENT_ROUTING_TRUSTED_APPS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.trustedApps})`; diff --git a/x-pack/plugins/security_solution/public/management/links.ts b/x-pack/plugins/security_solution/public/management/links.ts index 91bf4e958f6fb..7247c45c366f4 100644 --- a/x-pack/plugins/security_solution/public/management/links.ts +++ b/x-pack/plugins/security_solution/public/management/links.ts @@ -8,6 +8,7 @@ import type { CoreStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; +import IconFilebeatChart from '../app/solution_navigation/links/sections/icons/filebeat_chart'; import { checkArtifactHasData } from './services/exceptions_list/check_artifact_has_data'; import { calculateEndpointAuthz, @@ -22,6 +23,7 @@ import { EVENT_FILTERS_PATH, HOST_ISOLATION_EXCEPTIONS_PATH, MANAGE_PATH, + NOTES_PATH, POLICIES_PATH, RESPONSE_ACTIONS_HISTORY_PATH, SecurityPageName, @@ -39,6 +41,7 @@ import { TRUSTED_APPLICATIONS, ENTITY_ANALYTICS_RISK_SCORE, ASSET_CRITICALITY, + NOTES, } from '../app/translations'; import { licenseService } from '../common/hooks/use_license'; import type { LinkItem } from '../common/links/types'; @@ -85,6 +88,12 @@ const categories = [ }), linkIds: [SecurityPageName.cloudDefendPolicies], }, + { + label: i18n.translate('xpack.securitySolution.appLinks.category.investigations', { + defaultMessage: 'Investigations', + }), + linkIds: [SecurityPageName.notes], + }, ]; export const links: LinkItem = { @@ -215,6 +224,19 @@ export const links: LinkItem = { hideTimeline: true, }, cloudDefendLink, + { + id: SecurityPageName.notes, + title: NOTES, + description: i18n.translate('xpack.securitySolution.appLinks.notesDescription', { + defaultMessage: + 'Oversee, revise and revisit the annotations within each document and timeline.', + }), + landingIcon: IconFilebeatChart, + path: NOTES_PATH, + skipUrlState: true, + hideTimeline: true, + experimentalKey: 'securitySolutionNotesEnabled', + }, ], }; diff --git a/x-pack/plugins/security_solution/public/management/pages/index.tsx b/x-pack/plugins/security_solution/public/management/pages/index.tsx index 144ae26815f18..dc8314acc276c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.tsx @@ -11,6 +11,8 @@ import { Routes, Route } from '@kbn/shared-ux-router'; import { TrackApplicationView } from '@kbn/usage-collection-plugin/public'; import { EuiEmptyPrompt, EuiLoadingLogo } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; +import { NotesContainer } from './notes'; import { ManagementEmptyStateWrapper } from '../components/management_empty_state_wrapper'; import { MANAGEMENT_ROUTING_ENDPOINTS_PATH, @@ -20,6 +22,7 @@ import { MANAGEMENT_ROUTING_TRUSTED_APPS_PATH, MANAGEMENT_ROUTING_BLOCKLIST_PATH, MANAGEMENT_ROUTING_RESPONSE_ACTIONS_HISTORY_PATH, + MANAGEMENT_ROUTING_NOTES_PATH, } from '../common/constants'; import { NotFoundPage } from '../../app/404'; import { EndpointsContainer } from './endpoint_hosts'; @@ -77,7 +80,18 @@ const ResponseActionsTelemetry = () => ( ); +const NotesTelemetry = () => ( + + + + +); + export const ManagementContainer = memo(() => { + const securitySolutionNotesEnabled = useIsExperimentalFeatureEnabled( + 'securitySolutionNotesEnabled' + ); + const { loading, canReadPolicyManagement, @@ -148,6 +162,10 @@ export const ManagementContainer = memo(() => { hasPrivilege={canReadActionsLogManagement} /> + {securitySolutionNotesEnabled && ( + + )} + {canReadEndpointList && ( diff --git a/x-pack/plugins/security_solution/public/management/pages/notes/index.tsx b/x-pack/plugins/security_solution/public/management/pages/notes/index.tsx new file mode 100644 index 0000000000000..5c57509432a93 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/notes/index.tsx @@ -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 { Routes, Route } from '@kbn/shared-ux-router'; +import React from 'react'; +import { NoteManagementPage } from '../../../notes'; +import { NotFoundPage } from '../../../app/404'; +import { MANAGEMENT_ROUTING_NOTES_PATH } from '../../common/constants'; + +export const NotesContainer = () => { + return ( + + + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/types.ts b/x-pack/plugins/security_solution/public/management/types.ts index 94f671ac09e2f..ef0e3e56c7285 100644 --- a/x-pack/plugins/security_solution/public/management/types.ts +++ b/x-pack/plugins/security_solution/public/management/types.ts @@ -33,6 +33,7 @@ export enum AdministrationSubTab { blocklist = 'blocklist', responseActionsHistory = 'response_actions_history', protectionUpdates = 'protection_updates', + notes = 'notes', } /** diff --git a/x-pack/plugins/security_solution/public/notes/components/translations.ts b/x-pack/plugins/security_solution/public/notes/components/translations.ts index f2846d6daab62..8d7a5b4262815 100644 --- a/x-pack/plugins/security_solution/public/notes/components/translations.ts +++ b/x-pack/plugins/security_solution/public/notes/components/translations.ts @@ -14,56 +14,10 @@ export const BATCH_ACTIONS = i18n.translate( } ); -export const CREATED_COLUMN = i18n.translate( - 'xpack.securitySolution.notes.management.createdColumnTitle', - { - defaultMessage: 'Created', - } -); - -export const CREATED_BY_COLUMN = i18n.translate( - 'xpack.securitySolution.notes.management.createdByColumnTitle', - { - defaultMessage: 'Created by', - } -); - -export const EVENT_ID_COLUMN = i18n.translate( - 'xpack.securitySolution.notes.management.eventIdColumnTitle', - { - defaultMessage: 'View Document', - } -); - -export const TIMELINE_ID_COLUMN = i18n.translate( - 'xpack.securitySolution.notes.management.timelineColumnTitle', - { - defaultMessage: 'Timeline', - } -); - -export const NOTE_CONTENT_COLUMN = i18n.translate( - 'xpack.securitySolution.notes.management.noteContentColumnTitle', - { - defaultMessage: 'Note content', - } -); - export const DELETE = i18n.translate('xpack.securitySolution.notes.management.deleteAction', { defaultMessage: 'Delete', }); -export const DELETE_SINGLE_NOTE_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.notes.management.deleteDescription', - { - defaultMessage: 'Delete this note', - } -); - -export const TABLE_ERROR = i18n.translate('xpack.securitySolution.notes.management.tableError', { - defaultMessage: 'Unable to load notes', -}); - export const DELETE_NOTES_MODAL_TITLE = i18n.translate( 'xpack.securitySolution.notes.management.deleteNotesModalTitle', { @@ -96,13 +50,6 @@ export const REFRESH = i18n.translate('xpack.securitySolution.notes.management.r defaultMessage: 'Refresh', }); -export const OPEN_TIMELINE = i18n.translate( - 'xpack.securitySolution.notes.management.openTimeline', - { - defaultMessage: 'Open timeline', - } -); - export const VIEW_EVENT_IN_TIMELINE = i18n.translate( 'xpack.securitySolution.notes.management.viewEventInTimeline', { diff --git a/x-pack/plugins/security_solution/public/notes/links.ts b/x-pack/plugins/security_solution/public/notes/links.ts new file mode 100644 index 0000000000000..ef6c691b6246a --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/links.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 { i18n } from '@kbn/i18n'; +import { NOTES_PATH, SecurityPageName, SERVER_APP_ID } from '../../common/constants'; +import { NOTES } from '../app/translations'; +import type { LinkItem } from '../common/links/types'; + +export const links: LinkItem = { + id: SecurityPageName.notes, + title: NOTES, + path: NOTES_PATH, + capabilities: [`${SERVER_APP_ID}.show`], + globalSearchKeywords: [ + i18n.translate('xpack.securitySolution.appLinks.notes', { + defaultMessage: 'Notes', + }), + ], + links: [], + experimentalKey: 'securitySolutionNotesEnabled', +}; 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 574501b7d03c0..ddfed3fbb6287 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 @@ -7,8 +7,11 @@ import React, { useCallback, useMemo, useEffect } from 'react'; import type { DefaultItemAction, EuiBasicTableColumn } from '@elastic/eui'; -import { EuiBasicTable, EuiEmptyPrompt, EuiLink } from '@elastic/eui'; +import { EuiBasicTable, EuiEmptyPrompt, EuiLink, EuiSpacer } from '@elastic/eui'; import { useDispatch, useSelector } from 'react-redux'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; +import { useQueryTimelineById } from '../../timelines/components/open_timeline/helpers'; +import { Title } from '../../common/components/header_page/title'; // TODO unify this type from the api with the one in public/common/lib/note import type { Note } from '../../../common/api/timeline'; import { FormattedRelativePreferenceDate } from '../../common/components/formatted_date'; @@ -32,12 +35,11 @@ import type { NotesState } from '..'; import { SearchRow } from '../components/search_row'; import { NotesUtilityBar } from '../components/utility_bar'; import { DeleteConfirmModal } from '../components/delete_confirm_modal'; -import * as i18n from '../components/translations'; -import type { OpenTimelineProps } from '../../timelines/components/open_timeline/types'; +import * as i18n from './translations'; import { OpenEventInTimeline } from '../components/open_event_in_timeline'; const columns: ( - onOpenTimeline: OpenTimelineProps['onOpenTimeline'] + onOpenTimeline: (timelineId: string) => void ) => Array> = (onOpenTimeline) => { return [ { @@ -61,9 +63,7 @@ const columns: ( name: i18n.TIMELINE_ID_COLUMN, render: (timelineId: Note['timelineId']) => timelineId ? ( - onOpenTimeline({ timelineId, duplicate: false })}> - {i18n.OPEN_TIMELINE} - + onOpenTimeline(timelineId)}>{i18n.OPEN_TIMELINE} ) : null, }, { @@ -80,11 +80,7 @@ const pageSizeOptions = [10, 25, 50, 100]; * This component uses the same slices of state as the notes functionality of the rest of the Security Solution applicaiton. * Therefore, changes made in this page (like fetching or deleting notes) will have an impact everywhere. */ -export const NoteManagementPage = ({ - onOpenTimeline, -}: { - onOpenTimeline: OpenTimelineProps['onOpenTimeline']; -}) => { +export const NoteManagementPage = () => { const dispatch = useDispatch(); const notes = useSelector(selectAllNotes); const pagination = useSelector(selectNotesPagination); @@ -152,6 +148,19 @@ export const NoteManagementPage = ({ return item.noteId; }, []); + const unifiedComponentsInTimelineDisabled = useIsExperimentalFeatureEnabled( + 'unifiedComponentsInTimelineDisabled' + ); + const queryTimelineById = useQueryTimelineById(); + const openTimeline = useCallback( + (timelineId: string) => + queryTimelineById({ + timelineId, + unifiedComponentsInTimelineDisabled, + }), + [queryTimelineById, unifiedComponentsInTimelineDisabled] + ); + const columnWithActions = useMemo(() => { const actions: Array> = [ { @@ -164,13 +173,13 @@ export const NoteManagementPage = ({ }, ]; return [ - ...columns(onOpenTimeline), + ...columns(openTimeline), { name: 'actions', actions, }, ]; - }, [selectRowForDeletion, onOpenTimeline]); + }, [selectRowForDeletion, openTimeline]); const currentPagination = useMemo(() => { return { @@ -207,6 +216,8 @@ export const NoteManagementPage = ({ return ( <> + + <EuiSpacer size="m" /> <SearchRow /> <NotesUtilityBar /> <EuiBasicTable diff --git a/x-pack/plugins/security_solution/public/notes/pages/translations.ts b/x-pack/plugins/security_solution/public/notes/pages/translations.ts new file mode 100644 index 0000000000000..5f5d9b19477e6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/pages/translations.ts @@ -0,0 +1,73 @@ +/* + * Copyright 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 NOTES = i18n.translate('xpack.securitySolution.notes.management.title', { + defaultMessage: 'Notes', +}); + +export const CREATED_COLUMN = i18n.translate( + 'xpack.securitySolution.notes.management.createdColumnTitle', + { + defaultMessage: 'Created', + } +); + +export const CREATED_BY_COLUMN = i18n.translate( + 'xpack.securitySolution.notes.management.createdByColumnTitle', + { + defaultMessage: 'Created by', + } +); + +export const EVENT_ID_COLUMN = i18n.translate( + 'xpack.securitySolution.notes.management.eventIdColumnTitle', + { + defaultMessage: 'View Document', + } +); + +export const TIMELINE_ID_COLUMN = i18n.translate( + 'xpack.securitySolution.notes.management.timelineColumnTitle', + { + defaultMessage: 'Timeline', + } +); + +export const NOTE_CONTENT_COLUMN = i18n.translate( + 'xpack.securitySolution.notes.management.noteContentColumnTitle', + { + defaultMessage: 'Note content', + } +); + +export const DELETE = i18n.translate('xpack.securitySolution.notes.management.deleteAction', { + defaultMessage: 'Delete', +}); + +export const DELETE_SINGLE_NOTE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.notes.management.deleteDescription', + { + defaultMessage: 'Delete this note', + } +); + +export const TABLE_ERROR = i18n.translate('xpack.securitySolution.notes.management.tableError', { + defaultMessage: 'Unable to load notes', +}); + +export const REFRESH = i18n.translate('xpack.securitySolution.notes.management.refresh', { + defaultMessage: 'Refresh', +}); + +export const OPEN_TIMELINE = i18n.translate( + 'xpack.securitySolution.notes.management.openTimeline', + { + defaultMessage: 'Open timeline', + } +); diff --git a/x-pack/plugins/security_solution/public/notes/routes.tsx b/x-pack/plugins/security_solution/public/notes/routes.tsx new file mode 100644 index 0000000000000..7bd17c2b012ef --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/routes.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { Switch } from 'react-router-dom'; +import { Route } from '@kbn/shared-ux-router'; +import { TrackApplicationView } from '@kbn/usage-collection-plugin/public'; +import { NoteManagementPage } from './pages/note_management_page'; +import { SpyRoute } from '../common/utils/route/spy_routes'; +import { NotFoundPage } from '../app/404'; +import { NOTES_PATH, SecurityPageName } from '../../common/constants'; +import { PluginTemplateWrapper } from '../common/components/plugin_template_wrapper'; + +const NotesManagementTelemetry = () => ( + <PluginTemplateWrapper> + <TrackApplicationView viewId={SecurityPageName.notes}> + <NoteManagementPage /> + <SpyRoute pageName={SecurityPageName.notes} /> + </TrackApplicationView> + </PluginTemplateWrapper> +); + +const NotesManagementContainer: React.FC = React.memo(() => { + return ( + <Switch> + <Route path={NOTES_PATH} exact component={NotesManagementTelemetry} /> + <Route component={NotFoundPage} /> + </Switch> + ); +}); +NotesManagementContainer.displayName = 'NotesManagementContainer'; + +export const routes = [ + { + path: NOTES_PATH, + component: NotesManagementContainer, + }, +]; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index ea86d5eaa54fb..cdb61ecf61f6e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -70,7 +70,7 @@ interface OwnProps<TCache = object> { export type OpenTimelineOwnProps = OwnProps & Pick< OpenTimelineProps, - 'defaultPageSize' | 'title' | 'importDataModalToggle' | 'setImportDataModalToggle' | 'tabName' + 'defaultPageSize' | 'title' | 'importDataModalToggle' | 'setImportDataModalToggle' >; /** Returns a collection of selected timeline ids */ @@ -131,7 +131,6 @@ export const StatefulOpenTimelineComponent = React.memo<OpenTimelineOwnProps>( importDataModalToggle, onOpenTimeline, setImportDataModalToggle, - tabName, title, }) => { const dispatch = useDispatch(); @@ -423,7 +422,6 @@ export const StatefulOpenTimelineComponent = React.memo<OpenTimelineOwnProps>( selectedItems={selectedItems} sortDirection={sortDirection} sortField={sortField} - tabName={tabName} templateTimelineFilter={templateTimelineFilter} timelineType={timelineType} timelineStatus={timelineStatus} diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx index 524d3bee9640a..5a1a9155bb5c1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx @@ -30,7 +30,6 @@ import { TimelinesTable } from './timelines_table'; import * as i18n from './translations'; import { OPEN_TIMELINE_CLASS_NAME } from './helpers'; import type { OpenTimelineProps, ActionTimelineToShow, OpenTimelineResult } from './types'; -import { NoteManagementPage } from '../../../notes'; const QueryText = styled.span` white-space: normal; @@ -64,7 +63,6 @@ export const OpenTimeline = React.memo<OpenTimelineProps>( sortDirection, setImportDataModalToggle, sortField, - tabName, timelineType = TimelineTypeEnum.default, timelineStatus, timelineFilter, @@ -228,92 +226,86 @@ export const OpenTimeline = React.memo<OpenTimelineProps>( <div data-test-subj="timelines-page-container" className={OPEN_TIMELINE_CLASS_NAME}> {!!timelineFilter && timelineFilter} - {tabName !== 'notes' ? ( - <> - <SearchRow - data-test-subj="search-row" - favoriteCount={favoriteCount} - onlyFavorites={onlyFavorites} - onQueryChange={onQueryChange} - onToggleOnlyFavorites={onToggleOnlyFavorites} - query={query} - timelineType={timelineType} - > - {SearchRowContent} - </SearchRow> + <> + <SearchRow + data-test-subj="search-row" + favoriteCount={favoriteCount} + onlyFavorites={onlyFavorites} + onQueryChange={onQueryChange} + onToggleOnlyFavorites={onToggleOnlyFavorites} + query={query} + timelineType={timelineType} + > + {SearchRowContent} + </SearchRow> - <UtilityBar border> - <UtilityBarSection> - <UtilityBarGroup> - <UtilityBarText data-test-subj="query-message"> - <> - {i18n.SHOWING}{' '} - {timelineType === TimelineTypeEnum.template ? nTemplates : nTimelines} - </> - </UtilityBarText> - </UtilityBarGroup> - <UtilityBarGroup> - {timelineStatus !== TimelineStatusEnum.immutable && ( - <> - <UtilityBarText data-test-subj="selected-count"> - {timelineType === TimelineTypeEnum.template - ? i18n.SELECTED_TEMPLATES((selectedItems || []).length) - : i18n.SELECTED_TIMELINES((selectedItems || []).length)} - </UtilityBarText> - <UtilityBarAction - dataTestSubj="batchActions" - iconSide="right" - iconType="arrowDown" - popoverContent={getBatchItemsPopoverContent} - data-test-subj="utility-bar-action" - > - <span data-test-subj="utility-bar-action-button"> - {i18n.BATCH_ACTIONS} - </span> - </UtilityBarAction> - </> - )} - <UtilityBarAction - dataTestSubj="refreshButton" - iconSide="right" - iconType="refresh" - onClick={onRefreshBtnClick} - > - {i18n.REFRESH} - </UtilityBarAction> - </UtilityBarGroup> - </UtilityBarSection> - </UtilityBar> + <UtilityBar border> + <UtilityBarSection> + <UtilityBarGroup> + <UtilityBarText data-test-subj="query-message"> + <> + {i18n.SHOWING}{' '} + {timelineType === TimelineTypeEnum.template ? nTemplates : nTimelines} + </> + </UtilityBarText> + </UtilityBarGroup> + <UtilityBarGroup> + {timelineStatus !== TimelineStatusEnum.immutable && ( + <> + <UtilityBarText data-test-subj="selected-count"> + {timelineType === TimelineTypeEnum.template + ? i18n.SELECTED_TEMPLATES((selectedItems || []).length) + : i18n.SELECTED_TIMELINES((selectedItems || []).length)} + </UtilityBarText> + <UtilityBarAction + dataTestSubj="batchActions" + iconSide="right" + iconType="arrowDown" + popoverContent={getBatchItemsPopoverContent} + data-test-subj="utility-bar-action" + > + <span data-test-subj="utility-bar-action-button">{i18n.BATCH_ACTIONS}</span> + </UtilityBarAction> + </> + )} + <UtilityBarAction + dataTestSubj="refreshButton" + iconSide="right" + iconType="refresh" + onClick={onRefreshBtnClick} + > + {i18n.REFRESH} + </UtilityBarAction> + </UtilityBarGroup> + </UtilityBarSection> + </UtilityBar> - <TimelinesTable - actionTimelineToShow={actionTimelineToShow} - data-test-subj="timelines-table" - deleteTimelines={deleteTimelines} - defaultPageSize={defaultPageSize} - loading={isLoading} - itemIdToExpandedNotesRowMap={itemIdToExpandedNotesRowMap} - enableExportTimelineDownloader={enableExportTimelineDownloader} - onCreateRule={onCreateRule} - onCreateRuleFromEql={onCreateRuleFromEql} - onOpenDeleteTimelineModal={onOpenDeleteTimelineModal} - onOpenTimeline={onOpenTimeline} - onSelectionChange={onSelectionChange} - onTableChange={onTableChange} - onToggleShowNotes={onToggleShowNotes} - pageIndex={pageIndex} - pageSize={pageSize} - searchResults={searchResults} - showExtendedColumns={true} - sortDirection={sortDirection} - sortField={sortField} - timelineType={timelineType} - totalSearchResultsCount={totalSearchResultsCount} - tableRef={tableRef} - /> - </> - ) : ( - <NoteManagementPage onOpenTimeline={onOpenTimeline} /> - )} + <TimelinesTable + actionTimelineToShow={actionTimelineToShow} + data-test-subj="timelines-table" + deleteTimelines={deleteTimelines} + defaultPageSize={defaultPageSize} + loading={isLoading} + itemIdToExpandedNotesRowMap={itemIdToExpandedNotesRowMap} + enableExportTimelineDownloader={enableExportTimelineDownloader} + onCreateRule={onCreateRule} + onCreateRuleFromEql={onCreateRuleFromEql} + onOpenDeleteTimelineModal={onOpenDeleteTimelineModal} + onOpenTimeline={onOpenTimeline} + onSelectionChange={onSelectionChange} + onTableChange={onTableChange} + onToggleShowNotes={onToggleShowNotes} + pageIndex={pageIndex} + pageSize={pageSize} + searchResults={searchResults} + showExtendedColumns={true} + sortDirection={sortDirection} + sortField={sortField} + timelineType={timelineType} + totalSearchResultsCount={totalSearchResultsCount} + tableRef={tableRef} + /> + </> </div> </> ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts index 14ddedf5b9688..d750ec08c24b4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts @@ -206,7 +206,6 @@ export interface OpenTimelineProps { totalSearchResultsCount: number; /** Hide action on timeline if needed it */ hideActions?: ActionTimelineToShow[]; - tabName?: string; } export interface ResolveTimelineConfig { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx index 45dd7d9e95bbf..e6ad5ad0e1f11 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx @@ -8,7 +8,6 @@ import React, { useState, useCallback, useMemo } from 'react'; import { useParams } from 'react-router-dom'; import { EuiTabs, EuiTab, EuiSpacer } from '@elastic/eui'; - import { noop } from 'lodash/fp'; import { type TimelineType, TimelineTypeEnum } from '../../../../common/api/timeline'; import { SecurityPageName } from '../../../app/types'; @@ -17,7 +16,7 @@ import * as i18n from './translations'; import type { TimelineTab } from './types'; import { TimelineTabsStyle } from './types'; import { useKibana } from '../../../common/lib/kibana'; -import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; + export interface UseTimelineTypesArgs { defaultTimelineCount?: number | null; templateTimelineCount?: number | null; @@ -42,8 +41,6 @@ export const useTimelineTypes = ({ : TimelineTypeEnum.default ); - const notesEnabled = useIsExperimentalFeatureEnabled('securitySolutionNotesEnabled'); - const timelineUrl = useMemo(() => { return formatUrl(getTimelineTabsUrl(TimelineTypeEnum.default, urlSearch)); }, [formatUrl, urlSearch]); @@ -51,10 +48,6 @@ export const useTimelineTypes = ({ return formatUrl(getTimelineTabsUrl(TimelineTypeEnum.template, urlSearch)); }, [formatUrl, urlSearch]); - const notesUrl = useMemo(() => { - return formatUrl(getTimelineTabsUrl('notes', urlSearch)); - }, [formatUrl, urlSearch]); - const goToTimeline = useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); @@ -71,14 +64,6 @@ export const useTimelineTypes = ({ [navigateToUrl, templateUrl] ); - const goToNotes = useCallback( - (ev: React.SyntheticEvent) => { - ev.preventDefault(); - navigateToUrl(notesUrl); - }, - [navigateToUrl, notesUrl] - ); - const getFilterOrTabs: (timelineTabsStyle: TimelineTabsStyle) => TimelineTab[] = useCallback( (timelineTabsStyle: TimelineTabsStyle) => [ { @@ -132,17 +117,6 @@ export const useTimelineTypes = ({ {tab.name} </EuiTab> ))} - {notesEnabled && ( - <EuiTab - data-test-subj="timeline-notes" - isSelected={tabName === 'notes'} - key="timeline-notes" - href={notesUrl} - onClick={goToNotes} - > - {'Notes'} - </EuiTab> - )} </EuiTabs> <EuiSpacer size="m" /> </> diff --git a/x-pack/plugins/security_solution/public/timelines/links.ts b/x-pack/plugins/security_solution/public/timelines/links.ts index 169ef6da01910..9315417d97646 100644 --- a/x-pack/plugins/security_solution/public/timelines/links.ts +++ b/x-pack/plugins/security_solution/public/timelines/links.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { SecurityPageName, SERVER_APP_ID, TIMELINES_PATH } from '../../common/constants'; -import { TIMELINES, NOTES } from '../app/translations'; +import { TIMELINES } from '../app/translations'; import type { LinkItem } from '../common/links/types'; export const links: LinkItem = { @@ -30,14 +30,5 @@ export const links: LinkItem = { path: `${TIMELINES_PATH}/template`, sideNavDisabled: true, }, - { - id: SecurityPageName.notesManagement, - title: NOTES, - description: i18n.translate('xpack.securitySolution.appLinks.notesManagementDescription', { - defaultMessage: 'Visualize and delete notes.', - }), - path: `${TIMELINES_PATH}/notes`, - experimentalKey: 'securitySolutionNotesEnabled', - }, ], }; diff --git a/x-pack/plugins/security_solution/public/timelines/pages/index.tsx b/x-pack/plugins/security_solution/public/timelines/pages/index.tsx index c7e8cb9887efe..2151a2624aeb4 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/index.tsx @@ -17,7 +17,7 @@ import { appendSearch } from '../../common/components/link_to/helpers'; import { TIMELINES_PATH } from '../../../common/constants'; -const timelinesPagePath = `${TIMELINES_PATH}/:tabName(${TimelineTypeEnum.default}|${TimelineTypeEnum.template}|notes)`; +const timelinesPagePath = `${TIMELINES_PATH}/:tabName(${TimelineTypeEnum.default}|${TimelineTypeEnum.template})`; const timelinesDefaultPath = `${TIMELINES_PATH}/${TimelineTypeEnum.default}`; export const Timelines = React.memo(() => ( diff --git a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx index 9d3c05c97b685..08cf46b41ad35 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx @@ -41,7 +41,7 @@ export const TimelinesPage = React.memo(() => { {indicesExist ? ( <SecuritySolutionPageWrapper> <HeaderPage title={i18n.PAGE_TITLE}> - {capabilitiesCanUserCRUD && tabName !== 'notes' ? ( + {capabilitiesCanUserCRUD && ( <EuiFlexGroup gutterSize="s" alignItems="center"> <EuiFlexItem> <EuiButton @@ -56,7 +56,7 @@ export const TimelinesPage = React.memo(() => { <NewTimelineButton type={timelineType} /> </EuiFlexItem> </EuiFlexGroup> - ) : null} + )} </HeaderPage> <StatefulOpenTimeline @@ -66,7 +66,6 @@ export const TimelinesPage = React.memo(() => { setImportDataModalToggle={setImportDataModal} title={i18n.ALL_TIMELINES_PANEL_TITLE} data-test-subj="stateful-open-timeline" - tabName={tabName} /> </SecuritySolutionPageWrapper> ) : ( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 67324e7024bfc..f993da6cd3985 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -35253,7 +35253,6 @@ "xpack.securitySolution.appLinks.network.flows": "Flux", "xpack.securitySolution.appLinks.network.http": "HTTP", "xpack.securitySolution.appLinks.network.tls": "TLS", - "xpack.securitySolution.appLinks.notesManagementDescription": "Visualisez et supprimez des notes.", "xpack.securitySolution.appLinks.overview": "Aperçu", "xpack.securitySolution.appLinks.overviewDescription": "Résumé de votre activité d'environnement de sécurité, y compris les alertes, les événements, les éléments récents et un fil d'actualités !", "xpack.securitySolution.appLinks.policiesDescription": "Utilisez les politiques pour personnaliser les protections des points de terminaison et de charge de travail cloud, et d'autres configurations.", @@ -39508,7 +39507,6 @@ "xpack.securitySolution.navigation.manage": "Gérer", "xpack.securitySolution.navigation.network": "Réseau", "xpack.securitySolution.navigation.newRuleTitle": "Créer une nouvelle règle", - "xpack.securitySolution.navigation.notesManagement": "Notes", "xpack.securitySolution.navigation.overview": "Aperçu", "xpack.securitySolution.navigation.protectionUpdates": "Mises à jour de la protection", "xpack.securitySolution.navigation.responseActionsHistory": "Historique des actions de réponse", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ae40b40dd5573..14b59b1f54b8b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -34997,7 +34997,6 @@ "xpack.securitySolution.appLinks.network.flows": "Flow", "xpack.securitySolution.appLinks.network.http": "HTTP", "xpack.securitySolution.appLinks.network.tls": "TLS", - "xpack.securitySolution.appLinks.notesManagementDescription": "メモを可視化して、削除します。", "xpack.securitySolution.appLinks.overview": "概要", "xpack.securitySolution.appLinks.overviewDescription": "アラート、イベント、最近のアイテム、ニュースフィードを含む、セキュリティ環境アクティビティの概要。", "xpack.securitySolution.appLinks.policiesDescription": "ポリシーを使用して、エンドポイントおよびクラウドワークロード保護、ならびに他の構成をカスタマイズします。", @@ -39251,7 +39250,6 @@ "xpack.securitySolution.navigation.manage": "管理", "xpack.securitySolution.navigation.network": "ネットワーク", "xpack.securitySolution.navigation.newRuleTitle": "新規ルールを作成", - "xpack.securitySolution.navigation.notesManagement": "メモ", "xpack.securitySolution.navigation.overview": "概要", "xpack.securitySolution.navigation.protectionUpdates": "保護更新", "xpack.securitySolution.navigation.responseActionsHistory": "対応アクション履歴", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 130727459f54d..e55a9107d7c4d 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -35041,7 +35041,6 @@ "xpack.securitySolution.appLinks.network.flows": "流", "xpack.securitySolution.appLinks.network.http": "HTTP", "xpack.securitySolution.appLinks.network.tls": "TLS", - "xpack.securitySolution.appLinks.notesManagementDescription": "可视化并删除备注。", "xpack.securitySolution.appLinks.overview": "概览", "xpack.securitySolution.appLinks.overviewDescription": "您的安全环境活动摘要,包括告警、事件、最近项和新闻源!", "xpack.securitySolution.appLinks.policiesDescription": "使用策略定制终端和云工作负载防护及其他配置。", @@ -39297,7 +39296,6 @@ "xpack.securitySolution.navigation.manage": "管理", "xpack.securitySolution.navigation.network": "网络", "xpack.securitySolution.navigation.newRuleTitle": "创建新规则", - "xpack.securitySolution.navigation.notesManagement": "备注", "xpack.securitySolution.navigation.overview": "概览", "xpack.securitySolution.navigation.protectionUpdates": "防护更新", "xpack.securitySolution.navigation.responseActionsHistory": "响应操作历史记录", From 6742f770497a946de2d21aa39985243eec2b9f7b Mon Sep 17 00:00:00 2001 From: Lola <omolola.akinleye@elastic.co> Date: Tue, 1 Oct 2024 14:38:07 -0400 Subject: [PATCH 078/107] [Cloud Security] Agentless integration deletion flow (#191557) ## Summary Summarize your PR. If it involves visual changes include a screenshot or gif. This PR is completes the deletion flow for Agentless CSPM. **Current Agentless Integraton deletion flow**: 1. Successfully delete integration policy 2. Successfully unenrolls agent from agent policy 3. Successfully revokes enrollment token 4. Successfully deletes agentless deployment 5. Successfully deletes agent policy 6. Successful notification shows when deleted integration policy is successful ## Agentless Agent API - Unenrolls agent and revokes token first to avoid 404 save object client error. - Update `is_managed` property to no longer check for `agentPolicy.supports_agentless`. Agentless policies will now be a regular policy. - Adds logging for DELETE agentless Agent API endpoint - Adds agentless API deleteendpoint using try & catch. No errors will be thrown. Agent status will become offline after deployment deletion - If agentless deployment api fails, then we will continue to delete the agent policy ## UI Changes **CSPM Integration** - Updates Agent Policy Error toast notification title - Updates Agent Policy Error toast notification message <img width="1612" alt="image" src="https://github.com/user-attachments/assets/0003ce04-c53c-4e11-8363-ddc25ba342a7"> **Edit Mode** - Adds back the Agentless selector in Edit Integration <img width="1316" alt="image" src="https://github.com/user-attachments/assets/0d2f20ce-32fc-421c-a15a-48ca6226b67f"> **Integration Policies Page** - Removes automatic navigation to agent policies page when deleting an integration. In 8.17, we have a ticket to [hide the agentless agent policies.](https://github.com/elastic/security-team/issues/9857) - Enables delete button when deleting package policy with agents for agentless policies - Disables Upgrade Action - Removes Add Agent Action <img width="1717" alt="image" src="https://github.com/user-attachments/assets/1b7ac4c7-e8bc-41b8-836f-4d3c79a449dd"> <img width="670" alt="image" src="https://github.com/user-attachments/assets/0ab6a4c4-d7c6-43ea-9537-67e7fbcca2b0"> **Agent Policies Page** - Updates messaging when deleting the agentless policy from agent policy page. Warning users that deleting agentless policy will also delete the integration and unenroll agent. - Enables delete button when deleting agentless policy with agents for agentless policies - Removes Add agent menu action - Removes Upgrade policy menu action - Removes Uninstall agent action - Removes Copy policy menu action <img width="1595" alt="image" src="https://github.com/user-attachments/assets/2f195da2-4594-4f54-8f8d-7995e829a5ac"> <img width="1365" alt="image" src="https://github.com/user-attachments/assets/4915642d-41e8-4e83-80f9-f334cb879506"> **Agent Policy Settings** For agent policy that are agentless, we disabled the following [fleet actions:](https://www.elastic.co/guide/en/fleet/current/agent-policy.html#agent-policy-types) - Disables Agent monitoring - Disables Inactivity timeout - Disables Fleet Server - Disables Output for integrations - Disables Output for agent monitoring - Disables Agent binary download - Disables Host name format - Disables Inactive agent unenrollment timeout - Disables Advanced Settings - Limit CPU usage - Disables HTTP monitoring endpoint - Disables Agent Logging <img width="1569" alt="image" src="https://github.com/user-attachments/assets/2639be9f-ea10-4d42-b379-a13c4c2b08a1"> <img width="1517" alt="image" src="https://github.com/user-attachments/assets/ae6f3e10-8c2b-42fe-8f27-7e8621d373c0"> **Agents Page** - Disables Assign to Policy action - Disables Upgrade Policy action - Removes Unassign agent action - Removes agentless policies where user can add agent to agentless policy <img width="1710" alt="image" src="https://github.com/user-attachments/assets/61bf2d06-d337-45dd-8255-499db1e1ed42"> <img width="1723" alt="image" src="https://github.com/user-attachments/assets/cc76787f-d6a2-44fb-9289-7f1f643620ec"> ### How to test in Serverless Use vault access and open the security Project in [build ]([Buildkite Build](https://buildkite.com/elastic/kibana-pull-request/builds/234438)) ### 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 --- .../components/actions_menu.test.tsx | 66 +++++++ .../agent_policy/components/actions_menu.tsx | 167 ++++++++++------- .../agent_policy_advanced_fields/index.tsx | 26 ++- .../agent_policy_delete_provider.tsx | 50 ++++-- .../components/agent_policy_form.tsx | 2 +- .../steps/components/agent_policy_options.tsx | 58 +++--- .../single_page_layout/hooks/form.tsx | 20 ++- .../hooks/setup_technology.ts | 1 - .../components/header/right_content.tsx | 2 +- .../edit_package_policy_page/index.test.tsx | 23 ++- .../edit_package_policy_page/index.tsx | 17 +- .../components/actions_menu.tsx | 2 +- .../components/table_row_actions.tsx | 11 +- .../components/agent_policy_debugger.tsx | 1 + .../agent_policy_selection.tsx | 12 +- .../package_policy_actions_menu.test.tsx | 43 ++--- .../package_policy_actions_menu.tsx | 22 +-- .../package_policy_delete_provider.tsx | 77 ++++++-- .../public/hooks/use_request/agent_policy.ts | 18 +- .../plugins/fleet/server/errors/handlers.ts | 4 + x-pack/plugins/fleet/server/errors/index.ts | 6 + .../server/services/agent_policy.test.ts | 8 +- .../fleet/server/services/agent_policy.ts | 51 +++++- .../server/services/agent_policy_create.ts | 5 +- .../server/services/agents/agentless_agent.ts | 168 +++++++++++++----- .../fleet/server/services/package_policy.ts | 9 +- .../fleet/server/services/utils/agentless.ts | 19 ++ .../agentless/create_agent.ts | 56 ++++++ .../add_cis_integration_form_page.ts | 7 + .../apis/package_policy/delete.ts | 2 +- ...config.cloud_security_posture.agentless.ts | 16 +- .../agentless/cis_integration_aws.ts | 11 +- .../agentless/cis_integration_gcp.ts | 9 +- 33 files changed, 712 insertions(+), 277 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.test.tsx index 9781270d9dd81..4df4b4fe912d9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.test.tsx @@ -109,6 +109,39 @@ describe('AgentPolicyActionMenu', () => { const deleteButton = result.getByTestId('agentPolicyActionMenuDeleteButton'); expect(deleteButton).toHaveAttribute('disabled'); }); + + it('is disabled when agent policy support agentless is true', () => { + const testRenderer = createFleetTestRendererMock(); + const agentlessPolicy: AgentPolicy = { + ...baseAgentPolicy, + supports_agentless: true, + package_policies: [ + { + id: 'test-package-policy', + is_managed: false, + created_at: new Date().toISOString(), + created_by: 'test', + enabled: true, + inputs: [], + name: 'test-package-policy', + namespace: 'default', + policy_id: 'test', + policy_ids: ['test'], + revision: 1, + updated_at: new Date().toISOString(), + updated_by: 'test', + }, + ], + }; + + const result = testRenderer.render(<AgentPolicyActionMenu agentPolicy={agentlessPolicy} />); + + const agentActionsButton = result.getByTestId('agentActionsBtn'); + agentActionsButton.click(); + + const deleteButton = result.getByTestId('agentPolicyActionMenuDeleteButton'); + expect(deleteButton).not.toHaveAttribute('disabled'); + }); }); describe('add agent', () => { @@ -176,6 +209,39 @@ describe('AgentPolicyActionMenu', () => { const addButton = result.getByTestId('agentPolicyActionMenuAddAgentButton'); expect(addButton).toHaveAttribute('disabled'); }); + + it('should remove add agent button when agent policy support agentless is true', () => { + const testRenderer = createFleetTestRendererMock(); + const agentlessPolicy: AgentPolicy = { + ...baseAgentPolicy, + supports_agentless: true, + package_policies: [ + { + id: 'test-package-policy', + is_managed: false, + created_at: new Date().toISOString(), + created_by: 'test', + enabled: true, + inputs: [], + name: 'test-package-policy', + namespace: 'default', + policy_id: 'test', + policy_ids: ['test'], + revision: 1, + updated_at: new Date().toISOString(), + updated_by: 'test', + }, + ], + }; + + const result = testRenderer.render(<AgentPolicyActionMenu agentPolicy={agentlessPolicy} />); + + const agentActionsButton = result.getByTestId('agentActionsBtn'); + agentActionsButton.click(); + + const addAgentActionButton = result.queryByTestId('agentPolicyActionMenuAddAgentButton'); + expect(addAgentActionButton).toBeNull(); + }); }); describe('add fleet server', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx index 48f391a4e545d..bfb364abf8a5d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx @@ -100,82 +100,106 @@ export const AgentPolicyActionMenu = memo<{ </EuiContextMenuItem> ); - const menuItems = agentPolicy?.is_managed - ? [viewPolicyItem] - : [ + const deletePolicyItem = ( + <AgentPolicyDeleteProvider + hasFleetServer={policyHasFleetServer(agentPolicy as AgentPolicy)} + key="deletePolicy" + agentPolicy={agentPolicy} + packagePolicies={agentPolicy.package_policies} + > + {(deleteAgentPolicyPrompt) => ( <EuiContextMenuItem - icon="plusInCircle" - disabled={ - (isFleetServerPolicy && !authz.fleet.addFleetServers) || - (!isFleetServerPolicy && !authz.fleet.addAgents) + data-test-subj="agentPolicyActionMenuDeleteButton" + disabled={!authz.fleet.allAgentPolicies || hasManagedPackagePolicy} + toolTipContent={ + hasManagedPackagePolicy ? ( + <FormattedMessage + id="xpack.fleet.policyForm.deletePolicyActionText.disabled" + defaultMessage="Agent policy with managed package policies cannot be deleted." + data-test-subj="agentPolicyActionMenuDeleteButtonDisabledTooltip" + /> + ) : undefined } - data-test-subj="agentPolicyActionMenuAddAgentButton" - onClick={() => { - setIsContextMenuOpen(false); - setIsEnrollmentFlyoutOpen(true); - }} - key="enrollAgents" - > - {isFleetServerPolicy ? ( - <FormattedMessage - id="xpack.fleet.agentPolicyActionMenu.addFleetServerActionText" - defaultMessage="Add Fleet Server" - /> - ) : ( - <FormattedMessage - id="xpack.fleet.agentPolicyActionMenu.enrollAgentActionText" - defaultMessage="Add agent" - /> - )} - </EuiContextMenuItem>, - viewPolicyItem, - <EuiContextMenuItem - disabled={!authz.integrations.writeIntegrationPolicies} - icon="copy" + icon="trash" onClick={() => { - setIsContextMenuOpen(false); - copyAgentPolicyPrompt(agentPolicy, onCopySuccess); + deleteAgentPolicyPrompt(agentPolicy.id); }} - key="copyPolicy" > <FormattedMessage - id="xpack.fleet.agentPolicyActionMenu.copyPolicyActionText" - defaultMessage="Duplicate policy" + id="xpack.fleet.agentPolicyActionMenu.deletePolicyActionText" + defaultMessage="Delete policy" /> - </EuiContextMenuItem>, - <AgentPolicyDeleteProvider - hasFleetServer={policyHasFleetServer(agentPolicy as AgentPolicy)} - key="deletePolicy" - packagePolicies={agentPolicy.package_policies} - > - {(deleteAgentPolicyPrompt) => ( - <EuiContextMenuItem - data-test-subj="agentPolicyActionMenuDeleteButton" - disabled={!authz.fleet.allAgentPolicies || hasManagedPackagePolicy} - toolTipContent={ - hasManagedPackagePolicy ? ( - <FormattedMessage - id="xpack.fleet.policyForm.deletePolicyActionText.disabled" - defaultMessage="Agent policy with managed package policies cannot be deleted." - data-test-subj="agentPolicyActionMenuDeleteButtonDisabledTooltip" - /> - ) : undefined - } - icon="trash" - onClick={() => { - deleteAgentPolicyPrompt(agentPolicy.id); - }} - > - <FormattedMessage - id="xpack.fleet.agentPolicyActionMenu.deletePolicyActionText" - defaultMessage="Delete policy" - /> - </EuiContextMenuItem> - )} - </AgentPolicyDeleteProvider>, - ]; + </EuiContextMenuItem> + )} + </AgentPolicyDeleteProvider> + ); + + const copyPolicyItem = ( + <EuiContextMenuItem + data-test-subj="agentPolicyActionMenuCopyButton" + disabled={!authz.integrations.writeIntegrationPolicies} + icon="copy" + onClick={() => { + setIsContextMenuOpen(false); + copyAgentPolicyPrompt(agentPolicy, onCopySuccess); + }} + key="copyPolicy" + > + <FormattedMessage + id="xpack.fleet.agentPolicyActionMenu.copyPolicyActionText" + defaultMessage="Duplicate policy" + /> + </EuiContextMenuItem> + ); + + const managedMenuItems = [viewPolicyItem]; + const agentBasedMenuItems = [ + <EuiContextMenuItem + icon="plusInCircle" + disabled={ + (isFleetServerPolicy && !authz.fleet.addFleetServers) || + (!isFleetServerPolicy && !authz.fleet.addAgents) + } + data-test-subj="agentPolicyActionMenuAddAgentButton" + onClick={() => { + setIsContextMenuOpen(false); + setIsEnrollmentFlyoutOpen(true); + }} + key="enrollAgents" + > + {isFleetServerPolicy ? ( + <FormattedMessage + id="xpack.fleet.agentPolicyActionMenu.addFleetServerActionText" + defaultMessage="Add Fleet Server" + /> + ) : ( + <FormattedMessage + id="xpack.fleet.agentPolicyActionMenu.enrollAgentActionText" + defaultMessage="Add agent" + /> + )} + </EuiContextMenuItem>, + viewPolicyItem, + copyPolicyItem, + deletePolicyItem, + ]; + const agentlessMenuItems = [viewPolicyItem, deletePolicyItem]; + + let menuItems; + + if (agentPolicy?.is_managed) { + menuItems = managedMenuItems; + } else if (agentPolicy?.supports_agentless) { + menuItems = agentlessMenuItems; + } else { + menuItems = agentBasedMenuItems; + } - if (authz.fleet.allAgents && !agentPolicy?.is_managed) { + if ( + authz.fleet.allAgents && + !agentPolicy?.is_managed && + !agentPolicy?.supports_agentless + ) { menuItems.push( <EuiContextMenuItem icon="refresh" @@ -193,7 +217,12 @@ export const AgentPolicyActionMenu = memo<{ ); } - if (authz.fleet.allAgents && agentTamperProtectionEnabled && !agentPolicy?.is_managed) { + if ( + authz.fleet.allAgents && + agentTamperProtectionEnabled && + !agentPolicy?.is_managed && + !agentPolicy?.supports_agentless + ) { menuItems.push( <EuiContextMenuItem icon="minusInCircle" 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 fc16d56107ccd..841bd756d8687 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 @@ -121,6 +121,8 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = const licenseService = useLicense(); const [isUninstallCommandFlyoutOpen, setIsUninstallCommandFlyoutOpen] = useState(false); const policyHasElasticDefend = useMemo(() => hasElasticDefend(agentPolicy), [agentPolicy]); + const isManagedorAgentlessPolicy = + agentPolicy.is_managed === true || agentPolicy?.supports_agentless === true; const AgentTamperProtectionSectionContent = useMemo( () => ( @@ -196,7 +198,12 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = ); const AgentTamperProtectionSection = useMemo(() => { - if (agentTamperProtectionEnabled && licenseService.isPlatinum() && !agentPolicy.is_managed) { + if ( + agentTamperProtectionEnabled && + licenseService.isPlatinum() && + !agentPolicy.is_managed && + !agentPolicy.supports_agentless + ) { if (AgentTamperProtectionWrapper) { return ( <Suspense fallback={null}> @@ -214,6 +221,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = agentPolicy.is_managed, AgentTamperProtectionWrapper, AgentTamperProtectionSectionContent, + agentPolicy.supports_agentless, ]); return ( @@ -405,7 +413,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = > <EuiSpacer size="l" /> <EuiCheckboxGroup - disabled={disabled || agentPolicy.is_managed === true} + disabled={disabled || isManagedorAgentlessPolicy} options={[ { id: `${dataTypes.Logs}_${monitoringCheckboxIdSuffix}`, @@ -541,7 +549,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = > <EuiFieldNumber fullWidth - disabled={disabled || agentPolicy.is_managed === true} + disabled={disabled || isManagedorAgentlessPolicy} value={agentPolicy.inactivity_timeout || ''} min={0} onChange={(e) => { @@ -582,7 +590,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = isInvalid={Boolean(touchedFields.fleet_server_host_id && validation.fleet_server_host_id)} > <EuiSuperSelect - disabled={disabled || agentPolicy.is_managed === true} + disabled={disabled || isManagedorAgentlessPolicy} valueOfSelected={agentPolicy.fleet_server_host_id || DEFAULT_SELECT_VALUE} fullWidth isLoading={isLoadingFleetServerHostsOption} @@ -623,7 +631,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = isDisabled={disabled} > <EuiSuperSelect - disabled={disabled || agentPolicy.is_managed === true} + disabled={disabled || isManagedorAgentlessPolicy} valueOfSelected={agentPolicy.data_output_id || DEFAULT_SELECT_VALUE} fullWidth isLoading={isLoadingOptions} @@ -664,7 +672,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = isDisabled={disabled} > <EuiSuperSelect - disabled={disabled || agentPolicy.is_managed === true} + disabled={disabled || isManagedorAgentlessPolicy} valueOfSelected={agentPolicy.monitoring_output_id || DEFAULT_SELECT_VALUE} fullWidth isLoading={isLoadingOptions} @@ -706,7 +714,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = isDisabled={disabled} > <EuiSuperSelect - disabled={disabled} + disabled={disabled || agentPolicy?.supports_agentless === true} valueOfSelected={agentPolicy.download_source_id || DEFAULT_SELECT_VALUE} fullWidth isLoading={isLoadingDownloadSources} @@ -739,7 +747,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = > <EuiFormRow fullWidth isDisabled={disabled}> <EuiRadioGroup - disabled={disabled} + disabled={disabled || agentPolicy?.supports_agentless === true} options={[ { id: 'hostname', @@ -834,7 +842,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent<Props> = > <EuiFieldNumber fullWidth - disabled={disabled || agentPolicy.is_managed === true} + disabled={disabled || isManagedorAgentlessPolicy} value={agentPolicy.unenroll_timeout || ''} min={0} onChange={(e) => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx index 58b764ed68add..32c350108bccf 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_delete_provider.tsx @@ -23,12 +23,13 @@ import { sendGetAgents, } from '../../../hooks'; -import type { PackagePolicy } from '../../../types'; +import type { AgentPolicy, PackagePolicy } from '../../../types'; interface Props { children: (deleteAgentPolicy: DeleteAgentPolicy) => React.ReactElement; hasFleetServer: boolean; packagePolicies?: PackagePolicy[]; + agentPolicy: AgentPolicy; } export type DeleteAgentPolicy = (agentPolicy: string, onSuccess?: OnSuccessCallback) => void; @@ -39,12 +40,13 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent<Props> = ({ children, hasFleetServer, packagePolicies, + agentPolicy, }) => { const { notifications } = useStartServices(); const { agents: { enabled: isFleetEnabled }, } = useConfig(); - const [agentPolicy, setAgentPolicy] = useState<string>(); + const [agentPolicyId, setAgentPolicyId] = useState<string>(); const [isModalOpen, setIsModalOpen] = useState<boolean>(false); const [isLoadingAgentsCount, setIsLoadingAgentsCount] = useState<boolean>(false); const [agentsCount, setAgentsCount] = useState<number>(0); @@ -56,20 +58,20 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent<Props> = ({ const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); const deleteAgentPolicyPrompt: DeleteAgentPolicy = ( - agentPolicyToDelete, + agentPolicyIdToDelete, onSuccess = () => undefined ) => { - if (!agentPolicyToDelete) { + if (!agentPolicyIdToDelete) { throw new Error('No agent policy specified for deletion'); } setIsModalOpen(true); - setAgentPolicy(agentPolicyToDelete); - fetchAgentsCount(agentPolicyToDelete); + setAgentPolicyId(agentPolicyIdToDelete); + fetchAgentsCount(agentPolicyIdToDelete); onSuccessCallback.current = onSuccess; }; const closeModal = () => { - setAgentPolicy(undefined); + setAgentPolicyId(undefined); setIsLoading(false); setIsLoadingAgentsCount(false); setIsModalOpen(false); @@ -80,7 +82,7 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent<Props> = ({ try { const { data } = await deleteAgentPolicyMutation.mutateAsync({ - agentPolicyId: agentPolicy!, + agentPolicyId: agentPolicyId!, }); if (data) { @@ -91,13 +93,13 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent<Props> = ({ }) ); if (onSuccessCallback.current) { - onSuccessCallback.current(agentPolicy!); + onSuccessCallback.current(agentPolicyId!); } } else { notifications.toasts.addDanger( i18n.translate('xpack.fleet.deleteAgentPolicy.failureSingleNotificationTitle', { defaultMessage: "Error deleting agent policy ''{id}''", - values: { id: agentPolicy }, + values: { id: agentPolicyId }, }) ); } @@ -173,7 +175,9 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent<Props> = ({ ) } buttonColor="danger" - confirmButtonDisabled={isLoading || isLoadingAgentsCount || !!agentsCount} + confirmButtonDisabled={ + isLoading || isLoadingAgentsCount || (!agentPolicy?.supports_agentless && !!agentsCount) + } > {packagePoliciesWithMultiplePolicies && ( <> @@ -206,13 +210,23 @@ export const AgentPolicyDeleteProvider: React.FunctionComponent<Props> = ({ } )} > - <FormattedMessage - id="xpack.fleet.deleteAgentPolicy.confirmModal.affectedAgentsMessage" - defaultMessage="{agentsCount, plural, one {# agent is} other {# agents are}} assigned to this agent policy. Unassign these agents before deleting this policy. This might include inactive agents." - values={{ - agentsCount, - }} - /> + {agentPolicy?.supports_agentless ? ( + <FormattedMessage + id="xpack.fleet.deleteAgentPolicy.confirmModal.affectedAgentlessMessage" + defaultMessage="Deleting this agent policy will automatically delete integrations assign to {name} and unenroll elastic agent." + values={{ + name: <strong>{agentPolicy.name}</strong>, + }} + /> + ) : ( + <FormattedMessage + id="xpack.fleet.deleteAgentPolicy.confirmModal.affectedAgentsMessage" + defaultMessage="{agentsCount, plural, one {# agent is} other {# agents are}} assigned to this agent policy. Unassign these agents before deleting this policy. This might include inactive agents." + values={{ + agentsCount, + }} + /> + )} </EuiCallOut> ) : hasFleetServer ? ( <FormattedMessage diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx index 878089bbde8e2..b437d61f64c58 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx @@ -189,7 +189,7 @@ export const AgentPolicyForm: React.FunctionComponent<Props> = ({ <EuiSpacer size="m" /> <ConfiguredSettings configuredSettings={AGENT_POLICY_ADVANCED_SETTINGS} - disabled={isDisabled} + disabled={isDisabled || !!agentPolicy?.supports_agentless} /> </> ) : null} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/agent_policy_options.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/agent_policy_options.tsx index c39466d779548..29722bbc42850 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/agent_policy_options.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/agent_policy_options.tsx @@ -127,34 +127,36 @@ export function useAgentPoliciesOptions(packageInfo?: PackageInfo) { const agentPolicyMultiOptions: Array<EuiComboBoxOptionOption<string>> = useMemo( () => packageInfo && !isOutputLoading && !isAgentPoliciesLoading && !isLoadingPackagePolicies - ? agentPolicies.map((policy) => { - const isLimitedPackageAlreadyInPolicy = - isPackageLimited(packageInfo!) && - packagePoliciesForThisPackageByAgentPolicyId?.[policy.id]; - - const isAPMPackageAndDataOutputIsLogstash = - packageInfo?.name === FLEET_APM_PACKAGE && - getDataOutputForPolicy(policy)?.type === outputType.Logstash; - - return { - append: isAPMPackageAndDataOutputIsLogstash ? ( - <EuiToolTip - content={ - <FormattedMessage - id="xpack.fleet.createPackagePolicy.StepSelectPolicy.agentPolicyDisabledAPMLogstashOuputText" - defaultMessage="Logstash output for integrations is not supported with APM" - /> - } - > - <EuiIcon size="s" type="warningFilled" /> - </EuiToolTip> - ) : null, - key: policy.id, - label: policy.name, - disabled: isLimitedPackageAlreadyInPolicy || isAPMPackageAndDataOutputIsLogstash, - 'data-test-subj': 'agentPolicyMultiItem', - }; - }) + ? agentPolicies + .filter((policy) => policy.supports_agentless !== true) + .map((policy) => { + const isLimitedPackageAlreadyInPolicy = + isPackageLimited(packageInfo!) && + packagePoliciesForThisPackageByAgentPolicyId?.[policy.id]; + + const isAPMPackageAndDataOutputIsLogstash = + packageInfo?.name === FLEET_APM_PACKAGE && + getDataOutputForPolicy(policy)?.type === outputType.Logstash; + + return { + append: isAPMPackageAndDataOutputIsLogstash ? ( + <EuiToolTip + content={ + <FormattedMessage + id="xpack.fleet.createPackagePolicy.StepSelectPolicy.agentPolicyDisabledAPMLogstashOuputText" + defaultMessage="Logstash output for integrations is not supported with APM" + /> + } + > + <EuiIcon size="s" type="warningFilled" /> + </EuiToolTip> + ) : null, + key: policy.id, + label: policy.name, + disabled: isLimitedPackageAlreadyInPolicy || isAPMPackageAndDataOutputIsLogstash, + 'data-test-subj': 'agentPolicyMultiItem', + }; + }) : [], [ packageInfo, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx index ca96066facba3..2bae962f48e7c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx @@ -315,7 +315,11 @@ export function useOnSubmit({ if ( (agentCount !== 0 || (agentPolicies.length === 0 && selectedPolicyTab !== SelectedPolicyTab.NEW)) && - !(isAgentlessIntegration(packageInfo) || isAgentlessPackagePolicy(packagePolicy)) && + !( + isAgentlessIntegration(packageInfo) || + isAgentlessPackagePolicy(packagePolicy) || + isAgentlessAgentPolicy(overrideCreatedAgentPolicy) + ) && formState !== 'CONFIRM' ) { setFormState('CONFIRM'); @@ -339,10 +343,18 @@ export function useOnSubmit({ } } catch (e) { setFormState('VALID'); + const agentlessPolicy = agentPolicies.find( + (policy) => policy?.supports_agentless === true + ); + notifications.toasts.addError(e, { - title: i18n.translate('xpack.fleet.createAgentPolicy.errorNotificationTitle', { - defaultMessage: 'Unable to create agent policy', - }), + title: agentlessPolicy?.supports_agentless + ? i18n.translate('xpack.fleet.createAgentlessPolicy.errorNotificationTitle', { + defaultMessage: 'Unable to create integration', + }) + : i18n.translate('xpack.fleet.createAgentPolicy.errorNotificationTitle', { + defaultMessage: 'Unable to create agent policy', + }), }); return; } 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 141622410076d..fb6aefcf7583e 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 @@ -174,7 +174,6 @@ export function useSetupTechnology({ setNewAgentPolicy({ ...newAgentBasedPolicy.current, supports_agentless: false, - is_managed: false, }); setSelectedPolicyTab(SelectedPolicyTab.NEW); updateAgentPolicies([newAgentBasedPolicy.current] as AgentPolicy[]); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/header/right_content.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/header/right_content.tsx index 5dd391450b0cb..6603698a80186 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/header/right_content.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/header/right_content.tsx @@ -106,7 +106,7 @@ export const HeaderRightContent: React.FunctionComponent<HeaderRightContentProps ), }, { isDivider: true }, - ...(authz.fleet.readAgents + ...(authz.fleet.readAgents && !agentPolicy?.supports_agentless ? [ { label: i18n.translate('xpack.fleet.policyDetails.summary.usedBy', { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx index 384920b252a5a..94bcf380f7086 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.test.tsx @@ -495,7 +495,14 @@ describe('edit package policy page', () => { }, }); (sendGetOneAgentPolicy as MockFn).mockResolvedValue({ - data: { item: { id: 'agentless', name: 'Agentless policy', namespace: 'default' } }, + data: { + item: { + id: 'agentless', + name: 'Agentless policy', + namespace: 'default', + supports_agentless: true, + }, + }, }); render(); @@ -514,6 +521,20 @@ describe('edit package policy page', () => { expect(sendUpdatePackagePolicy).toHaveBeenCalled(); }); + it('should hide the multiselect agent policies when agent policy is agentless', async () => { + (useGetAgentPolicies as MockFn).mockReturnValue({ + data: { + items: [{ id: 'agent-policy-1', name: 'Agent policy 1', supports_agentless: true }], + }, + isLoading: false, + }); + + await act(async () => { + render(); + }); + expect(renderResult.queryByTestId('agentPolicyMultiSelect')).not.toBeInTheDocument(); + }); + describe('modify agent policies', () => { beforeEach(() => { useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: true }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index 2bfdd40a9df2f..e448d1376b2fe 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -46,8 +46,6 @@ import { StepConfigurePackagePolicy, StepDefinePackagePolicy, } from '../create_package_policy_page/components'; - -import { AGENTLESS_POLICY_ID } from '../../../../../../common/constants'; import type { AgentPolicy, PackagePolicyEditExtensionComponentProps } from '../../../types'; import { pkgKeyFromPackageInfo } from '../../../services'; @@ -75,7 +73,6 @@ export const EditPackagePolicyPage = memo(() => { } = useRouteMatch<{ policyId: string; packagePolicyId: string }>(); const packagePolicy = useGetOnePackagePolicy(packagePolicyId); - const extensionView = useUIExtension( packagePolicy.data?.item?.package?.name ?? '', 'package-policy-edit' @@ -106,8 +103,7 @@ export const EditPackagePolicyForm = memo<{ } = useConfig(); const { getHref } = useLink(); const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); - const { isAgentlessPackagePolicy } = useAgentless(); - + const { isAgentlessAgentPolicy } = useAgentless(); const { // data agentPolicies: existingAgentPolicies, @@ -130,7 +126,14 @@ export const EditPackagePolicyForm = memo<{ } = usePackagePolicyWithRelatedData(packagePolicyId, { forceUpgrade, }); - const hasAgentlessAgentPolicy = packagePolicy.policy_ids.includes(AGENTLESS_POLICY_ID); + + const hasAgentlessAgentPolicy = useMemo( + () => + existingAgentPolicies.length === 1 + ? existingAgentPolicies.some((policy) => isAgentlessAgentPolicy(policy)) + : false, + [existingAgentPolicies, isAgentlessAgentPolicy] + ); const canWriteIntegrationPolicies = useAuthz().integrations.writeIntegrationPolicies; useSetIsReadOnly(!canWriteIntegrationPolicies); @@ -451,7 +454,7 @@ export const EditPackagePolicyForm = memo<{ onChange={handleExtensionViewOnChange} validationResults={validationResults} isEditPage={true} - isAgentlessEnabled={isAgentlessPackagePolicy(packagePolicy)} + isAgentlessEnabled={hasAgentlessAgentPolicy} /> </ExtensionWrapper> ); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx index feefebf4fa2d6..231b10782eca7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx @@ -71,7 +71,7 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ onClick={() => { setIsReassignFlyoutOpen(true); }} - disabled={!agent.active && !agentPolicy} + disabled={(!agent.active && !agentPolicy) || agentPolicy?.supports_agentless === true} key="reassignPolicy" > <FormattedMessage diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx index d8f88514aaaf3..6ef1c5b83c104 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx @@ -76,7 +76,7 @@ export const TableRowActions: React.FunctionComponent<{ onClick={() => { onReassignClick(); }} - disabled={!agent.active} + disabled={!agent.active || agentPolicy?.supports_agentless === true} key="reassignPolicy" > <FormattedMessage @@ -107,7 +107,7 @@ export const TableRowActions: React.FunctionComponent<{ <EuiContextMenuItem key="agentUpgradeBtn" icon="refresh" - disabled={!isAgentUpgradeable(agent)} + disabled={!isAgentUpgradeable(agent) || agentPolicy?.supports_agentless === true} onClick={() => { onUpgradeClick(); }} @@ -138,7 +138,12 @@ export const TableRowActions: React.FunctionComponent<{ ); } - if (authz.fleet.allAgents && agentTamperProtectionEnabled && agent.policy_id) { + if ( + authz.fleet.allAgents && + agentTamperProtectionEnabled && + agent.policy_id && + !agentPolicy?.supports_agentless + ) { menuItems.push( <EuiContextMenuItem icon="minusInCircle" diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx index 78be94ef07048..98eed3cb63b4d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx @@ -128,6 +128,7 @@ export const AgentPolicyDebugger: React.FunctionComponent = () => { {selectedPolicyId && ( <AgentPolicyDeleteProvider + agentPolicy={selectedAgentPolicy as AgentPolicy} hasFleetServer={policyHasFleetServer(selectedAgentPolicy as AgentPolicy)} > {(deleteAgentPolicyPrompt) => { diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx index e7f951f9c4270..0aea38990f06b 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx @@ -33,7 +33,7 @@ const AgentPolicyFormRow = styled(EuiFormRow)` `; type Props = { - agentPolicies: Array<Pick<AgentPolicy, 'id' | 'name'>>; + agentPolicies: Array<Pick<AgentPolicy, 'id' | 'name' | 'supports_agentless'>>; selectedPolicyId?: string; setSelectedPolicyId: (agentPolicyId?: string) => void; excludeFleetServer?: boolean; @@ -115,10 +115,12 @@ export const AgentPolicySelection: React.FC<Props> = (props) => { <EuiSelect fullWidth isLoading={!agentPolicies} - options={agentPolicies.map((agentPolicy) => ({ - value: agentPolicy.id, - text: agentPolicy.name, - }))} + options={agentPolicies + .filter((policy) => !policy?.supports_agentless) + .map((agentPolicy) => ({ + value: agentPolicy.id, + text: agentPolicy.name, + }))} value={selectedPolicyId} onChange={onChangeCallback} aria-label={i18n.translate( diff --git a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx index 90e680c2ff845..dbf3969ffc226 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx @@ -7,12 +7,12 @@ import React from 'react'; -import { act, fireEvent } from '@testing-library/react'; +import { act } from '@testing-library/react'; import type { AgentPolicy, InMemoryPackagePolicy } from '../types'; import { createIntegrationsTestRendererMock } from '../mock'; -import { useMultipleAgentPolicies, useStartServices, useLink } from '../hooks'; +import { useMultipleAgentPolicies, useLink } from '../hooks'; import { PackagePolicyActionsMenu } from './package_policy_actions_menu'; @@ -135,6 +135,17 @@ describe('PackagePolicyActionsMenu', () => { }); }); + it('Should not enable upgrade button if package has upgrade and agentless policy is enabled', async () => { + const agentPolicies = createMockAgentPolicies({ supports_agentless: true }); + const packagePolicy = createMockPackagePolicy({ hasUpgrade: true }); + const { utils } = renderMenu({ agentPolicies, packagePolicy }); + + await act(async () => { + const upgradeButton = utils.getByTestId('PackagePolicyActionsUpgradeItem'); + expect(upgradeButton).toBeDisabled(); + }); + }); + it('Should not be able to delete integration from a managed policy', async () => { const agentPolicies = createMockAgentPolicies({ is_managed: true }); const packagePolicy = createMockPackagePolicy(); @@ -154,7 +165,7 @@ describe('PackagePolicyActionsMenu', () => { }); it('Should be able to delete integration from a managed agentless policy', async () => { - const agentPolicies = createMockAgentPolicies({ is_managed: true, supports_agentless: true }); + const agentPolicies = createMockAgentPolicies({ is_managed: false, supports_agentless: true }); const packagePolicy = createMockPackagePolicy(); const { utils } = renderMenu({ agentPolicies, packagePolicy }); await act(async () => { @@ -162,23 +173,6 @@ describe('PackagePolicyActionsMenu', () => { }); }); - it('Should navigate on delete integration when having an agentless policy', async () => { - const agentPolicies = createMockAgentPolicies({ is_managed: true, supports_agentless: true }); - const packagePolicy = createMockPackagePolicy(); - const { utils } = renderMenu({ agentPolicies, packagePolicy }); - - await act(async () => { - fireEvent.click(utils.getByTestId('PackagePolicyActionsDeleteItem')); - }); - await act(async () => { - fireEvent.click(utils.getByTestId('confirmModalConfirmButton')); - }); - expect(useStartServices().application.navigateToApp as jest.Mock).toHaveBeenCalledWith( - 'fleet', - { path: '/policies' } - ); - }); - it('Should show add button if the policy is not managed and showAddAgent=true', async () => { const agentPolicies = createMockAgentPolicies(); const packagePolicy = createMockPackagePolicy({ hasUpgrade: true }); @@ -197,6 +191,15 @@ describe('PackagePolicyActionsMenu', () => { }); }); + it('Should not show add button if the policy is agentless and showAddAgent=true', async () => { + const agentPolicies = createMockAgentPolicies({ supports_agentless: true }); + const packagePolicy = createMockPackagePolicy({ hasUpgrade: true }); + const { utils } = renderMenu({ agentPolicies, packagePolicy, showAddAgent: true }); + await act(async () => { + expect(utils.queryByText('Add agent')).toBeNull(); + }); + }); + it('Should show Edit integration with correct href when agentPolicy is defined', async () => { const agentPolicies = createMockAgentPolicies(); const packagePolicy = createMockPackagePolicy(); diff --git a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.tsx b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.tsx index fcebfcb2f2475..4da1711b28313 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.tsx @@ -10,11 +10,9 @@ import { EuiContextMenuItem, EuiPortal } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import type { AgentPolicy, InMemoryPackagePolicy } from '../types'; -import { useAgentPolicyRefresh, useAuthz, useLink, useStartServices } from '../hooks'; +import { useAgentPolicyRefresh, useAuthz, useLink } from '../hooks'; import { policyHasFleetServer } from '../services'; -import { PLUGIN_ID, pagePathGetters } from '../constants'; - import { AgentEnrollmentFlyout } from './agent_enrollment_flyout'; import { ContextMenuActions } from './context_menu_actions'; import { DangerEuiContextMenuItem } from './danger_eui_context_menu_item'; @@ -38,9 +36,6 @@ export const PackagePolicyActionsMenu: React.FunctionComponent<{ const [isEnrollmentFlyoutOpen, setIsEnrollmentFlyoutOpen] = useState(false); const { getHref } = useLink(); const authz = useAuthz(); - const { - application: { navigateToApp }, - } = useStartServices(); const agentPolicy = agentPolicies.length > 0 ? agentPolicies[0] : undefined; // TODO: handle multiple agent policies const canWriteIntegrationPolicies = authz.integrations.writeIntegrationPolicies; @@ -54,7 +49,8 @@ export const PackagePolicyActionsMenu: React.FunctionComponent<{ const agentPolicyIsManaged = Boolean(agentPolicy?.is_managed); const isOrphanedPolicy = !agentPolicy && packagePolicy.policy_ids.length === 0; - const isAddAgentVisible = showAddAgent && agentPolicy && !agentPolicyIsManaged; + const isAddAgentVisible = + showAddAgent && agentPolicy && !agentPolicyIsManaged && !agentPolicy?.supports_agentless; const onEnrollmentFlyoutClose = useMemo(() => { return () => setIsEnrollmentFlyoutOpen(false); @@ -115,7 +111,10 @@ export const PackagePolicyActionsMenu: React.FunctionComponent<{ <EuiContextMenuItem data-test-subj="PackagePolicyActionsUpgradeItem" disabled={ - !packagePolicy.hasUpgrade || !canWriteIntegrationPolicies || !upgradePackagePolicyHref + !packagePolicy.hasUpgrade || + !canWriteIntegrationPolicies || + !upgradePackagePolicyHref || + agentPolicy?.supports_agentless === true } icon="refresh" href={upgradePackagePolicyHref} @@ -150,12 +149,7 @@ export const PackagePolicyActionsMenu: React.FunctionComponent<{ onClick={() => { deletePackagePoliciesPrompt([packagePolicy.id], () => { setIsActionsMenuOpen(false); - if (agentPolicy?.supports_agentless) { - // go back to all agent policies - navigateToApp(PLUGIN_ID, { path: pagePathGetters.policies_list()[1] }); - } else { - refreshAgentPolicy(); - } + refreshAgentPolicy(); }); }} > diff --git a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx index 6369d344a2d9f..7d71915fda252 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx @@ -10,7 +10,12 @@ import { EuiCallOut, EuiConfirmModal, EuiSpacer, EuiIconTip } from '@elastic/eui import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useStartServices, sendDeletePackagePolicy, useConfig } from '../hooks'; +import { + useStartServices, + sendDeletePackagePolicy, + sendDeleteAgentPolicy, + useConfig, +} from '../hooks'; import { AGENTS_PREFIX } from '../../common/constants'; import type { AgentPolicy } from '../types'; import { sendGetAgents, useMultipleAgentPolicies } from '../hooks'; @@ -126,6 +131,26 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ defaultMessage: "Deleted integration ''{id}''", values: { id: successfulResults[0].name || successfulResults[0].id }, }); + + const agentlessPolicy = agentPolicies?.find( + (policy) => policy.supports_agentless === true + ); + + if (!!agentlessPolicy) { + try { + await sendDeleteAgentPolicy({ agentPolicyId: agentlessPolicy.id }); + } catch (e) { + notifications.toasts.addDanger( + i18n.translate( + 'xpack.fleet.deletePackagePolicy.fatalErrorAgentlessNotificationTitle', + { + defaultMessage: 'Error deleting agentless deployment', + } + ) + ); + } + } + notifications.toasts.addSuccess(successMessage); } @@ -155,10 +180,14 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ } closeModal(); }, - [closeModal, packagePolicies, notifications.toasts] + [closeModal, packagePolicies, notifications.toasts, agentPolicies] ); const renderModal = () => { + const isAgentlessPolicy = agentPolicies?.find((policy) => policy?.supports_agentless === true); + const packagePolicy = agentPolicies?.[0]?.package_policies?.find( + (policy) => policy.id === packagePolicies[0] + ); if (!isModalOpen) { return null; } @@ -166,11 +195,18 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ return ( <EuiConfirmModal title={ - <FormattedMessage - id="xpack.fleet.deletePackagePolicy.confirmModal.deleteMultipleTitle" - defaultMessage="Delete {count, plural, one {integration} other {# integrations}}?" - values={{ count: packagePolicies.length }} - /> + isAgentlessPolicy ? ( + <FormattedMessage + id="xpack.fleet.deletePackagePolicy.confirmModal.agentlessTitle" + defaultMessage="You’re about to delete an integration" + /> + ) : ( + <FormattedMessage + id="xpack.fleet.deletePackagePolicy.confirmModal.deleteMultipleTitle" + defaultMessage="Delete {count, plural, one {integration} other {# integrations}}?" + values={{ count: packagePolicies.length }} + /> + ) } onCancel={closeModal} onConfirm={deletePackagePolicies} @@ -224,14 +260,16 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ <EuiCallOut color="danger" title={ - <FormattedMessage - id="xpack.fleet.deletePackagePolicy.confirmModal.affectedAgentsTitle" - defaultMessage="This action will affect {agentsCount} {agentsCount, plural, one {agent} other {agents}}." - values={{ agentsCount }} - /> + !isAgentlessPolicy && ( + <FormattedMessage + id="xpack.fleet.deletePackagePolicy.confirmModal.affectedAgentsTitle" + defaultMessage="This action will affect {agentsCount} {agentsCount, plural, one {agent} other {agents}}." + values={{ agentsCount }} + /> + ) } > - {hasMultipleAgentPolicies ? ( + {hasMultipleAgentPolicies && !isAgentlessPolicy && ( <FormattedMessage id="xpack.fleet.deletePackagePolicy.confirmModal.affectedAgentPoliciesMessage" defaultMessage="Fleet has detected that the related agent policies {toolTip} are already in use by some of your agents." @@ -254,7 +292,8 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ ), }} /> - ) : ( + )}{' '} + {!hasMultipleAgentPolicies && !isAgentlessPolicy && ( <FormattedMessage id="xpack.fleet.deletePackagePolicy.confirmModal.affectedAgentsMessage" defaultMessage="Fleet has detected that {agentPolicyName} is already in use by some of your agents." @@ -263,10 +302,20 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent<Props> = ({ }} /> )} + {!hasMultipleAgentPolicies && isAgentlessPolicy && ( + <FormattedMessage + id="xpack.fleet.deletePackagePolicy.agentless.confirmModal.message" + defaultMessage="Deleting {packagePolicyName} integration will stop data ingestion." + values={{ + packagePolicyName: <strong>{packagePolicy?.name}</strong>, + }} + /> + )} </EuiCallOut> <EuiSpacer size="l" /> </> ) : null} + {!isLoadingAgentsCount && ( <FormattedMessage id="xpack.fleet.deletePackagePolicy.confirmModal.generalMessage" diff --git a/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts b/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts index b1a76f5a334f2..9e4fb2344fc29 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts @@ -164,18 +164,20 @@ export const sendCopyAgentPolicy = ( }); }; +export const sendDeleteAgentPolicy = (body: DeleteAgentPolicyRequest['body']) => { + return sendRequest<DeleteAgentPolicyResponse>({ + path: agentPolicyRouteService.getDeletePath(), + method: 'post', + body: JSON.stringify(body), + version: API_VERSIONS.public.v1, + }); +}; + export function useDeleteAgentPolicyMutation() { const queryClient = useQueryClient(); return useMutation({ - mutationFn: function sendDeleteAgentPolicy(body: DeleteAgentPolicyRequest['body']) { - return sendRequest<DeleteAgentPolicyResponse>({ - path: agentPolicyRouteService.getDeletePath(), - method: 'post', - body: JSON.stringify(body), - version: API_VERSIONS.public.v1, - }); - }, + mutationFn: sendDeleteAgentPolicy, onSuccess: () => { return queryClient.invalidateQueries(['agentPolicies']); }, diff --git a/x-pack/plugins/fleet/server/errors/handlers.ts b/x-pack/plugins/fleet/server/errors/handlers.ts index dfd92951c8919..d8971948397d3 100644 --- a/x-pack/plugins/fleet/server/errors/handlers.ts +++ b/x-pack/plugins/fleet/server/errors/handlers.ts @@ -44,6 +44,7 @@ import { FleetNotFoundError, PackageSavedObjectConflictError, FleetTooManyRequestsError, + AgentlessPolicyExistsRequestError, } from '.'; type IngestErrorHandler = ( @@ -111,6 +112,9 @@ const getHTTPResponseCode = (error: FleetError): number => { if (error instanceof PackageAlreadyInstalledError) { return 409; } + if (error instanceof AgentlessPolicyExistsRequestError) { + return 409; + } // Unsupported Media Type if (error instanceof PackageUnsupportedMediaTypeError) { return 415; diff --git a/x-pack/plugins/fleet/server/errors/index.ts b/x-pack/plugins/fleet/server/errors/index.ts index 80d8116baaaa3..09b387e7a5cee 100644 --- a/x-pack/plugins/fleet/server/errors/index.ts +++ b/x-pack/plugins/fleet/server/errors/index.ts @@ -57,6 +57,12 @@ export class AgentlessAgentCreateError extends FleetError { } } +export class AgentlessPolicyExistsRequestError extends AgentPolicyError { + constructor(message: string) { + super(`Unable to create integration. ${message}`); + } +} + export class AgentPolicyNameExistsError extends AgentPolicyError {} export class AgentReassignmentError extends FleetError {} export class PackagePolicyIneligibleForUpgradeError extends FleetError {} 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 9f42746c9c5fa..00bc01aa1f2cb 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.test.ts @@ -363,7 +363,7 @@ describe('Agent policy', () => { ); }); - it('should create a policy with is_managed true if agentless feature flag is set and in serverless env', async () => { + it('should create a policy agentless feature flag is set and in serverless env', async () => { jest .spyOn(appContextService, 'getExperimentalFeatures') .mockReturnValue({ agentless: true } as any); @@ -392,7 +392,7 @@ describe('Agent policy', () => { namespace: 'default', supports_agentless: true, status: 'active', - is_managed: true, + is_managed: false, revision: 1, updated_at: expect.anything(), updated_by: 'system', @@ -401,7 +401,7 @@ describe('Agent policy', () => { }); }); - it('should create a policy with is_managed true if agentless feature flag is set and in cloud env', async () => { + it('should create a policy if agentless feature flag is set and in cloud env', async () => { jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); jest.spyOn(appContextService, 'getConfig').mockReturnValue({ agentless: { enabled: true }, @@ -428,7 +428,7 @@ describe('Agent policy', () => { namespace: 'default', supports_agentless: true, status: 'active', - is_managed: true, + is_managed: false, revision: 1, updated_at: expect.anything(), updated_by: 'system', diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 57514ec30052b..ffdb2c4162d52 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -84,6 +84,7 @@ import { FleetUnauthorizedError, HostedAgentPolicyRestrictionRelatedError, PackagePolicyRestrictionRelatedError, + AgentlessPolicyExistsRequestError, } from '../errors'; import type { FullAgentConfigMap } from '../../common/types/models/agent_cm'; @@ -113,6 +114,7 @@ import { createSoFindIterable } from './utils/create_so_find_iterable'; import { isAgentlessEnabled } from './utils/agentless'; import { validatePolicyNamespaceForSpace } from './spaces/policy_namespaces'; import { isSpaceAwarenessEnabled } from './spaces/helpers'; +import { agentlessAgentService } from './agents/agentless_agent'; import { scheduleDeployAgentPoliciesTask } from './agent_policies/deploy_agent_policies_task'; const KEY_EDITABLE_FOR_MANAGED_POLICIES = ['namespace']; @@ -387,7 +389,7 @@ class AgentPolicyService { { ...agentPolicy, status: 'active', - is_managed: (agentPolicy.is_managed || agentPolicy?.supports_agentless) ?? false, + is_managed: agentPolicy.is_managed ?? false, revision: 1, updated_at: new Date().toISOString(), updated_by: options?.user?.username || 'system', @@ -411,7 +413,7 @@ class AgentPolicyService { public async requireUniqueName( soClient: SavedObjectsClientContract, - givenPolicy: { id?: string; name: string } + givenPolicy: { id?: string; name: string; supports_agentless?: boolean | null } ) { const savedObjectType = await getAgentPolicySavedObjectType(); @@ -423,7 +425,11 @@ class AgentPolicyService { const idsWithName = results.total && results.saved_objects.map(({ id }) => id); if (Array.isArray(idsWithName)) { const isEditingSelf = givenPolicy.id && idsWithName.includes(givenPolicy.id); - if (!givenPolicy.id || !isEditingSelf) { + + if ( + (!givenPolicy?.supports_agentless && !givenPolicy.id) || + (!givenPolicy?.supports_agentless && !isEditingSelf) + ) { const isSinglePolicy = idsWithName.length === 1; const existClause = isSinglePolicy ? `Agent Policy '${idsWithName[0]}' already exists` @@ -431,6 +437,13 @@ class AgentPolicyService { throw new AgentPolicyNameExistsError(`${existClause} with name '${givenPolicy.name}'`); } + + if (givenPolicy?.supports_agentless && !givenPolicy.id) { + const integrationName = givenPolicy.name.split(' ').pop(); + throw new AgentlessPolicyExistsRequestError( + `${givenPolicy.name} already exist. Please rename the integration name ${integrationName}.` + ); + } } } @@ -661,6 +674,7 @@ class AgentPolicyService { await this.requireUniqueName(soClient, { id, name: agentPolicy.name, + supports_agentless: agentPolicy?.supports_agentless, }); } if (agentPolicy.namespace) { @@ -1141,6 +1155,7 @@ class AgentPolicyService { if (agentPolicy.is_managed && !options?.force) { throw new HostedAgentPolicyRestrictionRelatedError(`Cannot delete hosted agent policy ${id}`); } + // Prevent deleting policy when assigned agents are inactive const { total } = await getAgentsByKuery(esClient, soClient, { showInactive: true, @@ -1149,12 +1164,32 @@ class AgentPolicyService { kuery: `${AGENTS_PREFIX}.policy_id:${id}`, }); - if (total > 0) { + if (total > 0 && !agentPolicy?.supports_agentless) { throw new FleetError( 'Cannot delete an agent policy that is assigned to any active or inactive agents' ); } + if (agentPolicy?.supports_agentless) { + logger.debug(`Starting unenrolling agent from agentless policy ${id}`); + // unenroll offline agents for agentless policies first to avoid 404 Save Object error + await this.triggerAgentPolicyUpdatedEvent(esClient, 'deleted', id, { + spaceId: soClient.getCurrentNamespace(), + }); + try { + // Deleting agentless deployment + await agentlessAgentService.deleteAgentlessAgent(id); + logger.debug( + `[Agentless API] Successfully deleted agentless deployment for single agent policy id ${id}` + ); + } catch (error) { + logger.error( + `[Agentless API] Error deleting agentless deployment for single agent policy id ${id}` + ); + logger.error(error); + } + } + const packagePolicies = await packagePolicyService.findAllForAgentPolicy(soClient, id); if (packagePolicies.length) { @@ -1216,9 +1251,11 @@ class AgentPolicyService { await soClient.delete(savedObjectType, id, { force: true, // need to delete through multiple space }); - await this.triggerAgentPolicyUpdatedEvent(esClient, 'deleted', id, { - spaceId: soClient.getCurrentNamespace(), - }); + if (!agentPolicy?.supports_agentless) { + await this.triggerAgentPolicyUpdatedEvent(esClient, 'deleted', id, { + spaceId: soClient.getCurrentNamespace(), + }); + } // cleanup .fleet-policies docs on delete await this.deleteFleetServerPoliciesForPolicyId(esClient, id); diff --git a/x-pack/plugins/fleet/server/services/agent_policy_create.ts b/x-pack/plugins/fleet/server/services/agent_policy_create.ts index 4d22820b9aa1c..f370867fc493b 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy_create.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy_create.ts @@ -21,12 +21,11 @@ import { import type { AgentPolicy, NewAgentPolicy } from '../types'; -import { agentlessAgentService } from './agents/agentless_agent'; - import { agentPolicyService, packagePolicyService } from '.'; import { incrementPackageName } from './package_policies'; import { bulkInstallPackages } from './epm/packages'; import { ensureDefaultEnrollmentAPIKeyForAgentPolicy } from './api_keys'; +import { agentlessAgentService } from './agents/agentless_agent'; const FLEET_SERVER_POLICY_ID = 'fleet-server-policy'; @@ -84,7 +83,7 @@ async function createPackagePolicy( user: options.user, bumpRevision: false, authorizationHeader: options.authorizationHeader, - force: options.force || agentPolicy.supports_agentless === true, + force: options.force, }); } diff --git a/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts b/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts index c98a5b63e0356..3bf21c3bec0d1 100644 --- a/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts +++ b/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts @@ -24,7 +24,12 @@ import { appContextService } from '../app_context'; import { listEnrollmentApiKeys } from '../api_keys'; import { listFleetServerHosts } from '../fleet_server_host'; -import { prependAgentlessApiBasePathToEndpoint, isAgentlessApiEnabled } from '../utils/agentless'; +import type { AgentlessConfig } from '../utils/agentless'; +import { + prependAgentlessApiBasePathToEndpoint, + isAgentlessApiEnabled, + getDeletionEndpointPath, +} from '../utils/agentless'; class AgentlessAgentService { public async createAgentlessAgent( @@ -42,23 +47,22 @@ class AgentlessAgentService { }; const logger = appContextService.getLogger(); - logger.debug(`Creating agentless agent ${agentlessAgentPolicy.id}`); + logger.debug(`[Agentless API] Creating agentless agent ${agentlessAgentPolicy.id}`); if (!isAgentlessApiEnabled) { logger.error( - 'Creating agentless agent not supported in non-cloud or non-serverless environments', - errorMetadata + '[Agentless API] Creating agentless agent not supported in non-cloud or non-serverless environments' ); throw new AgentlessAgentCreateError('Agentless agent not supported'); } if (!agentlessAgentPolicy.supports_agentless) { - logger.error('Agentless agent policy does not have agentless enabled'); + logger.error('[Agentless API] Agentless agent policy does not have agentless enabled'); throw new AgentlessAgentCreateError('Agentless agent policy does not have agentless enabled'); } const agentlessConfig = appContextService.getConfig()?.agentless; if (!agentlessConfig) { - logger.error('Missing agentless configuration', errorMetadata); + logger.error('[Agentless API] Missing agentless configuration', errorMetadata); throw new AgentlessAgentCreateError('missing agentless configuration'); } @@ -70,24 +74,16 @@ class AgentlessAgentService { ); logger.debug( - `Creating agentless agent with fleet_url: ${fleetUrl} and fleet_token: [REDACTED]` + `[Agentless API] Creating agentless agent with fleetUrl ${fleetUrl} and fleet_token: [REDACTED]` ); logger.debug( - `Creating agentless agent with TLS cert: ${ + `[Agentless API] Creating agentless agent with TLS cert: ${ agentlessConfig?.api?.tls?.certificate ? '[REDACTED]' : 'undefined' } and TLS key: ${agentlessConfig?.api?.tls?.key ? '[REDACTED]' : 'undefined'} and TLS ca: ${agentlessConfig?.api?.tls?.ca ? '[REDACTED]' : 'undefined'}` ); - - const tlsConfig = new SslConfig( - sslSchema.validate({ - enabled: true, - certificate: agentlessConfig?.api?.tls?.certificate, - key: agentlessConfig?.api?.tls?.key, - certificateAuthorities: agentlessConfig?.api?.tls?.ca, - }) - ); + const tlsConfig = this.createTlsConfig(agentlessConfig); const requestConfig: AxiosRequestConfig = { url: prependAgentlessApiBasePathToEndpoint(agentlessConfig, '/deployments'), @@ -114,33 +110,17 @@ class AgentlessAgentService { requestConfig.data.stack_version = appContextService.getKibanaVersion(); } - const requestConfigDebug = { - ...requestConfig, - data: { - ...requestConfig.data, - fleet_token: '[REDACTED]', - }, - httpsAgent: { - ...requestConfig.httpsAgent, - options: { - ...requestConfig.httpsAgent.options, - cert: requestConfig.httpsAgent.options.cert ? '[REDACTED]' : undefined, - key: requestConfig.httpsAgent.options.key ? '[REDACTED]' : undefined, - ca: requestConfig.httpsAgent.options.ca ? '[REDACTED]' : undefined, - }, - }, - }; - - const requestConfigDebugToString = JSON.stringify(requestConfigDebug); - - logger.debug(`Creating agentless agent with request config ${requestConfigDebugToString}`); + const requestConfigDebugStatus = this.createRequestConfigDebug(requestConfig); + logger.debug( + `[Agentless API] Creating agentless agent with request config ${requestConfigDebugStatus}` + ); const errorMetadataWithRequestConfig: LogMeta = { ...errorMetadata, http: { request: { id: traceId, - body: requestConfigDebug.data, + body: requestConfig.data, }, }, }; @@ -149,7 +129,7 @@ class AgentlessAgentService { (error: Error | AxiosError) => { if (!axios.isAxiosError(error)) { logger.error( - `Creating agentless failed with an error ${error} ${requestConfigDebugToString}`, + `[Agentless API] Creating agentless failed with an error ${error} ${requestConfigDebugStatus}`, errorMetadataWithRequestConfig ); throw new AgentlessAgentCreateError(withRequestIdMessage(error.message)); @@ -160,9 +140,9 @@ class AgentlessAgentService { if (error.response) { // The request was made and the server responded with a status code and error data logger.error( - `Creating agentless failed because the Agentless API responding with a status code that falls out of the range of 2xx: ${JSON.stringify( + `[Agentless API] Creating agentless failed because the Agentless API responding with a status code that falls out of the range of 2xx: ${JSON.stringify( error.response.status - )}} ${JSON.stringify(error.response.data)}} ${requestConfigDebugToString}`, + )}} ${JSON.stringify(error.response.data)}} ${requestConfigDebugStatus}`, { ...errorMetadataWithRequestConfig, http: { @@ -180,7 +160,7 @@ class AgentlessAgentService { } else if (error.request) { // The request was made but no response was received logger.error( - `Creating agentless agent failed while sending the request to the Agentless API: ${errorLogCodeCause} ${requestConfigDebugToString}`, + `[Agentless API] Creating agentless agent failed while sending the request to the Agentless API: ${errorLogCodeCause} ${requestConfigDebugStatus}`, errorMetadataWithRequestConfig ); throw new AgentlessAgentCreateError( @@ -189,7 +169,7 @@ class AgentlessAgentService { } else { // Something happened in setting up the request that triggered an Error logger.error( - `Creating agentless agent failed to be created ${errorLogCodeCause} ${requestConfigDebugToString}`, + `[Agentless API] Creating agentless agent failed to be created ${errorLogCodeCause} ${requestConfigDebugStatus}`, errorMetadataWithRequestConfig ); throw new AgentlessAgentCreateError( @@ -199,10 +179,110 @@ class AgentlessAgentService { } ); - logger.debug(`Created an agentless agent ${response}`); + logger.debug(`[Agentless API] Created an agentless agent ${response}`); + return response; + } + + public async deleteAgentlessAgent(agentlessPolicyId: string) { + const logger = appContextService.getLogger(); + const agentlessConfig = appContextService.getConfig()?.agentless; + const tlsConfig = this.createTlsConfig(agentlessConfig); + const requestConfig = { + url: getDeletionEndpointPath(agentlessConfig, `/deployments/${agentlessPolicyId}`), + method: 'DELETE', + headers: { + 'Content-type': 'application/json', + }, + httpsAgent: new https.Agent({ + rejectUnauthorized: tlsConfig.rejectUnauthorized, + cert: tlsConfig.certificate, + key: tlsConfig.key, + ca: tlsConfig.certificateAuthorities, + }), + }; + + const requestConfigDebugStatus = this.createRequestConfigDebug(requestConfig); + + logger.debug( + `[Agentless API] Start deleting agentless agent for agent policy ${requestConfigDebugStatus}` + ); + + if (!isAgentlessApiEnabled) { + logger.error( + '[Agentless API] Agentless API is not supported. Deleting agentless agent is not supported in non-cloud or non-serverless environments' + ); + } + + if (!agentlessConfig) { + logger.error('[Agentless API] kibana.yml is currently missing Agentless API configuration'); + } + + logger.debug(`[Agentless API] Deleting agentless agent with TLS config with certificate`); + + logger.debug( + `[Agentless API] Deleting agentless deployment with request config ${requestConfigDebugStatus}` + ); + + const response = await axios(requestConfig).catch((error: AxiosError) => { + const errorLogCodeCause = `${error.code} ${this.convertCauseErrorsToString(error)}`; + + if (!axios.isAxiosError(error)) { + logger.error( + `[Agentless API] Deleting agentless deployment failed with an error ${JSON.stringify( + error + )} ${requestConfigDebugStatus}` + ); + } + if (error.response) { + logger.error( + `[Agentless API] Deleting Agentless deployment Failed Response Error: ${JSON.stringify( + error.response.status + )}} ${JSON.stringify(error.response.data)}} ${requestConfigDebugStatus} ` + ); + } else if (error.request) { + logger.error( + `[Agentless API] Deleting agentless deployment failed to receive a response from the Agentless API ${errorLogCodeCause} ${requestConfigDebugStatus}` + ); + } else { + logger.error( + `[Agentless API] Deleting agentless deployment failed to delete the request ${errorLogCodeCause} ${requestConfigDebugStatus}` + ); + } + }); + return response; } + private createTlsConfig(agentlessConfig: AgentlessConfig | undefined) { + return new SslConfig( + sslSchema.validate({ + enabled: true, + certificate: agentlessConfig?.api?.tls?.certificate, + key: agentlessConfig?.api?.tls?.key, + certificateAuthorities: agentlessConfig?.api?.tls?.ca, + }) + ); + } + + private createRequestConfigDebug(requestConfig: AxiosRequestConfig<any>) { + return JSON.stringify({ + ...requestConfig, + data: { + ...requestConfig.data, + fleet_token: '[REDACTED]', + }, + httpsAgent: { + ...requestConfig.httpsAgent, + options: { + ...requestConfig.httpsAgent.options, + cert: requestConfig.httpsAgent.options.cert ? 'REDACTED' : undefined, + key: requestConfig.httpsAgent.options.key ? 'REDACTED' : undefined, + ca: requestConfig.httpsAgent.options.ca ? 'REDACTED' : undefined, + }, + }, + }); + } + private convertCauseErrorsToString = (error: AxiosError) => { if (error.cause instanceof AggregateError) { return error.cause.errors.map((e: Error) => e.message); diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index 4a7b6c2e2ee70..86d81f3df9b1a 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -1444,12 +1444,6 @@ class PackagePolicyClientImpl implements PackagePolicyClient { }); } - if (agentlessAgentPolicies.length > 0) { - for (const agentPolicyId of agentlessAgentPolicies) { - await agentPolicyService.delete(soClient, esClient, agentPolicyId, { force: true }); - } - } - if (!options?.skipUnassignFromAgentPolicies) { let uniquePolicyIdsR = [ ...new Set( @@ -3021,8 +3015,7 @@ async function validateIsNotHostedPolicy( throw new AgentPolicyNotFoundError('Agent policy not found'); } - const isManagedPolicyWithoutServerlessSupport = - agentPolicy.is_managed && !agentPolicy.supports_agentless && !force; + const isManagedPolicyWithoutServerlessSupport = agentPolicy.is_managed && !force; if (isManagedPolicyWithoutServerlessSupport) { throw new HostedAgentPolicyRestrictionRelatedError( diff --git a/x-pack/plugins/fleet/server/services/utils/agentless.ts b/x-pack/plugins/fleet/server/services/utils/agentless.ts index 5c544b1907b25..c85e9cc991a6c 100644 --- a/x-pack/plugins/fleet/server/services/utils/agentless.ts +++ b/x-pack/plugins/fleet/server/services/utils/agentless.ts @@ -28,6 +28,18 @@ const AGENTLESS_SERVERLESS_API_BASE_PATH = '/api/v1/serverless'; type AgentlessApiEndpoints = '/deployments' | `/deployments/${string}`; +export interface AgentlessConfig { + enabled?: boolean; + api?: { + url?: string; + tls?: { + certificate?: string; + key?: string; + ca?: string; + }; + }; +} + export const prependAgentlessApiBasePathToEndpoint = ( agentlessConfig: FleetConfigType['agentless'], endpoint: AgentlessApiEndpoints @@ -38,3 +50,10 @@ export const prependAgentlessApiBasePathToEndpoint = ( : AGENTLESS_ESS_API_BASE_PATH; return `${agentlessConfig.api.url}${endpointPrefix}${endpoint}`; }; + +export const getDeletionEndpointPath = ( + agentlessConfig: FleetConfigType['agentless'], + endpoint: AgentlessApiEndpoints +) => { + return `${agentlessConfig.api.url}${AGENTLESS_ESS_API_BASE_PATH}${endpoint}`; +}; diff --git a/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts b/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts index 1b1497140875e..2065d1307fbda 100644 --- a/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts +++ b/x-pack/test/cloud_security_posture_functional/agentless/create_agent.ts @@ -73,6 +73,62 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); }); + it(`should show setup technology selector in edit mode`, async () => { + const integrationPolicyName = `cloud_security_posture-${new Date().toISOString()}`; + await cisIntegration.navigateToAddIntegrationCspmWithVersionPage( + CLOUD_CREDENTIALS_PACKAGE_VERSION + ); + + await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); + await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); + + await cisIntegration.inputIntegrationName(integrationPolicyName); + + await cisIntegration.selectSetupTechnology('agentless'); + await cisIntegration.selectAwsCredentials('direct'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + await cisIntegration.clickSaveButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegrationAws.showPostInstallCloudFormationModal()).to.be(false); + + await cisIntegration.navigateToIntegrationCspList(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + await cisIntegration.navigateToEditIntegrationPage(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegration.showSetupTechnologyComponent()).to.be(true); + }); + + it(`should hide setup technology selector in edit mode`, async () => { + const integrationPolicyName = `cloud_security_posture1-${new Date().toISOString()}`; + await cisIntegration.navigateToAddIntegrationCspmWithVersionPage( + CLOUD_CREDENTIALS_PACKAGE_VERSION + ); + + await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); + await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); + + await cisIntegration.inputIntegrationName(integrationPolicyName); + await cisIntegration.selectSetupTechnology('agent-based'); + await pageObjects.header.waitUntilLoadingHasFinished(); + + await cisIntegration.clickSaveButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegrationAws.showPostInstallCloudFormationModal()).to.be(true); + + await cisIntegration.navigateToIntegrationCspList(); + await pageObjects.header.waitUntilLoadingHasFinished(); + await cisIntegration.navigateToEditIntegrationPage(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + expect(await cisIntegration.showSetupTechnologyComponent()).to.be(false); + }); + it(`should create default agent-based agent`, async () => { const integrationPolicyName = `cloud_security_posture-${new Date().toISOString()}`; diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts index 8732f0ba5b012..e3ef420055196 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts @@ -285,6 +285,11 @@ export function AddCisIntegrationFormPageProvider({ ); await agentOption.click(); }; + + const showSetupTechnologyComponent = async () => { + return await testSubjects.exists(SETUP_TECHNOLOGY_SELECTOR_ACCORDION_TEST_SUBJ); + }; + const selectAwsCredentials = async (credentialType: 'direct' | 'temporary') => { await clickOptionButton(AWS_CREDENTIAL_SELECTOR); await selectValue( @@ -544,5 +549,7 @@ export function AddCisIntegrationFormPageProvider({ getFirstCspmIntegrationPageAgent, getAgentBasedPolicyValue, showSuccessfulToast, + showSetupTechnologyComponent, + navigateToEditIntegrationPage, }; } diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/delete.ts b/x-pack/test/fleet_api_integration/apis/package_policy/delete.ts index ebe7a91019094..fddf71eaf98a1 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/delete.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/delete.ts @@ -166,7 +166,7 @@ export default function (providerContext: FtrProviderContext) { .set('kbn-xsrf', 'xxxx') .expect(200); - await supertest.get(`/api/fleet/agent_policies/${agentPolicy.id}`).expect(404); + await supertest.get(`/api/fleet/agent_policies/${agentPolicy.id}`).expect(200); }); }); describe('Delete bulk', () => { diff --git a/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.agentless.ts b/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.agentless.ts index 948a418279ac9..692ae096265fb 100644 --- a/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.agentless.ts +++ b/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.agentless.ts @@ -6,8 +6,10 @@ */ import { CLOUD_CREDENTIALS_PACKAGE_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; +import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import { createTestConfig } from '../../config.base'; +// TODO: Remove the agentless default config once Serverless API is merged and default policy is deleted export default createTestConfig({ serverlessProject: 'security', junit: { @@ -16,13 +18,23 @@ export default createTestConfig({ kbnServerArgs: [ `--xpack.fleet.packages.0.name=cloud_security_posture`, `--xpack.fleet.packages.0.version=${CLOUD_CREDENTIALS_PACKAGE_VERSION}`, + `--xpack.fleet.agentless.enabled=true`, + `--xpack.fleet.agents.fleet_server.hosts=["https://ftr.kibana:8220"]`, + `--xpack.fleet.internal.fleetServerStandalone=true`, - // Agentless Configuration based on Serverless Security Dev Yaml - config/serverless.security.dev.yml - `--xpack.fleet.enableExperimental.0=agentless`, + // Agentless Configuration based on Serverless Default policy`, `--xpack.fleet.agentPolicies.0.id=agentless`, `--xpack.fleet.agentPolicies.0.name=agentless`, `--xpack.fleet.agentPolicies.0.package_policies=[]`, `--xpack.cloud.serverless.project_id=some_fake_project_id`, + `--xpack.fleet.agentPolicies.0.is_default=true`, + `--xpack.fleet.agentPolicies.0.is_default_fleet_server=true`, + + // Serverless Agentless API + `--xpack.fleet.agentless.api.url=http://localhost:8089`, + `--xpack.fleet.agentless.api.tls.certificate=${KBN_CERT_PATH}`, + `--xpack.fleet.agentless.api.tls.key=${KBN_KEY_PATH}`, + `--xpack.fleet.agentless.api.tls.ca=${CA_CERT_PATH}`, ], // load tests in the index file testFiles: [require.resolve('./ftr/cloud_security_posture/agentless')], diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_aws.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_aws.ts index 6adbbac3cdc57..90991304936ea 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_aws.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_aws.ts @@ -6,9 +6,11 @@ */ import { CLOUD_CREDENTIALS_PACKAGE_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; import expect from '@kbn/expect'; - +import * as http from 'http'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { setupMockServer } from '../agentless_api/mock_agentless_api'; export default function ({ getPageObjects, getService }: FtrProviderContext) { + const mockAgentlessApiService = setupMockServer(); const pageObjects = getPageObjects([ 'settings', 'common', @@ -24,9 +26,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { let cisIntegration: typeof pageObjects.cisAddIntegration; let cisIntegrationAws: typeof pageObjects.cisAddIntegration.cisAws; let testSubjectIds: typeof pageObjects.cisAddIntegration.testSubjectIds; + let mockApiServer: http.Server; const previousPackageVersion = '1.9.0'; before(async () => { + mockApiServer = mockAgentlessApiService.listen(8089); await pageObjects.svlCommonPage.loginAsAdmin(); cisIntegration = pageObjects.cisAddIntegration; cisIntegrationAws = pageObjects.cisAddIntegration.cisAws; @@ -41,6 +45,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { .set('kbn-xsrf', 'xxxx') .send({ force: true }) .expect(200); + mockApiServer.close(); }); describe('Serverless - Agentless CIS_AWS Single Account Launch Cloud formation', () => { @@ -110,7 +115,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('Serverless - Agentless CIS_AWS edit flow', () => { + // TODO: Migrate test after Serverless default agentless policy is deleted. + describe.skip('Serverless - Agentless CIS_AWS edit flow', () => { it(`user should save and edit agentless integration policy`, async () => { const newDirectAccessKeyId = `newDirectAccessKey`; @@ -142,7 +148,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ).to.be('true'); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/191017 describe.skip('Serverless - Agentless CIS_AWS Create flow', () => { it(`user should save agentless integration policy when there are no api or validation errors and button is not disabled`, async () => { diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_gcp.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_gcp.ts index cd9e5b2168d1a..85a45f67bf9cc 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_gcp.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless/cis_integration_gcp.ts @@ -7,7 +7,9 @@ import expect from '@kbn/expect'; import { CLOUD_CREDENTIALS_PACKAGE_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; +import * as http from 'http'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { setupMockServer } from '../agentless_api/mock_agentless_api'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const pageObjects = getPageObjects(['common', 'svlCommonPage', 'cisAddIntegration', 'header']); @@ -21,7 +23,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { let cisIntegrationGcp: typeof pageObjects.cisAddIntegration.cisGcp; let testSubjectIds: typeof pageObjects.cisAddIntegration.testSubjectIds; + const mockAgentlessApiService = setupMockServer(); + let mockApiServer: http.Server; + before(async () => { + mockApiServer = mockAgentlessApiService.listen(8089); await pageObjects.svlCommonPage.loginAsAdmin(); cisIntegration = pageObjects.cisAddIntegration; cisIntegrationGcp = pageObjects.cisAddIntegration.cisGcp; @@ -36,6 +42,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { .set('kbn-xsrf', 'xxxx') .send({ force: true }) .expect(200); + mockApiServer.close(); }); describe('Agentless CIS_GCP Single Account Launch Cloud shell', () => { @@ -93,7 +100,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('Serverless - Agentless CIS_GCP edit flow', () => { + describe.skip('Serverless - Agentless CIS_GCP edit flow', () => { it(`user should save and edit agentless integration policy`, async () => { const newCredentialsJSON = 'newJson'; await cisIntegration.createAgentlessIntegration({ From 748a0a3c34f4655c59eca5cd75704ab7015e10f2 Mon Sep 17 00:00:00 2001 From: Ido Cohen <90558359+CohenIdo@users.noreply.github.com> Date: Tue, 1 Oct 2024 21:46:39 +0300 Subject: [PATCH 079/107] [Cloud Security] Ignore Unavailable Index --- .../configurations/latest_findings/use_grouped_findings.tsx | 1 + .../pages/configurations/latest_findings/use_latest_findings.ts | 2 +- .../pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx | 1 + .../pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx index 75234c0495f51..6d901a76a29c3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_grouped_findings.tsx @@ -70,6 +70,7 @@ export interface FindingsGroupingAggregation { export const getGroupedFindingsQuery = (query: GroupingQuery) => ({ ...query, index: CDR_MISCONFIGURATIONS_INDEX_PATTERN, + ignore_unavailable: true, size: 0, }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts index f8cd0238ef0bb..f6f27e15ee7a4 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings.ts @@ -51,7 +51,7 @@ export const getFindingsQuery = ( sort: getMultiFieldsSort(sort), size: MAX_FINDINGS_TO_LOAD, aggs: getFindingsCountAggQuery(), - ignore_unavailable: false, + ignore_unavailable: true, query: { ...query, bool: { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx index 580926340438f..9fddf97e28482 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_grouped_vulnerabilities.tsx @@ -57,6 +57,7 @@ export type VulnerabilitiesRootGroupingAggregation = export const getGroupedVulnerabilitiesQuery = (query: GroupingQuery) => ({ ...query, index: CDR_VULNERABILITIES_INDEX_PATTERN, + ignore_unavailable: true, size: 0, }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx index 3e5bd646e7993..0d0ea9ba5a22f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/hooks/use_latest_vulnerabilities.tsx @@ -57,6 +57,7 @@ export const getVulnerabilitiesQuery = ( pageParam: number ) => ({ index: CDR_VULNERABILITIES_INDEX_PATTERN, + ignore_unavailable: true, sort: getMultiFieldsSort(sort), size: MAX_FINDINGS_TO_LOAD, query: { From 5da67c71aeb4d7f1d989d57515c86ee8bc3e4652 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 2 Oct 2024 04:52:20 +1000 Subject: [PATCH 080/107] skip failing test suite (#194043) --- .../context_awareness/extensions/_get_row_indicator_provider.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts b/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts index f3f4cd40145e3..9f46b86daf3c4 100644 --- a/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts +++ b/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts @@ -24,6 +24,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const dataViews = getService('dataViews'); + // Failing: See https://github.com/elastic/kibana/issues/194043 // Failing: See https://github.com/elastic/kibana/issues/194043 describe.skip('extension getRowIndicatorProvider', () => { before(async () => { From 3f901562cffd9b8d7ff4f4e872c4e7ccf8575719 Mon Sep 17 00:00:00 2001 From: Tim Sullivan <tsullivan@users.noreply.github.com> Date: Tue, 1 Oct 2024 12:22:29 -0700 Subject: [PATCH 081/107] [Spaces and Roles] Updates for finalized contents and UX (#193923) ## Summary Follows https://github.com/elastic/kibana/pull/191795 * Minor content updates to Spaces Management * [spaces grid] More space for "description" column in Spaces Grid * [create space and edit space] Add "New" badge to Solution View picker * [create space and edit space] Move avatar section down * [create space] Remove the edit/update functionality from the Create Space page * [create space] Only show the Feature Visibility section if the selected solution is `classic` * [edit space] Rearrange the footer icons in the General tab * [edit space] Show callout when classic is selected by default * [edit space] Update the action icons shown on hover on the Assigned Roles table ### 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] 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) --- .../kibana_privilege_table/feature_table.tsx | 6 +- .../customize_space_avatar.test.tsx.snap | 0 .../customize_avatar/customize_avatar.tsx | 106 +++++++ .../customize_space_avatar.test.tsx | 0 .../customize_space_avatar.tsx | 0 .../components/customize_avatar/index.ts | 8 + .../customize_space.test.tsx.snap | 53 +--- .../customize_space/customize_space.tsx | 65 +--- .../enabled_features.test.tsx.snap | 17 +- .../enabled_features/enabled_features.tsx | 37 +-- .../solution_view/solution_view.tsx | 81 +++-- .../create_space/create_space_page.test.tsx | 280 +----------------- .../create_space/create_space_page.tsx | 133 ++------- .../management/edit_space/edit_space.tsx | 4 +- .../edit_space/edit_space_features_tab.tsx | 77 ----- .../edit_space/edit_space_general_tab.tsx | 27 +- .../public/management/edit_space/footer.tsx | 96 +++--- .../space_assign_role_privilege_form.tsx | 9 +- .../component/space_assigned_roles_table.tsx | 31 +- .../public/management/lib/validate_space.ts | 2 +- .../spaces_grid/spaces_grid_page.test.tsx | 4 +- .../spaces_grid/spaces_grid_page.tsx | 74 +++-- .../translations/translations/fr-FR.json | 7 - .../translations/translations/ja-JP.json | 7 - .../translations/translations/zh-CN.json | 7 - 25 files changed, 372 insertions(+), 759 deletions(-) rename x-pack/plugins/spaces/public/management/components/{customize_space => customize_avatar}/__snapshots__/customize_space_avatar.test.tsx.snap (100%) create mode 100644 x-pack/plugins/spaces/public/management/components/customize_avatar/customize_avatar.tsx rename x-pack/plugins/spaces/public/management/components/{customize_space => customize_avatar}/customize_space_avatar.test.tsx (100%) rename x-pack/plugins/spaces/public/management/components/{customize_space => customize_avatar}/customize_space_avatar.tsx (100%) create mode 100644 x-pack/plugins/spaces/public/management/components/customize_avatar/index.ts delete mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx diff --git a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx index 45b263b66f2fb..6fef00ccecec9 100644 --- a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx +++ b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx @@ -160,9 +160,7 @@ export class FeatureTable extends Component<Props, State> { <EuiSpacer size="s" /> {helpText && ( <> - <EuiCallOut iconType="iInCircle" size="s"> - {helpText} - </EuiCallOut> + <EuiCallOut size="s" title={helpText} /> <EuiSpacer size="s" /> </> )} @@ -404,7 +402,7 @@ export class FeatureTable extends Component<Props, State> { 'xpack.security.management.editRole.featureTable.managementCategoryHelpText', { defaultMessage: - 'Access to Stack Management is determined by both Elasticsearch and Kibana privileges, and cannot be explicitly disabled.', + 'Additional Stack Management permissions can be found outside of this menu, in index and cluster privileges.', } ); } diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space_avatar.test.tsx.snap b/x-pack/plugins/spaces/public/management/components/customize_avatar/__snapshots__/customize_space_avatar.test.tsx.snap similarity index 100% rename from x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space_avatar.test.tsx.snap rename to x-pack/plugins/spaces/public/management/components/customize_avatar/__snapshots__/customize_space_avatar.test.tsx.snap diff --git a/x-pack/plugins/spaces/public/management/components/customize_avatar/customize_avatar.tsx b/x-pack/plugins/spaces/public/management/components/customize_avatar/customize_avatar.tsx new file mode 100644 index 0000000000000..37daa938663e0 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/components/customize_avatar/customize_avatar.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiDescribedFormGroup, EuiLoadingSpinner, EuiTitle } from '@elastic/eui'; +import React, { Component, lazy, Suspense } from 'react'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { CustomizeSpaceAvatar } from './customize_space_avatar'; +import { getSpaceAvatarComponent } from '../../../space_avatar'; +import type { SpaceValidator } from '../../lib'; +import type { CustomizeSpaceFormValues } from '../../types'; +import { SectionPanel } from '../section_panel'; + +// No need to wrap LazySpaceAvatar in an error boundary, because it is one of the first chunks loaded when opening Kibana. +const LazySpaceAvatar = lazy(() => + getSpaceAvatarComponent().then((component) => ({ default: component })) +); + +interface Props { + validator: SpaceValidator; + space: CustomizeSpaceFormValues; + onChange: (space: CustomizeSpaceFormValues) => void; + title?: string; +} + +interface State { + customizingAvatar: boolean; + usingCustomIdentifier: boolean; +} + +export class CustomizeAvatar extends Component<Props, State> { + public state = { + customizingAvatar: false, + usingCustomIdentifier: false, + }; + + public render() { + const { validator, space } = this.props; + + return ( + <SectionPanel dataTestSubj="customizeAvatarSection"> + <EuiDescribedFormGroup + title={ + <EuiTitle size="xs"> + <h3> + <FormattedMessage + id="xpack.spaces.management.manageSpacePage.avatarTitle" + defaultMessage="Define an avatar" + /> + </h3> + </EuiTitle> + } + description={ + <> + <p> + {i18n.translate('xpack.spaces.management.manageSpacePage.avatarDescription', { + defaultMessage: 'Choose how your space avatar appears across Kibana.', + })} + </p> + {space.avatarType === 'image' ? ( + <Suspense fallback={<EuiLoadingSpinner />}> + <LazySpaceAvatar + space={{ + ...space, + initials: '?', + name: undefined, + }} + size="xl" + /> + </Suspense> + ) : ( + <Suspense fallback={<EuiLoadingSpinner />}> + <LazySpaceAvatar + space={{ + name: '?', + ...space, + imageUrl: undefined, + }} + size="xl" + /> + </Suspense> + )} + </> + } + fullWidth + > + <CustomizeSpaceAvatar + space={this.props.space} + onChange={this.onAvatarChange} + validator={validator} + /> + </EuiDescribedFormGroup> + </SectionPanel> + ); + } + + public onAvatarChange = (space: CustomizeSpaceFormValues) => { + this.props.onChange(space); + }; +} diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.test.tsx b/x-pack/plugins/spaces/public/management/components/customize_avatar/customize_space_avatar.test.tsx similarity index 100% rename from x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.test.tsx rename to x-pack/plugins/spaces/public/management/components/customize_avatar/customize_space_avatar.test.tsx diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.tsx b/x-pack/plugins/spaces/public/management/components/customize_avatar/customize_space_avatar.tsx similarity index 100% rename from x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.tsx rename to x-pack/plugins/spaces/public/management/components/customize_avatar/customize_space_avatar.tsx diff --git a/x-pack/plugins/spaces/public/management/components/customize_avatar/index.ts b/x-pack/plugins/spaces/public/management/components/customize_avatar/index.ts new file mode 100644 index 0000000000000..60d3168efc245 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/components/customize_avatar/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 { CustomizeAvatar } from './customize_avatar'; diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap b/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap index d7527e300eece..fe9692a971d3f 100644 --- a/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap +++ b/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap @@ -38,7 +38,7 @@ exports[`renders correctly 1`] = ` <EuiFormRow data-test-subj="optionalDescription" fullWidth={true} - helpText="The description appears on the space selection screen." + helpText="Appears on the space selection screen and spaces list." isInvalid={false} label="Description" labelAppend={ @@ -89,56 +89,5 @@ exports[`renders correctly 1`] = ` /> </EuiFormRow> </EuiDescribedFormGroup> - <EuiDescribedFormGroup - description={ - <React.Fragment> - <p> - Choose how your space avatar appears across Kibana. - </p> - <React.Suspense - fallback={<EuiLoadingSpinner />} - > - <UNDEFINED - size="xl" - space={ - Object { - "id": "", - "imageUrl": undefined, - "name": "", - } - } - /> - </React.Suspense> - </React.Fragment> - } - fullWidth={true} - title={ - <EuiTitle - size="xs" - > - <h3> - <Memo(MemoizedFormattedMessage) - defaultMessage="Create an avatar" - id="xpack.spaces.management.manageSpacePage.avatarTitle" - /> - </h3> - </EuiTitle> - } - > - <CustomizeSpaceAvatar - onChange={[Function]} - space={ - Object { - "id": "", - "name": "", - } - } - validator={ - SpaceValidator { - "shouldValidate": true, - } - } - /> - </EuiDescribedFormGroup> </SectionPanel> `; diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/customize_space.tsx b/x-pack/plugins/spaces/public/management/components/customize_space/customize_space.tsx index f67e40df53ec3..a5761c34c97b0 100644 --- a/x-pack/plugins/spaces/public/management/components/customize_space/customize_space.tsx +++ b/x-pack/plugins/spaces/public/management/components/customize_space/customize_space.tsx @@ -9,29 +9,22 @@ import { EuiDescribedFormGroup, EuiFieldText, EuiFormRow, - EuiLoadingSpinner, EuiText, EuiTextArea, EuiTitle, } from '@elastic/eui'; import type { ChangeEvent } from 'react'; -import React, { Component, lazy, Suspense } from 'react'; +import React, { Component } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { CustomizeSpaceAvatar } from './customize_space_avatar'; -import { getSpaceAvatarComponent, getSpaceColor, getSpaceInitials } from '../../../space_avatar'; +import { getSpaceColor, getSpaceInitials } from '../../../space_avatar'; import type { SpaceValidator } from '../../lib'; import { toSpaceIdentifier } from '../../lib'; import type { CustomizeSpaceFormValues } from '../../types'; import { SectionPanel } from '../section_panel'; -// No need to wrap LazySpaceAvatar in an error boundary, because it is one of the first chunks loaded when opening Kibana. -const LazySpaceAvatar = lazy(() => - getSpaceAvatarComponent().then((component) => ({ default: component })) -); - interface Props { validator: SpaceValidator; space: CustomizeSpaceFormValues; @@ -112,7 +105,7 @@ export class CustomizeSpace extends Component<Props, State> { helpText={i18n.translate( 'xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText', { - defaultMessage: 'The description appears on the space selection screen.', + defaultMessage: 'Appears on the space selection screen and spaces list.', } )} {...validator.validateSpaceDescription(this.props.space)} @@ -156,58 +149,6 @@ export class CustomizeSpace extends Component<Props, State> { </EuiFormRow> )} </EuiDescribedFormGroup> - - <EuiDescribedFormGroup - title={ - <EuiTitle size="xs"> - <h3> - <FormattedMessage - id="xpack.spaces.management.manageSpacePage.avatarTitle" - defaultMessage="Create an avatar" - /> - </h3> - </EuiTitle> - } - description={ - <> - <p> - {i18n.translate('xpack.spaces.management.manageSpacePage.avatarDescription', { - defaultMessage: 'Choose how your space avatar appears across Kibana.', - })} - </p> - {space.avatarType === 'image' ? ( - <Suspense fallback={<EuiLoadingSpinner />}> - <LazySpaceAvatar - space={{ - ...space, - initials: '?', - name: undefined, - }} - size="xl" - /> - </Suspense> - ) : ( - <Suspense fallback={<EuiLoadingSpinner />}> - <LazySpaceAvatar - space={{ - name: '?', - ...space, - imageUrl: undefined, - }} - size="xl" - /> - </Suspense> - )} - </> - } - fullWidth - > - <CustomizeSpaceAvatar - space={this.props.space} - onChange={this.onAvatarChange} - validator={validator} - /> - </EuiDescribedFormGroup> </SectionPanel> ); } diff --git a/x-pack/plugins/spaces/public/management/components/enabled_features/__snapshots__/enabled_features.test.tsx.snap b/x-pack/plugins/spaces/public/management/components/enabled_features/__snapshots__/enabled_features.test.tsx.snap index fd56cf65620f1..9babe0f169992 100644 --- a/x-pack/plugins/spaces/public/management/components/enabled_features/__snapshots__/enabled_features.test.tsx.snap +++ b/x-pack/plugins/spaces/public/management/components/enabled_features/__snapshots__/enabled_features.test.tsx.snap @@ -2,8 +2,7 @@ exports[`EnabledFeatures renders as expected 1`] = ` <SectionPanel - data-test-subj="enabled-features-panel" - title="Features" + dataTestSubj="enabled-features-panel" > <EuiFlexGroup> <EuiFlexItem> @@ -26,14 +25,16 @@ exports[`EnabledFeatures renders as expected 1`] = ` > <p> <MemoizedFormattedMessage - defaultMessage="Hidden features are removed from the user interface, but not disabled. To secure access to features, {manageRolesLink}." - id="xpack.spaces.management.enabledSpaceFeatures.notASecurityMechanismMessage" + defaultMessage="Choose the features to display in the navigation menu for users of this space. If you want to focus on a single solution, you can simplify the navigation even more by selecting a {solutionView}." + id="xpack.spaces.management.enabledSpaceFeatures.chooseFeaturesToDisplayMessage" values={ Object { - "manageRolesLink": <Memo(MemoizedFormattedMessage) - defaultMessage="manage security roles" - id="xpack.spaces.management.enabledSpaceFeatures.manageRolesLinkText" - />, + "solutionView": <strong> + <Memo(MemoizedFormattedMessage) + defaultMessage="Solution view" + id="xpack.spaces.management.enabledSpaceFeatures.chooseFeaturesToDisplaySolutionViewText" + /> + </strong>, } } /> diff --git a/x-pack/plugins/spaces/public/management/components/enabled_features/enabled_features.tsx b/x-pack/plugins/spaces/public/management/components/enabled_features/enabled_features.tsx index 36d0694953242..377f4c51ff0c5 100644 --- a/x-pack/plugins/spaces/public/management/components/enabled_features/enabled_features.tsx +++ b/x-pack/plugins/spaces/public/management/components/enabled_features/enabled_features.tsx @@ -5,14 +5,12 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import type { FunctionComponent } from 'react'; import React from 'react'; import type { KibanaFeatureConfig } from '@kbn/features-plugin/public'; -import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; import { FeatureTable } from './feature_table'; import type { Space } from '../../../../common'; @@ -25,16 +23,8 @@ interface Props { } export const EnabledFeatures: FunctionComponent<Props> = (props) => { - const { services } = useKibana(); - const canManageRoles = services.application?.capabilities.management?.security?.roles === true; - return ( - <SectionPanel - title={i18n.translate('xpack.spaces.management.manageSpacePage.featuresTitle', { - defaultMessage: 'Features', - })} - data-test-subj="enabled-features-panel" - > + <SectionPanel dataTestSubj="enabled-features-panel"> <EuiFlexGroup> <EuiFlexItem> <EuiTitle size="xs"> @@ -49,25 +39,16 @@ export const EnabledFeatures: FunctionComponent<Props> = (props) => { <EuiText size="s" color="subdued"> <p> <FormattedMessage - id="xpack.spaces.management.enabledSpaceFeatures.notASecurityMechanismMessage" - defaultMessage="Hidden features are removed from the user interface, but not disabled. To secure access to features, {manageRolesLink}." + id="xpack.spaces.management.enabledSpaceFeatures.chooseFeaturesToDisplayMessage" + defaultMessage="Choose the features to display in the navigation menu for users of this space. If you want to focus on a single solution, you can simplify the navigation even more by selecting a {solutionView}." values={{ - manageRolesLink: canManageRoles ? ( - <EuiLink - href={services.application?.getUrlForApp('management', { - path: '/security/roles', - })} - > + solutionView: ( + <strong> <FormattedMessage - id="xpack.spaces.management.enabledSpaceFeatures.manageRolesLinkText" - defaultMessage="manage security roles" + id="xpack.spaces.management.enabledSpaceFeatures.chooseFeaturesToDisplaySolutionViewText" + defaultMessage="Solution view" /> - </EuiLink> - ) : ( - <FormattedMessage - id="xpack.spaces.management.enabledSpaceFeatures.manageRolesLinkText" - defaultMessage="manage security roles" - /> + </strong> ), }} /> diff --git a/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx b/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx index c336791991df4..4bf5e437f7350 100644 --- a/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx +++ b/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx @@ -7,6 +7,8 @@ import type { EuiSuperSelectOption, EuiThemeComputed } from '@elastic/eui'; import { + EuiBetaBadge, + EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiFormRow, @@ -24,6 +26,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { Space } from '../../../../common'; +import { SOLUTION_VIEW_CLASSIC } from '../../../../common/constants'; import type { SpaceValidator } from '../../lib'; import { SectionPanel } from '../section_panel'; @@ -40,9 +43,7 @@ const getOptions = ({ size }: EuiThemeComputed): Array<EuiSuperSelectOption<Solu <EuiIcon type="logoElasticsearch" css={iconCss} /> {i18n.translate( 'xpack.spaces.management.manageSpacePage.solutionViewSelect.searchOptionLabel', - { - defaultMessage: 'Search', - } + { defaultMessage: 'Search' } )} </> ), @@ -55,9 +56,7 @@ const getOptions = ({ size }: EuiThemeComputed): Array<EuiSuperSelectOption<Solu <EuiIcon type="logoObservability" css={iconCss} /> {i18n.translate( 'xpack.spaces.management.manageSpacePage.solutionViewSelect.obltOptionLabel', - { - defaultMessage: 'Observability', - } + { defaultMessage: 'Observability' } )} </> ), @@ -70,9 +69,7 @@ const getOptions = ({ size }: EuiThemeComputed): Array<EuiSuperSelectOption<Solu <EuiIcon type="logoSecurity" css={iconCss} /> {i18n.translate( 'xpack.spaces.management.manageSpacePage.solutionViewSelect.securityOptionLabel', - { - defaultMessage: 'Security', - } + { defaultMessage: 'Security' } )} </> ), @@ -85,9 +82,7 @@ const getOptions = ({ size }: EuiThemeComputed): Array<EuiSuperSelectOption<Solu <EuiIcon type="logoKibana" css={iconCss} /> {i18n.translate( 'xpack.spaces.management.manageSpacePage.solutionViewSelect.classicOptionLabel', - { - defaultMessage: 'Classic', - } + { defaultMessage: 'Classic' } )} </> ), @@ -112,25 +107,40 @@ export const SolutionView: FunctionComponent<Props> = ({ sectionTitle, }) => { const { euiTheme } = useEuiTheme(); + const showClassicDefaultViewCallout = isEditing && space.solution == null; return ( <SectionPanel title={sectionTitle} dataTestSubj="navigationPanel"> - <EuiFlexGroup> + <EuiFlexGroup alignItems="flexStart"> <EuiFlexItem> <EuiTitle size="xs"> - <h3> - <FormattedMessage - id="xpack.spaces.management.manageSpacePage.setSolutionViewMessage" - defaultMessage="Set solution view" - /> - </h3> + <EuiFlexGroup gutterSize="s"> + <EuiFlexItem grow={false}> + <h3> + <FormattedMessage + id="xpack.spaces.management.manageSpacePage.setSolutionViewMessage" + defaultMessage="Select solution view" + /> + </h3> + </EuiFlexItem> + <EuiFlexItem> + <EuiBetaBadge + label={i18n.translate( + 'xpack.spaces.management.manageSpacePage.setSolutionViewNewBadge', + { defaultMessage: 'New' } + )} + color="accent" + size="s" + /> + </EuiFlexItem> + </EuiFlexGroup> </EuiTitle> <EuiSpacer size="s" /> <EuiText size="s" color="subdued"> <p> <FormattedMessage id="xpack.spaces.management.manageSpacePage.setSolutionViewDescription" - defaultMessage="Determines the navigation all users will see for this space. Each solution view contains features from Analytics tools and Management." + defaultMessage="Focus the navigation and menus of this space on a specific solution. Features that are not relevant to the selected solution are no longer visible to users of this space." /> </p> </EuiText> @@ -145,20 +155,43 @@ export const SolutionView: FunctionComponent<Props> = ({ > <EuiSuperSelect options={getOptions(euiTheme)} - valueOfSelected={space.solution} + valueOfSelected={ + space.solution ?? + (showClassicDefaultViewCallout ? SOLUTION_VIEW_CLASSIC : undefined) + } data-test-subj="solutionViewSelect" onChange={(solution) => { onChange({ ...space, solution }); }} placeholder={i18n.translate( 'xpack.spaces.management.navigation.solutionViewDefaultValue', - { - defaultMessage: 'Select view', - } + { defaultMessage: 'Select solution view' } )} isInvalid={validator.validateSolutionView(space, isEditing).isInvalid} /> </EuiFormRow> + + {showClassicDefaultViewCallout && ( + <> + <EuiText size="s" color="subdued"> + <FormattedMessage + id="xpack.spaces.management.manageSpacePage.solutionViewSelect.classicDefaultViewCallout" + defaultMessage="Affects all users of the space" + /> + </EuiText> + + <EuiSpacer /> + <EuiCallOut + color="primary" + size="s" + iconType="iInCircle" + title={i18n.translate( + 'xpack.spaces.management.manageSpacePage.solutionViewSelect.classicDefaultViewCallout', + { defaultMessage: 'By default your current view is Classic' } + )} + /> + </> + )} </EuiFlexItem> </EuiFlexGroup> </SectionPanel> diff --git a/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx b/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx index 4c8617ff007b8..14413b0b2f47b 100644 --- a/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx @@ -6,7 +6,6 @@ */ import type { EuiCheckboxProps } from '@elastic/eui'; -import { EuiButton } from '@elastic/eui'; import { waitFor } from '@testing-library/react'; import type { ReactWrapper } from 'enzyme'; import React from 'react'; @@ -23,7 +22,6 @@ import type { SolutionView, Space } from '../../../common/types/latest'; import { EventTracker } from '../../analytics'; import type { SpacesManager } from '../../spaces_manager'; import { spacesManagerMock } from '../../spaces_manager/mocks'; -import { ConfirmAlterActiveSpaceModal } from '../components/confirm_alter_active_space_modal'; import { EnabledFeatures } from '../components/enabled_features'; // To be resolved by EUI team. @@ -153,8 +151,8 @@ describe('ManageSpacePage', () => { expect(errors).toEqual([ 'Enter a name.', 'Enter a URL identifier.', + 'Select a solution.', 'Enter initials.', - 'Select one solution.', ]); expect(spacesManager.createSpace).not.toHaveBeenCalled(); @@ -168,7 +166,7 @@ describe('ManageSpacePage', () => { { const errors = wrapper.find('div.euiFormErrorText').map((node) => node.text()); - expect(errors).toEqual(['Select one solution.']); // requires solution view to be set + expect(errors).toEqual(['Select a solution.']); // requires solution view to be set } updateSpace(wrapper, false, 'oblt'); @@ -274,7 +272,13 @@ describe('ManageSpacePage', () => { expect(wrapper.find('input[name="name"]')).toHaveLength(1); }); - expect(wrapper.find(EnabledFeatures)).toHaveLength(1); + // expect visible features table to exist after setting the Solution View to Classic + await waitFor(() => { + // switch to classic + updateSpace(wrapper, false, 'classic'); + // expect visible features table to exist again + expect(wrapper.find(EnabledFeatures)).toHaveLength(1); + }); }); it('hides feature visibility controls when not allowed', async () => { @@ -333,9 +337,6 @@ describe('ManageSpacePage', () => { await Promise.resolve(); wrapper.update(); - - // default for create space: expect visible features table to exist - expect(wrapper.find(EnabledFeatures)).toHaveLength(1); }); await waitFor(() => { @@ -353,147 +354,6 @@ describe('ManageSpacePage', () => { }); }); - it('allows a space to be updated', async () => { - const spaceToUpdate = { - id: 'existing-space', - name: 'Existing Space', - description: 'hey an existing space', - color: '#aabbcc', - initials: 'AB', - disabledFeatures: [], - solution: 'es', - }; - - const spacesManager = spacesManagerMock.create(); - spacesManager.getSpace = jest.fn().mockResolvedValue({ - ...spaceToUpdate, - }); - spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); - - const onLoadSpace = jest.fn(); - - const wrapper = mountWithIntl( - <CreateSpacePage - spaceId={'existing-space'} - spacesManager={spacesManager as unknown as SpacesManager} - onLoadSpace={onLoadSpace} - getFeatures={featuresStart.getFeatures} - notifications={notificationServiceMock.createStartContract()} - history={history} - capabilities={{ - navLinks: {}, - management: {}, - catalogue: {}, - spaces: { manage: true }, - }} - eventTracker={eventTracker} - allowFeatureVisibility - allowSolutionVisibility - /> - ); - - await waitFor(() => { - wrapper.update(); - expect(spacesManager.getSpace).toHaveBeenCalledWith('existing-space'); - }); - - expect(onLoadSpace).toHaveBeenCalledWith({ - ...spaceToUpdate, - }); - - await Promise.resolve(); - - wrapper.update(); - - updateSpace(wrapper, true, 'oblt'); - - await clickSaveButton(wrapper); - - expect(spacesManager.updateSpace).toHaveBeenCalledWith({ - id: 'existing-space', - name: 'New Space Name', - description: 'some description', - color: '#AABBCC', - initials: 'AB', - imageUrl: '', - disabledFeatures: ['feature-1'], - solution: 'oblt', // solution has been changed - }); - - expect(reportEvent).toHaveBeenCalledWith('space_solution_changed', { - action: 'edit', - solution: 'oblt', - solution_prev: 'es', - space_id: 'existing-space', - }); - }); - - it('sets calculated fields for existing spaces', async () => { - // The Spaces plugin provides functions to calculate the initials and color of a space if they have not been customized. The new space - // management page explicitly sets these fields when a new space is created, but it should also handle existing "legacy" spaces that do - // not already have these fields set. - const spaceToUpdate = { - id: 'existing-space', - name: 'Existing Space', - description: 'hey an existing space', - color: undefined, - initials: undefined, - imageUrl: undefined, - disabledFeatures: [], - }; - - const spacesManager = spacesManagerMock.create(); - spacesManager.getSpace = jest.fn().mockResolvedValue({ - ...spaceToUpdate, - }); - spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); - - const onLoadSpace = jest.fn(); - - const wrapper = mountWithIntl( - <CreateSpacePage - spaceId={'existing-space'} - spacesManager={spacesManager as unknown as SpacesManager} - onLoadSpace={onLoadSpace} - getFeatures={featuresStart.getFeatures} - notifications={notificationServiceMock.createStartContract()} - history={history} - capabilities={{ - navLinks: {}, - management: {}, - catalogue: {}, - spaces: { manage: true }, - }} - eventTracker={eventTracker} - allowFeatureVisibility - allowSolutionVisibility - /> - ); - - await waitFor(() => { - wrapper.update(); - expect(spacesManager.getSpace).toHaveBeenCalledWith('existing-space'); - }); - - expect(onLoadSpace).toHaveBeenCalledWith({ - ...spaceToUpdate, - }); - - await Promise.resolve(); - - wrapper.update(); - - // not changing anything, just clicking the "Update space" button - await clickSaveButton(wrapper); - - expect(spacesManager.updateSpace).toHaveBeenCalledWith({ - ...spaceToUpdate, - color: '#E7664C', - initials: 'ES', - imageUrl: '', - }); - }); - it('notifies when there is an error retrieving features', async () => { const spacesManager = spacesManagerMock.create(); spacesManager.createSpace = jest.fn(spacesManager.createSpace); @@ -528,119 +388,6 @@ describe('ManageSpacePage', () => { }); }); }); - - it('warns when updating features in the active space', async () => { - const spacesManager = spacesManagerMock.create(); - spacesManager.getSpace = jest.fn().mockResolvedValue({ - id: 'my-space', - name: 'Existing Space', - description: 'hey an existing space', - color: '#aabbcc', - initials: 'AB', - disabledFeatures: [], - }); - spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); - - const wrapper = mountWithIntl( - <CreateSpacePage - spaceId={'my-space'} - spacesManager={spacesManager as unknown as SpacesManager} - getFeatures={featuresStart.getFeatures} - notifications={notificationServiceMock.createStartContract()} - history={history} - capabilities={{ - navLinks: {}, - management: {}, - catalogue: {}, - spaces: { manage: true }, - }} - eventTracker={eventTracker} - allowFeatureVisibility - allowSolutionVisibility - /> - ); - - await waitFor(() => { - wrapper.update(); - expect(spacesManager.getSpace).toHaveBeenCalledWith('my-space'); - }); - - await Promise.resolve(); - - wrapper.update(); - - updateSpace(wrapper); - - await clickSaveButton(wrapper); - - const warningDialog = wrapper.find(ConfirmAlterActiveSpaceModal); - expect(warningDialog).toHaveLength(1); - - expect(spacesManager.updateSpace).toHaveBeenCalledTimes(0); - - const confirmButton = warningDialog - .find(EuiButton) - .find('[data-test-subj="confirmModalConfirmButton"]') - .find('button'); - - confirmButton.simulate('click'); - - await Promise.resolve(); - - wrapper.update(); - - expect(spacesManager.updateSpace).toHaveBeenCalledTimes(1); - }); - - it('does not warn when features are left alone in the active space', async () => { - const spacesManager = spacesManagerMock.create(); - spacesManager.getSpace = jest.fn().mockResolvedValue({ - id: 'my-space', - name: 'Existing Space', - description: 'hey an existing space', - color: '#aabbcc', - initials: 'AB', - disabledFeatures: [], - }); - spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); - - const wrapper = mountWithIntl( - <CreateSpacePage - spaceId={'my-space'} - spacesManager={spacesManager as unknown as SpacesManager} - getFeatures={featuresStart.getFeatures} - notifications={notificationServiceMock.createStartContract()} - history={history} - capabilities={{ - navLinks: {}, - management: {}, - catalogue: {}, - spaces: { manage: true }, - }} - eventTracker={eventTracker} - allowFeatureVisibility - allowSolutionVisibility - /> - ); - - await waitFor(() => { - wrapper.update(); - expect(spacesManager.getSpace).toHaveBeenCalledWith('my-space'); - }); - - await Promise.resolve(); - - wrapper.update(); - - updateSpace(wrapper, false); - - await clickSaveButton(wrapper); - - const warningDialog = wrapper.find(ConfirmAlterActiveSpaceModal); - expect(warningDialog).toHaveLength(0); - - expect(spacesManager.updateSpace).toHaveBeenCalledTimes(1); - }); }); function updateSpace( @@ -680,15 +427,6 @@ function toggleFeature(wrapper: ReactWrapper<any, any>) { wrapper.update(); } -async function clickSaveButton(wrapper: ReactWrapper<any, any>) { - const saveButton = wrapper.find('button[data-test-subj="save-space-button"]'); - saveButton.simulate('click'); - - await Promise.resolve(); - - wrapper.update(); -} - function capitalizeFirstLetter(string: string) { return string.charAt(0).toUpperCase() + string.slice(1); } diff --git a/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx b/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx index e8204a53fe345..31a5bf885e785 100644 --- a/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx +++ b/x-pack/plugins/spaces/public/management/create_space/create_space_page.tsx @@ -27,15 +27,15 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { Space } from '../../../common'; -import { isReservedSpace } from '../../../common'; +import { SOLUTION_VIEW_CLASSIC } from '../../../common/constants'; import type { EventTracker } from '../../analytics'; import { getSpacesFeatureDescription } from '../../constants'; import { getSpaceColor, getSpaceInitials } from '../../space_avatar'; import type { SpacesManager } from '../../spaces_manager'; import { UnauthorizedPrompt } from '../components'; import { ConfirmAlterActiveSpaceModal } from '../components/confirm_alter_active_space_modal'; +import { CustomizeAvatar } from '../components/customize_avatar'; import { CustomizeSpace } from '../components/customize_space'; -import { DeleteSpacesButton } from '../components/delete_spaces_button'; import { EnabledFeatures } from '../components/enabled_features'; import { SolutionView } from '../components/solution_view'; import { toSpaceIdentifier } from '../lib'; @@ -60,7 +60,6 @@ interface State { features: KibanaFeature[]; originalSpace?: Partial<Space>; showAlteringActiveSpaceDialog: boolean; - showVisibleFeaturesPicker: boolean; haveDisabledFeaturesChanged: boolean; hasSolutionViewChanged: boolean; isLoading: boolean; @@ -80,7 +79,6 @@ export class CreateSpacePage extends Component<Props, State> { this.state = { isLoading: true, showAlteringActiveSpaceDialog: false, - showVisibleFeaturesPicker: !!props.allowFeatureVisibility, saveInProgress: false, space: { color: getSpaceColor({}), @@ -185,12 +183,9 @@ export class CreateSpacePage extends Component<Props, State> { return ( <div data-test-subj="spaces-create-page"> <CustomizeSpace - title={i18n.translate('xpack.spaces.management.manageSpacePage.generalTitle', { - defaultMessage: 'General', - })} space={this.state.space} onChange={this.onSpaceChange} - editingExistingSpace={this.editingExistingSpace()} + editingExistingSpace={false} validator={this.validator} /> @@ -201,25 +196,30 @@ export class CreateSpacePage extends Component<Props, State> { space={this.state.space} onChange={this.onSolutionViewChange} validator={this.validator} - isEditing={this.editingExistingSpace()} - sectionTitle={i18n.translate( - 'xpack.spaces.management.manageSpacePage.navigationTitle', - { defaultMessage: 'Navigation' } - )} + isEditing={false} /> </> )} - {this.state.showVisibleFeaturesPicker && ( - <> - <EuiSpacer /> - <EnabledFeatures - space={this.state.space} - features={this.state.features} - onChange={this.onSpaceChange} - /> - </> - )} + {this.props.allowFeatureVisibility && + (!this.state.space.solution || this.state.space.solution === SOLUTION_VIEW_CLASSIC) && ( + <> + <EuiSpacer /> + <EnabledFeatures + space={this.state.space} + features={this.state.features} + onChange={this.onSpaceChange} + /> + </> + )} + + <EuiSpacer /> + + <CustomizeAvatar + space={this.state.space} + onChange={this.onSpaceChange} + validator={this.validator} + /> <EuiSpacer /> @@ -240,14 +240,6 @@ export class CreateSpacePage extends Component<Props, State> { }; public getTitle = () => { - if (this.editingExistingSpace()) { - return ( - <FormattedMessage - id="xpack.spaces.management.manageSpacePage.editSpaceTitle" - defaultMessage="Edit space" - /> - ); - } return ( <FormattedMessage id="xpack.spaces.management.manageSpacePage.createSpaceTitle" @@ -257,7 +249,6 @@ export class CreateSpacePage extends Component<Props, State> { }; public getChangeImpactWarning = () => { - if (!this.editingExistingSpace()) return null; const { haveDisabledFeaturesChanged, hasSolutionViewChanged } = this.state; if (!haveDisabledFeaturesChanged && !hasSolutionViewChanged) return null; @@ -289,13 +280,6 @@ export class CreateSpacePage extends Component<Props, State> { } ); - const updateSpaceText = i18n.translate( - 'xpack.spaces.management.manageSpacePage.updateSpaceButton', - { - defaultMessage: 'Update space', - } - ); - const cancelButtonText = i18n.translate( 'xpack.spaces.management.manageSpacePage.cancelSpaceButton', { @@ -303,8 +287,6 @@ export class CreateSpacePage extends Component<Props, State> { } ); - const saveText = this.editingExistingSpace() ? updateSpaceText : createSpaceText; - return ( <EuiFlexGroup responsive={false}> <EuiFlexItem grow={false}> @@ -314,7 +296,7 @@ export class CreateSpacePage extends Component<Props, State> { data-test-subj="save-space-button" isLoading={this.state.saveInProgress} > - {saveText} + {createSpaceText} </EuiButton> </EuiFlexItem> <EuiFlexItem grow={false}> @@ -323,37 +305,12 @@ export class CreateSpacePage extends Component<Props, State> { </EuiButtonEmpty> </EuiFlexItem> <EuiFlexItem grow={true} /> - {this.getActionButton()} </EuiFlexGroup> ); }; - public getActionButton = () => { - if (this.state.space && this.editingExistingSpace() && !isReservedSpace(this.state.space)) { - return ( - <EuiFlexItem grow={false}> - <DeleteSpacesButton - data-test-subj="delete-space-button" - space={this.state.space as Space} - spacesManager={this.props.spacesManager} - onDelete={this.backToSpacesList} - notifications={this.props.notifications} - /> - </EuiFlexItem> - ); - } - - return null; - }; - private onSolutionViewChange = (space: Partial<Space>) => { - if (this.props.allowFeatureVisibility) { - let showVisibleFeaturesPicker = false; - if (space.solution === 'classic' || space.solution == null) { - showVisibleFeaturesPicker = true; - } - this.setState((state) => ({ ...state, showVisibleFeaturesPicker })); - } + this.setState((state) => ({ ...state, solution: space.solution })); this.onSpaceChange(space); }; @@ -366,14 +323,8 @@ export class CreateSpacePage extends Component<Props, State> { public saveSpace = () => { this.validator.enableValidation(); - const originalSpace: Space = this.state.originalSpace as Space; const space: Space = this.state.space as Space; - const { haveDisabledFeaturesChanged, hasSolutionViewChanged } = this.state; - const result = this.validator.validateForSave( - space, - this.editingExistingSpace(), - this.props.allowSolutionVisibility - ); + const result = this.validator.validateForSave(space, false, this.props.allowSolutionVisibility); if (result.isInvalid) { this.setState({ formError: result, @@ -382,24 +333,7 @@ export class CreateSpacePage extends Component<Props, State> { return; } - if (this.editingExistingSpace()) { - const { spacesManager } = this.props; - - spacesManager.getActiveSpace().then((activeSpace) => { - const editingActiveSpace = activeSpace.id === originalSpace.id; - - if (editingActiveSpace && (haveDisabledFeaturesChanged || hasSolutionViewChanged)) { - this.setState({ - showAlteringActiveSpaceDialog: true, - }); - - return; - } - this.performSave(); - }); - } else { - this.performSave(); - } + this.performSave(); }; private loadSpace = async (spaceId: string, featuresPromise: Promise<KibanaFeature[]>) => { @@ -472,15 +406,8 @@ export class CreateSpacePage extends Component<Props, State> { solution, }; - let action; - const isEditing = this.editingExistingSpace(); const { spacesManager, eventTracker } = this.props; - - if (isEditing) { - action = spacesManager.updateSpace(params); - } else { - action = spacesManager.createSpace(params); - } + const action = spacesManager.createSpace(params); this.setState({ saveInProgress: true }); @@ -493,7 +420,7 @@ export class CreateSpacePage extends Component<Props, State> { spaceId: id, solution, solutionPrev: this.state.originalSpace?.solution, - action: isEditing ? 'edit' : 'create', + action: 'create', }); }; @@ -536,6 +463,4 @@ export class CreateSpacePage extends Component<Props, State> { }; private backToSpacesList = () => this.props.history.push('/'); - - private editingExistingSpace = () => !!this.props.spaceId; } diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx index cd2bd76a57928..825bc6977ad1c 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx @@ -201,8 +201,8 @@ export const EditSpace: FC<PageProps> = ({ <HeaderAvatar /> </EuiFlexItem> <EuiFlexItem grow={true}> - <EuiFlexGroup direction="column"> - <EuiFlexItem grow={true} al> + <EuiFlexGroup direction="column" gutterSize="none"> + <EuiFlexItem grow={true}> <EuiFlexGroup justifyContent="spaceBetween"> <EuiFlexItem grow={true}> <EuiTitle size="l"> diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx deleted file mode 100644 index f5bfbe79ec2d4..0000000000000 --- a/x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx +++ /dev/null @@ -1,77 +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 { EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; -import type { FC } from 'react'; -import React from 'react'; - -import type { KibanaFeature } from '@kbn/features-plugin/common'; -import { FormattedMessage } from '@kbn/i18n-react'; - -import { useEditSpaceServices } from './provider'; -import type { Space } from '../../../common'; -import { FeatureTable } from '../components/enabled_features/feature_table'; -import { SectionPanel } from '../components/section_panel'; - -interface Props { - space: Partial<Space>; - features: KibanaFeature[]; - onChange: (updatedSpace: Partial<Space>) => void; -} - -export const EditSpaceEnabledFeatures: FC<Props> = ({ features, space, onChange }) => { - const { capabilities, getUrlForApp } = useEditSpaceServices(); - const canManageRoles = capabilities.roles?.save === true; - - if (!features) { - return null; - } - - return ( - <SectionPanel dataTestSubj="enabled-features-panel"> - <EuiFlexGroup> - <EuiFlexItem> - <EuiTitle size="xs"> - <h3> - <FormattedMessage - id="xpack.spaces.management.editSpaceFeatures.featuresVisibility" - defaultMessage="Set features visibility" - /> - </h3> - </EuiTitle> - <EuiSpacer size="s" /> - <EuiText size="s" color="subdued"> - <p> - <FormattedMessage - id="xpack.spaces.management.editSpaceFeatures.notASecurityMechanismMessage" - defaultMessage="Hidden features are removed from the user interface, but not disabled. To secure access to features, {manageRolesLink}." - values={{ - manageRolesLink: canManageRoles ? ( - <EuiLink href={getUrlForApp('management', { path: '/security/roles' })}> - <FormattedMessage - id="xpack.spaces.management.editSpaceFeatures.manageRolesLinkText" - defaultMessage="manage security roles" - /> - </EuiLink> - ) : ( - <FormattedMessage - id="xpack.spaces.management.editSpaceFeatures.askAnAdministratorText" - defaultMessage="ask an administrator to manage roles" - /> - ), - }} - /> - </p> - </EuiText> - </EuiFlexItem> - <EuiFlexItem> - <FeatureTable features={features} space={space} onChange={onChange} /> - </EuiFlexItem> - </EuiFlexGroup> - </SectionPanel> - ); -}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx index 24269528916f8..cb82b5f800fbb 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx @@ -13,7 +13,6 @@ import type { KibanaFeature } from '@kbn/features-plugin/common'; import { i18n } from '@kbn/i18n'; import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt'; -import { EditSpaceEnabledFeatures } from './edit_space_features_tab'; import { EditSpaceTabFooter } from './footer'; import { useEditSpaceServices } from './provider'; import type { Space } from '../../../common'; @@ -21,7 +20,9 @@ import { SOLUTION_VIEW_CLASSIC } from '../../../common/constants'; import { getSpaceInitials } from '../../space_avatar'; import { ConfirmDeleteModal } from '../components'; import { ConfirmAlterActiveSpaceModal } from '../components/confirm_alter_active_space_modal'; +import { CustomizeAvatar } from '../components/customize_avatar'; import { CustomizeSpace } from '../components/customize_space'; +import { EnabledFeatures } from '../components/enabled_features'; import { SolutionView } from '../components/solution_view'; import { SpaceValidator } from '../lib'; import type { CustomizeSpaceFormValues } from '../types'; @@ -249,17 +250,15 @@ export const EditSpaceSettingsTab: React.FC<Props> = ({ space, features, history <EuiSpacer /> <EuiCallOut color="warning" - iconType="help" - title="Warning" - data-test-subj="space-edit-page-user-impact-warning" - > - {i18n.translate( + iconType="iInCircle" + title={i18n.translate( 'xpack.spaces.management.spaceDetails.spaceChangesWarning.impactAllUsersInSpace', { - defaultMessage: 'The changes made will impact all users in the space.', + defaultMessage: 'The changes will apply to all users of the space.', } )} - </EuiCallOut> + data-test-subj="space-edit-page-user-impact-warning" + /> </> ) ); @@ -289,10 +288,10 @@ export const EditSpaceSettingsTab: React.FC<Props> = ({ space, features, history </> )} - {props.allowFeatureVisibility && (solution == null || solution === SOLUTION_VIEW_CLASSIC) && ( + {props.allowFeatureVisibility && (!solution || solution === SOLUTION_VIEW_CLASSIC) && ( <> <EuiSpacer /> - <EditSpaceEnabledFeatures + <EnabledFeatures features={features} space={getSpaceFromFormValues(formValues)} onChange={onChangeFeatures} @@ -300,6 +299,14 @@ export const EditSpaceSettingsTab: React.FC<Props> = ({ space, features, history </> )} + <EuiSpacer /> + + <CustomizeAvatar + space={getSpaceFromFormValues(formValues)} + onChange={onChangeSpaceSettings} + validator={validator} + /> + {doShowUserImpactWarning()} <EuiSpacer /> diff --git a/x-pack/plugins/spaces/public/management/edit_space/footer.tsx b/x-pack/plugins/spaces/public/management/edit_space/footer.tsx index 013a356f9b400..b00494cbee51c 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/footer.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/footer.tsx @@ -31,57 +31,57 @@ export const EditSpaceTabFooter: React.FC<Props> = ({ onClickSubmit, onClickDeleteSpace, }) => { + if (isLoading) { + return ( + <EuiFlexGroup justifyContent="spaceAround"> + <EuiFlexItem grow={false}> + <EuiLoadingSpinner /> + </EuiFlexItem> + </EuiFlexGroup> + ); + } + return ( - <> - {isLoading && ( - <EuiFlexGroup justifyContent="spaceAround"> - <EuiFlexItem grow={false}> - <EuiLoadingSpinner /> - </EuiFlexItem> - </EuiFlexGroup> + <EuiFlexGroup> + {isDirty && ( + <EuiFlexItem grow={false}> + <EuiButton + color="primary" + fill + onClick={onClickSubmit} + data-test-subj="save-space-button" + > + <FormattedMessage + id="xpack.spaces.management.spaceDetails.footerActions.updateSpace" + defaultMessage="Apply changes" + /> + </EuiButton> + </EuiFlexItem> )} - {!isLoading && ( - <EuiFlexGroup> - <EuiFlexItem grow={false}> - <EuiButtonEmpty - onClick={onClickDeleteSpace} - color="danger" - data-test-subj="delete-space-button" - > - <FormattedMessage - id="xpack.spaces.management.spaceDetails.footerActions.deleteSpace" - defaultMessage="Delete space" - /> - </EuiButtonEmpty> - </EuiFlexItem> - <EuiFlexItem grow={true} /> - <EuiFlexItem grow={false}> - <EuiButtonEmpty onClick={onClickCancel} data-test-subj="cancel-space-button"> - <FormattedMessage - id="xpack.spaces.management.spaceDetails.footerActions.cancel" - defaultMessage="Cancel" - /> - </EuiButtonEmpty> - </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiButtonEmpty onClick={onClickCancel} data-test-subj="cancel-space-button"> + <FormattedMessage + id="xpack.spaces.management.spaceDetails.footerActions.cancel" + defaultMessage="Cancel" + /> + </EuiButtonEmpty> + </EuiFlexItem> + <EuiFlexItem grow={true} /> - {isDirty && ( - <EuiFlexItem grow={false}> - <EuiButton - color="primary" - fill - onClick={onClickSubmit} - data-test-subj="save-space-button" - > - <FormattedMessage - id="xpack.spaces.management.spaceDetails.footerActions.updateSpace" - defaultMessage="Update space" - /> - </EuiButton> - </EuiFlexItem> - )} - </EuiFlexGroup> - )} - </> + <EuiFlexItem grow={false}> + <EuiButtonEmpty + onClick={onClickDeleteSpace} + color="danger" + iconType="trash" + data-test-subj="delete-space-button" + > + <FormattedMessage + id="xpack.spaces.management.spaceDetails.footerActions.deleteSpace" + defaultMessage="Delete space" + /> + </EuiButtonEmpty> + </EuiFlexItem> + </EuiFlexGroup> ); }; diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx index 658730a848a33..276efb7f92526 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx @@ -354,7 +354,7 @@ export const PrivilegesRolesForm: FC<PrivilegesRolesFormProps> = (props) => { <EuiFormRow label={i18n.translate( 'xpack.spaces.management.spaceDetails.roles.selectRolesFormRowLabel', - { defaultMessage: 'Select roles(s)' } + { defaultMessage: 'Select roles' } )} labelAppend={ <EuiLink href={getUrlForApp('management', { deepLinkId: 'roles' })}> @@ -367,7 +367,8 @@ export const PrivilegesRolesForm: FC<PrivilegesRolesFormProps> = (props) => { helpText={i18n.translate( 'xpack.spaces.management.spaceDetails.roles.selectRolesHelp', { - defaultMessage: 'Select Kibana spaces to which you wish to assign privileges.', + defaultMessage: + 'Users assigned to selected roles will gain access to this space.', } )} > @@ -380,6 +381,10 @@ export const PrivilegesRolesForm: FC<PrivilegesRolesFormProps> = (props) => { values: { spaceName: space.name }, } )} + placeholder={i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.selectRolesPlaceholder', + { defaultMessage: 'Add a role...' } + )} isLoading={fetchingDataDeps} options={createRolesComboBoxOptions(spaceUnallocatedRoles)} selectedOptions={selectedRoles} diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx index 6a1d9f24bc042..ffe7ecba85ec0 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx @@ -78,6 +78,7 @@ const getTableColumns = ({ name: i18n.translate('xpack.spaces.management.spaceDetails.rolesTable.column.name.title', { defaultMessage: 'Role', }), + width: '45%', }, { field: 'privileges', @@ -118,25 +119,25 @@ const getTableColumns = ({ { defaultMessage: 'Role type' } ), render: (_value: Role['metadata']) => { - return React.createElement(EuiBadge, { - children: _value?._reserved - ? i18n.translate( + return _value?._reserved + ? React.createElement(EuiBadge, { + children: i18n.translate( 'xpack.spaces.management.spaceDetails.rolesTable.column.roleType.reserved', { defaultMessage: 'Reserved' } - ) - : i18n.translate( - 'xpack.spaces.management.spaceDetails.rolesTable.column.roleType.custom', - { defaultMessage: 'Custom' } ), - color: _value?._reserved ? undefined : 'success', - }); + color: 'primary', + }) + : null; }, }, ]; if (!isReadOnly) { columns.push({ - name: 'Actions', + name: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.columnHeaderName', + { defaultMessage: 'Actions' } + ), actions: [ { type: 'icon', @@ -163,22 +164,22 @@ const getTableColumns = ({ : i18n.translate( 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.notEditableDescription.isAssignedToAll', { - defaultMessage: `Can't perform actions on a role that is assigned to all spaces`, + defaultMessage: `You can't edit the access of a role that is assigned to all spaces.`, } ), - isPrimary: true, + showOnHover: true, enabled: () => false, available: (rowRecord) => !isEditableRole(rowRecord), }, { type: 'icon', icon: 'pencil', + isPrimary: true, 'data-test-subj': 'spaceRoleCellEditAction', name: i18n.translate( 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.edit.title', { defaultMessage: 'Remove from space' } ), - isPrimary: true, description: i18n.translate( 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.edit.description', { @@ -186,15 +187,14 @@ const getTableColumns = ({ 'Click this action to edit the role privileges of this user for this space.', } ), - showOnHover: true, available: (rowRecord) => isEditableRole(rowRecord), onClick: onClickRowEditAction, }, { - isPrimary: true, type: 'icon', icon: 'trash', color: 'danger', + isPrimary: true, 'data-test-subj': 'spaceRoleCellDeleteAction', name: i18n.translate( 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.remove.title', @@ -204,7 +204,6 @@ const getTableColumns = ({ 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.edit.description', { defaultMessage: 'Click this action to remove the user from this space.' } ), - showOnHover: true, available: (rowRecord) => isEditableRole(rowRecord), onClick: onClickRowRemoveAction, }, diff --git a/x-pack/plugins/spaces/public/management/lib/validate_space.ts b/x-pack/plugins/spaces/public/management/lib/validate_space.ts index 7a7980028dad0..89205cc91f2ef 100644 --- a/x-pack/plugins/spaces/public/management/lib/validate_space.ts +++ b/x-pack/plugins/spaces/public/management/lib/validate_space.ts @@ -181,7 +181,7 @@ export class SpaceValidator { if (!space.solution) { return invalid( i18n.translate('xpack.spaces.management.validateSpace.requiredSolutionViewErrorMessage', { - defaultMessage: 'Select one solution.', + defaultMessage: 'Select a solution.', }) ); } 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 091057a2f4a4c..c8707f8959f0c 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 @@ -95,7 +95,7 @@ describe('SpacesGridPage', () => { expect(wrapper.find('EuiInMemoryTable').prop('items')).toBe(spaces); expect(wrapper.find('EuiInMemoryTable').prop('columns')).not.toContainEqual({ field: 'solution', - name: 'Solution View', + name: 'Solution view', sortable: true, render: expect.any(Function), }); @@ -155,7 +155,7 @@ describe('SpacesGridPage', () => { expect(wrapper.find('EuiInMemoryTable').prop('items')).toBe(spacesWithSolution); expect(wrapper.find('EuiInMemoryTable').prop('columns')).toContainEqual({ field: 'solution', - name: 'Solution View', + name: 'Solution view', sortable: true, render: expect.any(Function), }); 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 5ac3ecf0ca687..462b65f327ebc 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 @@ -10,7 +10,7 @@ import { type EuiBasicTableColumn, EuiButton, EuiCallOut, - EuiFlexGroup, + EuiFlexGrid, EuiFlexItem, EuiInMemoryTable, EuiLink, @@ -19,6 +19,7 @@ import { EuiPageSection, EuiSpacer, EuiText, + useIsWithinBreakpoints, } from '@elastic/eui'; import React, { Component, lazy, Suspense } from 'react'; @@ -152,9 +153,7 @@ export class SpacesGridPage extends Component<Props, State> { box: { placeholder: i18n.translate( 'xpack.spaces.management.spacesGridPage.searchPlaceholder', - { - defaultMessage: 'Search', - } + { defaultMessage: 'Search' } ), }, }} @@ -281,28 +280,49 @@ export class SpacesGridPage extends Component<Props, State> { defaultMessage: 'Space', }), sortable: true, - render: (value: string, rowRecord: Space) => ( - <EuiFlexGroup responsive={false} alignItems="center" gutterSize="m"> - <EuiFlexItem grow={false}> - <EuiLink - {...reactRouterNavigate(this.props.history, this.getEditSpacePath(rowRecord))} - data-test-subj={`${rowRecord.id}-hyperlink`} + 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 ( + <EuiFlexGrid + responsive={false} + columns={gridColumns} + alignItems="center" + gutterSize="s" > - {value} - </EuiLink> - </EuiFlexItem> - {this.state.activeSpace?.id === rowRecord.id && ( - <EuiFlexItem grow={false}> - <EuiBadge color="primary" data-test-subj={`spacesListCurrentBadge-${rowRecord.id}`}> - {i18n.translate('xpack.spaces.management.spacesGridPage.currentSpaceMarkerText', { - defaultMessage: 'current', - })} - </EuiBadge> - </EuiFlexItem> - )} - </EuiFlexGroup> - ), + <EuiFlexItem> + <EuiLink + {...reactRouterNavigate(this.props.history, this.getEditSpacePath(rowRecord))} + data-test-subj={`${rowRecord.id}-hyperlink`} + > + {value} + </EuiLink> + </EuiFlexItem> + <EuiFlexItem> + {isCurrent && ( + <span> + <EuiBadge + color="primary" + data-test-subj={`spacesListCurrentBadge-${rowRecord.id}`} + > + {i18n.translate( + 'xpack.spaces.management.spacesGridPage.currentSpaceMarkerText', + { defaultMessage: 'current' } + )} + </EuiBadge> + </span> + )} + </EuiFlexItem> + </EuiFlexGrid> + ); + }; + + return <SpaceName />; + }, 'data-test-subj': 'spacesListTableRowNameCell', + width: '15%', }, { field: 'description', @@ -311,7 +331,7 @@ export class SpacesGridPage extends Component<Props, State> { }), sortable: true, truncateText: true, - width: '30%', + width: '45%', }, ]; @@ -331,7 +351,7 @@ export class SpacesGridPage extends Component<Props, State> { return ( <FormattedMessage id="xpack.spaces.management.spacesGridPage.allFeaturesEnabled" - defaultMessage="All features visible" + defaultMessage="All features" /> ); } @@ -377,7 +397,7 @@ export class SpacesGridPage extends Component<Props, State> { config.push({ field: 'solution', name: i18n.translate('xpack.spaces.management.spacesGridPage.solutionColumnName', { - defaultMessage: 'Solution View', + defaultMessage: 'Solution view', }), sortable: true, render: (solution: Space['solution'], record: Space) => ( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f993da6cd3985..06b9b42e4b8b9 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -42710,8 +42710,6 @@ "xpack.spaces.management.deselectAllFeaturesLink": "Tout masquer", "xpack.spaces.management.enabledFeatures.featureCategoryButtonLabel": "Touche bascule de catégorie", "xpack.spaces.management.enabledSpaceFeatures.enableFeaturesInSpaceMessage": "Définir la visibilité des fonctionnalités", - "xpack.spaces.management.enabledSpaceFeatures.manageRolesLinkText": "gérer les rôles de sécurité", - "xpack.spaces.management.enabledSpaceFeatures.notASecurityMechanismMessage": "Les fonctionnalités masquées sont supprimées de l'interface utilisateur, mais pas désactivées. Pour sécuriser l'accès aux fonctionnalités, {manageRolesLink}.", "xpack.spaces.management.featureAccordionSwitchLabel": "{enabledCount} fonctionnalités visibles / {featureCount}", "xpack.spaces.management.featureVisibilityTitle": "Visibilité des fonctionnalités", "xpack.spaces.management.hideAllFeaturesText": "Tout masquer", @@ -42723,15 +42721,11 @@ "xpack.spaces.management.manageSpacePage.createSpaceTitle": "Créer l'espace", "xpack.spaces.management.manageSpacePage.describeSpaceDescription": "Attribuez à votre espace un nom facile à retenir.", "xpack.spaces.management.manageSpacePage.describeSpaceTitle": "Décrire cet espace", - "xpack.spaces.management.manageSpacePage.editSpaceTitle": "Modifier l'espace", "xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "Erreur lors du chargement de l'espace : {message}", "xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "Erreur lors de l'enregistrement de l'espace : {message}", - "xpack.spaces.management.manageSpacePage.featuresTitle": "Fonctionnalités", - "xpack.spaces.management.manageSpacePage.generalTitle": "Général", "xpack.spaces.management.manageSpacePage.loadErrorTitle": "Erreur lors du chargement des fonctionnalités disponibles", "xpack.spaces.management.manageSpacePage.loadingMessage": "Chargement…", "xpack.spaces.management.manageSpacePage.nameFormRowLabel": "Nom", - "xpack.spaces.management.manageSpacePage.navigationTitle": "Navigation", "xpack.spaces.management.manageSpacePage.optionalLabel": "Facultatif", "xpack.spaces.management.manageSpacePage.setSolutionViewDescription": "Détermine la navigation que tous les utilisateurs verront pour cet espace. Chaque vue de solution contient des fonctionnalités de Outils d'analyse et de Gestion.", "xpack.spaces.management.manageSpacePage.setSolutionViewMessage": "Définir la vue de la solution", @@ -42742,7 +42736,6 @@ "xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "Description", "xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "La description s'affiche sur l'écran de sélection de l'espace.", "xpack.spaces.management.manageSpacePage.spaceSuccessfullySavedNotificationMessage": "L'espace {name} a été enregistré.", - "xpack.spaces.management.manageSpacePage.updateSpaceButton": "Mettre à jour l'espace", "xpack.spaces.management.navigation.solutionViewLabel": "Afficher la solution", "xpack.spaces.management.reversedSpaceBadge.reversedSpacesCanBePartiallyModifiedTooltip": "Les espaces réservés sont intégrés et ne peuvent être que partiellement modifiés.", "xpack.spaces.management.selectAllFeaturesLink": "Afficher tout", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 14b59b1f54b8b..f54abfcf29bb3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -42450,8 +42450,6 @@ "xpack.spaces.management.deselectAllFeaturesLink": "すべて非表示", "xpack.spaces.management.enabledFeatures.featureCategoryButtonLabel": "カテゴリ切り替え", "xpack.spaces.management.enabledSpaceFeatures.enableFeaturesInSpaceMessage": "機能の表示を設定", - "xpack.spaces.management.enabledSpaceFeatures.manageRolesLinkText": "セキュリティロールを管理", - "xpack.spaces.management.enabledSpaceFeatures.notASecurityMechanismMessage": "非表示の機能はユーザーインターフェイスから削除されますが、無効にされません。機能へのアクセスを保護するには、{manageRolesLink}してください。", "xpack.spaces.management.featureAccordionSwitchLabel": "{featureCount} 件中 {enabledCount} 件の機能を表示中", "xpack.spaces.management.featureVisibilityTitle": "機能の表示", "xpack.spaces.management.hideAllFeaturesText": "すべて非表示", @@ -42463,15 +42461,11 @@ "xpack.spaces.management.manageSpacePage.createSpaceTitle": "スペースを作成", "xpack.spaces.management.manageSpacePage.describeSpaceDescription": "スペースに覚えやすい名前を付けます。", "xpack.spaces.management.manageSpacePage.describeSpaceTitle": "このスペースを説明", - "xpack.spaces.management.manageSpacePage.editSpaceTitle": "スペースの編集", "xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "スペースの読み込み中にエラーが発生:{message}", "xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "スペースの保存中にエラーが発生:{message}", - "xpack.spaces.management.manageSpacePage.featuresTitle": "機能", - "xpack.spaces.management.manageSpacePage.generalTitle": "一般", "xpack.spaces.management.manageSpacePage.loadErrorTitle": "利用可能な機能の読み込みエラー", "xpack.spaces.management.manageSpacePage.loadingMessage": "読み込み中…", "xpack.spaces.management.manageSpacePage.nameFormRowLabel": "名前", - "xpack.spaces.management.manageSpacePage.navigationTitle": "ナビゲーション", "xpack.spaces.management.manageSpacePage.optionalLabel": "オプション", "xpack.spaces.management.manageSpacePage.setSolutionViewDescription": "すべてのユーザーにこのスペースで表示されるナビゲーションを決定します。各ソリューションビューには、分析ツールと管理の機能が含まれます。", "xpack.spaces.management.manageSpacePage.setSolutionViewMessage": "ソリューションビューを設定", @@ -42482,7 +42476,6 @@ "xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "説明", "xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "説明はスペース選択画面に表示されます。", "xpack.spaces.management.manageSpacePage.spaceSuccessfullySavedNotificationMessage": "スペース {name} が保存されました。", - "xpack.spaces.management.manageSpacePage.updateSpaceButton": "スペースを更新", "xpack.spaces.management.navigation.solutionViewLabel": "ソリューションビュー", "xpack.spaces.management.reversedSpaceBadge.reversedSpacesCanBePartiallyModifiedTooltip": "リザーブされたスペースはビルトインのため、部分的な変更しかできません。", "xpack.spaces.management.selectAllFeaturesLink": "すべて表示", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e55a9107d7c4d..7899d8a68f04c 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -42500,8 +42500,6 @@ "xpack.spaces.management.deselectAllFeaturesLink": "全部隐藏", "xpack.spaces.management.enabledFeatures.featureCategoryButtonLabel": "类别切换", "xpack.spaces.management.enabledSpaceFeatures.enableFeaturesInSpaceMessage": "设置功能可见性", - "xpack.spaces.management.enabledSpaceFeatures.manageRolesLinkText": "管理安全角色", - "xpack.spaces.management.enabledSpaceFeatures.notASecurityMechanismMessage": "将会从用户界面移除隐藏的功能,但不会禁用。要获取功能的访问权限,{manageRolesLink}。", "xpack.spaces.management.featureAccordionSwitchLabel": "{enabledCount}/{featureCount} 个功能可见", "xpack.spaces.management.featureVisibilityTitle": "功能可见性", "xpack.spaces.management.hideAllFeaturesText": "全部隐藏", @@ -42513,15 +42511,11 @@ "xpack.spaces.management.manageSpacePage.createSpaceTitle": "创建工作区", "xpack.spaces.management.manageSpacePage.describeSpaceDescription": "为您的工作区提供好记的名称。", "xpack.spaces.management.manageSpacePage.describeSpaceTitle": "描述此工作区", - "xpack.spaces.management.manageSpacePage.editSpaceTitle": "编辑工作区", "xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "加载空间时出错:{message}", "xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "保存空间时出错:{message}", - "xpack.spaces.management.manageSpacePage.featuresTitle": "功能", - "xpack.spaces.management.manageSpacePage.generalTitle": "常规", "xpack.spaces.management.manageSpacePage.loadErrorTitle": "加载可用功能时出错", "xpack.spaces.management.manageSpacePage.loadingMessage": "正在加载……", "xpack.spaces.management.manageSpacePage.nameFormRowLabel": "名称", - "xpack.spaces.management.manageSpacePage.navigationTitle": "导航", "xpack.spaces.management.manageSpacePage.optionalLabel": "可选", "xpack.spaces.management.manageSpacePage.setSolutionViewDescription": "确定所有用户将在此工作区看到的导航。每个解决方案视图均包含来自分析工具的功能和管理功能。", "xpack.spaces.management.manageSpacePage.setSolutionViewMessage": "设置解决方案视图", @@ -42532,7 +42526,6 @@ "xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "描述", "xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "描述显示在“工作区选择”屏幕上。", "xpack.spaces.management.manageSpacePage.spaceSuccessfullySavedNotificationMessage": "空间 “{name}” 已保存。", - "xpack.spaces.management.manageSpacePage.updateSpaceButton": "更新工作区", "xpack.spaces.management.navigation.solutionViewLabel": "解决方案视图", "xpack.spaces.management.reversedSpaceBadge.reversedSpacesCanBePartiallyModifiedTooltip": "保留的工作区是内置的,只能进行部分修改。", "xpack.spaces.management.selectAllFeaturesLink": "全部显示", From b5e941344f9a198f15da4dff5170fb82869ef527 Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Tue, 1 Oct 2024 12:28:57 -0700 Subject: [PATCH 082/107] [ResponseOps] Prepare the connector `delete` HTTP API for versioning (#194227) Towards https://github.com/elastic/response-ops-team/issues/125 ## Summary Preparing the `DELETE ${BASE_ACTION_API_PATH}/connector/{id}` HTTP API for versioning --- .../routes/connector/apis/delete/index.ts | 12 +++++++++ .../connector/apis/delete/schemas/latest.ts | 8 ++++++ .../connector/apis/delete/schemas/v1.ts | 16 ++++++++++++ .../connector/apis/delete/types/latest.ts | 8 ++++++ .../routes/connector/apis/delete/types/v1.ts | 11 ++++++++ .../{ => connector/delete}/delete.test.ts | 20 +++++++-------- .../routes/{ => connector/delete}/delete.ts | 25 ++++++++----------- .../server/routes/connector/delete/index.ts | 8 ++++++ x-pack/plugins/actions/server/routes/index.ts | 4 +-- 9 files changed, 86 insertions(+), 26 deletions(-) create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/delete/index.ts create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/latest.ts create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/v1.ts create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/delete/types/latest.ts create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/delete/types/v1.ts rename x-pack/plugins/actions/server/routes/{ => connector/delete}/delete.test.ts (83%) rename x-pack/plugins/actions/server/routes/{ => connector/delete}/delete.ts (67%) create mode 100644 x-pack/plugins/actions/server/routes/connector/delete/index.ts diff --git a/x-pack/plugins/actions/common/routes/connector/apis/delete/index.ts b/x-pack/plugins/actions/common/routes/connector/apis/delete/index.ts new file mode 100644 index 0000000000000..68b75d728e56a --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/delete/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { deleteConnectorRequestParamsSchema } from './schemas/latest'; +export type { DeleteConnectorRequestParams } from './types/latest'; + +export { deleteConnectorRequestParamsSchema as deleteConnectorRequestParamsSchemaV1 } from './schemas/v1'; +export type { DeleteConnectorRequestParams as DeleteConnectorRequestParamsV1 } from './types/v1'; diff --git a/x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/latest.ts b/x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/latest.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 './v1'; diff --git a/x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/v1.ts b/x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/v1.ts new file mode 100644 index 0000000000000..3847b188e85ed --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/delete/schemas/v1.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 { schema } from '@kbn/config-schema'; + +export const deleteConnectorRequestParamsSchema = schema.object({ + id: schema.string({ + meta: { + description: 'An identifier for the connector.', + }, + }), +}); diff --git a/x-pack/plugins/actions/common/routes/connector/apis/delete/types/latest.ts b/x-pack/plugins/actions/common/routes/connector/apis/delete/types/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/delete/types/latest.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 './v1'; diff --git a/x-pack/plugins/actions/common/routes/connector/apis/delete/types/v1.ts b/x-pack/plugins/actions/common/routes/connector/apis/delete/types/v1.ts new file mode 100644 index 0000000000000..bd713f5921f25 --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/delete/types/v1.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { TypeOf } from '@kbn/config-schema'; +import { deleteConnectorRequestParamsSchemaV1 } from '..'; + +export type DeleteConnectorRequestParams = TypeOf<typeof deleteConnectorRequestParamsSchemaV1>; diff --git a/x-pack/plugins/actions/server/routes/delete.test.ts b/x-pack/plugins/actions/server/routes/connector/delete/delete.test.ts similarity index 83% rename from x-pack/plugins/actions/server/routes/delete.test.ts rename to x-pack/plugins/actions/server/routes/connector/delete/delete.test.ts index b250e607738e6..9fb3f7f3a8ae5 100644 --- a/x-pack/plugins/actions/server/routes/delete.test.ts +++ b/x-pack/plugins/actions/server/routes/connector/delete/delete.test.ts @@ -5,14 +5,14 @@ * 2.0. */ -import { deleteActionRoute } from './delete'; +import { deleteConnectorRoute } from './delete'; import { httpServiceMock } from '@kbn/core/server/mocks'; -import { licenseStateMock } from '../lib/license_state.mock'; -import { mockHandlerArguments } from './legacy/_mock_handler_arguments'; -import { actionsClientMock } from '../mocks'; -import { verifyAccessAndContext } from './verify_access_and_context'; +import { licenseStateMock } from '../../../lib/license_state.mock'; +import { mockHandlerArguments } from '../../legacy/_mock_handler_arguments'; +import { actionsClientMock } from '../../../mocks'; +import { verifyAccessAndContext } from '../../verify_access_and_context'; -jest.mock('./verify_access_and_context', () => ({ +jest.mock('../../verify_access_and_context', () => ({ verifyAccessAndContext: jest.fn(), })); @@ -21,12 +21,12 @@ beforeEach(() => { (verifyAccessAndContext as jest.Mock).mockImplementation((license, handler) => handler); }); -describe('deleteActionRoute', () => { +describe('deleteConnectorRoute', () => { it('deletes an action with proper parameters', async () => { const licenseState = licenseStateMock.create(); const router = httpServiceMock.createRouter(); - deleteActionRoute(router, licenseState); + deleteConnectorRoute(router, licenseState); const [config, handler] = router.delete.mock.calls[0]; @@ -63,7 +63,7 @@ describe('deleteActionRoute', () => { const licenseState = licenseStateMock.create(); const router = httpServiceMock.createRouter(); - deleteActionRoute(router, licenseState); + deleteConnectorRoute(router, licenseState); const [, handler] = router.delete.mock.calls[0]; @@ -90,7 +90,7 @@ describe('deleteActionRoute', () => { throw new Error('OMG'); }); - deleteActionRoute(router, licenseState); + deleteConnectorRoute(router, licenseState); const [, handler] = router.delete.mock.calls[0]; diff --git a/x-pack/plugins/actions/server/routes/delete.ts b/x-pack/plugins/actions/server/routes/connector/delete/delete.ts similarity index 67% rename from x-pack/plugins/actions/server/routes/delete.ts rename to x-pack/plugins/actions/server/routes/connector/delete/delete.ts index 8b25fe66c9eb2..38f7c41d6037b 100644 --- a/x-pack/plugins/actions/server/routes/delete.ts +++ b/x-pack/plugins/actions/server/routes/connector/delete/delete.ts @@ -5,20 +5,17 @@ * 2.0. */ -import { schema } from '@kbn/config-schema'; import { IRouter } from '@kbn/core/server'; -import { ILicenseState } from '../lib'; -import { BASE_ACTION_API_PATH } from '../../common'; -import { ActionsRequestHandlerContext } from '../types'; -import { verifyAccessAndContext } from './verify_access_and_context'; +import { ILicenseState } from '../../../lib'; +import { BASE_ACTION_API_PATH } from '../../../../common'; +import { ActionsRequestHandlerContext } from '../../../types'; +import { verifyAccessAndContext } from '../../verify_access_and_context'; +import { + deleteConnectorRequestParamsSchemaV1, + DeleteConnectorRequestParamsV1, +} from '../../../../common/routes/connector/apis/delete'; -const paramSchema = schema.object({ - id: schema.string({ - meta: { description: 'An identifier for the connector.' }, - }), -}); - -export const deleteActionRoute = ( +export const deleteConnectorRoute = ( router: IRouter<ActionsRequestHandlerContext>, licenseState: ILicenseState ) => { @@ -33,7 +30,7 @@ export const deleteActionRoute = ( }, validate: { request: { - params: paramSchema, + params: deleteConnectorRequestParamsSchemaV1, }, response: { 204: { @@ -45,7 +42,7 @@ export const deleteActionRoute = ( router.handleLegacyErrors( verifyAccessAndContext(licenseState, async function (context, req, res) { const actionsClient = (await context.actions).getActionsClient(); - const { id } = req.params; + const { id }: DeleteConnectorRequestParamsV1 = req.params; await actionsClient.delete({ id }); return res.noContent(); }) diff --git a/x-pack/plugins/actions/server/routes/connector/delete/index.ts b/x-pack/plugins/actions/server/routes/connector/delete/index.ts new file mode 100644 index 0000000000000..7539eb498e837 --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/delete/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 { deleteConnectorRoute } from './delete'; diff --git a/x-pack/plugins/actions/server/routes/index.ts b/x-pack/plugins/actions/server/routes/index.ts index ca25b88bcf798..975eb662be415 100644 --- a/x-pack/plugins/actions/server/routes/index.ts +++ b/x-pack/plugins/actions/server/routes/index.ts @@ -14,7 +14,7 @@ import { listTypesWithSystemRoute } from './connector/list_types_system'; import { ILicenseState } from '../lib'; import { ActionsRequestHandlerContext } from '../types'; import { createActionRoute } from './create'; -import { deleteActionRoute } from './delete'; +import { deleteConnectorRoute } from './connector/delete'; import { executeActionRoute } from './execute'; import { getConnectorRoute } from './connector/get'; import { updateActionRoute } from './update'; @@ -37,7 +37,7 @@ export function defineRoutes(opts: RouteOptions) { defineLegacyRoutes(router, licenseState, usageCounter); createActionRoute(router, licenseState); - deleteActionRoute(router, licenseState); + deleteConnectorRoute(router, licenseState); getConnectorRoute(router, licenseState); getAllConnectorsRoute(router, licenseState); updateActionRoute(router, licenseState); From 121ff399672673844c5a92996c7a379894abeea8 Mon Sep 17 00:00:00 2001 From: Jen Huang <its.jenetic@gmail.com> Date: Tue, 1 Oct 2024 12:30:24 -0700 Subject: [PATCH 083/107] [UII] Add proxy args to install snippets (#193922) ## Summary Resolves #184222. This PR: - Ensures custom agent binary download source URI is respected where ever it appears in command snippets, for both Fleet Server and Elastic Agent install instructions - If a proxy is associated with the source URI, the appropriate args are added to the commands as well - For `curl` commands, these are appended as `--proxy <url>` and `--proxy-header "<key>-<value>"` (repeated for each header key/value pair) - For Windows, these are appended as `-Proxy "<url>"` and `-Headers @{"<key1>"="<value1>"; "<key2>"="<value2>"}` - Adjusts Fleet Server `./elastic-agent install` instructions so that: - `--fleet-server-es` is the value of the data output host set on that Fleet Server policy (must be ES output) - If a proxy is associated with that ES output, the corresponding args are appended: `--proxy-url=<url>` and `--proxy-header "<key>-<value>"` (repeated for each header key/value pair) The internal API at `/internal/fleet/settings/enrollment` has new properties added to its response to support this: ``` fleet_server: { es_output?: Output; es_output_proxy?: FleetProxy; }; download_source_proxy?: FleetProxy; ``` ## Examples **Fleet Server install with proxied custom download and proxied ES host:** ``` curl -L -O https://my-agent-binary-source/beats/elastic-agent/elastic-agent-9.0.0-linux-x86_64.tar.gz --proxy http://some-proxy:1111 --proxy-header "Accept-Language=en-US,en;q=0.5" --proxy-header "Accept-Encoding=gzip, deflate, br" tar xzvf elastic-agent-9.0.0-linux-x86_64.tar.gz cd elastic-agent-9.0.0-linux-x86_64 sudo ./elastic-agent install \ --fleet-server-es=http://localhost:9999 \ --fleet-server-service-token=REDACTED \ --fleet-server-policy=027a180f-2f4a-4dd1-a531-bf1d1d64179f \ --fleet-server-port=8220 \ --proxy-url=http://some-proxy:1111 \ --proxy-header="Accept-Language=en-US,en;q=0.5" \ --proxy-header="Accept-Encoding=gzip, deflate, br" ``` ``` $ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri https://my-agent-binary-source/beats/elastic-agent/elastic-agent-9.0.0-windows-x86_64.zip -OutFile elastic-agent-9.0.0-windows-x86_64.zip -Proxy "http://some-proxy:1111" -Headers @{"Accept-Language"="en-US,en;q=0.5";"Accept-Encoding"="gzip, deflate, br"} Expand-Archive .\elastic-agent-9.0.0-windows-x86_64.zip cd elastic-agent-9.0.0-windows-x86_64 .\elastic-agent.exe install ` --fleet-server-es=http://localhost:9999 ` --fleet-server-service-token=REDACTED ` --fleet-server-policy=027a180f-2f4a-4dd1-a531-bf1d1d64179f ` --fleet-server-port=8220 ` --proxy-url=http://some-proxy:1111 ` --proxy-header="Accept-Language=en-US,en;q=0.5" ` --proxy-header="Accept-Encoding=gzip, deflate, br" ``` **Elastic Agent install with proxied download source and proxied Fleet Server host:** ``` curl -L -O https://my-agent-binary-source/beats/elastic-agent/elastic-agent-8.15.1-darwin-aarch64.tar.gz --proxy http://some-proxy:1111 --proxy-header "Accept-Language=en-US,en;q=0.5" --proxy-header "Accept-Encoding=gzip, deflate, br" tar xzvf elastic-agent-8.15.1-darwin-aarch64.tar.gz cd elastic-agent-8.15.1-darwin-aarch64 sudo ./elastic-agent install --url=https://localhost:2222 --enrollment-token=REDACTED --proxy-url=http://some-proxy:1111 --proxy-header "Accept-Language=en-US,en;q=0.5" --proxy-header "Accept-Encoding=gzip, deflate, br" ``` ``` $ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri https://my-agent-binary-source/beats/elastic-agent/elastic-agent-8.15.1-windows-x86_64.zip -OutFile elastic-agent-8.15.1-windows-x86_64.zip -Proxy "http://some-proxy:1111" -Headers @{"Accept-Language"="en-US,en;q=0.5";"Accept-Encoding"="gzip, deflate, br"} Expand-Archive .\elastic-agent-8.15.1-windows-x86_64.zip -DestinationPath . cd elastic-agent-8.15.1-windows-x86_64 .\elastic-agent.exe install --url=https://localhost:2222 --enrollment-token=REDACTED --proxy-url=http://some-proxy:1111 --proxy-header "Accept-Language=en-US,en;q=0.5" --proxy-header "Accept-Encoding=gzip, deflate, br" ``` ### To-do - [x] Unit tests - [x] API integration tests for enrollment settings endpoint --- .../fleet_settings_enrollment_response.yaml | 12 + .../fleet/common/types/rest_spec/settings.ts | 13 +- .../steps/install_fleet_server.tsx | 33 +- .../utils/install_command_utils.test.ts | 695 +++++++++++++++--- .../utils/install_command_utils.ts | 86 ++- .../install_agent_standalone.tsx | 2 +- .../agent_enrollment_flyout/index.tsx | 10 +- .../steps/compute_steps.tsx | 12 +- .../agent_enrollment_flyout/types.ts | 1 + .../enrollment_instructions/manual/index.tsx | 57 +- .../standalone/index.tsx | 27 +- ...use_fleet_server_hosts_for_policy.test.tsx | 52 ++ .../use_fleet_server_hosts_for_policy.ts | 8 +- .../settings/enrollment_settings_handler.ts | 37 +- .../fleet/server/types/rest_spec/settings.ts | 28 +- .../apis/settings/enrollment.ts | 45 +- .../es_archives/fleet/fleet_server/data.json | 5 +- 17 files changed, 916 insertions(+), 207 deletions(-) diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_settings_enrollment_response.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_settings_enrollment_response.yaml index 5c9204e5f35a3..8de00dae5c9ea 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_settings_enrollment_response.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/fleet_settings_enrollment_response.yaml @@ -23,6 +23,12 @@ properties: type: string download_source_id: type: string + space_ids: + type: array + items: + type: string + data_output_id: + type: string required: - id - name @@ -33,10 +39,16 @@ properties: $ref: ./fleet_server_host.yaml host_proxy: $ref: ./proxies.yaml + es_output: + $ref: ./output_create_request_elasticsearch.yaml + es_output_proxy: + $ref: ./proxies.yaml required: - agent_policies - has_active download_source: $ref: ./download_sources.yaml + download_source_proxy: + $ref: ./proxies.yaml required: - fleet_server diff --git a/x-pack/plugins/fleet/common/types/rest_spec/settings.ts b/x-pack/plugins/fleet/common/types/rest_spec/settings.ts index 6961a0254562f..c281b79b4d50c 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/settings.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/settings.ts @@ -5,7 +5,14 @@ * 2.0. */ -import type { Settings, AgentPolicy, FleetServerHost, FleetProxy, DownloadSource } from '../models'; +import type { + Settings, + AgentPolicy, + FleetServerHost, + FleetProxy, + DownloadSource, + Output, +} from '../models'; export interface GetSettingsResponse { item: Settings; @@ -35,16 +42,20 @@ export type EnrollmentSettingsFleetServerPolicy = Pick< | 'fleet_server_host_id' | 'download_source_id' | 'space_ids' + | 'data_output_id' >; export interface GetEnrollmentSettingsResponse { fleet_server: { policies: EnrollmentSettingsFleetServerPolicy[]; has_active: boolean; + es_output?: Output; + es_output_proxy?: FleetProxy; host?: FleetServerHost; host_proxy?: FleetProxy; }; download_source?: DownloadSource; + download_source_proxy?: FleetProxy; } export interface PutSpaceSettingsRequest { body: { diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/install_fleet_server.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/install_fleet_server.tsx index 97edbd849e0ae..a7631deb88b80 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/install_fleet_server.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/install_fleet_server.tsx @@ -13,8 +13,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { PLATFORM_TYPE } from '../../../hooks'; -import { useDefaultDownloadSource } from '../../../hooks'; -import { useStartServices, useDefaultOutput, useKibanaVersion } from '../../../hooks'; +import { useFleetServerHostsForPolicy } from '../../../hooks'; +import { useStartServices, useKibanaVersion } from '../../../hooks'; import { PlatformSelector } from '../..'; @@ -61,24 +61,31 @@ const InstallFleetServerStepContent: React.FunctionComponent<{ }> = ({ serviceToken, fleetServerHost, fleetServerPolicyId, deploymentMode }) => { const { docLinks } = useStartServices(); const kibanaVersion = useKibanaVersion(); - const { output } = useDefaultOutput(); - const { downloadSource } = useDefaultDownloadSource(); - const commandOutput = output?.type === 'elasticsearch' ? output : undefined; + const { esOutput, esOutputProxy, downloadSource, downloadSourceProxy } = + useFleetServerHostsForPolicy( + fleetServerPolicyId + ? { + id: fleetServerPolicyId, + } + : null + ); const installCommands = (['linux', 'mac', 'windows', 'deb', 'rpm'] as PLATFORM_TYPE[]).reduce( (acc, platform) => { - acc[platform] = getInstallCommandForPlatform( + acc[platform] = getInstallCommandForPlatform({ platform, - commandOutput?.hosts?.[0] ?? '<ELASTICSEARCH_HOST>', - serviceToken ?? '', - fleetServerPolicyId, + esOutputHost: esOutput?.hosts?.[0] ?? '<ELASTICSEARCH_HOST>', + esOutputProxy, + serviceToken: serviceToken ?? '', + policyId: fleetServerPolicyId, fleetServerHost, - deploymentMode === 'production', - commandOutput?.ca_trusted_fingerprint ?? undefined, + isProductionDeployment: deploymentMode === 'production', + sslCATrustedFingerprint: esOutput?.ca_trusted_fingerprint ?? undefined, kibanaVersion, - downloadSource - ); + downloadSource, + downloadSourceProxy, + }); return acc; }, diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.test.ts b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.test.ts index 21a2cc53257f7..c86811da2fde7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.test.ts @@ -10,11 +10,11 @@ import { getInstallCommandForPlatform } from './install_command_utils'; describe('getInstallCommandForPlatform', () => { describe('without policy id', () => { it('should return the correct command if the the policyId is not set for linux', () => { - const res = getInstallCommandForPlatform( - 'linux', - 'http://elasticsearch:9200', - 'service-token-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz @@ -28,11 +28,11 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is not set for mac', () => { - const res = getInstallCommandForPlatform( - 'mac', - 'http://elasticsearch:9200', - 'service-token-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'mac', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--darwin-aarch64.tar.gz @@ -46,11 +46,11 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is not set for windows', () => { - const res = getInstallCommandForPlatform( - 'windows', - 'http://elasticsearch:9200', - 'service-token-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'windows', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + }); expect(res).toMatchInlineSnapshot(` "$ProgressPreference = 'SilentlyContinue' @@ -65,11 +65,11 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is not set for rpm', () => { - const res = getInstallCommandForPlatform( - 'rpm', - 'http://elasticsearch:9200', - 'service-token-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'rpm', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--x86_64.rpm @@ -84,11 +84,11 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is not set for deb', () => { - const res = getInstallCommandForPlatform( - 'deb', - 'http://elasticsearch:9200', - 'service-token-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'deb', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--amd64.deb @@ -103,15 +103,12 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command sslCATrustedFingerprint option is passed', () => { - const res = getInstallCommandForPlatform( - 'linux', - 'http://elasticsearch:9200', - 'service-token-1', - undefined, - undefined, - false, - 'fingerprint123456' - ); + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + sslCATrustedFingerprint: 'fingerprint123456', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz @@ -128,12 +125,12 @@ describe('getInstallCommandForPlatform', () => { describe('with policy id', () => { it('should return the correct command if the the policyId is set for linux', () => { - const res = getInstallCommandForPlatform( - 'linux', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz @@ -148,12 +145,12 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for mac', () => { - const res = getInstallCommandForPlatform( - 'mac', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'mac', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--darwin-aarch64.tar.gz @@ -168,12 +165,12 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for windows', () => { - const res = getInstallCommandForPlatform( - 'windows', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'windows', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + }); expect(res).toMatchInlineSnapshot(` "$ProgressPreference = 'SilentlyContinue' @@ -189,12 +186,12 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for rpm', () => { - const res = getInstallCommandForPlatform( - 'rpm', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'rpm', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--x86_64.rpm @@ -210,12 +207,12 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for deb', () => { - const res = getInstallCommandForPlatform( - 'deb', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); + const res = getInstallCommandForPlatform({ + platform: 'deb', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--amd64.deb @@ -233,22 +230,18 @@ describe('getInstallCommandForPlatform', () => { describe('with policy id and downloadSource', () => { it('should return the correct command if the the policyId is set for linux', () => { - const res = getInstallCommandForPlatform( - 'linux', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1', - undefined, - undefined, - undefined, - undefined, - { + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + downloadSource: { id: 'test', name: 'test', is_default: false, host: 'https://test.fr/8.12.0-test/', - } - ); + }, + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://test.fr/8.12.0-test/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz @@ -265,14 +258,14 @@ describe('getInstallCommandForPlatform', () => { describe('with policy id and fleet server host and production deployment', () => { it('should return the correct command if the the policyId is set for linux', () => { - const res = getInstallCommandForPlatform( - 'linux', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1', - 'http://fleetserver:8220', - true - ); + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + isProductionDeployment: true, + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz @@ -291,14 +284,14 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for mac', () => { - const res = getInstallCommandForPlatform( - 'mac', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1', - 'http://fleetserver:8220', - true - ); + const res = getInstallCommandForPlatform({ + platform: 'mac', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + isProductionDeployment: true, + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--darwin-aarch64.tar.gz @@ -317,14 +310,14 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for windows', () => { - const res = getInstallCommandForPlatform( - 'windows', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1', - 'http://fleetserver:8220', - true - ); + const res = getInstallCommandForPlatform({ + platform: 'windows', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + isProductionDeployment: true, + }); expect(res).toMatchInlineSnapshot(` "$ProgressPreference = 'SilentlyContinue' @@ -344,14 +337,14 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for rpm', () => { - const res = getInstallCommandForPlatform( - 'rpm', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1', - 'http://fleetserver:8220', - true - ); + const res = getInstallCommandForPlatform({ + platform: 'rpm', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + isProductionDeployment: true, + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--x86_64.rpm @@ -371,14 +364,14 @@ describe('getInstallCommandForPlatform', () => { }); it('should return the correct command if the the policyId is set for deb', () => { - const res = getInstallCommandForPlatform( - 'deb', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1', - 'http://fleetserver:8220', - true - ); + const res = getInstallCommandForPlatform({ + platform: 'deb', + esOutputHost: 'http://elasticsearch:9200', + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + isProductionDeployment: true, + }); expect(res).toMatchInlineSnapshot(` "curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent--amd64.deb @@ -397,4 +390,474 @@ describe('getInstallCommandForPlatform', () => { `); }); }); + + describe('with simple proxy settings', () => { + it('should return the correct command if proxies are set for linux', () => { + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz --proxy http://download-src-proxy:2222 + tar xzvf elastic-agent--linux-x86_64.tar.gz + cd elastic-agent--linux-x86_64 + sudo ./elastic-agent install \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111" + `); + }); + + it('should return the correct command if proxies are set for mac', () => { + const res = getInstallCommandForPlatform({ + platform: 'mac', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--darwin-aarch64.tar.gz --proxy http://download-src-proxy:2222 + tar xzvf elastic-agent--darwin-aarch64.tar.gz + cd elastic-agent--darwin-aarch64 + sudo ./elastic-agent install \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111" + `); + }); + + it('should return the correct command if proxies are set for windows', () => { + const res = getInstallCommandForPlatform({ + platform: 'windows', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "$ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -Uri https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--windows-x86_64.zip -OutFile elastic-agent--windows-x86_64.zip -Proxy \\"http://download-src-proxy:2222\\" + Expand-Archive .\\\\elastic-agent--windows-x86_64.zip + cd elastic-agent--windows-x86_64 + .\\\\elastic-agent.exe install \` + --fleet-server-es=http://elasticsearch:9200 \` + --fleet-server-service-token=service-token-1 \` + --fleet-server-policy=policy-1 \` + --fleet-server-port=8220 \` + --proxy-url=http://es-proxy:1111" + `); + }); + + it('should return the correct command if proxies are set for rpm', () => { + const res = getInstallCommandForPlatform({ + platform: 'rpm', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--x86_64.rpm --proxy http://download-src-proxy:2222 + sudo rpm -vi elastic-agent--x86_64.rpm + sudo elastic-agent enroll \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111 + sudo systemctl enable elastic-agent + sudo systemctl start elastic-agent" + `); + }); + + it('should return the correct command if proxies are set for deb', () => { + const res = getInstallCommandForPlatform({ + platform: 'deb', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--amd64.deb --proxy http://download-src-proxy:2222 + sudo dpkg -i elastic-agent--amd64.deb + sudo elastic-agent enroll \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111 + sudo systemctl enable elastic-agent + sudo systemctl start elastic-agent" + `); + }); + }); + + describe('with full proxy settings', () => { + it('should return the correct command if proxies are set for linux', () => { + const res = getInstallCommandForPlatform({ + platform: 'linux', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + proxy_headers: { + 'X-Forwarded-For': 'forwarded-value', + 'test-header': 'test-value', + }, + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + proxy_headers: { + 'Accept-Language': 'en-US,en;q=0.5', + 'second-header': 'second-value', + }, + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--linux-x86_64.tar.gz --proxy http://download-src-proxy:2222 --proxy-header \\"Accept-Language=en-US,en;q=0.5\\" --proxy-header \\"second-header=second-value\\" + tar xzvf elastic-agent--linux-x86_64.tar.gz + cd elastic-agent--linux-x86_64 + sudo ./elastic-agent install \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111 \\\\ + --proxy-header=\\"X-Forwarded-For=forwarded-value\\" \\\\ + --proxy-header=\\"test-header=test-value\\"" + `); + }); + + it('should return the correct command if proxies are set for mac', () => { + const res = getInstallCommandForPlatform({ + platform: 'mac', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + proxy_headers: { + 'X-Forwarded-For': 'forwarded-value', + 'test-header': 'test-value', + }, + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + proxy_headers: { + 'Accept-Language': 'en-US,en;q=0.5', + 'second-header': 'second-value', + }, + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--darwin-aarch64.tar.gz --proxy http://download-src-proxy:2222 --proxy-header \\"Accept-Language=en-US,en;q=0.5\\" --proxy-header \\"second-header=second-value\\" + tar xzvf elastic-agent--darwin-aarch64.tar.gz + cd elastic-agent--darwin-aarch64 + sudo ./elastic-agent install \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111 \\\\ + --proxy-header=\\"X-Forwarded-For=forwarded-value\\" \\\\ + --proxy-header=\\"test-header=test-value\\"" + `); + }); + + it('should return the correct command if proxies are set for windows', () => { + const res = getInstallCommandForPlatform({ + platform: 'windows', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + proxy_headers: { + 'X-Forwarded-For': 'forwarded-value', + 'test-header': 'test-value', + }, + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + proxy_headers: { + 'Accept-Language': 'en-US,en;q=0.5', + 'second-header': 'second-value', + }, + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "$ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -Uri https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--windows-x86_64.zip -OutFile elastic-agent--windows-x86_64.zip -Proxy \\"http://download-src-proxy:2222\\" -Headers @{\\"Accept-Language\\"=\\"en-US,en;q=0.5\\"; \\"second-header\\"=\\"second-value\\"} + Expand-Archive .\\\\elastic-agent--windows-x86_64.zip + cd elastic-agent--windows-x86_64 + .\\\\elastic-agent.exe install \` + --fleet-server-es=http://elasticsearch:9200 \` + --fleet-server-service-token=service-token-1 \` + --fleet-server-policy=policy-1 \` + --fleet-server-port=8220 \` + --proxy-url=http://es-proxy:1111 \` + --proxy-header=\\"X-Forwarded-For=forwarded-value\\" \` + --proxy-header=\\"test-header=test-value\\"" + `); + }); + + it('should return the correct command if proxies are set for rpm', () => { + const res = getInstallCommandForPlatform({ + platform: 'rpm', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + proxy_headers: { + 'X-Forwarded-For': 'forwarded-value', + 'test-header': 'test-value', + }, + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + proxy_headers: { + 'Accept-Language': 'en-US,en;q=0.5', + 'second-header': 'second-value', + }, + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--x86_64.rpm --proxy http://download-src-proxy:2222 --proxy-header \\"Accept-Language=en-US,en;q=0.5\\" --proxy-header \\"second-header=second-value\\" + sudo rpm -vi elastic-agent--x86_64.rpm + sudo elastic-agent enroll \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111 \\\\ + --proxy-header=\\"X-Forwarded-For=forwarded-value\\" \\\\ + --proxy-header=\\"test-header=test-value\\" + sudo systemctl enable elastic-agent + sudo systemctl start elastic-agent" + `); + }); + + it('should return the correct command if proxies are set for deb', () => { + const res = getInstallCommandForPlatform({ + platform: 'deb', + esOutputHost: 'http://elasticsearch:9200', + esOutputProxy: { + id: 'es-proxy', + name: 'es-proxy', + url: 'http://es-proxy:1111', + proxy_headers: { + 'X-Forwarded-For': 'forwarded-value', + 'test-header': 'test-value', + }, + is_preconfigured: false, + }, + serviceToken: 'service-token-1', + policyId: 'policy-1', + fleetServerHost: 'http://fleetserver:8220', + downloadSource: { + id: 'download-src', + name: 'download-src', + host: 'https://download-src/8.12.0-test/', + is_default: false, + proxy_id: 'download-proxy', + }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'http://download-src-proxy:2222', + proxy_headers: { + 'Accept-Language': 'en-US,en;q=0.5', + 'second-header': 'second-value', + }, + is_preconfigured: false, + }, + }); + + expect(res).toMatchInlineSnapshot(` + "curl -L -O https://download-src/8.12.0-test/beats/elastic-agent/elastic-agent--amd64.deb --proxy http://download-src-proxy:2222 --proxy-header \\"Accept-Language=en-US,en;q=0.5\\" --proxy-header \\"second-header=second-value\\" + sudo dpkg -i elastic-agent--amd64.deb + sudo elastic-agent enroll \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --fleet-server-port=8220 \\\\ + --proxy-url=http://es-proxy:1111 \\\\ + --proxy-header=\\"X-Forwarded-For=forwarded-value\\" \\\\ + --proxy-header=\\"test-header=test-value\\" + sudo systemctl enable elastic-agent + sudo systemctl start elastic-agent" + `); + }); + }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.ts b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.ts index 79809b94470e4..5656e49de4bc9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/utils/install_command_utils.ts @@ -5,7 +5,11 @@ * 2.0. */ -import type { DownloadSource } from '../../../../../../common/types'; +import type { DownloadSource, FleetProxy } from '../../../../../../common/types'; +import { + getDownloadBaseUrl, + getDownloadSourceProxyArgs, +} from '../../../../../components/enrollment_instructions/manual'; import type { PLATFORM_TYPE } from '../../../hooks'; export type CommandsByPlatform = { @@ -15,27 +19,31 @@ export type CommandsByPlatform = { function getArtifact( platform: PLATFORM_TYPE, kibanaVersion: string, - downloadSource?: DownloadSource + downloadSource?: DownloadSource, + downloadSourceProxy?: FleetProxy ) { - const ARTIFACT_BASE_URL = `${ - downloadSource - ? downloadSource.host.endsWith('/') - ? downloadSource.host.substring(0, downloadSource.host.length - 1) - : downloadSource.host - : 'https://artifacts.elastic.co/downloads' - }/beats/elastic-agent`; + const ARTIFACT_BASE_URL = `${getDownloadBaseUrl(downloadSource)}/beats/elastic-agent`; + const { windows: windowsDownloadSourceProxyArgs, curl: curlDownloadSourceProxyArgs } = + getDownloadSourceProxyArgs(downloadSourceProxy); + + const appendWindowsDownloadSourceProxyArgs = windowsDownloadSourceProxyArgs + ? ` ${windowsDownloadSourceProxyArgs}` + : ''; + const appendCurlDownloadSourceProxyArgs = curlDownloadSourceProxyArgs + ? ` ${curlDownloadSourceProxyArgs}` + : ''; const artifactMap: Record<PLATFORM_TYPE, { downloadCommand: string }> = { linux: { downloadCommand: [ - `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz`, + `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz${appendCurlDownloadSourceProxyArgs}`, `tar xzvf elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz`, `cd elastic-agent-${kibanaVersion}-linux-x86_64`, ].join(`\n`), }, mac: { downloadCommand: [ - `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-darwin-aarch64.tar.gz`, + `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-darwin-aarch64.tar.gz${appendCurlDownloadSourceProxyArgs}`, `tar xzvf elastic-agent-${kibanaVersion}-darwin-aarch64.tar.gz`, `cd elastic-agent-${kibanaVersion}-darwin-aarch64`, ].join(`\n`), @@ -43,20 +51,20 @@ function getArtifact( windows: { downloadCommand: [ `$ProgressPreference = 'SilentlyContinue'`, - `Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-windows-x86_64.zip -OutFile elastic-agent-${kibanaVersion}-windows-x86_64.zip`, + `Invoke-WebRequest -Uri ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-windows-x86_64.zip -OutFile elastic-agent-${kibanaVersion}-windows-x86_64.zip${appendWindowsDownloadSourceProxyArgs}`, `Expand-Archive .\\elastic-agent-${kibanaVersion}-windows-x86_64.zip`, `cd elastic-agent-${kibanaVersion}-windows-x86_64`, ].join(`\n`), }, deb: { downloadCommand: [ - `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-amd64.deb`, + `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-amd64.deb${appendCurlDownloadSourceProxyArgs}`, `sudo dpkg -i elastic-agent-${kibanaVersion}-amd64.deb`, ].join(`\n`), }, rpm: { downloadCommand: [ - `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-x86_64.rpm`, + `curl -L -O ${ARTIFACT_BASE_URL}/elastic-agent-${kibanaVersion}-x86_64.rpm${appendCurlDownloadSourceProxyArgs}`, `sudo rpm -vi elastic-agent-${kibanaVersion}-x86_64.rpm`, ].join(`\n`), }, @@ -68,20 +76,34 @@ function getArtifact( return artifactMap[platform]; } -export function getInstallCommandForPlatform( - platform: PLATFORM_TYPE, - esHost: string, - serviceToken: string, - policyId?: string, - fleetServerHost?: string, - isProductionDeployment?: boolean, - sslCATrustedFingerprint?: string, - kibanaVersion?: string, - downloadSource?: DownloadSource -): string { +export function getInstallCommandForPlatform({ + platform, + esOutputHost, + esOutputProxy, + serviceToken, + policyId, + fleetServerHost, + isProductionDeployment, + sslCATrustedFingerprint, + kibanaVersion, + downloadSource, + downloadSourceProxy, +}: { + platform: PLATFORM_TYPE; + esOutputHost: string; + esOutputProxy?: FleetProxy | undefined; + serviceToken: string; + policyId?: string; + fleetServerHost?: string; + isProductionDeployment?: boolean; + sslCATrustedFingerprint?: string; + kibanaVersion?: string; + downloadSource?: DownloadSource; + downloadSourceProxy?: FleetProxy; +}): string { const newLineSeparator = platform === 'windows' ? '`\n' : '\\\n'; - const artifact = getArtifact(platform, kibanaVersion ?? '', downloadSource); + const artifact = getArtifact(platform, kibanaVersion ?? '', downloadSource, downloadSourceProxy); const commandArguments = []; @@ -89,7 +111,7 @@ export function getInstallCommandForPlatform( commandArguments.push(['url', fleetServerHost]); } - commandArguments.push(['fleet-server-es', esHost]); + commandArguments.push(['fleet-server-es', esOutputHost]); commandArguments.push(['fleet-server-service-token', serviceToken]); if (policyId) { commandArguments.push(['fleet-server-policy', policyId]); @@ -110,7 +132,15 @@ export function getInstallCommandForPlatform( commandArguments.push(['fleet-server-port', '8220']); - const commandArgumentsStr = commandArguments + const enrollmentProxyArgs = []; + if (esOutputProxy) { + enrollmentProxyArgs.push(['proxy-url', esOutputProxy.url]); + Object.entries(esOutputProxy.proxy_headers || []).forEach(([key, value]) => { + enrollmentProxyArgs.push(['proxy-header', `"${key}=${value}"`]); + }); + } + + const commandArgumentsStr = [...commandArguments, ...enrollmentProxyArgs] .reduce((acc, [key, val]) => { if (acc === '' && key === 'url') { return `--${key}=${val}`; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx index 0b9a6f6e85830..2802ac1319b15 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_standalone.tsx @@ -52,7 +52,7 @@ export const InstallElasticAgentStandalonePageStep: React.FC<InstallAgentPagePro ); } - const installManagedCommands = StandaloneInstructions(kibanaVersion); + const installManagedCommands = StandaloneInstructions({ agentVersion: kibanaVersion }); const steps = [ ConfigureStandaloneAgentStep({ diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx index 1b4e6565efc01..5ccdf37951703 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx @@ -77,8 +77,13 @@ export const AgentEnrollmentFlyout: React.FunctionComponent<FlyOutProps> = ({ const { agentPolicyWithPackagePolicies } = useAgentPolicyWithPackagePolicies(selectedPolicyId); - const { fleetServerHost, fleetProxy, downloadSource, isLoadingInitialRequest } = - useFleetServerHostsForPolicy(agentPolicyWithPackagePolicies); + const { + fleetServerHost, + fleetProxy, + downloadSource, + isLoadingInitialRequest, + downloadSourceProxy, + } = useFleetServerHostsForPolicy(agentPolicyWithPackagePolicies); const selectedPolicy = agentPolicyWithPackagePolicies ? agentPolicyWithPackagePolicies @@ -196,6 +201,7 @@ export const AgentEnrollmentFlyout: React.FunctionComponent<FlyOutProps> = ({ fleetServerHost={fleetServerHost} fleetProxy={fleetProxy} downloadSource={downloadSource} + downloadSourceProxy={downloadSourceProxy} setSelectedPolicyId={setSelectedPolicyId} agentPolicy={agentPolicy} selectedPolicy={selectedPolicy} diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx index ea31b163fb368..660aafa339b47 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx @@ -53,6 +53,8 @@ export const StandaloneSteps: React.FunctionComponent<InstructionProps> = ({ setSelectedAPIKeyId, isK8s, cloudSecurityIntegration, + downloadSource, + downloadSourceProxy, }) => { const { yaml, onCreateApiKey, isCreatingApiKey, apiKey, downloadYaml } = useFetchFullPolicy( selectedPolicy, @@ -62,7 +64,11 @@ export const StandaloneSteps: React.FunctionComponent<InstructionProps> = ({ const agentVersion = useAgentVersion(); const instructionsSteps = useMemo(() => { - const standaloneInstallCommands = StandaloneInstructions(agentVersion || ''); + const standaloneInstallCommands = StandaloneInstructions({ + agentVersion: agentVersion || '', + downloadSource, + downloadSourceProxy, + }); const steps: EuiContainedStepProps[] = !agentPolicy ? [ @@ -107,6 +113,8 @@ export const StandaloneSteps: React.FunctionComponent<InstructionProps> = ({ return steps; }, [ agentVersion, + downloadSource, + downloadSourceProxy, agentPolicy, selectedPolicy, agentPolicies, @@ -143,6 +151,7 @@ export const ManagedSteps: React.FunctionComponent<InstructionProps> = ({ fleetServerHost, fleetProxy, downloadSource, + downloadSourceProxy, refreshAgentPolicies, mode, setMode, @@ -173,6 +182,7 @@ export const ManagedSteps: React.FunctionComponent<InstructionProps> = ({ fleetServerHost, fleetProxy, downloadSource, + downloadSourceProxy, agentVersion: agentVersion || '', gcpProjectId, gcpOrganizationId, diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/types.ts b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/types.ts index 0eefe62229193..a58feeda65617 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/types.ts +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/types.ts @@ -83,4 +83,5 @@ export interface InstructionProps extends BaseProps { fleetServerHost: string; fleetProxy?: FleetProxy; downloadSource?: DownloadSource; + downloadSourceProxy?: FleetProxy; } diff --git a/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx b/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx index e5733983dd754..654b3a782649c 100644 --- a/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx +++ b/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import { DEFAULT_DOWNLOAD_SOURCE_URI } from '../../../../common/constants'; import type { DownloadSource, FleetProxy } from '../../../types'; function getfleetServerHostsEnrollArgs( @@ -14,7 +15,7 @@ function getfleetServerHostsEnrollArgs( ) { const proxyHeadersArgs = fleetProxy?.proxy_headers ? Object.entries(fleetProxy.proxy_headers).reduce((acc, [proxyKey, proyVal]) => { - acc += ` --proxy-header ${proxyKey}=${proyVal}`; + acc += ` --proxy-header "${proxyKey}=${proyVal}"`; return acc; }, '') @@ -23,11 +24,45 @@ function getfleetServerHostsEnrollArgs( return `--url=${fleetServerHost || `FLEET_SERVER_HOST`} --enrollment-token=${apiKey}${proxyArgs}`; } +export const getDownloadBaseUrl = (downloadSource?: DownloadSource) => { + const source = downloadSource?.host || DEFAULT_DOWNLOAD_SOURCE_URI; + return source.endsWith('/') ? source.substring(0, source.length - 1) : source; +}; + +export const getDownloadSourceProxyArgs = (downloadSourceProxy?: FleetProxy) => { + const windows = `${downloadSourceProxy?.url ? `-Proxy "${downloadSourceProxy.url}"` : ''} ${ + downloadSourceProxy?.proxy_headers + ? `-Headers @{${Object.entries(downloadSourceProxy.proxy_headers) + .reduce((acc, [proxyKey, proyVal]) => { + acc.push(`"${proxyKey}"="${proyVal}"`); + return acc; + }, [] as string[]) + .join('; ')}}` + : '' + }`.trim(); + const curl = `${downloadSourceProxy?.url ? `--proxy ${downloadSourceProxy.url}` : ''} ${ + downloadSourceProxy?.proxy_headers + ? Object.entries(downloadSourceProxy.proxy_headers) + .reduce((acc, [proxyKey, proyVal]) => { + acc.push(`--proxy-header "${proxyKey}=${proyVal}"`); + return acc; + }, [] as string[]) + .join(' ') + : '' + }`.trim(); + + return { + windows, + curl, + }; +}; + export const ManualInstructions = ({ apiKey, fleetServerHost, fleetProxy, downloadSource, + downloadSourceProxy, agentVersion: agentVersion, gcpProjectId = '<PROJECT_ID>', gcpOrganizationId = '<ORGANIZATION_ID>', @@ -37,44 +72,44 @@ export const ManualInstructions = ({ fleetServerHost: string; fleetProxy?: FleetProxy; downloadSource?: DownloadSource; + downloadSourceProxy?: FleetProxy; agentVersion: string; gcpProjectId?: string; gcpOrganizationId?: string; gcpAccountType?: string; }) => { const enrollArgs = getfleetServerHostsEnrollArgs(apiKey, fleetServerHost, fleetProxy); - const downloadBaseUrl = downloadSource - ? downloadSource.host.endsWith('/') - ? downloadSource.host.substring(0, downloadSource.host.length - 1) - : downloadSource.host - : 'https://artifacts.elastic.co/downloads'; + const downloadBaseUrl = getDownloadBaseUrl(downloadSource); const fleetServerUrl = enrollArgs?.split('--url=')?.pop()?.split('--enrollment')[0]; const enrollmentToken = enrollArgs?.split('--enrollment-token=')[1]; const k8sCommand = 'kubectl apply -f elastic-agent-managed-kubernetes.yml'; - const linuxCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-linux-x86_64.tar.gz + const { windows: windowsDownloadSourceProxyArgs, curl: curlDownloadSourceProxyArgs } = + getDownloadSourceProxyArgs(downloadSourceProxy); + + const linuxCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-linux-x86_64.tar.gz ${curlDownloadSourceProxyArgs} tar xzvf elastic-agent-${agentVersion}-linux-x86_64.tar.gz cd elastic-agent-${agentVersion}-linux-x86_64 sudo ./elastic-agent install ${enrollArgs}`; - const macCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-darwin-aarch64.tar.gz + const macCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-darwin-aarch64.tar.gz ${curlDownloadSourceProxyArgs} tar xzvf elastic-agent-${agentVersion}-darwin-aarch64.tar.gz cd elastic-agent-${agentVersion}-darwin-aarch64 sudo ./elastic-agent install ${enrollArgs}`; const windowsCommand = `$ProgressPreference = 'SilentlyContinue' -Invoke-WebRequest -Uri ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-windows-x86_64.zip -OutFile elastic-agent-${agentVersion}-windows-x86_64.zip +Invoke-WebRequest -Uri ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-windows-x86_64.zip -OutFile elastic-agent-${agentVersion}-windows-x86_64.zip ${windowsDownloadSourceProxyArgs} Expand-Archive .\\elastic-agent-${agentVersion}-windows-x86_64.zip -DestinationPath . cd elastic-agent-${agentVersion}-windows-x86_64 .\\elastic-agent.exe install ${enrollArgs}`; - const linuxDebCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-amd64.deb + const linuxDebCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-amd64.deb ${curlDownloadSourceProxyArgs} sudo dpkg -i elastic-agent-${agentVersion}-amd64.deb sudo elastic-agent enroll ${enrollArgs} \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const linuxRpmCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-x86_64.rpm + const linuxRpmCommand = `curl -L -O ${downloadBaseUrl}/beats/elastic-agent/elastic-agent-${agentVersion}-x86_64.rpm ${curlDownloadSourceProxyArgs} sudo rpm -vi elastic-agent-${agentVersion}-x86_64.rpm sudo elastic-agent enroll ${enrollArgs} \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; diff --git a/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx b/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx index 21221fdaba79f..dd8eafec86ec4 100644 --- a/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx +++ b/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx @@ -4,27 +4,42 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import type { CommandsByPlatform } from '../../../applications/fleet/components/fleet_server_instructions/utils/install_command_utils'; +import type { DownloadSource, FleetProxy } from '../../../types'; +import { getDownloadBaseUrl, getDownloadSourceProxyArgs } from '../manual'; + +export const StandaloneInstructions = ({ + agentVersion, + downloadSource, + downloadSourceProxy, +}: { + agentVersion: string; + downloadSource?: DownloadSource; + downloadSourceProxy?: FleetProxy; +}): CommandsByPlatform => { + const downloadBaseUrl = getDownloadBaseUrl(downloadSource); + const { windows: windowsDownloadSourceProxyArgs, curl: curlDownloadSourceProxyArgs } = + getDownloadSourceProxyArgs(downloadSourceProxy); -export const StandaloneInstructions = (agentVersion: string): CommandsByPlatform => { - const linuxDebCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-amd64.deb + const linuxDebCommand = `curl -L -O ${downloadBaseUrl}/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-amd64.deb ${curlDownloadSourceProxyArgs} sudo dpkg -i elastic-agent-${agentVersion}-amd64.deb \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const linuxRpmCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-x86_64.rpm + const linuxRpmCommand = `curl -L -O ${downloadBaseUrl}/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-x86_64.rpm ${curlDownloadSourceProxyArgs} sudo rpm -vi elastic-agent-${agentVersion}-x86_64.rpm \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const linuxCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-linux-x86_64.tar.gz + const linuxCommand = `curl -L -O ${downloadBaseUrl}/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-linux-x86_64.tar.gz ${curlDownloadSourceProxyArgs} tar xzvf elastic-agent-${agentVersion}-linux-x86_64.tar.gz cd elastic-agent-${agentVersion}-linux-x86_64 sudo ./elastic-agent install`; - const macCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-darwin-aarch64.tar.gz + const macCommand = `curl -L -O ${downloadBaseUrl}/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-darwin-aarch64.tar.gz ${curlDownloadSourceProxyArgs} tar xzvf elastic-agent-${agentVersion}-darwin-aarch64.tar.gz cd elastic-agent-${agentVersion}-darwin-aarch64 sudo ./elastic-agent install`; const windowsCommand = `$ProgressPreference = 'SilentlyContinue' -Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-windows-x86_64.zip -OutFile elastic-agent-${agentVersion}-windows-x86_64.zip +Invoke-WebRequest -Uri ${downloadBaseUrl}/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-windows-x86_64.zip -OutFile elastic-agent-${agentVersion}-windows-x86_64.zip ${windowsDownloadSourceProxyArgs} Expand-Archive .\elastic-agent-${agentVersion}-windows-x86_64.zip -DestinationPath . cd elastic-agent-${agentVersion}-windows-x86_64 .\\elastic-agent.exe install`; diff --git a/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx b/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx index 9e6c8ab5c62b1..6f9c96d130ebd 100644 --- a/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx +++ b/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx @@ -42,6 +42,23 @@ describe('useFleetServerHostsForPolicy', () => { is_preconfigured: false, }, has_active: true, + es_output: { + id: 'es-output', + name: 'es-output', + is_default: false, + is_default_monitoring: false, + type: 'elasticsearch', + hosts: ['https://elasticsearch:9200'], + }, + es_output_proxy: { + id: 'es-output-proxy', + name: 'es-output-proxy', + url: 'https://es-output-proxy', + proxy_headers: { + 'header-key': 'header-value', + }, + is_preconfigured: false, + }, }, download_source: { id: 'default-source', @@ -49,6 +66,15 @@ describe('useFleetServerHostsForPolicy', () => { host: 'https://defaultsource', is_default: false, }, + download_source_proxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'https://download-src-proxy', + proxy_headers: { + 'header-key': 'header-value', + }, + is_preconfigured: false, + }, }, }); }); @@ -64,12 +90,38 @@ describe('useFleetServerHostsForPolicy', () => { url: 'https://defaultproxy', is_preconfigured: false, }, + esOutput: { + id: 'es-output', + name: 'es-output', + is_default: false, + is_default_monitoring: false, + type: 'elasticsearch', + hosts: ['https://elasticsearch:9200'], + }, + esOutputProxy: { + id: 'es-output-proxy', + name: 'es-output-proxy', + url: 'https://es-output-proxy', + proxy_headers: { + 'header-key': 'header-value', + }, + is_preconfigured: false, + }, downloadSource: { id: 'default-source', name: 'default-source', host: 'https://defaultsource', is_default: false, }, + downloadSourceProxy: { + id: 'download-src-proxy', + name: 'download-src-proxy', + url: 'https://download-src-proxy', + proxy_headers: { + 'header-key': 'header-value', + }, + is_preconfigured: false, + }, }); }); }); diff --git a/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.ts b/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.ts index 8ca0d8a6871c3..12b8523f13028 100644 --- a/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.ts +++ b/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.ts @@ -14,7 +14,7 @@ import { useGetEnrollmentSettings } from './use_request'; /** * Return Fleet server hosts urls and proxy for a given agent policy */ -export function useFleetServerHostsForPolicy(agentPolicy?: AgentPolicy | null) { +export function useFleetServerHostsForPolicy(agentPolicy?: Pick<AgentPolicy, 'id'> | null) { const { isLoading, isInitialRequest, @@ -26,14 +26,20 @@ export function useFleetServerHostsForPolicy(agentPolicy?: AgentPolicy | null) { isLoadingInitialRequest: isLoading && isInitialRequest, fleetServerHost: enrollmentSettings?.fleet_server.host?.host_urls[0] || '', fleetProxy: enrollmentSettings?.fleet_server.host_proxy, + esOutput: enrollmentSettings?.fleet_server.es_output, + esOutputProxy: enrollmentSettings?.fleet_server.es_output_proxy, downloadSource: enrollmentSettings?.download_source, + downloadSourceProxy: enrollmentSettings?.download_source_proxy, }), [ isLoading, isInitialRequest, enrollmentSettings?.fleet_server.host, enrollmentSettings?.fleet_server.host_proxy, + enrollmentSettings?.fleet_server.es_output, + enrollmentSettings?.fleet_server.es_output_proxy, enrollmentSettings?.download_source, + enrollmentSettings?.download_source_proxy, ] ); } diff --git a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts index 73a7d03a14592..69bf95207f82c 100644 --- a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts +++ b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts @@ -22,6 +22,7 @@ import { agentPolicyService, appContextService, downloadSourceService } from '.. import { getFleetServerHostsForAgentPolicy } from '../../services/fleet_server_host'; import { getFleetProxy } from '../../services/fleet_proxies'; import { getFleetServerPolicies, hasFleetServersForPolicies } from '../../services/fleet_server'; +import { getDataOutputForAgentPolicy } from '../../services/agent_policies'; export const getEnrollmentSettingsHandler: FleetRequestHandler< undefined, @@ -46,6 +47,7 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< name: undefined, fleet_server_host_id: undefined, download_source_id: undefined, + data_output_id: undefined, }; // Check if there is any active fleet server enrolled into the fleet server policies policies if (fleetServerPolicies) { @@ -69,6 +71,19 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< settingsResponse.download_source = undefined; } + // Get download source proxy + // ignore errors if the download source proxy is not found + try { + if (settingsResponse.download_source?.proxy_id) { + settingsResponse.download_source_proxy = await getFleetProxy( + soClient, + settingsResponse.download_source.proxy_id + ); + } + } catch (e) { + settingsResponse.download_source_proxy = undefined; + } + // Get associated fleet server host, or default one if it doesn't exist // `getFleetServerHostsForAgentPolicy` errors if there is no default, so catch it try { @@ -80,7 +95,7 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< settingsResponse.fleet_server.host = undefined; } - // if a fleet server host was found, get associated fleet server host proxy if any + // If a fleet server host was found, get associated fleet server host proxy if any // ignore errors if the proxy is not found try { if (settingsResponse.fleet_server.host?.proxy_id) { @@ -93,6 +108,25 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< settingsResponse.fleet_server.host_proxy = undefined; } + // Get associated output and proxy (if any) to use for Fleet Server enrollment + try { + if (settingsResponse.fleet_server.policies.length > 0) { + const dataOutput = await getDataOutputForAgentPolicy(soClient, scopedAgentPolicy); + if (dataOutput.type === 'elasticsearch' && dataOutput.hosts?.[0]) { + settingsResponse.fleet_server.es_output = dataOutput; + if (dataOutput.proxy_id) { + settingsResponse.fleet_server.es_output_proxy = await getFleetProxy( + soClient, + dataOutput.proxy_id + ); + } + } + } + } catch (e) { + settingsResponse.fleet_server.es_output = undefined; + settingsResponse.fleet_server.es_output_proxy = undefined; + } + return response.ok({ body: settingsResponse }); } catch (error) { return defaultFleetErrorHandler({ error, response }); @@ -115,6 +149,7 @@ export const getFleetServerOrAgentPolicies = async ( fleet_server_host_id: policy.fleet_server_host_id, download_source_id: policy.download_source_id, space_ids: policy.space_ids, + data_output_id: policy.data_output_id, }); // If an agent policy is specified, return only that policy diff --git a/x-pack/plugins/fleet/server/types/rest_spec/settings.ts b/x-pack/plugins/fleet/server/types/rest_spec/settings.ts index 6553d2e976bed..0adaa69f1d30a 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/settings.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/settings.ts @@ -9,6 +9,10 @@ import { schema } from '@kbn/config-schema'; import { isDiffPathProtocol } from '../../../common/services'; +import { OutputSchema } from '../models'; + +import { FleetProxySchema } from './fleet_proxies'; + export const GetSettingsRequestSchema = {}; export const PutSettingsRequestSchema = { @@ -101,6 +105,7 @@ export const GetEnrollmentSettingsResponseSchema = schema.object({ fleet_server_host_id: schema.maybe(schema.oneOf([schema.literal(null), schema.string()])), download_source_id: schema.maybe(schema.oneOf([schema.literal(null), schema.string()])), space_ids: schema.maybe(schema.arrayOf(schema.string())), + data_output_id: schema.maybe(schema.oneOf([schema.literal(null), schema.string()])), }) ), has_active: schema.boolean(), @@ -115,25 +120,9 @@ export const GetEnrollmentSettingsResponseSchema = schema.object({ proxy_id: schema.maybe(schema.oneOf([schema.literal(null), schema.string()])), }) ), - host_proxy: schema.maybe( - schema.object({ - id: schema.string(), - proxy_headers: schema.maybe( - schema.recordOf( - schema.string(), - schema.oneOf([schema.string(), schema.number(), schema.boolean()]) - ) - ), - name: schema.string(), - url: schema.string(), - certificate_authorities: schema.maybe( - schema.oneOf([schema.literal(null), schema.string()]) - ), - certificate: schema.maybe(schema.oneOf([schema.literal(null), schema.string()])), - certificate_key: schema.maybe(schema.oneOf([schema.literal(null), schema.string()])), - is_preconfigured: schema.boolean(), - }) - ), + host_proxy: schema.maybe(FleetProxySchema), + es_output: schema.maybe(OutputSchema), + es_output_proxy: schema.maybe(FleetProxySchema), }), download_source: schema.maybe( schema.object({ @@ -154,4 +143,5 @@ export const GetEnrollmentSettingsResponseSchema = schema.object({ ), }) ), + download_source_proxy: schema.maybe(FleetProxySchema), }); diff --git a/x-pack/test/fleet_api_integration/apis/settings/enrollment.ts b/x-pack/test/fleet_api_integration/apis/settings/enrollment.ts index fc464ce0e3ded..d69051b6140a9 100644 --- a/x-pack/test/fleet_api_integration/apis/settings/enrollment.ts +++ b/x-pack/test/fleet_api_integration/apis/settings/enrollment.ts @@ -18,11 +18,8 @@ export default function (providerContext: FtrProviderContext) { describe('Enrollment settings - get', function () { skipIfNoDockerRegistry(providerContext); - before(async () => { - await fleetAndAgents.setup(); - }); - it('should respond with empty enrollment settings on empty cluster', async function () { + await fleetAndAgents.setup(); const response = await supertest .get(`/internal/fleet/settings/enrollment`) .set('kbn-xsrf', 'xxxx') @@ -51,6 +48,7 @@ export default function (providerContext: FtrProviderContext) { .set('kbn-xsrf', 'xxxx') .send({ force: true }) .expect(200); + await fleetAndAgents.setup(); }); after(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/fleet/fleet_server'); @@ -92,12 +90,25 @@ export default function (providerContext: FtrProviderContext) { host_proxy: { id: 'my-proxy', name: 'my proxy', + proxy_headers: { + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'en-US,en;q=0.5', + }, url: 'https://my-proxy', certificate: '', certificate_authorities: '', certificate_key: '', is_preconfigured: false, }, + es_output: { + hosts: ['http://localhost:9200'], + id: 'fleet-default-output', + is_default: true, + is_default_monitoring: true, + name: 'default', + preset: 'balanced', + type: 'elasticsearch', + }, }, download_source: { id: 'fleet-default-download-source', @@ -137,12 +148,25 @@ export default function (providerContext: FtrProviderContext) { host_proxy: { id: 'my-proxy', name: 'my proxy', + proxy_headers: { + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'en-US,en;q=0.5', + }, url: 'https://my-proxy', certificate: '', certificate_authorities: '', certificate_key: '', is_preconfigured: false, }, + es_output: { + hosts: ['http://localhost:9200'], + id: 'fleet-default-output', + is_default: true, + is_default_monitoring: true, + name: 'default', + preset: 'balanced', + type: 'elasticsearch', + }, }, download_source: { id: 'fleet-default-download-source', @@ -178,6 +202,19 @@ export default function (providerContext: FtrProviderContext) { host: 'https://localhost:2222', proxy_id: 'my-proxy', }, + download_source_proxy: { + certificate: '', + certificate_authorities: '', + certificate_key: '', + id: 'my-proxy', + is_preconfigured: false, + name: 'my proxy', + proxy_headers: { + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'en-US,en;q=0.5', + }, + url: 'https://my-proxy', + }, }); }); }); diff --git a/x-pack/test/functional/es_archives/fleet/fleet_server/data.json b/x-pack/test/functional/es_archives/fleet/fleet_server/data.json index a3729885c13e9..32e3735981802 100644 --- a/x-pack/test/functional/es_archives/fleet/fleet_server/data.json +++ b/x-pack/test/functional/es_archives/fleet/fleet_server/data.json @@ -435,12 +435,11 @@ "certificate_key": "", "is_preconfigured": false, "name": "my proxy", - "proxy_headers": null, + "proxy_headers": "{\"Accept-Language\":\"en-US,en;q=0.5\",\"Accept-Encoding\":\"gzip, deflate, br\"}", "url": "https://my-proxy" }, "managed": false, - "references": [ - ], + "references": [], "type": "fleet-proxy", "updated_at": "2024-04-22T22:07:16.226Z" } From 9d671f694bd584ff9ad5b75532aea9f2b6bc1c92 Mon Sep 17 00:00:00 2001 From: christineweng <18648970+christineweng@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:11:34 -0500 Subject: [PATCH 084/107] [Security Solution][Document Details] Add an advanced setting for visualizations in flyout in ESS (#194012) ## Summary This PR replaces a feature flag `visualizationInFlyoutEnabled` with advanced setting `securitySolution:enableVisualizationsInFlyout`. ![image](https://github.com/user-attachments/assets/3ddf00d8-d641-44ae-aca6-45a4c1bcbd7e) #### When advanced setting is off (DEFAULT): - Visualize tab should not be present in alert/event flyout - Analyzer and session preview links should go to timeline #### When advanced setting is on: - Visualize tab is present in alert/event flyout - The analyzer and session preview icon should open left panel ![image](https://github.com/user-attachments/assets/ca25538f-2f7c-4fc7-9081-473c6b9b3a5b) #### Some enhancements and fixes: - Clicking alerts in session viewer opens an alert preview - Upsell and no data messages are updated in session viewer to be consistent with session preview - Links in analyzer and session preview should be disabled in previews (`isPreviewMode`) - Links in analyzer and session preview should be disabled in rule preview (`isPreview`) https://github.com/user-attachments/assets/074166b8-3ce1-4488-9245-029b7dc55c59 ### 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] [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 --- .../settings/setting_ids/index.ts | 2 + .../server/collectors/management/schema.ts | 4 + .../server/collectors/management/types.ts | 1 + src/plugins/telemetry/schema/oss_plugins.json | 6 + .../security_solution/common/constants.ts | 4 + .../common/experimental_features.ts | 5 - .../left/components/session_view.test.tsx | 53 ++++++- .../left/components/session_view.tsx | 68 ++++++++- .../flyout/document_details/left/index.tsx | 6 +- .../left/tabs/visualize_tab.tsx | 38 ++--- .../analyzer_preview_container.test.tsx | 112 ++++++++------- .../components/analyzer_preview_container.tsx | 58 ++------ .../session_preview_container.test.tsx | 96 +++++++++++-- .../components/session_preview_container.tsx | 92 +++++------- .../visualizations_section.test.tsx | 14 +- .../session_view_no_data_message.test.tsx | 61 ++++++++ .../session_view_no_data_message.tsx | 87 ++++++++++++ .../shared/components/test_ids.ts | 3 + .../hooks/use_navigate_to_analyzer.test.tsx | 106 ++++++++++++++ .../shared/hooks/use_navigate_to_analyzer.tsx | 133 ++++++++++++++++++ .../use_navigate_to_session_view.test.tsx | 81 +++++++++++ .../hooks/use_navigate_to_session_view.tsx | 104 ++++++++++++++ .../security_solution/server/ui_settings.ts | 19 +++ .../translations/translations/fr-FR.json | 5 - .../translations/translations/ja-JP.json | 5 - .../translations/translations/zh-CN.json | 5 - 26 files changed, 953 insertions(+), 215 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.tsx diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index 611a7a0e13df5..cb32dbd4a4505 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -187,6 +187,8 @@ export const SECURITY_SOLUTION_EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER = /** This Kibana Advanced Setting allows users to enable/disable the Asset Criticality feature */ export const SECURITY_SOLUTION_ENABLE_ASSET_CRITICALITY_SETTING = 'securitySolution:enableAssetCriticality' as const; +export const SECURITY_SOLUTION_ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING = + 'securitySolution:enableVisualizationsInFlyout' as const; // Timelion settings export const TIMELION_ES_DEFAULT_INDEX_ID = 'timelion:es.default_index'; 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 1c118620773ae..0ece5f004c23e 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -130,6 +130,10 @@ export const stackManagementSchema: MakeSchemaFrom<UsageStats> = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, + 'securitySolution:enableVisualizationsInFlyout': { + type: 'boolean', + _meta: { description: 'Non-default value of setting.' }, + }, 'search:includeFrozen': { 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 71c692b6fdf34..ca1df3c95e87a 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -76,6 +76,7 @@ export interface UsageStats { 'securitySolution:enableAssetCriticality': boolean; 'securitySolution:excludeColdAndFrozenTiersInAnalyzer': boolean; 'securitySolution:enableCcsWarning': boolean; + 'securitySolution:enableVisualizationsInFlyout': boolean; 'search:includeFrozen': boolean; 'courier:maxConcurrentShardRequests': number; 'courier:setRequestPreference': string; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 82e7666018782..f25c29e5f6952 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -9919,6 +9919,12 @@ "description": "Non-default value of setting." } }, + "securitySolution:enableVisualizationsInFlyout":{ + "type": "boolean", + "_meta": { + "description": "Non-default value of setting." + } + }, "search:includeFrozen": { "type": "boolean", "_meta": { diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index e2b85fd123f91..f947369112033 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -199,6 +199,10 @@ export const ENABLE_ASSET_CRITICALITY_SETTING = 'securitySolution:enableAssetCri export const EXCLUDED_DATA_TIERS_FOR_RULE_EXECUTION = 'securitySolution:excludedDataTiersForRuleExecution' as const; +/** This Kibana Advanced Setting allows users to enable/disable the Visualizations in Flyout feature */ +export const ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING = + 'securitySolution:enableVisualizationsInFlyout' as const; + /** * Id for the notifications alerting type * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 88ca097e09b18..982b102abd93e 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -209,11 +209,6 @@ export const allowedExperimentalValues = Object.freeze({ */ analyzerDatePickersAndSourcererDisabled: false, - /** - * Enables visualization: session viewer and analyzer in expandable flyout - */ - visualizationInFlyoutEnabled: false, - /** * Enables an ability to customize Elastic prebuilt rules. * 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 cce77411d6c9f..29d12721c3ef7 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 @@ -11,12 +11,35 @@ import '@testing-library/jest-dom'; import { DocumentDetailsContext } from '../../shared/context'; import { TestProviders } from '../../../../common/mock'; import { SESSION_VIEW_TEST_ID } from './test_ids'; +import { + SESSION_VIEW_UPSELL_TEST_ID, + SESSION_VIEW_NO_DATA_TEST_ID, +} from '../../shared/components/test_ids'; import { SessionView } from './session_view'; import { ANCESTOR_INDEX, ENTRY_LEADER_ENTITY_ID, ENTRY_LEADER_START, } from '../../shared/constants/field_names'; +import { useSessionPreview } from '../../right/hooks/use_session_preview'; +import { useSourcererDataView } from '../../../../sourcerer/containers'; +import { mockContextValue } from '../../shared/mocks/mock_context'; +import { useLicense } from '../../../../common/hooks/use_license'; + +jest.mock('../../right/hooks/use_session_preview'); +jest.mock('../../../../common/hooks/use_license'); +jest.mock('../../../../sourcerer/containers'); + +const NO_DATA_MESSAGE = + 'You can only view Linux session details if you’ve enabled the Include session data setting in your Elastic Defend integration policy. Refer to Enable Session View dataExternal link(opens in a new tab or window) for more information.'; + +const UPSELL_TEXT = 'This feature requires an Enterprise subscription'; + +const sessionViewConfig = { + index: {}, + sessionEntityId: 'sessionEntityId', + sessionStartTime: 'sessionStartTime', +}; interface MockData { [key: string]: string; @@ -46,7 +69,7 @@ jest.mock('../../../../common/lib/kibana', () => { }; }); -const renderSessionView = (contextValue: DocumentDetailsContext) => +const renderSessionView = (contextValue: DocumentDetailsContext = mockContextValue) => render( <TestProviders> <DocumentDetailsContext.Provider value={contextValue}> @@ -56,6 +79,19 @@ const renderSessionView = (contextValue: DocumentDetailsContext) => ); describe('<SessionView />', () => { + beforeEach(() => { + (useSessionPreview as jest.Mock).mockReturnValue(sessionViewConfig); + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + jest.mocked(useSourcererDataView).mockReturnValue({ + browserFields: {}, + dataViewId: '', + loading: false, + indicesExist: true, + selectedPatterns: ['index'], + indexPattern: { fields: [], title: '' }, + sourcererDataView: undefined, + }); + }); it('renders session view correctly', () => { const contextValue = { getFieldsData: mockFieldsData, @@ -75,4 +111,19 @@ describe('<SessionView />', () => { const wrapper = renderSessionView(contextValue); expect(wrapper.getByTestId(SESSION_VIEW_TEST_ID)).toBeInTheDocument(); }); + + it('should render upsell message in header if no correct license', () => { + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => false }); + + const { getByTestId } = renderSessionView(); + expect(getByTestId(SESSION_VIEW_UPSELL_TEST_ID)).toHaveTextContent(UPSELL_TEXT); + }); + + it('should render error message and text in header if no sessionConfig', () => { + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + (useSessionPreview as jest.Mock).mockReturnValue(null); + + const { getByTestId } = renderSessionView(); + expect(getByTestId(SESSION_VIEW_NO_DATA_TEST_ID)).toHaveTextContent(NO_DATA_MESSAGE); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.tsx index fa44e0154b59f..38bf50a679ee2 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.tsx @@ -6,7 +6,10 @@ */ import type { FC } from 'react'; -import React from 'react'; +import React, { useCallback, useMemo } from 'react'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import type { TableId } from '@kbn/securitysolution-data-table'; +import { EuiPanel } from '@elastic/eui'; import { ANCESTOR_INDEX, ENTRY_LEADER_ENTITY_ID, @@ -14,8 +17,17 @@ import { } from '../../shared/constants/field_names'; import { getField } from '../../shared/utils'; import { SESSION_VIEW_TEST_ID } from './test_ids'; +import { isActiveTimeline } from '../../../../helpers'; +import { useSourcererDataView } from '../../../../sourcerer/containers'; +import { DocumentDetailsPreviewPanelKey } from '../../shared/constants/panel_keys'; import { useKibana } from '../../../../common/lib/kibana'; import { useDocumentDetailsContext } from '../../shared/context'; +import { SourcererScopeName } from '../../../../sourcerer/store/model'; +import { detectionsTimelineIds } from '../../../../timelines/containers/helpers'; +import { ALERT_PREVIEW_BANNER } from '../../preview/constants'; +import { useLicense } from '../../../../common/hooks/use_license'; +import { useSessionPreview } from '../../right/hooks/use_session_preview'; +import { SessionViewNoDataMessage } from '../../shared/components/session_view_no_data_message'; export const SESSION_VIEW_ID = 'session-view'; @@ -23,26 +35,70 @@ export const SESSION_VIEW_ID = 'session-view'; * Session view displayed in the document details expandable flyout left section under the Visualize tab */ export const SessionView: FC = () => { - const { sessionView } = useKibana().services; - const { getFieldsData, indexName } = useDocumentDetailsContext(); + const { sessionView, telemetry } = useKibana().services; + const { getFieldsData, indexName, scopeId, dataFormattedForFieldBrowser } = + useDocumentDetailsContext(); + + const sessionViewConfig = useSessionPreview({ getFieldsData, dataFormattedForFieldBrowser }); + const isEnterprisePlus = useLicense().isEnterprise(); + const isEnabled = sessionViewConfig && isEnterprisePlus; const ancestorIndex = getField(getFieldsData(ANCESTOR_INDEX)); // e.g in case of alert, we want to grab it's origin index const sessionEntityId = getField(getFieldsData(ENTRY_LEADER_ENTITY_ID)) || ''; const sessionStartTime = getField(getFieldsData(ENTRY_LEADER_START)) || ''; const index = ancestorIndex || indexName; - // TODO as part of https://github.com/elastic/security-team/issues/7031 - // bring back no data message if needed + const sourcererScope = useMemo(() => { + if (isActiveTimeline(scopeId)) { + return SourcererScopeName.timeline; + } else if (detectionsTimelineIds.includes(scopeId as TableId)) { + return SourcererScopeName.detections; + } else { + return SourcererScopeName.default; + } + }, [scopeId]); + + const { selectedPatterns } = useSourcererDataView(sourcererScope); + const eventDetailsIndex = useMemo(() => selectedPatterns.join(','), [selectedPatterns]); + + const { openPreviewPanel } = useExpandableFlyoutApi(); + const openAlertDetailsPreview = useCallback( + (eventId?: string, onClose?: () => void) => { + openPreviewPanel({ + id: DocumentDetailsPreviewPanelKey, + params: { + id: eventId, + indexName: eventDetailsIndex, + scopeId, + banner: ALERT_PREVIEW_BANNER, + isPreviewMode: true, + }, + }); + telemetry.reportDetailsFlyoutOpened({ + location: scopeId, + panel: 'preview', + }); + }, + [openPreviewPanel, eventDetailsIndex, scopeId, telemetry] + ); - return ( + return isEnabled ? ( <div data-test-subj={SESSION_VIEW_TEST_ID}> {sessionView.getSessionView({ index, sessionEntityId, sessionStartTime, isFullScreen: true, + loadAlertDetails: openAlertDetailsPreview, })} </div> + ) : ( + <EuiPanel hasShadow={false}> + <SessionViewNoDataMessage + isEnterprisePlus={isEnterprisePlus} + hasSessionViewConfig={sessionViewConfig !== null} + /> + </EuiPanel> ); }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx index 838209490f7d8..8e6b817e275e5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx @@ -9,7 +9,9 @@ import type { FC } from 'react'; import React, { memo, useMemo } from 'react'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import { ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING } from '../../../../common/constants'; import { DocumentDetailsLeftPanelKey } from '../shared/constants/panel_keys'; import { useKibana } from '../../../common/lib/kibana'; import { PanelHeader } from './header'; @@ -38,8 +40,8 @@ export const LeftPanel: FC<Partial<DocumentDetailsProps>> = memo(({ path }) => { 'securitySolutionNotesEnabled' ); - const visualizationInFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'visualizationInFlyoutEnabled' + const [visualizationInFlyoutEnabled] = useUiSetting$<boolean>( + ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING ); const tabsDisplayed = useMemo(() => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx index 031273c3e0892..0dad444ee6ece 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx @@ -13,11 +13,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { useDocumentDetailsContext } from '../../shared/context'; import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; -import { - DocumentDetailsLeftPanelKey, - DocumentDetailsAnalyzerPanelKey, -} from '../../shared/constants/panel_keys'; -import { LeftPanelVisualizeTab } from '..'; +import { DocumentDetailsAnalyzerPanelKey } from '../../shared/constants/panel_keys'; import { VISUALIZE_TAB_BUTTON_GROUP_TEST_ID, VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON_TEST_ID, @@ -59,8 +55,8 @@ const visualizeButtons: EuiButtonGroupOptionProps[] = [ * Visualize view displayed in the document details expandable flyout left section */ export const VisualizeTab = memo(() => { - const { eventId, indexName, scopeId } = useDocumentDetailsContext(); - const { openLeftPanel, openPreviewPanel } = useExpandableFlyoutApi(); + const { scopeId } = useDocumentDetailsContext(); + const { openPreviewPanel } = useExpandableFlyoutApi(); const panels = useExpandableFlyoutState(); const [activeVisualizationId, setActiveVisualizationId] = useState( panels.left?.path?.subTab ?? SESSION_VIEW_ID @@ -72,28 +68,16 @@ export const VisualizeTab = memo(() => { setActiveVisualizationId(optionId); if (optionId === ANALYZE_GRAPH_ID) { startTransaction({ name: ALERTS_ACTIONS.OPEN_ANALYZER }); + openPreviewPanel({ + id: DocumentDetailsAnalyzerPanelKey, + params: { + resolverComponentInstanceID: `${key}-${scopeId}`, + banner: ANALYZER_PREVIEW_BANNER, + }, + }); } - openLeftPanel({ - id: DocumentDetailsLeftPanelKey, - path: { - tab: LeftPanelVisualizeTab, - subTab: optionId, - }, - params: { - id: eventId, - indexName, - scopeId, - }, - }); - openPreviewPanel({ - id: DocumentDetailsAnalyzerPanelKey, - params: { - resolverComponentInstanceID: `${key}-${scopeId}`, - banner: ANALYZER_PREVIEW_BANNER, - }, - }); }, - [startTransaction, eventId, indexName, scopeId, openLeftPanel, openPreviewPanel, key] + [startTransaction, openPreviewPanel, key, scopeId] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx index 3908aef1eb6b9..9c743f2b1bc9d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx @@ -8,7 +8,6 @@ import { render, screen } from '@testing-library/react'; import { TestProviders } from '../../../../common/mock'; import React from 'react'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { DocumentDetailsContext } from '../../shared/context'; import { mockContextValue } from '../../shared/mocks/mock_context'; import { AnalyzerPreviewContainer } from './analyzer_preview_container'; @@ -23,18 +22,8 @@ import { EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID, EXPANDABLE_PANEL_TOGGLE_ICON_TEST_ID, } from '@kbn/security-solution-common'; -import { mockFlyoutApi } from '../../shared/mocks/mock_flyout_context'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; import { useInvestigateInTimeline } from '../../../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline'; -import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; -import { - DocumentDetailsLeftPanelKey, - DocumentDetailsAnalyzerPanelKey, -} from '../../shared/constants/panel_keys'; -import { ANALYZE_GRAPH_ID, ANALYZER_PREVIEW_BANNER } from '../../left/components/analyze_graph'; -jest.mock('@kbn/expandable-flyout'); jest.mock( '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver' ); @@ -42,9 +31,19 @@ jest.mock('../../shared/hooks/use_alert_prevalence_from_process_tree'); jest.mock( '../../../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline' ); -jest.mock('../../shared/hooks/use_which_flyout'); -const mockUseWhichFlyout = useWhichFlyout as jest.Mock; -const FLYOUT_KEY = 'securitySolution'; + +const mockNavigateToAnalyzer = jest.fn(); +jest.mock('../../shared/hooks/use_navigate_to_analyzer', () => { + return { useNavigateToAnalyzer: () => ({ navigateToAnalyzer: mockNavigateToAnalyzer }) }; +}); + +jest.mock('@kbn/kibana-react-plugin/public', () => { + const original = jest.requireActual('@kbn/kibana-react-plugin/public'); + return { + ...original, + useUiSetting$: () => mockUseUiSetting(), + }; +}); jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -59,18 +58,19 @@ jest.mock('react-redux', () => { }; }); -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled 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 NO_ANALYZER_MESSAGE = 'You can only visualize events triggered by hosts configured with the Elastic Defend integration or any sysmon data from winlogbeat. Refer to Visual event analyzerExternal link(opens in a new tab or window) for more information.'; -const panelContextValue = { - ...mockContextValue, - dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, -}; - -const renderAnalyzerPreview = (context = panelContextValue) => +const renderAnalyzerPreview = (context = mockContextValue) => render( <TestProviders> <DocumentDetailsContext.Provider value={context}> @@ -82,9 +82,6 @@ const renderAnalyzerPreview = (context = panelContextValue) => describe('AnalyzerPreviewContainer', () => { beforeEach(() => { jest.clearAllMocks(); - mockUseWhichFlyout.mockReturnValue(FLYOUT_KEY); - jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); }); it('should render component and link in header', () => { @@ -170,7 +167,27 @@ describe('AnalyzerPreviewContainer', () => { investigateInTimelineAlertClick: jest.fn(), }); - const { queryByTestId } = renderAnalyzerPreview({ ...panelContextValue, isPreview: true }); + const { queryByTestId } = renderAnalyzerPreview({ ...mockContextValue, isPreview: true }); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + const { investigateInTimelineAlertClick } = useInvestigateInTimeline({}); + expect(investigateInTimelineAlertClick).not.toHaveBeenCalled(); + }); + + it('should not navigate to analyzer when in preview mode', () => { + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + (useAlertPrevalenceFromProcessTree as jest.Mock).mockReturnValue({ + loading: false, + error: false, + alertIds: ['alertid'], + statsNodes: mock.mockStatsNodes, + }); + (useInvestigateInTimeline as jest.Mock).mockReturnValue({ + investigateInTimelineAlertClick: jest.fn(), + }); + + const { queryByTestId } = renderAnalyzerPreview({ ...mockContextValue, isPreviewMode: true }); expect( queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)) ).not.toBeInTheDocument(); @@ -181,7 +198,7 @@ describe('AnalyzerPreviewContainer', () => { describe('when visualizationInFlyoutEnabled is enabled', () => { it('should open left flyout visualization tab when clicking on title', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); + mockUseUiSetting.mockReturnValue([true]); (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); (useAlertPrevalenceFromProcessTree as jest.Mock).mockReturnValue({ @@ -197,29 +214,30 @@ describe('AnalyzerPreviewContainer', () => { const { getByTestId } = renderAnalyzerPreview(); getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)).click(); - expect(mockFlyoutApi.openLeftPanel).toHaveBeenCalledWith({ - id: DocumentDetailsLeftPanelKey, - path: { - tab: 'visualize', - subTab: ANALYZE_GRAPH_ID, - }, - params: { - id: mockContextValue.eventId, - indexName: mockContextValue.indexName, - scopeId: mockContextValue.scopeId, - }, + expect(mockNavigateToAnalyzer).toHaveBeenCalled(); + }); + + it('should disable link when in rule preview', () => { + mockUseUiSetting.mockReturnValue([true]); + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + (useAlertPrevalenceFromProcessTree as jest.Mock).mockReturnValue({ + loading: false, + error: false, + alertIds: ['alertid'], + statsNodes: mock.mockStatsNodes, }); - expect(mockFlyoutApi.openPreviewPanel).toHaveBeenCalledWith({ - id: DocumentDetailsAnalyzerPanelKey, - params: { - resolverComponentInstanceID: `${FLYOUT_KEY}-${mockContextValue.scopeId}`, - banner: ANALYZER_PREVIEW_BANNER, - }, + (useInvestigateInTimeline as jest.Mock).mockReturnValue({ + investigateInTimelineAlertClick: jest.fn(), }); + + const { queryByTestId } = renderAnalyzerPreview({ ...mockContextValue, isPreview: true }); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); }); - it('should not disable link when in rule preview', () => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); + it('should disable link when in preview mode', () => { + mockUseUiSetting.mockReturnValue([true]); (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); (useAlertPrevalenceFromProcessTree as jest.Mock).mockReturnValue({ loading: false, @@ -231,7 +249,7 @@ describe('AnalyzerPreviewContainer', () => { investigateInTimelineAlertClick: jest.fn(), }); - const { queryByTestId } = renderAnalyzerPreview({ ...panelContextValue, isPreview: true }); + const { queryByTestId } = renderAnalyzerPreview({ ...mockContextValue, isPreviewMode: true }); expect( queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)) ).not.toBeInTheDocument(); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx index ab8b7d8cec668..6896f15ca88cb 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx @@ -11,14 +11,8 @@ import { TimelineTabs } from '@kbn/securitysolution-data-table'; import { EuiLink, EuiMark } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { ExpandablePanel } from '@kbn/security-solution-common'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; -import { - DocumentDetailsLeftPanelKey, - DocumentDetailsAnalyzerPanelKey, -} from '../../shared/constants/panel_keys'; -import { useKibana } from '../../../../common/lib/kibana'; +import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING } from '../../../../../common/constants'; import { useStartTransaction } from '../../../../common/lib/apm/use_start_transaction'; import { useInvestigateInTimeline } from '../../../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline'; import { ALERTS_ACTIONS } from '../../../../common/lib/apm/user_actions'; @@ -28,7 +22,7 @@ import { useDocumentDetailsContext } from '../../shared/context'; import { useIsInvestigateInResolverActionEnabled } from '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver'; import { AnalyzerPreview } from './analyzer_preview'; import { ANALYZER_PREVIEW_TEST_ID } from './test_ids'; -import { ANALYZE_GRAPH_ID, ANALYZER_PREVIEW_BANNER } from '../../left/components/analyze_graph'; +import { useNavigateToAnalyzer } from '../../shared/hooks/use_navigate_to_analyzer'; const timelineId = 'timeline-1'; @@ -36,14 +30,11 @@ const timelineId = 'timeline-1'; * Analyzer preview under Overview, Visualizations. It shows a tree representation of analyzer. */ export const AnalyzerPreviewContainer: React.FC = () => { - const { telemetry } = useKibana().services; - const { dataAsNestedObject, isPreview, eventId, indexName, scopeId } = + const { dataAsNestedObject, isPreview, eventId, indexName, scopeId, isPreviewMode } = useDocumentDetailsContext(); - const { openLeftPanel, openPreviewPanel } = useExpandableFlyoutApi(); - const key = useWhichFlyout() ?? 'memory'; - const visualizationInFlyoutEnabled = useIsExperimentalFeatureEnabled( - 'visualizationInFlyoutEnabled' + const [visualizationInFlyoutEnabled] = useUiSetting$<boolean>( + ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING ); // decide whether to show the analyzer preview or not const isEnabled = useIsInvestigateInResolverActionEnabled(dataAsNestedObject); @@ -70,32 +61,12 @@ export const AnalyzerPreviewContainer: React.FC = () => { dispatch(setActiveTabTimeline({ id: timelineId, activeTab: TimelineTabs.graph })); }, [dataAsNestedObject, dispatch, investigateInTimelineAlertClick, startTransaction]); - const gotoVisualizationTab = useCallback(() => { - openLeftPanel({ - id: DocumentDetailsLeftPanelKey, - path: { - tab: 'visualize', - subTab: ANALYZE_GRAPH_ID, - }, - params: { - id: eventId, - indexName, - scopeId, - }, - }); - openPreviewPanel({ - id: DocumentDetailsAnalyzerPanelKey, - params: { - resolverComponentInstanceID: `${key}-${scopeId}`, - banner: ANALYZER_PREVIEW_BANNER, - }, - }); - telemetry.reportDetailsFlyoutTabClicked({ - location: scopeId, - panel: 'left', - tabId: 'visualize', - }); - }, [eventId, indexName, openLeftPanel, openPreviewPanel, key, scopeId, telemetry]); + const { navigateToAnalyzer } = useNavigateToAnalyzer({ + eventId, + indexName, + isFlyoutOpen: true, + scopeId, + }); return ( <ExpandablePanel @@ -108,9 +79,10 @@ export const AnalyzerPreviewContainer: React.FC = () => { ), iconType: visualizationInFlyoutEnabled ? 'arrowStart' : 'timeline', ...(isEnabled && - !isPreview && { + !isPreview && + !isPreviewMode && { link: { - callback: visualizationInFlyoutEnabled ? gotoVisualizationTab : goToAnalyzerTab, + callback: visualizationInFlyoutEnabled ? navigateToAnalyzer : goToAnalyzerTab, tooltip: visualizationInFlyoutEnabled ? ( <FormattedMessage id="xpack.securitySolution.flyout.right.visualizations.analyzerPreview.analyzerPreviewOpenAnalyzerTooltip" diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx index 26bbdcebe22f1..4d4c20787ce1a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx @@ -20,27 +20,37 @@ import { EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID, EXPANDABLE_PANEL_TOGGLE_ICON_TEST_ID, } from '@kbn/security-solution-common'; -import { mockGetFieldsData } from '../../shared/mocks/mock_get_fields_data'; +import { mockContextValue } from '../../shared/mocks/mock_context'; jest.mock('../hooks/use_session_preview'); jest.mock('../../../../common/hooks/use_license'); +const mockNavigateToSessionView = jest.fn(); +jest.mock('../../shared/hooks/use_navigate_to_session_view', () => { + return { useNavigateToSessionView: () => ({ navigateToSessionView: mockNavigateToSessionView }) }; +}); + +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 NO_DATA_MESSAGE = 'You can only view Linux session details if you’ve enabled the Include session data setting in your Elastic Defend integration policy. Refer to Enable Session View dataExternal link(opens in a new tab or window) for more information.'; const UPSELL_TEXT = 'This feature requires an Enterprise subscription'; -const panelContextValue = { - getFieldsData: mockGetFieldsData, -} as unknown as DocumentDetailsContext; - const sessionViewConfig = { index: {}, sessionEntityId: 'sessionEntityId', sessionStartTime: 'sessionStartTime', }; -const renderSessionPreview = (context = panelContextValue) => +const renderSessionPreview = (context = mockContextValue) => render( <TestProviders> <DocumentDetailsContext.Provider value={context}> @@ -50,7 +60,7 @@ const renderSessionPreview = (context = panelContextValue) => ); describe('SessionPreviewContainer', () => { - afterEach(() => { + beforeEach(() => { jest.clearAllMocks(); }); @@ -127,7 +137,7 @@ describe('SessionPreviewContainer', () => { (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); const { getByTestId, queryByTestId } = renderSessionPreview({ - ...panelContextValue, + ...mockContextValue, isPreview: true, }); @@ -148,4 +158,74 @@ describe('SessionPreviewContainer', () => { queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)) ).not.toBeInTheDocument(); }); + + it('should not render link to session viewer if flyout is open in preview mode', () => { + (useSessionPreview as jest.Mock).mockReturnValue(sessionViewConfig); + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + + const { getByTestId, queryByTestId } = renderSessionPreview({ + ...mockContextValue, + isPreviewMode: true, + }); + + expect(getByTestId(SESSION_PREVIEW_TEST_ID)).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + }); + + describe('when visualization in flyout flag is enabled', () => { + it('should open left panel vizualization tab when visualization in flyout flag is on', () => { + mockUseUiSetting.mockReturnValue([true]); + (useSessionPreview as jest.Mock).mockReturnValue(sessionViewConfig); + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + + const { getByTestId } = renderSessionPreview(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)).click(); + + expect(mockNavigateToSessionView).toHaveBeenCalled(); + }); + + it('should not render link to session viewer if flyout is open in rule preview', () => { + (useSessionPreview as jest.Mock).mockReturnValue(sessionViewConfig); + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + + const { getByTestId, queryByTestId } = renderSessionPreview({ + ...mockContextValue, + isPreview: true, + }); + + expect(getByTestId(SESSION_PREVIEW_TEST_ID)).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + }); + + it('should not render link to session viewer if flyout is open in preview mode', () => { + (useSessionPreview as jest.Mock).mockReturnValue(sessionViewConfig); + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + + const { getByTestId, queryByTestId } = renderSessionPreview({ + ...mockContextValue, + isPreview: true, + }); + + expect(getByTestId(SESSION_PREVIEW_TEST_ID)).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx index aa97b904c1381..974c74b995393 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx @@ -8,10 +8,10 @@ import React, { type FC, useCallback } from 'react'; import { TimelineTabs } from '@kbn/securitysolution-data-table'; import { useDispatch } from 'react-redux'; -import { EuiLink, useEuiTheme } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { css } from '@emotion/css'; import { ExpandablePanel } from '@kbn/security-solution-common'; +import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +import { ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING } from '../../../../../common/constants'; import { useLicense } from '../../../../common/hooks/use_license'; import { SessionPreview } from './session_preview'; import { useSessionPreview } from '../hooks/use_session_preview'; @@ -22,6 +22,8 @@ import { SESSION_PREVIEW_TEST_ID } from './test_ids'; import { useStartTransaction } from '../../../../common/lib/apm/use_start_transaction'; import { setActiveTabTimeline } from '../../../../timelines/store/actions'; import { getScopedActions } from '../../../../helpers'; +import { useNavigateToSessionView } from '../../shared/hooks/use_navigate_to_session_view'; +import { SessionViewNoDataMessage } from '../../shared/components/session_view_no_data_message'; const timelineId = 'timeline-1'; @@ -29,8 +31,20 @@ const timelineId = 'timeline-1'; * Checks if the SessionView component is available, if so render it or else render an error message */ export const SessionPreviewContainer: FC = () => { - const { dataAsNestedObject, getFieldsData, isPreview, dataFormattedForFieldBrowser } = - useDocumentDetailsContext(); + const { + eventId, + indexName, + scopeId, + dataAsNestedObject, + getFieldsData, + isPreview, + isPreviewMode, + dataFormattedForFieldBrowser, + } = useDocumentDetailsContext(); + + const [visualizationInFlyoutEnabled] = useUiSetting$<boolean>( + ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING + ); // decide whether to show the session view or not const sessionViewConfig = useSessionPreview({ getFieldsData, dataFormattedForFieldBrowser }); @@ -64,54 +78,12 @@ export const SessionPreviewContainer: FC = () => { startTransaction, ]); - const { euiTheme } = useEuiTheme(); - - const noSessionMessage = !isEnterprisePlus ? ( - <FormattedMessage - id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellDescription" - defaultMessage="This feature requires an {subscription}" - values={{ - subscription: ( - <EuiLink href="https://www.elastic.co/pricing/" target="_blank"> - <FormattedMessage - id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellLinkText" - defaultMessage="Enterprise subscription" - /> - </EuiLink> - ), - }} - /> - ) : !sessionViewConfig ? ( - <FormattedMessage - id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataDescription" - defaultMessage="You can only view Linux session details if you’ve enabled the {setting} setting in your Elastic Defend integration policy. Refer to {link} for more information." - values={{ - setting: ( - <span - css={css` - font-weight: ${euiTheme.font.weight.bold}; - `} - > - <FormattedMessage - id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataSettingDescription" - defaultMessage="Include session data" - /> - </span> - ), - link: ( - <EuiLink - href="https://www.elastic.co/guide/en/security/current/session-view.html#enable-session-view" - target="_blank" - > - <FormattedMessage - id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataLinkText" - defaultMessage="Enable Session View data" - /> - </EuiLink> - ), - }} - /> - ) : null; + const { navigateToSessionView } = useNavigateToSessionView({ + eventId, + indexName, + isFlyoutOpen: true, + scopeId, + }); return ( <ExpandablePanel @@ -122,11 +94,12 @@ export const SessionPreviewContainer: FC = () => { defaultMessage="Session viewer preview" /> ), - iconType: 'timeline', + iconType: visualizationInFlyoutEnabled ? 'arrowStart' : 'timeline', ...(isEnabled && - !isPreview && { + !isPreview && + !isPreviewMode && { link: { - callback: goToSessionViewTab, + callback: visualizationInFlyoutEnabled ? navigateToSessionView : goToSessionViewTab, tooltip: ( <FormattedMessage id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTooltip" @@ -138,7 +111,14 @@ export const SessionPreviewContainer: FC = () => { }} data-test-subj={SESSION_PREVIEW_TEST_ID} > - {isEnabled ? <SessionPreview /> : noSessionMessage} + {isEnabled ? ( + <SessionPreview /> + ) : ( + <SessionViewNoDataMessage + isEnterprisePlus={isEnterprisePlus} + hasSessionViewConfig={sessionViewConfig !== null} + /> + )} </ExpandablePanel> ); }; 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 c62824a529e1a..9af61e21fb67d 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 @@ -24,7 +24,6 @@ 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'; jest.mock('../hooks/use_expand_section'); jest.mock('../../shared/hooks/use_alert_prevalence_from_process_tree', () => ({ @@ -32,9 +31,6 @@ jest.mock('../../shared/hooks/use_alert_prevalence_from_process_tree', () => ({ })); const mockUseAlertPrevalenceFromProcessTree = useAlertPrevalenceFromProcessTree as jest.Mock; -jest.mock('../../../../common/hooks/use_experimental_features'); -const mockUseIsExperimentalFeatureEnabled = useIsExperimentalFeatureEnabled as jest.Mock; - jest.mock('../../../../timelines/containers/use_timeline_data_filters', () => ({ useTimelineDataFilters: jest.fn(), })); @@ -54,6 +50,15 @@ jest.mock( '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver' ); +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 panelContextValue = { ...mockContextValue, dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, @@ -72,7 +77,6 @@ const renderVisualizationsSection = (contextValue = panelContextValue) => describe('<VisualizationsSection />', () => { beforeEach(() => { - mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); mockUseTimelineDataFilters.mockReturnValue({ selectedPatterns: ['index'] }); mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ loading: false, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.test.tsx new file mode 100644 index 0000000000000..49f0056c50c0a --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.test.tsx @@ -0,0 +1,61 @@ +/* + * Copyright 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 '@testing-library/jest-dom'; +import { TestProviders } from '../../../../common/mock'; +import { SESSION_VIEW_UPSELL_TEST_ID, SESSION_VIEW_NO_DATA_TEST_ID } from './test_ids'; +import { SessionViewNoDataMessage } from './session_view_no_data_message'; + +const NO_DATA_MESSAGE = + 'You can only view Linux session details if you’ve enabled the Include session data setting in your Elastic Defend integration policy. Refer to Enable Session View dataExternal link(opens in a new tab or window) for more information.'; + +const UPSELL_TEXT = 'This feature requires an Enterprise subscription'; + +const renderSessionViewNoDataMessage = ({ + isEnterprisePlus, + hasSessionViewConfig, +}: { + isEnterprisePlus: boolean; + hasSessionViewConfig: boolean; +}) => + render( + <TestProviders> + <SessionViewNoDataMessage + isEnterprisePlus={isEnterprisePlus} + hasSessionViewConfig={hasSessionViewConfig} + /> + </TestProviders> + ); + +describe('<SessionViewNoDataMessage />', () => { + it('renders license upsell message if license is not Enterprise', () => { + const { getByTestId } = renderSessionViewNoDataMessage({ + isEnterprisePlus: false, + hasSessionViewConfig: false, + }); + + expect(getByTestId(SESSION_VIEW_UPSELL_TEST_ID)).toHaveTextContent(UPSELL_TEXT); + }); + + it('renders no session view message if hasSessionViewConfig is false', () => { + const { getByTestId } = renderSessionViewNoDataMessage({ + isEnterprisePlus: true, + hasSessionViewConfig: false, + }); + expect(getByTestId(SESSION_VIEW_NO_DATA_TEST_ID)).toHaveTextContent(NO_DATA_MESSAGE); + }); + + it('renders null if neither is false', () => { + const { container } = renderSessionViewNoDataMessage({ + isEnterprisePlus: true, + hasSessionViewConfig: true, + }); + expect(container).toBeEmptyDOMElement(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.tsx new file mode 100644 index 0000000000000..032240c853a8c --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/session_view_no_data_message.tsx @@ -0,0 +1,87 @@ +/* + * Copyright 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 { FC } from 'react'; +import React from 'react'; +import { EuiLink, useEuiTheme } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/css'; +import { SESSION_VIEW_UPSELL_TEST_ID, SESSION_VIEW_NO_DATA_TEST_ID } from './test_ids'; + +interface SessionViewNoDataMessageProps { + /** + * Whether the user has an Enterprise Plus license + */ + isEnterprisePlus: boolean; + /** + * Whether the user has Session View configuration + */ + hasSessionViewConfig: boolean; +} + +/** + * Message displayed when the user does not have access to Session View + */ +export const SessionViewNoDataMessage: FC<SessionViewNoDataMessageProps> = ({ + isEnterprisePlus, + hasSessionViewConfig, +}) => { + const { euiTheme } = useEuiTheme(); + + return !isEnterprisePlus ? ( + <div data-test-subj={SESSION_VIEW_UPSELL_TEST_ID}> + <FormattedMessage + id={'xpack.securitySolution.flyout.sessionViewer.upsellDescription'} + defaultMessage="This feature requires an {subscription}" + values={{ + subscription: ( + <EuiLink href="https://www.elastic.co/pricing/" target="_blank"> + <FormattedMessage + id={'xpack.securitySolution.flyout.sessionViewer.upsellLinkText'} + defaultMessage="Enterprise subscription" + /> + </EuiLink> + ), + }} + /> + </div> + ) : !hasSessionViewConfig ? ( + <div data-test-subj={SESSION_VIEW_NO_DATA_TEST_ID}> + <FormattedMessage + id={'xpack.securitySolution.flyout.sessionViewer.noDataDescription'} + defaultMessage="You can only view Linux session details if you’ve enabled the {setting} setting in your Elastic Defend integration policy. Refer to {link} for more information." + values={{ + setting: ( + <span + css={css` + font-weight: ${euiTheme.font.weight.bold}; + `} + > + <FormattedMessage + id={'xpack.securitySolution.flyout.sessionViewer.noDataSettingDescription'} + defaultMessage="Include session data" + /> + </span> + ), + link: ( + <EuiLink + href="https://www.elastic.co/guide/en/security/current/session-view.html#enable-session-view" + target="_blank" + > + <FormattedMessage + id={'xpack.securitySolution.flyout.sessionViewer.noDataLinkText'} + defaultMessage="Enable Session View data" + /> + </EuiLink> + ), + }} + /> + </div> + ) : null; +}; + +SessionViewNoDataMessage.displayName = 'SessionViewNoDataMessage'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/test_ids.ts index 9939ca27886b7..8561df63d7199 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/components/test_ids.ts @@ -9,3 +9,6 @@ import { PREFIX } from '../../../shared/test_ids'; export const FLYOUT_TOUR_TEST_ID = `${PREFIX}Tour` as const; export const FLYOUT_PREVIEW_LINK_TEST_ID = `${PREFIX}PreviewLink` as const; + +export const SESSION_VIEW_UPSELL_TEST_ID = `${PREFIX}SessionViewUpsell` as const; +export const SESSION_VIEW_NO_DATA_TEST_ID = `${PREFIX}SessionViewNoData` as const; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx new file mode 100644 index 0000000000000..7ae0601d37ce9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useNavigateToAnalyzer } from './use_navigate_to_analyzer'; +import { mockFlyoutApi } from '../mocks/mock_flyout_context'; +import { useWhichFlyout } from './use_which_flyout'; +import { useKibana as mockUseKibana } from '../../../../common/lib/kibana/__mocks__'; +import { useKibana } from '../../../../common/lib/kibana'; +import { + DocumentDetailsRightPanelKey, + DocumentDetailsLeftPanelKey, + DocumentDetailsAnalyzerPanelKey, +} from '../constants/panel_keys'; +import { ANALYZE_GRAPH_ID, ANALYZER_PREVIEW_BANNER } from '../../left/components/analyze_graph'; + +jest.mock('@kbn/expandable-flyout'); +jest.mock('../../../../common/lib/kibana'); +jest.mock('./use_which_flyout'); + +const mockedUseKibana = mockUseKibana(); +(useKibana as jest.Mock).mockReturnValue(mockedUseKibana); + +const mockUseWhichFlyout = useWhichFlyout as jest.Mock; +const FLYOUT_KEY = 'securitySolution'; + +const eventId = 'eventId1'; +const indexName = 'index1'; +const scopeId = 'scopeId1'; + +describe('useNavigateToAnalyzer', () => { + beforeEach(() => { + jest.clearAllMocks(); + mockUseWhichFlyout.mockReturnValue(FLYOUT_KEY); + jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); + }); + + it('when isFlyoutOpen is true, should return callback that opens left and preview panels', () => { + const hookResult = renderHook(() => + useNavigateToAnalyzer({ isFlyoutOpen: true, eventId, indexName, scopeId }) + ); + hookResult.result.current.navigateToAnalyzer(); + + expect(mockFlyoutApi.openLeftPanel).toHaveBeenCalledWith({ + id: DocumentDetailsLeftPanelKey, + path: { + tab: 'visualize', + subTab: ANALYZE_GRAPH_ID, + }, + params: { + id: eventId, + indexName, + scopeId, + }, + }); + + expect(mockFlyoutApi.openPreviewPanel).toHaveBeenCalledWith({ + id: DocumentDetailsAnalyzerPanelKey, + params: { + resolverComponentInstanceID: `${FLYOUT_KEY}-${scopeId}`, + banner: ANALYZER_PREVIEW_BANNER, + }, + }); + }); + + it('when isFlyoutOpen is false, should return callback that opens a new flyout', () => { + const hookResult = renderHook(() => + useNavigateToAnalyzer({ isFlyoutOpen: false, eventId, indexName, scopeId }) + ); + hookResult.result.current.navigateToAnalyzer(); + expect(mockFlyoutApi.openFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, + params: { + id: eventId, + indexName, + scopeId, + }, + }, + left: { + id: DocumentDetailsLeftPanelKey, + path: { + tab: 'visualize', + subTab: ANALYZE_GRAPH_ID, + }, + params: { + id: eventId, + indexName, + scopeId, + }, + }, + preview: { + id: DocumentDetailsAnalyzerPanelKey, + params: { + resolverComponentInstanceID: `${FLYOUT_KEY}-${scopeId}`, + banner: ANALYZER_PREVIEW_BANNER, + }, + }, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.tsx new file mode 100644 index 0000000000000..448f2c081c946 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.tsx @@ -0,0 +1,133 @@ +/* + * Copyright 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 { useCallback, useMemo } from 'react'; +import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import type { Maybe } from '@kbn/timelines-plugin/common/search_strategy/common'; +import { useKibana } from '../../../../common/lib/kibana'; +import { useWhichFlyout } from './use_which_flyout'; +import { ANALYZE_GRAPH_ID, ANALYZER_PREVIEW_BANNER } from '../../left/components/analyze_graph'; +import { + DocumentDetailsLeftPanelKey, + DocumentDetailsRightPanelKey, + DocumentDetailsAnalyzerPanelKey, +} from '../constants/panel_keys'; + +export interface UseNavigateToAnalyzerParams { + /** + * When flyout is already open, call open left panel only + * When flyout is not open, open a new flyout + */ + isFlyoutOpen: boolean; + /** + * Id of the document + */ + eventId: string; + /** + * Name of the index used in the parent's page + */ + indexName: Maybe<string> | undefined; + /** + * Scope id of the page + */ + scopeId: string; +} + +export interface UseNavigateToAnalyzerResult { + /** + * Callback to open analyzer in visualize tab + */ + navigateToAnalyzer: () => void; +} + +/** + * Hook that returns the a callback to navigate to the analyzer in the flyout + */ +export const useNavigateToAnalyzer = ({ + isFlyoutOpen, + eventId, + indexName, + scopeId, +}: UseNavigateToAnalyzerParams): UseNavigateToAnalyzerResult => { + const { telemetry } = useKibana().services; + const { openLeftPanel, openPreviewPanel, openFlyout } = useExpandableFlyoutApi(); + const key = useWhichFlyout() ?? 'memory'; + + const right: FlyoutPanelProps = useMemo( + () => ({ + id: DocumentDetailsRightPanelKey, + params: { + id: eventId, + indexName, + scopeId, + }, + }), + [eventId, indexName, scopeId] + ); + + const left: FlyoutPanelProps = useMemo( + () => ({ + id: DocumentDetailsLeftPanelKey, + params: { + id: eventId, + indexName, + scopeId, + }, + path: { + tab: 'visualize', + subTab: ANALYZE_GRAPH_ID, + }, + }), + [eventId, indexName, scopeId] + ); + + const preview: FlyoutPanelProps = useMemo( + () => ({ + id: DocumentDetailsAnalyzerPanelKey, + params: { + resolverComponentInstanceID: `${key}-${scopeId}`, + banner: ANALYZER_PREVIEW_BANNER, + }, + }), + [key, scopeId] + ); + + const navigateToAnalyzer = useCallback(() => { + if (isFlyoutOpen) { + openLeftPanel(left); + openPreviewPanel(preview); + telemetry.reportDetailsFlyoutTabClicked({ + location: scopeId, + panel: 'left', + tabId: 'visualize', + }); + } else { + openFlyout({ + right, + left, + preview, + }); + telemetry.reportDetailsFlyoutOpened({ + location: scopeId, + panel: 'left', + }); + } + }, [ + openFlyout, + openLeftPanel, + openPreviewPanel, + right, + left, + preview, + scopeId, + telemetry, + isFlyoutOpen, + ]); + + return useMemo(() => ({ navigateToAnalyzer }), [navigateToAnalyzer]); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx new file mode 100644 index 0000000000000..c0f85e07377df --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useNavigateToSessionView } from './use_navigate_to_session_view'; +import { mockFlyoutApi } from '../mocks/mock_flyout_context'; +import { useKibana as mockUseKibana } from '../../../../common/lib/kibana/__mocks__'; +import { useKibana } from '../../../../common/lib/kibana'; +import { DocumentDetailsRightPanelKey, DocumentDetailsLeftPanelKey } from '../constants/panel_keys'; +import { SESSION_VIEW_ID } from '../../left/components/session_view'; + +jest.mock('@kbn/expandable-flyout'); +jest.mock('../../../../common/lib/kibana'); + +const mockedUseKibana = mockUseKibana(); +(useKibana as jest.Mock).mockReturnValue(mockedUseKibana); + +const eventId = 'eventId1'; +const indexName = 'index1'; +const scopeId = 'scopeId1'; + +describe('useNavigateToSessionView', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.mocked(useExpandableFlyoutApi).mockReturnValue(mockFlyoutApi); + }); + + it('when isFlyoutOpen is true, should return callback that opens left panel', () => { + const hookResult = renderHook(() => + useNavigateToSessionView({ isFlyoutOpen: true, eventId, indexName, scopeId }) + ); + hookResult.result.current.navigateToSessionView(); + + expect(mockFlyoutApi.openLeftPanel).toHaveBeenCalledWith({ + id: DocumentDetailsLeftPanelKey, + path: { + tab: 'visualize', + subTab: SESSION_VIEW_ID, + }, + params: { + id: eventId, + indexName, + scopeId, + }, + }); + }); + + it('when isFlyoutOpen is false, should return callback that opens a new flyout', () => { + const hookResult = renderHook(() => + useNavigateToSessionView({ isFlyoutOpen: false, eventId, indexName, scopeId }) + ); + hookResult.result.current.navigateToSessionView(); + expect(mockFlyoutApi.openFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, + params: { + id: eventId, + indexName, + scopeId, + }, + }, + left: { + id: DocumentDetailsLeftPanelKey, + path: { + tab: 'visualize', + subTab: SESSION_VIEW_ID, + }, + params: { + id: eventId, + indexName, + scopeId, + }, + }, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.tsx new file mode 100644 index 0000000000000..b8234321217e6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.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 { useCallback, useMemo } from 'react'; +import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import type { Maybe } from '@kbn/timelines-plugin/common/search_strategy/common'; +import { useKibana } from '../../../../common/lib/kibana'; +import { SESSION_VIEW_ID } from '../../left/components/session_view'; +import { DocumentDetailsLeftPanelKey, DocumentDetailsRightPanelKey } from '../constants/panel_keys'; + +export interface UseNavigateToSessionViewParams { + /** + * When flyout is already open, call open left panel only + * When flyout is not open, open a new flyout + */ + isFlyoutOpen: boolean; + /** + * Id of the document + */ + eventId: string; + /** + * Name of the index used in the parent's page + */ + indexName: Maybe<string> | undefined; + /** + * Scope id of the page + */ + scopeId: string; +} + +export interface UseNavigateToSessionViewResult { + /** + * Callback to open session view in visualize tab + */ + navigateToSessionView: () => void; +} + +/** + * Hook that returns the a callback to navigate to session view in the flyout + */ +export const useNavigateToSessionView = ({ + isFlyoutOpen, + eventId, + indexName, + scopeId, +}: UseNavigateToSessionViewParams): UseNavigateToSessionViewResult => { + const { telemetry } = useKibana().services; + const { openLeftPanel, openFlyout } = useExpandableFlyoutApi(); + + const right: FlyoutPanelProps = useMemo( + () => ({ + id: DocumentDetailsRightPanelKey, + params: { + id: eventId, + indexName, + scopeId, + }, + }), + [eventId, indexName, scopeId] + ); + + const left: FlyoutPanelProps = useMemo( + () => ({ + id: DocumentDetailsLeftPanelKey, + params: { + id: eventId, + indexName, + scopeId, + }, + path: { + tab: 'visualize', + subTab: SESSION_VIEW_ID, + }, + }), + [eventId, indexName, scopeId] + ); + + const navigateToSessionView = useCallback(() => { + if (isFlyoutOpen) { + openLeftPanel(left); + telemetry.reportDetailsFlyoutTabClicked({ + location: scopeId, + panel: 'left', + tabId: 'visualize', + }); + } else { + openFlyout({ + right, + left, + }); + telemetry.reportDetailsFlyoutOpened({ + location: scopeId, + panel: 'left', + }); + } + }, [openFlyout, openLeftPanel, right, left, scopeId, telemetry, isFlyoutOpen]); + + return useMemo(() => ({ navigateToSessionView }), [navigateToSessionView]); +}; diff --git a/x-pack/plugins/security_solution/server/ui_settings.ts b/x-pack/plugins/security_solution/server/ui_settings.ts index d3f382538eeca..36b6a5a6582c8 100644 --- a/x-pack/plugins/security_solution/server/ui_settings.ts +++ b/x-pack/plugins/security_solution/server/ui_settings.ts @@ -39,6 +39,7 @@ import { EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER, EXCLUDED_DATA_TIERS_FOR_RULE_EXECUTION, ENABLE_ASSET_CRITICALITY_SETTING, + ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING, } from '../common/constants'; import type { ExperimentalFeatures } from '../common/experimental_features'; import { LogLevelSetting } from '../common/api/detection_engine/rule_monitoring'; @@ -216,6 +217,24 @@ export const initUiSettings = ( requiresPageReload: true, schema: schema.boolean(), }, + [ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING]: { + name: i18n.translate('xpack.securitySolution.uiSettings.enableVisualizationsInFlyoutLabel', { + defaultMessage: 'Enable visualizations in flyout', + }), + value: false, + description: i18n.translate( + 'xpack.securitySolution.uiSettings.enableVisualizationsInFlyoutDescription', + { + defaultMessage: + '<em>[technical preview]</em> Enable visualizations (analyzer and session viewer) in flyout.', + values: { em: (chunks) => `<em>${chunks}</em>` }, + } + ), + type: 'boolean', + category: [APP_ID], + requiresPageReload: true, + schema: schema.boolean(), + }, [DEFAULT_RULES_TABLE_REFRESH_SETTING]: { name: i18n.translate('xpack.securitySolution.uiSettings.rulesTableRefresh', { defaultMessage: 'Rules auto refresh', diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 06b9b42e4b8b9..7601e3e48b1fe 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -39035,16 +39035,11 @@ "xpack.securitySolution.flyout.right.visualizations.assignees.popoverTooltip": "Assigner une alerte", "xpack.securitySolution.flyout.right.visualizations.sectionTitle": "Visualisations", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.commandDescription": "par", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataDescription": "Vous ne pouvez afficher les détails de la session Linux que si vous avez activé le paramètre {setting} dans votre politique d'intégration Elastic Defend. Pour en savoir plus, consultez {link}.", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataLinkText": "Activer les données de vue de session", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataSettingDescription": "Inclure les données de session", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.processDescription": "démarré", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.ruleDescription": "avec la règle", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTitle": "Aperçu du visualiseur de session", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTooltip": "Investiguer dans la chronologie", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.timeDescription": "à", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellDescription": "Cette fonctionnalité requiert un {subscription}", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellLinkText": "Abonnement Enterprise", "xpack.securitySolution.flyout.tour.entities.description": "Consultez la vue {entities} étendue pour en savoir plus sur les hôtes et les utilisateurs liés à l'alerte.", "xpack.securitySolution.flyout.tour.entities.text": "Entités", "xpack.securitySolution.flyout.tour.entities.title": "De nouvelles informations sur les hôtes et les utilisateurs sont disponibles", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f54abfcf29bb3..6be35ea91f84c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -38777,16 +38777,11 @@ "xpack.securitySolution.flyout.right.visualizations.assignees.popoverTooltip": "アラートの割り当て", "xpack.securitySolution.flyout.right.visualizations.sectionTitle": "ビジュアライゼーション", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.commandDescription": "グループ基準", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataDescription": "Linuxセッションの詳細を表示できるのは、Elastic Defendの統合ポリシーで{setting}設定を有効にしている場合のみです。詳細については、{link}を参照してください。", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataLinkText": "セッションビューデータを有効化", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataSettingDescription": "セッションデータを含める", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.processDescription": "開始済み", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.ruleDescription": "ルールがある", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTitle": "セッションビューアープレビュー", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTooltip": "タイムラインで調査", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.timeDescription": "に", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellDescription": "この機能には{subscription}が必要です", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellLinkText": "エンタープライズサブスクリプション", "xpack.securitySolution.flyout.tour.entities.description": "アラートに関連付けられたホストとユーザーの詳細については、展開された{entities}ビューを確認してください。", "xpack.securitySolution.flyout.tour.entities.text": "エンティティ", "xpack.securitySolution.flyout.tour.entities.title": "新しいホストとユーザーのインサイトがあります", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 7899d8a68f04c..b06da5e8b9bd5 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -38823,16 +38823,11 @@ "xpack.securitySolution.flyout.right.visualizations.assignees.popoverTooltip": "分配告警", "xpack.securitySolution.flyout.right.visualizations.sectionTitle": "可视化", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.commandDescription": "依据", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataDescription": "如果已在 Elastic Defend 集成策略中启用 {setting} 设置,则您只能查看 Linux 会话详情。请参阅 {link} 了解更多信息。", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataLinkText": "启用会话视图数据", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataSettingDescription": "包括会话数据", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.processDescription": "已启动", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.ruleDescription": "具有规则", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTitle": "会话查看器预览", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTooltip": "在时间线中调查", "xpack.securitySolution.flyout.right.visualizations.sessionPreview.timeDescription": "处于", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellDescription": "此功能需要{subscription}", - "xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellLinkText": "企业级订阅", "xpack.securitySolution.flyout.tour.entities.description": "请查阅展开的 {entities} 视图以了解与该告警有关的主机和用户的更多信息。", "xpack.securitySolution.flyout.tour.entities.text": "实体", "xpack.securitySolution.flyout.tour.entities.title": "有新主机和用户洞见可用", From ca46f784e5185bbce503171e6432e960c94f2586 Mon Sep 17 00:00:00 2001 From: Philippe Oberti <philippe.oberti@elastic.co> Date: Tue, 1 Oct 2024 15:44:41 -0500 Subject: [PATCH 085/107] [Security Solution][Notes] - fetch notes by saved object ids (#193930) --- .../output/kibana.serverless.staging.yaml | 10 + oas_docs/output/kibana.staging.yaml | 10 + .../timeline/get_notes/get_notes_route.gen.ts | 4 + .../get_notes/get_notes_route.schema.yaml | 10 + ...imeline_api_2023_10_31.bundled.schema.yaml | 10 + ...imeline_api_2023_10_31.bundled.schema.yaml | 10 + .../public/common/mock/global_state.ts | 2 + .../left/components/add_note.tsx | 206 ----------- .../attach_to_active_timeline.test.tsx | 122 +++++++ .../components/attach_to_active_timeline.tsx | 133 +++++++ .../left/components/notes_details.test.tsx | 148 +++++++- .../left/components/notes_details.tsx | 104 +++++- .../left/components/notes_list.test.tsx | 307 ---------------- .../left/components/notes_list.tsx | 211 ----------- .../left/components/test_ids.ts | 10 +- .../security_solution/public/notes/api/api.ts | 14 + .../components/add_note.test.tsx | 93 +---- .../public/notes/components/add_note.tsx | 148 ++++++++ .../components/delete_note_button.test.tsx | 120 +++++++ .../notes/components/delete_note_button.tsx | 85 +++++ .../notes/components/notes_list.test.tsx | 145 ++++++++ .../public/notes/components/notes_list.tsx | 100 ++++++ .../components/open_flyout_button.test.tsx | 62 ++++ .../notes/components/open_flyout_button.tsx | 74 ++++ .../components/open_timeline_button.test.tsx | 61 ++++ .../notes/components/open_timeline_button.tsx | 59 ++++ .../public/notes/components/test_ids.ts | 19 + .../public/notes/store/notes.slice.test.ts | 179 +++++++++- .../public/notes/store/notes.slice.ts | 68 +++- .../actions/save_timeline_button.test.tsx | 21 ++ .../modal/actions/save_timeline_button.tsx | 109 +++--- .../timelines/components/notes/old_notes.tsx | 202 +++++++++++ .../components/notes/participants.test.tsx | 77 ++++ .../components/notes/participants.tsx | 144 ++++++++ .../components/notes/save_timeline.test.tsx | 43 +++ .../components/notes/save_timeline.tsx | 65 ++++ .../timelines/components/notes/test_ids.ts | 15 + .../note_previews/index.test.tsx | 4 +- .../components/timeline/tabs/index.tsx | 44 ++- .../timeline/tabs/notes/index.test.tsx | 221 ++++++++++++ .../components/timeline/tabs/notes/index.tsx | 334 +++++++++--------- .../query_tab_unified_components.test.tsx | 3 +- .../timeline/routes/notes/get_notes.test.ts | 121 ++++++- .../lib/timeline/routes/notes/get_notes.ts | 30 ++ 44 files changed, 2889 insertions(+), 1068 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx delete mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx rename x-pack/plugins/security_solution/public/{flyout/document_details/left => notes}/components/add_note.test.tsx (57%) create mode 100644 x-pack/plugins/security_solution/public/notes/components/add_note.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/delete_note_button.test.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/delete_note_button.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/notes_list.test.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/notes_list.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/open_flyout_button.test.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/open_timeline_button.test.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/open_timeline_button.tsx create mode 100644 x-pack/plugins/security_solution/public/notes/components/test_ids.ts create mode 100644 x-pack/plugins/security_solution/public/timelines/components/notes/old_notes.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/notes/participants.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/notes/participants.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/notes/test_ids.ts create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.test.tsx diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index 621efdc026eea..8fd6d8c7be347 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -14921,6 +14921,10 @@ paths: name: documentIds schema: $ref: '#/components/schemas/Security_Timeline_API_DocumentIds' + - in: query + name: savedObjectIds + schema: + $ref: '#/components/schemas/Security_Timeline_API_SavedObjectIds' - in: query name: page schema: @@ -31674,6 +31678,12 @@ components: - threat_match - zeek type: string + Security_Timeline_API_SavedObjectIds: + oneOf: + - items: + type: string + type: array + - type: string Security_Timeline_API_SavedObjectResolveAliasPurpose: enum: - savedObjectConversion diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index 79960c7287336..eb25c65d433fa 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -18351,6 +18351,10 @@ paths: name: documentIds schema: $ref: '#/components/schemas/Security_Timeline_API_DocumentIds' + - in: query + name: savedObjectIds + schema: + $ref: '#/components/schemas/Security_Timeline_API_SavedObjectIds' - in: query name: page schema: @@ -39683,6 +39687,12 @@ components: - threat_match - zeek type: string + Security_Timeline_API_SavedObjectIds: + oneOf: + - items: + type: string + type: array + - type: string Security_Timeline_API_SavedObjectResolveAliasPurpose: enum: - savedObjectConversion 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 5851b95d4d606..c4c48022f6512 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 @@ -21,6 +21,9 @@ import { Note } from '../model/components.gen'; export type DocumentIds = z.infer<typeof DocumentIds>; export const DocumentIds = z.union([z.array(z.string()), z.string()]); +export type SavedObjectIds = z.infer<typeof SavedObjectIds>; +export const SavedObjectIds = z.union([z.array(z.string()), z.string()]); + export type GetNotesResult = z.infer<typeof GetNotesResult>; export const GetNotesResult = z.object({ totalCount: z.number(), @@ -30,6 +33,7 @@ export const GetNotesResult = z.object({ export type GetNotesRequestQuery = z.infer<typeof GetNotesRequestQuery>; export const GetNotesRequestQuery = z.object({ documentIds: DocumentIds.optional(), + savedObjectIds: SavedObjectIds.optional(), page: z.string().nullable().optional(), perPage: z.string().nullable().optional(), search: z.string().nullable().optional(), 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 793eeac5e7c71..985e7728b7cc8 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 @@ -17,6 +17,10 @@ paths: in: query schema: $ref: '#/components/schemas/DocumentIds' + - name: savedObjectIds + in: query + schema: + $ref: '#/components/schemas/SavedObjectIds' - name: page in: query schema: @@ -65,6 +69,12 @@ components: items: type: string - type: string + SavedObjectIds: + oneOf: + - type: array + items: + type: string + - type: string GetNotesResult: type: object required: [totalCount, notes] 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 e36af57a2b3e9..68740efb388a4 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 @@ -63,6 +63,10 @@ paths: name: documentIds schema: $ref: '#/components/schemas/DocumentIds' + - in: query + name: savedObjectIds + schema: + $ref: '#/components/schemas/SavedObjectIds' - in: query name: page schema: @@ -1359,6 +1363,12 @@ components: - threat_match - zeek type: string + SavedObjectIds: + oneOf: + - items: + type: string + type: array + - type: string SavedObjectResolveAliasPurpose: enum: - savedObjectConversion 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 818b83d7b85dd..cfcb36e2dee75 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 @@ -63,6 +63,10 @@ paths: name: documentIds schema: $ref: '#/components/schemas/DocumentIds' + - in: query + name: savedObjectIds + schema: + $ref: '#/components/schemas/SavedObjectIds' - in: query name: page schema: @@ -1359,6 +1363,12 @@ components: - threat_match - zeek type: string + SavedObjectIds: + oneOf: + - items: + type: string + type: array + - type: string SavedObjectResolveAliasPurpose: enum: - savedObjectConversion 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 e3f9f19192a6b..16e1e7edf0eaa 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 @@ -527,12 +527,14 @@ export const mockGlobalState: State = { ids: ['1'], status: { fetchNotesByDocumentIds: ReqStatus.Idle, + fetchNotesBySavedObjectIds: ReqStatus.Idle, createNote: ReqStatus.Idle, deleteNotes: ReqStatus.Idle, fetchNotes: ReqStatus.Idle, }, error: { fetchNotesByDocumentIds: null, + fetchNotesBySavedObjectIds: null, createNote: null, deleteNotes: null, fetchNotes: null, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.tsx deleted file mode 100644 index 5e4e390ac5077..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.tsx +++ /dev/null @@ -1,206 +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, { memo, useCallback, useEffect, useMemo, useState } from 'react'; -import { - EuiButton, - EuiCheckbox, - EuiComment, - EuiCommentList, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiSpacer, - EuiToolTip, - useEuiTheme, -} from '@elastic/eui'; -import { css } from '@emotion/react'; -import { useDispatch, useSelector } from 'react-redux'; -import { i18n } from '@kbn/i18n'; -import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; -import { Flyouts } from '../../shared/constants/flyouts'; -import { useKibana } from '../../../../common/lib/kibana'; -import { TimelineId } from '../../../../../common/types'; -import { timelineSelectors } from '../../../../timelines/store'; -import { - ADD_NOTE_BUTTON_TEST_ID, - ADD_NOTE_MARKDOWN_TEST_ID, - ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID, -} from './test_ids'; -import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import type { State } from '../../../../common/store'; -import { - createNote, - ReqStatus, - selectCreateNoteError, - selectCreateNoteStatus, -} from '../../../../notes/store/notes.slice'; -import { MarkdownEditor } from '../../../../common/components/markdown_editor'; - -const timelineCheckBoxId = 'xpack.securitySolution.flyout.left.notes.attachToTimelineCheckboxId'; - -export const MARKDOWN_ARIA_LABEL = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.markdownAriaLabel', - { - defaultMessage: 'Note', - } -); -export const ADD_NOTE_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.addNoteBtnLabel', - { - defaultMessage: 'Add note', - } -); -export const CREATE_NOTE_ERROR = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.createNoteErrorLabel', - { - defaultMessage: 'Error create note', - } -); -export const ATTACH_TO_TIMELINE_CHECKBOX = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.attachToTimelineCheckboxLabel', - { - defaultMessage: 'Attach to active timeline', - } -); -export const ATTACH_TO_TIMELINE_INFO = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.attachToTimelineInfoLabel', - { - defaultMessage: 'The active timeline must be saved before a note can be associated with it', - } -); - -export interface AddNewNoteProps { - /** - * Id of the document - */ - eventId: string; -} - -/** - * Renders a markdown editor and an add button to create new notes. - * The checkbox is automatically checked if the flyout is opened from a timeline and that timeline is saved. It is disabled if the flyout is NOT opened from a timeline. - */ -export const AddNote = memo(({ eventId }: AddNewNoteProps) => { - const { telemetry } = useKibana().services; - const { euiTheme } = useEuiTheme(); - const dispatch = useDispatch(); - const { addError: addErrorToast } = useAppToasts(); - const [editorValue, setEditorValue] = useState(''); - const [isMarkdownInvalid, setIsMarkdownInvalid] = useState(false); - - const activeTimeline = useSelector((state: State) => - timelineSelectors.selectTimelineById(state, TimelineId.active) - ); - - // if the flyout is open from a timeline and that timeline is saved, we automatically check the checkbox to associate the note to it - const isTimelineFlyout = useWhichFlyout() === Flyouts.timeline; - - const [checked, setChecked] = useState<boolean>(true); - const onCheckboxChange = useCallback( - (e: React.ChangeEvent<HTMLInputElement>) => setChecked(e.target.checked), - [] - ); - - const createStatus = useSelector((state: State) => selectCreateNoteStatus(state)); - const createError = useSelector((state: State) => selectCreateNoteError(state)); - - const addNote = useCallback(() => { - dispatch( - createNote({ - note: { - timelineId: (checked && activeTimeline?.savedObjectId) || '', - eventId, - note: editorValue, - }, - }) - ); - telemetry.reportAddNoteFromExpandableFlyoutClicked({ - isRelatedToATimeline: checked && activeTimeline?.savedObjectId !== null, - }); - setEditorValue(''); - }, [activeTimeline?.savedObjectId, checked, dispatch, editorValue, eventId, telemetry]); - - // show a toast if the create note call fails - useEffect(() => { - if (createStatus === ReqStatus.Failed && createError) { - addErrorToast(null, { - title: CREATE_NOTE_ERROR, - }); - } - }, [addErrorToast, createError, createStatus]); - - const buttonDisabled = useMemo( - () => editorValue.trim().length === 0 || isMarkdownInvalid, - [editorValue, isMarkdownInvalid] - ); - - const initialCheckboxChecked = useMemo( - () => isTimelineFlyout && activeTimeline.savedObjectId != null, - [activeTimeline?.savedObjectId, isTimelineFlyout] - ); - - const checkBoxDisabled = useMemo( - () => !isTimelineFlyout || (isTimelineFlyout && activeTimeline?.savedObjectId == null), - [activeTimeline?.savedObjectId, isTimelineFlyout] - ); - - return ( - <> - <EuiCommentList> - <EuiComment username=""> - <MarkdownEditor - dataTestSubj={ADD_NOTE_MARKDOWN_TEST_ID} - value={editorValue} - onChange={setEditorValue} - ariaLabel={MARKDOWN_ARIA_LABEL} - setIsMarkdownInvalid={setIsMarkdownInvalid} - /> - </EuiComment> - </EuiCommentList> - <EuiSpacer /> - <EuiFlexGroup alignItems="center" justifyContent="flexEnd" responsive={false}> - <EuiFlexItem grow={false}> - <> - <EuiCheckbox - data-test-subj={ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID} - id={timelineCheckBoxId} - label={ - <> - {ATTACH_TO_TIMELINE_CHECKBOX} - <EuiToolTip position="top" content={ATTACH_TO_TIMELINE_INFO}> - <EuiIcon - type="iInCircle" - css={css` - margin-left: ${euiTheme.size.s}; - `} - /> - </EuiToolTip> - </> - } - disabled={checkBoxDisabled} - checked={initialCheckboxChecked && checked} - onChange={(e) => onCheckboxChange(e)} - /> - </> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiButton - onClick={addNote} - isLoading={createStatus === ReqStatus.Loading} - disabled={buttonDisabled} - data-test-subj={ADD_NOTE_BUTTON_TEST_ID} - > - {ADD_NOTE_BUTTON} - </EuiButton> - </EuiFlexItem> - </EuiFlexGroup> - </> - ); -}); - -AddNote.displayName = 'AddNote'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx new file mode 100644 index 0000000000000..383750e05a006 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx @@ -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 { render } from '@testing-library/react'; +import React from 'react'; +import { + ATTACH_TO_TIMELINE_CALLOUT_TEST_ID, + ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID, + SAVE_TIMELINE_BUTTON_TEST_ID, +} from './test_ids'; +import { AttachToActiveTimeline } from './attach_to_active_timeline'; +import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; +import { TimelineId } from '../../../../../common/types'; + +const mockSetAttachToTimeline = jest.fn(); + +describe('AttachToActiveTimeline', () => { + it('should render the component for an unsaved timeline', () => { + const mockStore = createMockStore({ + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + }, + }, + }, + }); + + const { getByTestId, getByText, queryByTestId } = render( + <TestProviders store={mockStore}> + <AttachToActiveTimeline + setAttachToTimeline={mockSetAttachToTimeline} + isCheckboxDisabled={false} + /> + </TestProviders> + ); + + expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toBeInTheDocument(); + expect(queryByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).not.toBeInTheDocument(); + + expect(getByText('Attach to timeline')).toBeInTheDocument(); + expect( + getByText('Before attaching a note to the timeline, you need to save the timeline first.') + ).toBeInTheDocument(); + + expect(getByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); + }); + + it('should render the saved timeline texts in the callout', () => { + const mockStore = createMockStore({ + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + savedObjectId: 'savedObjectId', + }, + }, + }, + }); + + const { getByTestId, getByText, queryByTestId } = render( + <TestProviders store={mockStore}> + <AttachToActiveTimeline + setAttachToTimeline={mockSetAttachToTimeline} + isCheckboxDisabled={false} + /> + </TestProviders> + ); + expect(getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).toBeInTheDocument(); + expect(queryByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).not.toBeInTheDocument(); + expect(getByText('Attach to timeline')).toBeInTheDocument(); + expect( + getByText('You can associate the newly created note to the active timeline.') + ).toBeInTheDocument(); + expect(getByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); + }); + + it('should call the callback when user click on the checkbox', () => { + const mockStore = createMockStore({ + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + savedObjectId: 'savedObjectId', + }, + }, + }, + }); + + const { getByTestId } = render( + <TestProviders store={mockStore}> + <AttachToActiveTimeline + setAttachToTimeline={mockSetAttachToTimeline} + isCheckboxDisabled={false} + /> + </TestProviders> + ); + + const checkbox = getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID); + + checkbox.click(); + + expect(mockSetAttachToTimeline).toHaveBeenCalledWith(false); + + checkbox.click(); + + expect(mockSetAttachToTimeline).toHaveBeenCalledWith(true); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx new file mode 100644 index 0000000000000..278830da7e27f --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx @@ -0,0 +1,133 @@ +/* + * Copyright 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, useCallback, useMemo, useState } from 'react'; +import { EuiCallOut, EuiCheckbox, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import { useSelector } from 'react-redux'; +import type { State } from '../../../../common/store'; +import { TimelineId } from '../../../../../common/types'; +import { SaveTimelineButton } from '../../../../timelines/components/modal/actions/save_timeline_button'; +import { + ATTACH_TO_TIMELINE_CALLOUT_TEST_ID, + ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID, + SAVE_TIMELINE_BUTTON_TEST_ID, +} from './test_ids'; +import { timelineSelectors } from '../../../../timelines/store'; + +const timelineCheckBoxId = 'xpack.securitySolution.flyout.notes.attachToTimeline.checkboxId'; + +export const ATTACH_TO_TIMELINE_CALLOUT_TITLE = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.attachToTimeline.calloutTitle', + { + defaultMessage: 'Attach to timeline', + } +); +export const SAVED_TIMELINE_CALLOUT_CONTENT = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.attachToTimeline.calloutContent', + { + defaultMessage: 'You can associate the newly created note to the active timeline.', + } +); +export const UNSAVED_TIMELINE_CALLOUT_CONTENT = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.attachToTimeline.calloutContent', + { + defaultMessage: 'Before attaching a note to the timeline, you need to save the timeline first.', + } +); +export const ATTACH_TO_TIMELINE_CHECKBOX = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.attachToTimeline.checkboxLabel', + { + defaultMessage: 'Attach to active timeline', + } +); +export const SAVE_TIMELINE_BUTTON = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.savedTimelineButtonLabel', + { + defaultMessage: 'Save timeline', + } +); + +export interface AttachToActiveTimelineProps { + /** + * Let the parent component know if the user wants to attach the note to the timeline + */ + setAttachToTimeline: (checked: boolean) => void; + /** + * Disables the checkbox (if timeline is not saved) + */ + isCheckboxDisabled: boolean; +} + +/** + * Renders a callout and a checkbox to allow the user to attach a timeline id to a note. + * If the active timeline is saved, the UI renders a checkbox to allow the user to attach the note to the timeline. + * If the active timeline is not saved, the UI renders a button that allows the user to to save the timeline directly from the flyout. + */ +export const AttachToActiveTimeline = memo( + ({ setAttachToTimeline, isCheckboxDisabled }: AttachToActiveTimelineProps) => { + const [checked, setChecked] = useState<boolean>(true); + + const timeline = useSelector((state: State) => + timelineSelectors.selectTimelineById(state, TimelineId.active) + ); + const timelineSavedObjectId = useMemo(() => timeline?.savedObjectId ?? '', [timeline]); + const isTimelineSaved: boolean = useMemo( + () => timelineSavedObjectId.length > 0, + [timelineSavedObjectId] + ); + + const onCheckboxChange = useCallback( + (e: React.ChangeEvent<HTMLInputElement>) => { + setChecked(e.target.checked); + setAttachToTimeline(e.target.checked); + }, + [setAttachToTimeline] + ); + + return ( + <EuiCallOut + title={ATTACH_TO_TIMELINE_CALLOUT_TITLE} + color={'primary'} + iconType="iInCircle" + data-test-subj={ATTACH_TO_TIMELINE_CALLOUT_TEST_ID} + css={css` + margin-left: 50px; + `} + > + <EuiFlexGroup justifyContent="spaceBetween" responsive={false}> + <EuiFlexItem> + <EuiText size="s"> + {isTimelineSaved ? SAVED_TIMELINE_CALLOUT_CONTENT : UNSAVED_TIMELINE_CALLOUT_CONTENT} + </EuiText> + </EuiFlexItem> + <EuiFlexItem grow={false}> + {isTimelineSaved ? ( + <EuiCheckbox + data-test-subj={ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID} + id={timelineCheckBoxId} + label={ATTACH_TO_TIMELINE_CHECKBOX} + disabled={isCheckboxDisabled} + checked={checked} + onChange={(e) => onCheckboxChange(e)} + /> + ) : ( + <SaveTimelineButton + timelineId={TimelineId.active} + buttonText={SAVE_TIMELINE_BUTTON} + data-test-subj={SAVE_TIMELINE_BUTTON_TEST_ID} + /> + )} + </EuiFlexItem> + </EuiFlexGroup> + </EuiCallOut> + ); + } +); + +AttachToActiveTimeline.displayName = 'AttachToActiveTimeline'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.test.tsx index dbe09d7e23599..9426d604bce57 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.test.tsx @@ -8,14 +8,34 @@ import { render } from '@testing-library/react'; import React from 'react'; import { DocumentDetailsContext } from '../../shared/context'; -import { TestProviders } from '../../../../common/mock'; -import { NotesDetails } from './notes_details'; -import { ADD_NOTE_BUTTON_TEST_ID } from './test_ids'; +import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; +import { FETCH_NOTES_ERROR, NO_NOTES, NotesDetails } from './notes_details'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; +import { + ADD_NOTE_BUTTON_TEST_ID, + NOTES_LOADING_TEST_ID, +} from '../../../../notes/components/test_ids'; +import { + ATTACH_TO_TIMELINE_CALLOUT_TEST_ID, + ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID, +} from './test_ids'; +import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; +import { Flyouts } from '../../shared/constants/flyouts'; +import { TimelineId } from '../../../../../common/types'; +import { ReqStatus } from '../../../../notes'; + +jest.mock('../../shared/hooks/use_which_flyout'); jest.mock('../../../../common/components/user_privileges'); const useUserPrivilegesMock = useUserPrivileges as jest.Mock; +const mockAddError = jest.fn(); +jest.mock('../../../../common/hooks/use_app_toasts', () => ({ + useAppToasts: () => ({ + addError: mockAddError, + }), +})); + const mockDispatch = jest.fn(); jest.mock('react-redux', () => { const original = jest.requireActual('react-redux'); @@ -28,6 +48,19 @@ jest.mock('react-redux', () => { const panelContextValue = { eventId: 'event id', } as unknown as DocumentDetailsContext; +const mockGlobalStateWithSavedTimeline = { + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + savedObjectId: 'savedObjectId', + }, + }, + }, +}; const renderNotesDetails = () => render( @@ -40,26 +73,121 @@ const renderNotesDetails = () => describe('NotesDetails', () => { beforeEach(() => { + jest.clearAllMocks(); useUserPrivilegesMock.mockReturnValue({ - kibanaSecuritySolutionsPrivileges: { crud: true, read: true }, + kibanaSecuritySolutionsPrivileges: { crud: true }, }); + (useWhichFlyout as jest.Mock).mockReturnValue(Flyouts.timeline); }); it('should fetch notes for the document id', () => { - renderNotesDetails(); + const mockStore = createMockStore(mockGlobalStateWithSavedTimeline); + + render( + <TestProviders store={mockStore}> + <DocumentDetailsContext.Provider value={panelContextValue}> + <NotesDetails /> + </DocumentDetailsContext.Provider> + </TestProviders> + ); + expect(mockDispatch).toHaveBeenCalled(); }); - it('should render an add note button', () => { - const { getByTestId } = renderNotesDetails(); - expect(getByTestId(ADD_NOTE_BUTTON_TEST_ID)).toBeInTheDocument(); + it('should render loading spinner if notes are being fetched', () => { + const store = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + notes: { + ...mockGlobalStateWithSavedTimeline.notes, + status: { + ...mockGlobalStateWithSavedTimeline.notes.status, + fetchNotesByDocumentIds: ReqStatus.Loading, + }, + }, + }); + + const { getByTestId } = render( + <TestProviders store={store}> + <DocumentDetailsContext.Provider value={panelContextValue}> + <NotesDetails /> + </DocumentDetailsContext.Provider> + </TestProviders> + ); + + expect(getByTestId(NOTES_LOADING_TEST_ID)).toBeInTheDocument(); + }); + + it('should render no data message if no notes are present', () => { + const store = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + notes: { + ...mockGlobalStateWithSavedTimeline.notes, + status: { + ...mockGlobalStateWithSavedTimeline.notes.status, + fetchNotesByDocumentIds: ReqStatus.Succeeded, + }, + }, + }); + + const { getByText } = render( + <TestProviders store={store}> + <DocumentDetailsContext.Provider value={panelContextValue}> + <NotesDetails /> + </DocumentDetailsContext.Provider> + </TestProviders> + ); + + expect(getByText(NO_NOTES)).toBeInTheDocument(); }); - it('should not render an add note button for users without crud privileges', () => { + it('should render error toast if fetching notes fails', () => { + const store = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + notes: { + ...mockGlobalStateWithSavedTimeline.notes, + status: { + ...mockGlobalStateWithSavedTimeline.notes.status, + fetchNotesByDocumentIds: ReqStatus.Failed, + }, + error: { + ...mockGlobalStateWithSavedTimeline.notes.error, + fetchNotesByDocumentIds: { type: 'http', status: 500 }, + }, + }, + }); + + render( + <TestProviders store={store}> + <DocumentDetailsContext.Provider value={panelContextValue}> + <NotesDetails /> + </DocumentDetailsContext.Provider> + </TestProviders> + ); + + expect(mockAddError).toHaveBeenCalledWith(null, { + title: FETCH_NOTES_ERROR, + }); + }); + + it('should not render the add note section for users without crud privileges', () => { useUserPrivilegesMock.mockReturnValue({ - kibanaSecuritySolutionsPrivileges: { crud: false, read: true }, + kibanaSecuritySolutionsPrivileges: { crud: false }, }); + const { queryByTestId } = renderNotesDetails(); + expect(queryByTestId(ADD_NOTE_BUTTON_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).not.toBeInTheDocument(); + }); + + it('should not render the callout and attach to timeline checkbox if not timeline flyout', () => { + (useWhichFlyout as jest.Mock).mockReturnValue(Flyouts.securitySolution); + + const { getByTestId, queryByTestId } = renderNotesDetails(); + + expect(getByTestId(ADD_NOTE_BUTTON_TEST_ID)).toBeInTheDocument(); + expect(queryByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).not.toBeInTheDocument(); + expect(queryByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx index b2b07110d1c4d..b3dfbd53416be 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx @@ -5,36 +5,120 @@ * 2.0. */ -import React, { memo, useEffect } from 'react'; -import { useDispatch } from 'react-redux'; -import { EuiSpacer } from '@elastic/eui'; -import { AddNote } from './add_note'; -import { NotesList } from './notes_list'; -import { fetchNotesByDocumentIds } from '../../../../notes/store/notes.slice'; +import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { EuiFlexGroup, EuiFlexItem, EuiLoadingElastic, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { Flyouts } from '../../shared/constants/flyouts'; +import { timelineSelectors } from '../../../../timelines/store'; +import { TimelineId } from '../../../../../common/types'; +import { AttachToActiveTimeline } from './attach_to_active_timeline'; +import { AddNote } from '../../../../notes/components/add_note'; +import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; +import { NOTES_LOADING_TEST_ID } from '../../../../notes/components/test_ids'; +import { NotesList } from '../../../../notes/components/notes_list'; +import type { State } from '../../../../common/store'; +import type { Note } from '../../../../../common/api/timeline'; +import { + fetchNotesByDocumentIds, + ReqStatus, + selectFetchNotesByDocumentIdsError, + selectFetchNotesByDocumentIdsStatus, + selectSortedNotesByDocumentId, +} from '../../../../notes/store/notes.slice'; import { useDocumentDetailsContext } from '../../shared/context'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; +import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; + +export const FETCH_NOTES_ERROR = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.fetchNotesErrorLabel', + { + defaultMessage: 'Error fetching notes', + } +); +export const NO_NOTES = i18n.translate('xpack.securitySolution.flyout.left.notes.noNotesLabel', { + defaultMessage: 'No notes have been created for this document', +}); /** * List all the notes for a document id and allows to create new notes associated with that document. * Displayed in the document details expandable flyout left section. */ export const NotesDetails = memo(() => { + const { addError: addErrorToast } = useAppToasts(); const dispatch = useDispatch(); const { eventId } = useDocumentDetailsContext(); const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); const canCreateNotes = kibanaSecuritySolutionsPrivileges.crud; + // will drive the value we send to the AddNote component + // if true (timeline is saved and the user kept the checkbox checked) we'll send the timelineId to the AddNote component + // if false (timeline is not saved or the user unchecked the checkbox manually ) we'll send an empty string + const [attachToTimeline, setAttachToTimeline] = useState<boolean>(true); + + // if the flyout is open from a timeline and that timeline is saved, we automatically check the checkbox to associate the note to it + const isTimelineFlyout = useWhichFlyout() === Flyouts.timeline; + + const timeline = useSelector((state: State) => + timelineSelectors.selectTimelineById(state, TimelineId.active) + ); + const timelineSavedObjectId = useMemo(() => timeline?.savedObjectId ?? '', [timeline]); + + const notes: Note[] = useSelector((state: State) => + selectSortedNotesByDocumentId(state, { + documentId: eventId, + sort: { field: 'created', direction: 'asc' }, + }) + ); + const fetchStatus = useSelector((state: State) => selectFetchNotesByDocumentIdsStatus(state)); + const fetchError = useSelector((state: State) => selectFetchNotesByDocumentIdsError(state)); + + const fetchNotes = useCallback( + () => dispatch(fetchNotesByDocumentIds({ documentIds: [eventId] })), + [dispatch, eventId] + ); + useEffect(() => { - dispatch(fetchNotesByDocumentIds({ documentIds: [eventId] })); - }, [dispatch, eventId]); + fetchNotes(); + }, [fetchNotes]); + + // show a toast if the fetch notes call fails + useEffect(() => { + if (fetchStatus === ReqStatus.Failed && fetchError) { + addErrorToast(null, { + title: FETCH_NOTES_ERROR, + }); + } + }, [addErrorToast, fetchError, fetchStatus]); return ( <> - <NotesList eventId={eventId} /> + {fetchStatus === ReqStatus.Loading && ( + <EuiLoadingElastic data-test-subj={NOTES_LOADING_TEST_ID} size="xxl" /> + )} + {fetchStatus === ReqStatus.Succeeded && notes.length === 0 ? ( + <EuiFlexGroup justifyContent="center"> + <EuiFlexItem grow={false}> + <p>{NO_NOTES}</p> + </EuiFlexItem> + </EuiFlexGroup> + ) : ( + <NotesList notes={notes} options={{ hideFlyoutIcon: true }} /> + )} {canCreateNotes && ( <> <EuiSpacer /> - <AddNote eventId={eventId} /> + <AddNote + eventId={eventId} + timelineId={isTimelineFlyout && attachToTimeline ? timelineSavedObjectId : ''} + > + {isTimelineFlyout && ( + <AttachToActiveTimeline + setAttachToTimeline={setAttachToTimeline} + isCheckboxDisabled={timelineSavedObjectId.length === 0} + /> + )} + </AddNote> </> )} </> diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx deleted file mode 100644 index f7a0cf814415b..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.test.tsx +++ /dev/null @@ -1,307 +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 { render, within } from '@testing-library/react'; -import React from 'react'; -import { - ADD_NOTE_LOADING_TEST_ID, - DELETE_NOTE_BUTTON_TEST_ID, - NOTE_AVATAR_TEST_ID, - NOTES_COMMENT_TEST_ID, - NOTES_LOADING_TEST_ID, - OPEN_TIMELINE_BUTTON_TEST_ID, -} from './test_ids'; -import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; -import { DELETE_NOTE_ERROR, FETCH_NOTES_ERROR, NO_NOTES, NotesList } from './notes_list'; -import { ReqStatus } from '../../../../notes/store/notes.slice'; -import { useQueryTimelineById } from '../../../../timelines/components/open_timeline/helpers'; -import { useUserPrivileges } from '../../../../common/components/user_privileges'; - -jest.mock('../../../../common/components/user_privileges'); -const useUserPrivilegesMock = useUserPrivileges as jest.Mock; - -jest.mock('../../../../timelines/components/open_timeline/helpers'); - -const mockAddError = jest.fn(); -jest.mock('../../../../common/hooks/use_app_toasts', () => ({ - useAppToasts: () => ({ - addError: mockAddError, - }), -})); - -const mockDispatch = jest.fn(); -jest.mock('react-redux', () => { - const original = jest.requireActual('react-redux'); - return { - ...original, - useDispatch: () => mockDispatch, - }; -}); - -const renderNotesList = () => - render( - <TestProviders> - <NotesList eventId={'1'} /> - </TestProviders> - ); - -describe('NotesList', () => { - beforeEach(() => { - useUserPrivilegesMock.mockReturnValue({ - kibanaSecuritySolutionsPrivileges: { crud: true, read: true }, - }); - }); - - it('should render a note as a comment', () => { - const { getByTestId, getByText } = renderNotesList(); - expect(getByTestId(`${NOTES_COMMENT_TEST_ID}-0`)).toBeInTheDocument(); - expect(getByText('note-1')).toBeInTheDocument(); - expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toBeInTheDocument(); - expect(getByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-0`)).toBeInTheDocument(); - expect(getByTestId(`${NOTE_AVATAR_TEST_ID}-0`)).toBeInTheDocument(); - }); - - it('should render loading spinner if notes are being fetched', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - fetchNotesByDocumentIds: ReqStatus.Loading, - }, - }, - }); - - const { getByTestId } = render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - - expect(getByTestId(NOTES_LOADING_TEST_ID)).toBeInTheDocument(); - }); - - it('should render no data message if no notes are present', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - fetchNotesByDocumentIds: ReqStatus.Succeeded, - }, - }, - }); - - const { getByText } = render( - <TestProviders store={store}> - <NotesList eventId={'wrong-event-id'} /> - </TestProviders> - ); - - expect(getByText(NO_NOTES)).toBeInTheDocument(); - }); - - it('should render error toast if fetching notes fails', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - fetchNotesByDocumentIds: ReqStatus.Failed, - }, - error: { - ...mockGlobalState.notes.error, - fetchNotesByDocumentIds: { type: 'http', status: 500 }, - }, - }, - }); - - render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - - expect(mockAddError).toHaveBeenCalledWith(null, { - title: FETCH_NOTES_ERROR, - }); - }); - - it('should render ? in avatar is user is missing', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - entities: { - '1': { - eventId: '1', - noteId: '1', - note: 'note-1', - timelineId: '', - created: 1663882629000, - createdBy: 'elastic', - updated: 1663882629000, - updatedBy: null, - version: 'version', - }, - }, - }, - }); - - const { getByTestId } = render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - const { getByText } = within(getByTestId(`${NOTE_AVATAR_TEST_ID}-0`)); - - expect(getByText('?')).toBeInTheDocument(); - }); - - it('should render create loading when user creates a new note', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - createNote: ReqStatus.Loading, - }, - }, - }); - - const { getByTestId } = render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - - expect(getByTestId(ADD_NOTE_LOADING_TEST_ID)).toBeInTheDocument(); - }); - - it('should dispatch delete action when user deletes a new note', () => { - const { getByTestId } = renderNotesList(); - - const deleteIcon = getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`); - - expect(deleteIcon).toBeInTheDocument(); - expect(deleteIcon).not.toHaveAttribute('disabled'); - - deleteIcon.click(); - - expect(mockDispatch).toHaveBeenCalled(); - }); - - it('should have delete icons disabled and show spinner if a new note is being deleted', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - deleteNotes: ReqStatus.Loading, - }, - }, - }); - - const { getByTestId } = render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - - expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toHaveAttribute('disabled'); - }); - - it('should not render a delete icon when the user does not have crud privileges', () => { - useUserPrivilegesMock.mockReturnValue({ - kibanaSecuritySolutionsPrivileges: { crud: false, read: true }, - }); - const { queryByTestId } = renderNotesList(); - - const deleteIcon = queryByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`); - - expect(deleteIcon).not.toBeInTheDocument(); - }); - - it('should render error toast if deleting a note fails', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - status: { - ...mockGlobalState.notes.status, - deleteNotes: ReqStatus.Failed, - }, - error: { - ...mockGlobalState.notes.error, - deleteNotes: { type: 'http', status: 500 }, - }, - }, - }); - - render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - - expect(mockAddError).toHaveBeenCalledWith(null, { - title: DELETE_NOTE_ERROR, - }); - }); - - it('should open timeline if user clicks on the icon', () => { - const queryTimelineById = jest.fn(); - (useQueryTimelineById as jest.Mock).mockReturnValue(queryTimelineById); - - const { getByTestId } = renderNotesList(); - - getByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-0`).click(); - - expect(queryTimelineById).toHaveBeenCalledWith({ - duplicate: false, - onOpenTimeline: undefined, - timelineId: 'timeline-1', - timelineType: undefined, - unifiedComponentsInTimelineDisabled: false, - }); - }); - - it('should not render timeline icon if no timeline is related to the note', () => { - const store = createMockStore({ - ...mockGlobalState, - notes: { - ...mockGlobalState.notes, - entities: { - '1': { - eventId: '1', - noteId: '1', - note: 'note-1', - timelineId: '', - created: 1663882629000, - createdBy: 'elastic', - updated: 1663882629000, - updatedBy: 'elastic', - version: 'version', - }, - }, - }, - }); - - const { queryByTestId } = render( - <TestProviders store={store}> - <NotesList eventId={'1'} /> - </TestProviders> - ); - - expect(queryByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-0`)).not.toBeInTheDocument(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx deleted file mode 100644 index ba7d0b961ddef..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_list.tsx +++ /dev/null @@ -1,211 +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, { memo, useCallback, useEffect, useState } from 'react'; -import { - EuiAvatar, - EuiButtonIcon, - EuiComment, - EuiCommentList, - EuiLoadingElastic, -} from '@elastic/eui'; -import { useDispatch, useSelector } from 'react-redux'; -import { FormattedRelative } from '@kbn/i18n-react'; -import { i18n } from '@kbn/i18n'; -import { MarkdownRenderer } from '../../../../common/components/markdown_editor'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; -import { useQueryTimelineById } from '../../../../timelines/components/open_timeline/helpers'; -import { - ADD_NOTE_LOADING_TEST_ID, - DELETE_NOTE_BUTTON_TEST_ID, - NOTE_AVATAR_TEST_ID, - NOTES_COMMENT_TEST_ID, - NOTES_LOADING_TEST_ID, - OPEN_TIMELINE_BUTTON_TEST_ID, -} from './test_ids'; -import type { State } from '../../../../common/store'; -import type { Note } from '../../../../../common/api/timeline'; -import { - deleteNotes, - ReqStatus, - selectCreateNoteStatus, - selectDeleteNotesError, - selectDeleteNotesStatus, - selectFetchNotesByDocumentIdsError, - selectFetchNotesByDocumentIdsStatus, - selectSortedNotesByDocumentId, -} from '../../../../notes/store/notes.slice'; -import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import { useUserPrivileges } from '../../../../common/components/user_privileges'; - -export const ADDED_A_NOTE = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.addedANoteLabel', - { - defaultMessage: 'added a note', - } -); -export const FETCH_NOTES_ERROR = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.fetchNotesErrorLabel', - { - defaultMessage: 'Error fetching notes', - } -); -export const NO_NOTES = i18n.translate('xpack.securitySolution.flyout.left.notes.noNotesLabel', { - defaultMessage: 'No notes have been created for this document', -}); -export const DELETE_NOTE = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.deleteNoteLabel', - { - defaultMessage: 'Delete note', - } -); -export const DELETE_NOTE_ERROR = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.deleteNoteErrorLabel', - { - defaultMessage: 'Error deleting note', - } -); - -export interface NotesListProps { - /** - * Id of the document - */ - eventId: string; -} - -/** - * Renders a list of notes for the document. - * If a note belongs to a timeline, a timeline icon will be shown the top right corner. - * Also, a delete icon is shown in the top right corner to delete a note. - * When a note is being created, the component renders a loading spinner when the new note is about to be added. - */ -export const NotesList = memo(({ eventId }: NotesListProps) => { - const dispatch = useDispatch(); - const { addError: addErrorToast } = useAppToasts(); - const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); - const canDeleteNotes = kibanaSecuritySolutionsPrivileges.crud; - - const unifiedComponentsInTimelineDisabled = useIsExperimentalFeatureEnabled( - 'unifiedComponentsInTimelineDisabled' - ); - - const fetchStatus = useSelector((state: State) => selectFetchNotesByDocumentIdsStatus(state)); - const fetchError = useSelector((state: State) => selectFetchNotesByDocumentIdsError(state)); - - const notes: Note[] = useSelector((state: State) => - selectSortedNotesByDocumentId(state, { - documentId: eventId, - sort: { field: 'created', direction: 'asc' }, - }) - ); - - const createStatus = useSelector((state: State) => selectCreateNoteStatus(state)); - - const deleteStatus = useSelector((state: State) => selectDeleteNotesStatus(state)); - const deleteError = useSelector((state: State) => selectDeleteNotesError(state)); - const [deletingNoteId, setDeletingNoteId] = useState(''); - - const deleteNoteFc = useCallback( - (noteId: string) => { - setDeletingNoteId(noteId); - dispatch(deleteNotes({ ids: [noteId] })); - }, - [dispatch] - ); - - const queryTimelineById = useQueryTimelineById(); - const openTimeline = useCallback( - ({ timelineId }: { timelineId: string }) => - queryTimelineById({ - duplicate: false, - onOpenTimeline: undefined, - timelineId, - timelineType: undefined, - unifiedComponentsInTimelineDisabled, - }), - [queryTimelineById, unifiedComponentsInTimelineDisabled] - ); - - // show a toast if the fetch notes call fails - useEffect(() => { - if (fetchStatus === ReqStatus.Failed && fetchError) { - addErrorToast(null, { - title: FETCH_NOTES_ERROR, - }); - } - }, [addErrorToast, fetchError, fetchStatus]); - - useEffect(() => { - if (deleteStatus === ReqStatus.Failed && deleteError) { - addErrorToast(null, { - title: DELETE_NOTE_ERROR, - }); - } - }, [addErrorToast, deleteError, deleteStatus]); - - if (fetchStatus === ReqStatus.Loading) { - return <EuiLoadingElastic data-test-subj={NOTES_LOADING_TEST_ID} size="xxl" />; - } - - if (fetchStatus === ReqStatus.Succeeded && notes.length === 0) { - return <p>{NO_NOTES}</p>; - } - - return ( - <EuiCommentList> - {notes.map((note, index) => ( - <EuiComment - data-test-subj={`${NOTES_COMMENT_TEST_ID}-${index}`} - key={note.noteId} - username={note.createdBy} - timestamp={<>{note.created && <FormattedRelative value={new Date(note.created)} />}</>} - event={ADDED_A_NOTE} - actions={ - <> - {note.timelineId && note.timelineId.length > 0 && ( - <EuiButtonIcon - data-test-subj={`${OPEN_TIMELINE_BUTTON_TEST_ID}-${index}`} - title="Open timeline" - aria-label="Open timeline" - color="text" - iconType="timeline" - onClick={() => openTimeline(note)} - /> - )} - {canDeleteNotes && ( - <EuiButtonIcon - data-test-subj={`${DELETE_NOTE_BUTTON_TEST_ID}-${index}`} - title={DELETE_NOTE} - aria-label={DELETE_NOTE} - color="text" - iconType="trash" - onClick={() => deleteNoteFc(note.noteId)} - disabled={deletingNoteId !== note.noteId && deleteStatus === ReqStatus.Loading} - isLoading={deletingNoteId === note.noteId && deleteStatus === ReqStatus.Loading} - /> - )} - </> - } - timelineAvatar={ - <EuiAvatar - data-test-subj={`${NOTE_AVATAR_TEST_ID}-${index}`} - size="l" - name={note.updatedBy || '?'} - /> - } - > - <MarkdownRenderer>{note.note || ''}</MarkdownRenderer> - </EuiComment> - ))} - {createStatus === ReqStatus.Loading && ( - <EuiLoadingElastic size="xxl" data-test-subj={ADD_NOTE_LOADING_TEST_ID} /> - )} - </EuiCommentList> - ); -}); - -NotesList.displayName = 'NotesList'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts index 23be7cc9b801f..0779f3c135b2d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts @@ -125,12 +125,6 @@ export const INVESTIGATION_GUIDE_LOADING_TEST_ID = `${INVESTIGATION_GUIDE_TEST_I /* Notes */ -export const NOTES_LOADING_TEST_ID = `${PREFIX}NotesLoading` as const; -export const NOTES_COMMENT_TEST_ID = `${PREFIX}NotesComment` as const; -export const ADD_NOTE_LOADING_TEST_ID = `${PREFIX}AddNotesLoading` as const; -export const ADD_NOTE_MARKDOWN_TEST_ID = `${PREFIX}AddNotesMarkdown` as const; -export const ADD_NOTE_BUTTON_TEST_ID = `${PREFIX}AddNotesButton` as const; -export const NOTE_AVATAR_TEST_ID = `${PREFIX}NoteAvatar` as const; -export const DELETE_NOTE_BUTTON_TEST_ID = `${PREFIX}DeleteNotesButton` as const; +export const ATTACH_TO_TIMELINE_CALLOUT_TEST_ID = `${PREFIX}AttachToTimelineCallout` as const; export const ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID = `${PREFIX}AttachToTimelineCheckbox` as const; -export const OPEN_TIMELINE_BUTTON_TEST_ID = `${PREFIX}OpenTimelineButton` as const; +export const SAVE_TIMELINE_BUTTON_TEST_ID = `${PREFIX}SaveTimelineButton` as const; 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 4c9542458c304..eb25eed9f2816 100644 --- a/x-pack/plugins/security_solution/public/notes/api/api.ts +++ b/x-pack/plugins/security_solution/public/notes/api/api.ts @@ -75,6 +75,20 @@ export const fetchNotesByDocumentIds = async (documentIds: string[]) => { return response; }; +/** + * Fetches all the notes for an array of saved object ids + */ +export const fetchNotesBySaveObjectIds = async (savedObjectIds: string[]) => { + const response = await KibanaServices.get().http.get<{ notes: Note[]; totalCount: number }>( + NOTE_URL, + { + query: { savedObjectIds }, + version: '2023-10-31', + } + ); + return response; +}; + /** * Deletes multiple notes */ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx b/x-pack/plugins/security_solution/public/notes/components/add_note.test.tsx similarity index 57% rename from x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx rename to x-pack/plugins/security_solution/public/notes/components/add_note.test.tsx index 481776bb51413..f20323da6085d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/add_note.test.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/add_note.test.tsx @@ -5,26 +5,18 @@ * 2.0. */ -import * as uuid from 'uuid'; import { render } from '@testing-library/react'; import React from 'react'; -import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; -import { AddNote, CREATE_NOTE_ERROR } from './add_note'; -import { - ADD_NOTE_BUTTON_TEST_ID, - ADD_NOTE_MARKDOWN_TEST_ID, - ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID, -} from './test_ids'; -import { ReqStatus } from '../../../../notes/store/notes.slice'; -import { TimelineId } from '../../../../../common/types'; import userEvent from '@testing-library/user-event'; -import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; -import { Flyouts } from '../../shared/constants/flyouts'; +import { createMockStore, mockGlobalState, TestProviders } from '../../common/mock'; +import { AddNote, CREATE_NOTE_ERROR } from './add_note'; +import { ADD_NOTE_BUTTON_TEST_ID, ADD_NOTE_MARKDOWN_TEST_ID } from './test_ids'; +import { ReqStatus } from '../store/notes.slice'; -jest.mock('../../shared/hooks/use_which_flyout'); +jest.mock('../../flyout/document_details/shared/hooks/use_which_flyout'); const mockAddError = jest.fn(); -jest.mock('../../../../common/hooks/use_app_toasts', () => ({ +jest.mock('../../common/hooks/use_app_toasts', () => ({ useAppToasts: () => ({ addError: mockAddError, }), @@ -52,7 +44,6 @@ describe('AddNote', () => { expect(getByTestId(ADD_NOTE_MARKDOWN_TEST_ID)).toBeInTheDocument(); expect(getByTestId(ADD_NOTE_BUTTON_TEST_ID)).toBeInTheDocument(); - expect(getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).toBeInTheDocument(); }); it('should create note', async () => { @@ -76,6 +67,19 @@ describe('AddNote', () => { expect(addButton).not.toHaveAttribute('disabled'); }); + it('should disable add button always is disableButton props is true', async () => { + const { getByTestId } = render( + <TestProviders> + <AddNote eventId={'event-id'} disableButton={true} /> + </TestProviders> + ); + + await userEvent.type(getByTestId('euiMarkdownEditorTextArea'), 'new note'); + + const addButton = getByTestId(ADD_NOTE_BUTTON_TEST_ID); + expect(addButton).toHaveAttribute('disabled'); + }); + it('should render the add note button in loading state while creating a new note', () => { const store = createMockStore({ ...mockGlobalState, @@ -123,63 +127,4 @@ describe('AddNote', () => { title: CREATE_NOTE_ERROR, }); }); - - it('should disable attach to timeline checkbox if flyout is not open from timeline', () => { - (useWhichFlyout as jest.Mock).mockReturnValue(Flyouts.securitySolution); - - const { getByTestId } = renderAddNote(); - - expect(getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).toHaveAttribute('disabled'); - }); - - it('should disable attach to timeline checkbox if active timeline is not saved', () => { - (useWhichFlyout as jest.Mock).mockReturnValue(Flyouts.timeline); - - const store = createMockStore({ - ...mockGlobalState, - timeline: { - ...mockGlobalState.timeline, - timelineById: { - ...mockGlobalState.timeline.timelineById, - [TimelineId.active]: { - ...mockGlobalState.timeline.timelineById[TimelineId.test], - }, - }, - }, - }); - - const { getByTestId } = render( - <TestProviders store={store}> - <AddNote eventId={'event-id'} /> - </TestProviders> - ); - - expect(getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).toHaveAttribute('disabled'); - }); - - it('should have attach to timeline checkbox enabled', () => { - (useWhichFlyout as jest.Mock).mockReturnValue(Flyouts.timeline); - - const store = createMockStore({ - ...mockGlobalState, - timeline: { - ...mockGlobalState.timeline, - timelineById: { - ...mockGlobalState.timeline.timelineById, - [TimelineId.active]: { - ...mockGlobalState.timeline.timelineById[TimelineId.test], - savedObjectId: uuid.v4(), - }, - }, - }, - }); - - const { getByTestId } = render( - <TestProviders store={store}> - <AddNote eventId={'event-id'} /> - </TestProviders> - ); - - expect(getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).not.toHaveAttribute('disabled'); - }); }); diff --git a/x-pack/plugins/security_solution/public/notes/components/add_note.tsx b/x-pack/plugins/security_solution/public/notes/components/add_note.tsx new file mode 100644 index 0000000000000..d54e0e42c86eb --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/add_note.tsx @@ -0,0 +1,148 @@ +/* + * Copyright 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, useCallback, useEffect, useMemo, useState } from 'react'; +import { + EuiButton, + EuiComment, + EuiCommentList, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, +} from '@elastic/eui'; +import { useDispatch, useSelector } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { useKibana } from '../../common/lib/kibana'; +import { ADD_NOTE_BUTTON_TEST_ID, ADD_NOTE_MARKDOWN_TEST_ID } from './test_ids'; +import { useAppToasts } from '../../common/hooks/use_app_toasts'; +import type { State } from '../../common/store'; +import { + createNote, + ReqStatus, + selectCreateNoteError, + selectCreateNoteStatus, +} from '../store/notes.slice'; +import { MarkdownEditor } from '../../common/components/markdown_editor'; + +export const MARKDOWN_ARIA_LABEL = i18n.translate( + 'xpack.securitySolution.notes.addNote.markdownAriaLabel', + { + defaultMessage: 'Note', + } +); +export const ADD_NOTE_BUTTON = i18n.translate('xpack.securitySolution.notes.addNote.buttonLabel', { + defaultMessage: 'Add note', +}); +export const CREATE_NOTE_ERROR = i18n.translate( + 'xpack.securitySolution.notes.createNote.errorLabel', + { + defaultMessage: 'Error create note', + } +); + +export interface AddNewNoteProps { + /** + * Id of the document + */ + eventId?: string; + /** + * Id of the timeline + */ + timelineId?: string | null | undefined; + /** + * Allows to override the default state of the add note button + */ + disableButton?: boolean; + /** + * Children to render between the markdown and the add note button + */ + children?: React.ReactNode; +} + +/** + * Renders a markdown editor and an add button to create new notes. + * The checkbox is automatically checked if the flyout is opened from a timeline and that timeline is saved. It is disabled if the flyout is NOT opened from a timeline. + */ +export const AddNote = memo( + ({ eventId, timelineId, disableButton = false, children }: AddNewNoteProps) => { + const { telemetry } = useKibana().services; + const dispatch = useDispatch(); + const { addError: addErrorToast } = useAppToasts(); + const [editorValue, setEditorValue] = useState(''); + const [isMarkdownInvalid, setIsMarkdownInvalid] = useState(false); + + const createStatus = useSelector((state: State) => selectCreateNoteStatus(state)); + const createError = useSelector((state: State) => selectCreateNoteError(state)); + + const addNote = useCallback(() => { + dispatch( + createNote({ + note: { + timelineId: timelineId || '', + eventId, + note: editorValue, + }, + }) + ); + telemetry.reportAddNoteFromExpandableFlyoutClicked({ + isRelatedToATimeline: timelineId != null, + }); + setEditorValue(''); + }, [dispatch, editorValue, eventId, telemetry, timelineId]); + + // show a toast if the create note call fails + useEffect(() => { + if (createStatus === ReqStatus.Failed && createError) { + addErrorToast(null, { + title: CREATE_NOTE_ERROR, + }); + } + }, [addErrorToast, createError, createStatus]); + + const buttonDisabled = useMemo( + () => disableButton || editorValue.trim().length === 0 || isMarkdownInvalid, + [disableButton, editorValue, isMarkdownInvalid] + ); + + return ( + <> + <EuiCommentList> + <EuiComment username=""> + <MarkdownEditor + dataTestSubj={ADD_NOTE_MARKDOWN_TEST_ID} + value={editorValue} + onChange={setEditorValue} + ariaLabel={MARKDOWN_ARIA_LABEL} + setIsMarkdownInvalid={setIsMarkdownInvalid} + /> + </EuiComment> + </EuiCommentList> + <EuiSpacer size="m" /> + {children && ( + <> + {children} + <EuiSpacer size="m" /> + </> + )} + <EuiFlexGroup alignItems="center" justifyContent="flexEnd" responsive={false}> + <EuiFlexItem grow={false}> + <EuiButton + onClick={addNote} + isLoading={createStatus === ReqStatus.Loading} + disabled={buttonDisabled} + data-test-subj={ADD_NOTE_BUTTON_TEST_ID} + > + {ADD_NOTE_BUTTON} + </EuiButton> + </EuiFlexItem> + </EuiFlexGroup> + </> + ); + } +); + +AddNote.displayName = 'AddNote'; diff --git a/x-pack/plugins/security_solution/public/notes/components/delete_note_button.test.tsx b/x-pack/plugins/security_solution/public/notes/components/delete_note_button.test.tsx new file mode 100644 index 0000000000000..88224604a0ece --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/delete_note_button.test.tsx @@ -0,0 +1,120 @@ +/* + * Copyright 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 { DELETE_NOTE_ERROR, DeleteNoteButtonIcon } from './delete_note_button'; +import { createMockStore, mockGlobalState, TestProviders } from '../../common/mock'; +import type { Note } from '../../../common/api/timeline'; +import { DELETE_NOTE_BUTTON_TEST_ID } from './test_ids'; +import { ReqStatus } from '..'; + +const mockDispatch = jest.fn(); +jest.mock('react-redux', () => { + const original = jest.requireActual('react-redux'); + return { + ...original, + useDispatch: () => mockDispatch, + }; +}); + +const mockAddError = jest.fn(); +jest.mock('../../common/hooks/use_app_toasts', () => ({ + useAppToasts: () => ({ + addError: mockAddError, + }), +})); + +const note: Note = { + eventId: '1', + noteId: '1', + note: 'note-1', + timelineId: 'timelineId', + created: 1663882629000, + createdBy: 'elastic', + updated: 1663882629000, + updatedBy: 'elastic', + version: 'version', +}; +const index = 0; + +describe('DeleteNoteButtonIcon', () => { + it('should render the delete icon', () => { + const { getByTestId } = render( + <TestProviders> + <DeleteNoteButtonIcon note={note} index={index} /> + </TestProviders> + ); + + expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-${index}`)).toBeInTheDocument(); + }); + + it('should have delete icons disabled and show spinner if a new note is being deleted', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + deleteNotes: ReqStatus.Loading, + }, + }, + }); + + const { getByTestId } = render( + <TestProviders store={store}> + <DeleteNoteButtonIcon note={note} index={index} /> + </TestProviders> + ); + + expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toHaveAttribute('disabled'); + }); + + it('should dispatch delete action when user deletes a new note', () => { + const { getByTestId } = render( + <TestProviders> + <DeleteNoteButtonIcon note={note} index={index} /> + </TestProviders> + ); + + const deleteIcon = getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`); + + expect(deleteIcon).toBeInTheDocument(); + expect(deleteIcon).not.toHaveAttribute('disabled'); + + deleteIcon.click(); + + expect(mockDispatch).toHaveBeenCalled(); + }); + + it('should render error toast if deleting a note fails', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + deleteNotes: ReqStatus.Failed, + }, + error: { + ...mockGlobalState.notes.error, + deleteNotes: { type: 'http', status: 500 }, + }, + }, + }); + + render( + <TestProviders store={store}> + <DeleteNoteButtonIcon note={note} index={index} /> + </TestProviders> + ); + + expect(mockAddError).toHaveBeenCalledWith(null, { + title: DELETE_NOTE_ERROR, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/notes/components/delete_note_button.tsx b/x-pack/plugins/security_solution/public/notes/components/delete_note_button.tsx new file mode 100644 index 0000000000000..3f9e757d3f5a5 --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/delete_note_button.tsx @@ -0,0 +1,85 @@ +/* + * Copyright 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, useCallback, useEffect, useState } from 'react'; +import { EuiButtonIcon } from '@elastic/eui'; +import { useDispatch, useSelector } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { DELETE_NOTE_BUTTON_TEST_ID } from './test_ids'; +import type { State } from '../../common/store'; +import type { Note } from '../../../common/api/timeline'; +import { + deleteNotes, + ReqStatus, + selectDeleteNotesError, + selectDeleteNotesStatus, +} from '../store/notes.slice'; +import { useAppToasts } from '../../common/hooks/use_app_toasts'; + +export const DELETE_NOTE = i18n.translate('xpack.securitySolution.notes.deleteNote.buttonLabel', { + defaultMessage: 'Delete note', +}); +export const DELETE_NOTE_ERROR = i18n.translate( + 'xpack.securitySolution.notes.deleteNote.errorLabel', + { + defaultMessage: 'Error deleting note', + } +); + +export interface DeleteNoteButtonIconProps { + /** + * The note that contains the id of the timeline to open + */ + note: Note; + /** + * The index of the note in the list of notes (used to have unique data-test-subj) + */ + index: number; +} + +/** + * Renders a button to delete a note + */ +export const DeleteNoteButtonIcon = memo(({ note, index }: DeleteNoteButtonIconProps) => { + const dispatch = useDispatch(); + const { addError: addErrorToast } = useAppToasts(); + + const deleteStatus = useSelector((state: State) => selectDeleteNotesStatus(state)); + const deleteError = useSelector((state: State) => selectDeleteNotesError(state)); + const [deletingNoteId, setDeletingNoteId] = useState(''); + + const deleteNoteFc = useCallback( + (noteId: string) => { + setDeletingNoteId(noteId); + dispatch(deleteNotes({ ids: [noteId] })); + }, + [dispatch] + ); + + useEffect(() => { + if (deleteStatus === ReqStatus.Failed && deleteError) { + addErrorToast(null, { + title: DELETE_NOTE_ERROR, + }); + } + }, [addErrorToast, deleteError, deleteStatus]); + + return ( + <EuiButtonIcon + data-test-subj={`${DELETE_NOTE_BUTTON_TEST_ID}-${index}`} + title={DELETE_NOTE} + aria-label={DELETE_NOTE} + color="text" + iconType="trash" + onClick={() => deleteNoteFc(note.noteId)} + disabled={deletingNoteId !== note.noteId && deleteStatus === ReqStatus.Loading} + isLoading={deletingNoteId === note.noteId && deleteStatus === ReqStatus.Loading} + /> + ); +}); + +DeleteNoteButtonIcon.displayName = 'DeleteNoteButtonIcon'; diff --git a/x-pack/plugins/security_solution/public/notes/components/notes_list.test.tsx b/x-pack/plugins/security_solution/public/notes/components/notes_list.test.tsx new file mode 100644 index 0000000000000..d32b508d03037 --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/notes_list.test.tsx @@ -0,0 +1,145 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, within } from '@testing-library/react'; +import React from 'react'; +import { + ADD_NOTE_LOADING_TEST_ID, + DELETE_NOTE_BUTTON_TEST_ID, + NOTE_AVATAR_TEST_ID, + NOTES_COMMENT_TEST_ID, + OPEN_TIMELINE_BUTTON_TEST_ID, +} from './test_ids'; +import { createMockStore, mockGlobalState, TestProviders } from '../../common/mock'; +import { NotesList } from './notes_list'; +import { ReqStatus } from '../store/notes.slice'; +import { useUserPrivileges } from '../../common/components/user_privileges'; +import type { Note } from '../../../common/api/timeline'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; + +jest.mock('../../common/hooks/use_experimental_features'); + +jest.mock('../../common/components/user_privileges'); +const useUserPrivilegesMock = useUserPrivileges as jest.Mock; + +const mockNote: Note = { + eventId: '1', + noteId: '1', + note: 'note-1', + timelineId: 'timeline-1', + created: 1663882629000, + createdBy: 'elastic', + updated: 1663882629000, + updatedBy: 'elastic', + version: 'version', +}; +const mockOptions = { hideTimelineIcon: true }; + +describe('NotesList', () => { + beforeEach(() => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(false); + + useUserPrivilegesMock.mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: true, read: true }, + }); + }); + + it('should render a note as a comment', () => { + const { getByTestId, getByText } = render( + <TestProviders> + <NotesList notes={[mockNote]} /> + </TestProviders> + ); + + expect(getByTestId(`${NOTES_COMMENT_TEST_ID}-0`)).toBeInTheDocument(); + expect(getByText('note-1')).toBeInTheDocument(); + expect(getByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`)).toBeInTheDocument(); + expect(getByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-0`)).toBeInTheDocument(); + expect(getByTestId(`${NOTE_AVATAR_TEST_ID}-0`)).toBeInTheDocument(); + }); + + it('should render ? in avatar is user is missing', () => { + const customMockNotes = [ + { + ...mockNote, + updatedBy: undefined, + }, + ]; + + const { getByTestId } = render( + <TestProviders> + <NotesList notes={customMockNotes} /> + </TestProviders> + ); + const { getByText } = within(getByTestId(`${NOTE_AVATAR_TEST_ID}-0`)); + + expect(getByText('?')).toBeInTheDocument(); + }); + + it('should render create loading when user creates a new note', () => { + const store = createMockStore({ + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + status: { + ...mockGlobalState.notes.status, + createNote: ReqStatus.Loading, + }, + }, + }); + + const { getByTestId } = render( + <TestProviders store={store}> + <NotesList notes={[mockNote]} /> + </TestProviders> + ); + + expect(getByTestId(ADD_NOTE_LOADING_TEST_ID)).toBeInTheDocument(); + }); + + it('should not render a delete icon when the user does not have crud privileges', () => { + useUserPrivilegesMock.mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: false, read: true }, + }); + const { queryByTestId } = render( + <TestProviders> + <NotesList notes={[mockNote]} /> + </TestProviders> + ); + + const deleteIcon = queryByTestId(`${DELETE_NOTE_BUTTON_TEST_ID}-0`); + + expect(deleteIcon).not.toBeInTheDocument(); + }); + + it('should not render timeline icon if no timeline is related to the note', () => { + const customMockNotes = [ + { + ...mockNote, + timelineId: '', + }, + ]; + + const { queryByTestId } = render( + <TestProviders> + <NotesList notes={customMockNotes} /> + </TestProviders> + ); + + expect(queryByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-0`)).not.toBeInTheDocument(); + }); + + it('should not render timeline icon if it should be hidden', () => { + const { queryByTestId } = render( + <TestProviders> + <NotesList notes={[mockNote]} options={mockOptions} /> + </TestProviders> + ); + + expect(queryByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-0`)).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/notes/components/notes_list.tsx b/x-pack/plugins/security_solution/public/notes/components/notes_list.tsx new file mode 100644 index 0000000000000..47dcf89b06452 --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/notes_list.tsx @@ -0,0 +1,100 @@ +/* + * Copyright 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 { EuiAvatar, EuiComment, EuiCommentList, EuiLoadingElastic } from '@elastic/eui'; +import { useSelector } from 'react-redux'; +import { FormattedRelative } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { OpenFlyoutButtonIcon } from './open_flyout_button'; +import { OpenTimelineButtonIcon } from './open_timeline_button'; +import { DeleteNoteButtonIcon } from './delete_note_button'; +import { MarkdownRenderer } from '../../common/components/markdown_editor'; +import { ADD_NOTE_LOADING_TEST_ID, NOTE_AVATAR_TEST_ID, NOTES_COMMENT_TEST_ID } from './test_ids'; +import type { State } from '../../common/store'; +import type { Note } from '../../../common/api/timeline'; +import { ReqStatus, selectCreateNoteStatus } from '../store/notes.slice'; +import { useUserPrivileges } from '../../common/components/user_privileges'; + +export const ADDED_A_NOTE = i18n.translate('xpack.securitySolution.notes.addedANoteLabel', { + defaultMessage: 'added a note', +}); +export const DELETE_NOTE = i18n.translate('xpack.securitySolution.notes.deleteNoteLabel', { + defaultMessage: 'Delete note', +}); + +export interface NotesListProps { + /** + * The notes to display as a EuiComment + */ + notes: Note[]; + /** + * Options to customize the rendering of the notes list + */ + options?: { + /** + * If true, the timeline icon will be hidden (this is useful for the timeline Notes tab) + */ + hideTimelineIcon?: boolean; + /** + * If true, the flyout icon will be hidden (this is useful for the flyout Notes tab) + */ + hideFlyoutIcon?: boolean; + }; +} + +/** + * Renders a list of notes for the document. + * If a note belongs to a timeline, a timeline icon will be shown the top right corner. + * Also, a delete icon is shown in the top right corner to delete a note. + * When a note is being created, the component renders a loading spinner when the new note is about to be added. + */ +export const NotesList = memo(({ notes, options }: NotesListProps) => { + const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); + const canDeleteNotes = kibanaSecuritySolutionsPrivileges.crud; + + const createStatus = useSelector((state: State) => selectCreateNoteStatus(state)); + + return ( + <EuiCommentList> + {notes.map((note, index) => ( + <EuiComment + data-test-subj={`${NOTES_COMMENT_TEST_ID}-${index}`} + key={note.noteId} + username={note.createdBy} + timestamp={<>{note.created && <FormattedRelative value={new Date(note.created)} />}</>} + event={ADDED_A_NOTE} + actions={ + <> + {note.eventId && !options?.hideFlyoutIcon && ( + <OpenFlyoutButtonIcon eventId={note.eventId} timelineId={note.timelineId} /> + )} + {note.timelineId && note.timelineId.length > 0 && !options?.hideTimelineIcon && ( + <OpenTimelineButtonIcon note={note} index={index} /> + )} + {canDeleteNotes && <DeleteNoteButtonIcon note={note} index={index} />} + </> + } + timelineAvatar={ + <EuiAvatar + data-test-subj={`${NOTE_AVATAR_TEST_ID}-${index}`} + size="l" + name={note.updatedBy || '?'} + /> + } + > + <MarkdownRenderer>{note.note || ''}</MarkdownRenderer> + </EuiComment> + ))} + {createStatus === ReqStatus.Loading && ( + <EuiLoadingElastic size="xxl" data-test-subj={ADD_NOTE_LOADING_TEST_ID} /> + )} + </EuiCommentList> + ); +}); + +NotesList.displayName = 'NotesList'; diff --git a/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.test.tsx b/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.test.tsx new file mode 100644 index 0000000000000..eed5e5bcbd5da --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.test.tsx @@ -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 { render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../common/mock'; +import { OPEN_FLYOUT_BUTTON_TEST_ID } from './test_ids'; +import { OpenFlyoutButtonIcon } from './open_flyout_button'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { DocumentDetailsRightPanelKey } from '../../flyout/document_details/shared/constants/panel_keys'; +import { useSourcererDataView } from '../../sourcerer/containers'; + +jest.mock('@kbn/expandable-flyout'); +jest.mock('../../sourcerer/containers'); + +const mockEventId = 'eventId'; +const mockTimelineId = 'timelineId'; + +describe('OpenFlyoutButtonIcon', () => { + it('should render the chevron icon', () => { + (useExpandableFlyoutApi as jest.Mock).mockReturnValue({ openFlyout: jest.fn() }); + (useSourcererDataView as jest.Mock).mockReturnValue({ selectedPatterns: [] }); + + const { getByTestId } = render( + <TestProviders> + <OpenFlyoutButtonIcon eventId={mockEventId} timelineId={mockTimelineId} /> + </TestProviders> + ); + + expect(getByTestId(OPEN_FLYOUT_BUTTON_TEST_ID)).toBeInTheDocument(); + }); + + it('should call the expandable flyout api when the button is clicked', () => { + const openFlyout = jest.fn(); + (useExpandableFlyoutApi as jest.Mock).mockReturnValue({ openFlyout }); + (useSourcererDataView as jest.Mock).mockReturnValue({ selectedPatterns: ['test1', 'test2'] }); + + const { getByTestId } = render( + <TestProviders> + <OpenFlyoutButtonIcon eventId={mockEventId} timelineId={mockTimelineId} /> + </TestProviders> + ); + + const button = getByTestId(OPEN_FLYOUT_BUTTON_TEST_ID); + button.click(); + + expect(openFlyout).toHaveBeenCalledWith({ + right: { + id: DocumentDetailsRightPanelKey, + params: { + id: mockEventId, + indexName: 'test1,test2', + scopeId: mockTimelineId, + }, + }, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx b/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx new file mode 100644 index 0000000000000..0c541cc95740c --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { EuiButtonIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { OPEN_FLYOUT_BUTTON_TEST_ID } from './test_ids'; +import { useSourcererDataView } from '../../sourcerer/containers'; +import { SourcererScopeName } from '../../sourcerer/store/model'; +import { useKibana } from '../../common/lib/kibana'; +import { DocumentDetailsRightPanelKey } from '../../flyout/document_details/shared/constants/panel_keys'; + +export const OPEN_FLYOUT_BUTTON = i18n.translate( + 'xpack.securitySolution.notes.openFlyoutButtonLabel', + { + defaultMessage: 'Expand event details', + } +); + +export interface OpenFlyoutButtonIconProps { + /** + * Id of the event to render in the flyout + */ + eventId: string; + /** + * Id of the timeline to pass to the flyout for scope + */ + timelineId: string; +} + +/** + * Renders a button to open the alert and event details flyout + */ +export const OpenFlyoutButtonIcon = memo(({ eventId, timelineId }: OpenFlyoutButtonIconProps) => { + const { selectedPatterns } = useSourcererDataView(SourcererScopeName.timeline); + + const { telemetry } = useKibana().services; + const { openFlyout } = useExpandableFlyoutApi(); + + const handleClick = useCallback(() => { + openFlyout({ + right: { + id: DocumentDetailsRightPanelKey, + params: { + id: eventId, + indexName: selectedPatterns.join(','), + scopeId: timelineId, + }, + }, + }); + telemetry.reportDetailsFlyoutOpened({ + location: timelineId, + panel: 'right', + }); + }, [eventId, openFlyout, selectedPatterns, telemetry, timelineId]); + + return ( + <EuiButtonIcon + data-test-subj={OPEN_FLYOUT_BUTTON_TEST_ID} + title={OPEN_FLYOUT_BUTTON} + aria-label={OPEN_FLYOUT_BUTTON} + color="text" + iconType="arrowRight" + onClick={handleClick} + /> + ); +}); + +OpenFlyoutButtonIcon.displayName = 'OpenFlyoutButtonIcon'; diff --git a/x-pack/plugins/security_solution/public/notes/components/open_timeline_button.test.tsx b/x-pack/plugins/security_solution/public/notes/components/open_timeline_button.test.tsx new file mode 100644 index 0000000000000..85ecfce68e5d9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/open_timeline_button.test.tsx @@ -0,0 +1,61 @@ +/* + * Copyright 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 { OpenTimelineButtonIcon } from './open_timeline_button'; +import type { Note } from '../../../common/api/timeline'; +import { OPEN_TIMELINE_BUTTON_TEST_ID } from './test_ids'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; +import { useQueryTimelineById } from '../../timelines/components/open_timeline/helpers'; + +jest.mock('../../common/hooks/use_experimental_features'); +jest.mock('../../timelines/components/open_timeline/helpers'); + +const note: Note = { + eventId: '1', + noteId: '1', + note: 'note-1', + timelineId: 'timelineId', + created: 1663882629000, + createdBy: 'elastic', + updated: 1663882629000, + updatedBy: 'elastic', + version: 'version', +}; +const index = 0; + +describe('OpenTimelineButtonIcon', () => { + it('should render the timeline icon', () => { + const { getByTestId } = render(<OpenTimelineButtonIcon note={note} index={index} />); + + expect(getByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-${index}`)).toBeInTheDocument(); + }); + + it('should call openTimeline with the correct values', () => { + const openTimeline = jest.fn(); + (useQueryTimelineById as jest.Mock).mockReturnValue(openTimeline); + + const unifiedComponentsInTimelineDisabled = false; + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue( + unifiedComponentsInTimelineDisabled + ); + + const { getByTestId } = render(<OpenTimelineButtonIcon note={note} index={index} />); + + const button = getByTestId(`${OPEN_TIMELINE_BUTTON_TEST_ID}-${index}`); + button.click(); + + expect(openTimeline).toHaveBeenCalledWith({ + duplicate: false, + onOpenTimeline: undefined, + timelineId: note.timelineId, + timelineType: undefined, + unifiedComponentsInTimelineDisabled, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/notes/components/open_timeline_button.tsx b/x-pack/plugins/security_solution/public/notes/components/open_timeline_button.tsx new file mode 100644 index 0000000000000..531983429acd1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/open_timeline_button.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback } from 'react'; +import { EuiButtonIcon } from '@elastic/eui'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; +import { useQueryTimelineById } from '../../timelines/components/open_timeline/helpers'; +import { OPEN_TIMELINE_BUTTON_TEST_ID } from './test_ids'; +import type { Note } from '../../../common/api/timeline'; + +export interface OpenTimelineButtonIconProps { + /** + * The note that contains the id of the timeline to open + */ + note: Note; + /** + * The index of the note in the list of notes (used to have unique data-test-subj) + */ + index: number; +} + +/** + * Renders a button to open the timeline associated with a note + */ +export const OpenTimelineButtonIcon = memo(({ note, index }: OpenTimelineButtonIconProps) => { + const unifiedComponentsInTimelineDisabled = useIsExperimentalFeatureEnabled( + 'unifiedComponentsInTimelineDisabled' + ); + + const queryTimelineById = useQueryTimelineById(); + const openTimeline = useCallback( + ({ timelineId }: { timelineId: string }) => + queryTimelineById({ + duplicate: false, + onOpenTimeline: undefined, + timelineId, + timelineType: undefined, + unifiedComponentsInTimelineDisabled, + }), + [queryTimelineById, unifiedComponentsInTimelineDisabled] + ); + + return ( + <EuiButtonIcon + data-test-subj={`${OPEN_TIMELINE_BUTTON_TEST_ID}-${index}`} + title="Open timeline" + aria-label="Open timeline" + color="text" + iconType="timeline" + onClick={() => openTimeline(note)} + /> + ); +}); + +OpenTimelineButtonIcon.displayName = 'OpenTimelineButtonIcon'; diff --git a/x-pack/plugins/security_solution/public/notes/components/test_ids.ts b/x-pack/plugins/security_solution/public/notes/components/test_ids.ts new file mode 100644 index 0000000000000..6c63a43f365ac --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/test_ids.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const PREFIX = 'securitySolutionNotes' as const; + +export const NOTES_LOADING_TEST_ID = `${PREFIX}NotesLoading` as const; +export const NOTES_COMMENT_TEST_ID = `${PREFIX}NotesComment` as const; +export const ADD_NOTE_LOADING_TEST_ID = `${PREFIX}AddNotesLoading` as const; +export const ADD_NOTE_MARKDOWN_TEST_ID = `${PREFIX}AddNotesMarkdown` as const; +export const ADD_NOTE_BUTTON_TEST_ID = `${PREFIX}AddNotesButton` as const; +export const NOTE_AVATAR_TEST_ID = `${PREFIX}NoteAvatar` as const; +export const DELETE_NOTE_BUTTON_TEST_ID = `${PREFIX}DeleteNotesButton` as const; +export const OPEN_TIMELINE_BUTTON_TEST_ID = `${PREFIX}OpenTimelineButton` as const; +export const OPEN_FLYOUT_BUTTON_TEST_ID = `${PREFIX}OpenFlyoutButton` as const; +export const TIMELINE_DESCRIPTION_COMMENT_TEST_ID = `${PREFIX}TimelineDescriptionComment` as const; 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 5825a170bf1cf..396940c892a6e 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 @@ -42,6 +42,9 @@ import { userSelectedRowForDeletion, userSortedNotes, selectSortedNotesByDocumentId, + fetchNotesBySavedObjectIds, + selectNotesBySavedObjectId, + selectSortedNotesBySavedObjectId, } from './notes.slice'; import type { NotesState } from './notes.slice'; import { mockGlobalState } from '../../common/mock'; @@ -72,11 +75,18 @@ const initialNonEmptyState = { ids: [mockNote1.noteId, mockNote2.noteId], status: { fetchNotesByDocumentIds: ReqStatus.Idle, + fetchNotesBySavedObjectIds: ReqStatus.Idle, createNote: ReqStatus.Idle, deleteNotes: ReqStatus.Idle, fetchNotes: ReqStatus.Idle, }, - error: { fetchNotesByDocumentIds: null, createNote: null, deleteNotes: null, fetchNotes: null }, + error: { + fetchNotesByDocumentIds: null, + fetchNotesBySavedObjectIds: null, + createNote: null, + deleteNotes: null, + fetchNotes: null, + }, pagination: { page: 1, perPage: 10, @@ -180,6 +190,88 @@ describe('notesSlice', () => { }); }); + describe('fetchNotesBySavedObjectIds', () => { + it('should set correct status state when fetching notes by saved object ids', () => { + const action = { type: fetchNotesBySavedObjectIds.pending.type }; + + expect(notesReducer(initalEmptyState, action)).toEqual({ + ...initalEmptyState, + status: { + ...initalEmptyState.status, + fetchNotesBySavedObjectIds: ReqStatus.Loading, + }, + }); + }); + + it('should set correct state when success on fetch notes by saved object id ids on an empty state', () => { + const action = { + type: fetchNotesBySavedObjectIds.fulfilled.type, + payload: { + entities: { + notes: { + [mockNote1.noteId]: mockNote1, + }, + }, + result: [mockNote1.noteId], + }, + }; + + expect(notesReducer(initalEmptyState, action)).toEqual({ + ...initalEmptyState, + entities: action.payload.entities.notes, + ids: action.payload.result, + status: { + ...initalEmptyState.status, + fetchNotesBySavedObjectIds: ReqStatus.Succeeded, + }, + }); + }); + + it('should replace notes when success on fetch notes by saved object id ids on a non-empty state', () => { + const newMockNote = { ...mockNote1, timelineId: 'timelineId' }; + const action = { + type: fetchNotesBySavedObjectIds.fulfilled.type, + payload: { + entities: { + notes: { + [newMockNote.noteId]: newMockNote, + }, + }, + result: [newMockNote.noteId], + }, + }; + + expect(notesReducer(initialNonEmptyState, action)).toEqual({ + ...initalEmptyState, + entities: { + [newMockNote.noteId]: newMockNote, + [mockNote2.noteId]: mockNote2, + }, + ids: [newMockNote.noteId, mockNote2.noteId], + status: { + ...initalEmptyState.status, + fetchNotesBySavedObjectIds: ReqStatus.Succeeded, + }, + }); + }); + + it('should set correct error state when failing to fetch notes by saved object ids', () => { + const action = { type: fetchNotesBySavedObjectIds.rejected.type, error: 'error' }; + + expect(notesReducer(initalEmptyState, action)).toEqual({ + ...initalEmptyState, + status: { + ...initalEmptyState.status, + fetchNotesBySavedObjectIds: ReqStatus.Failed, + }, + error: { + ...initalEmptyState.error, + fetchNotesBySavedObjectIds: 'error', + }, + }); + }); + }); + describe('createNote', () => { it('should set correct status state when creating a note', () => { const action = { type: createNote.pending.type }; @@ -516,7 +608,7 @@ describe('notesSlice', () => { expect(selectNotesByDocumentId(mockGlobalState, 'wrong-document-id')).toHaveLength(0); }); - it('should return all notes sorted dor an existing document id', () => { + it('should return all notes sorted for an existing document id', () => { const oldestNote = { eventId: '1', // should be a valid id based on mockTimelineData noteId: '1', @@ -573,6 +665,89 @@ describe('notesSlice', () => { ).toHaveLength(0); }); + it('should return all notes for an existing saved object id', () => { + expect(selectNotesBySavedObjectId(mockGlobalState, 'timeline-1')).toEqual([ + mockGlobalState.notes.entities['1'], + ]); + }); + + it('should return no notes if saved object id does not exist', () => { + expect(selectNotesBySavedObjectId(mockGlobalState, 'wrong-saved-object-id')).toHaveLength(0); + }); + + it('should return no notes if saved object id is empty string', () => { + expect(selectNotesBySavedObjectId(mockGlobalState, '')).toHaveLength(0); + }); + + it('should return all notes sorted for an existing saved object id', () => { + const oldestNote = { + eventId: '1', // should be a valid id based on mockTimelineData + noteId: '1', + note: 'note-1', + timelineId: 'timeline-1', + created: 1663882629000, + createdBy: 'elastic', + updated: 1663882629000, + updatedBy: 'elastic', + version: 'version', + }; + const newestNote = { + ...oldestNote, + noteId: '2', + created: 1663882689000, + }; + + const state = { + ...mockGlobalState, + notes: { + ...mockGlobalState.notes, + entities: { + '1': oldestNote, + '2': newestNote, + }, + ids: ['1', '2'], + }, + }; + + const ascResult = selectSortedNotesBySavedObjectId(state, { + savedObjectId: 'timeline-1', + sort: { field: 'created', direction: 'asc' }, + }); + expect(ascResult[0]).toEqual(oldestNote); + expect(ascResult[1]).toEqual(newestNote); + + const descResult = selectSortedNotesBySavedObjectId(state, { + savedObjectId: 'timeline-1', + sort: { field: 'created', direction: 'desc' }, + }); + expect(descResult[0]).toEqual(newestNote); + expect(descResult[1]).toEqual(oldestNote); + }); + + it('should also return no notes if saved object id does not exist', () => { + expect( + selectSortedNotesBySavedObjectId(mockGlobalState, { + savedObjectId: 'wrong-document-id', + sort: { + field: 'created', + direction: 'desc', + }, + }) + ).toHaveLength(0); + }); + + it('should also return no notes if saved object id is empty string', () => { + expect( + selectSortedNotesBySavedObjectId(mockGlobalState, { + savedObjectId: '', + sort: { + field: 'created', + direction: 'desc', + }, + }) + ).toHaveLength(0); + }); + it('should select notes pagination', () => { const state = { ...mockGlobalState, 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 4f333103a2a25..3f0439e7298e4 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 @@ -14,6 +14,7 @@ import { deleteNotes as deleteNotesApi, fetchNotes as fetchNotesApi, fetchNotesByDocumentIds as fetchNotesByDocumentIdsApi, + fetchNotesBySaveObjectIds as fetchNotesBySaveObjectIdsApi, } from '../api/api'; import type { NormalizedEntities, NormalizedEntity } from './normalize'; import { normalizeEntities, normalizeEntity } from './normalize'; @@ -26,7 +27,7 @@ export enum ReqStatus { Failed = 'failed', } -interface HttpError { +export interface HttpError { type: 'http'; status: number; } @@ -34,12 +35,14 @@ interface HttpError { export interface NotesState extends EntityState<Note> { status: { fetchNotesByDocumentIds: ReqStatus; + fetchNotesBySavedObjectIds: ReqStatus; createNote: ReqStatus; deleteNotes: ReqStatus; fetchNotes: ReqStatus; }; error: { fetchNotesByDocumentIds: SerializedError | HttpError | null; + fetchNotesBySavedObjectIds: SerializedError | HttpError | null; createNote: SerializedError | HttpError | null; deleteNotes: SerializedError | HttpError | null; fetchNotes: SerializedError | HttpError | null; @@ -66,12 +69,14 @@ const notesAdapter = createEntityAdapter<Note>({ export const initialNotesState: NotesState = notesAdapter.getInitialState({ status: { fetchNotesByDocumentIds: ReqStatus.Idle, + fetchNotesBySavedObjectIds: ReqStatus.Idle, createNote: ReqStatus.Idle, deleteNotes: ReqStatus.Idle, fetchNotes: ReqStatus.Idle, }, error: { fetchNotesByDocumentIds: null, + fetchNotesBySavedObjectIds: null, createNote: null, deleteNotes: null, fetchNotes: null, @@ -101,6 +106,16 @@ export const fetchNotesByDocumentIds = createAsyncThunk< return normalizeEntities(res.notes); }); +export const fetchNotesBySavedObjectIds = createAsyncThunk< + NormalizedEntities<Note>, + { savedObjectIds: string[] }, + {} +>('notes/fetchNotesBySavedObjectIds', async (args) => { + const { savedObjectIds } = args; + const res = await fetchNotesBySaveObjectIdsApi(savedObjectIds); + return normalizeEntities(res.notes); +}); + export const fetchNotes = createAsyncThunk< NormalizedEntities<Note> & { totalCount: number }, { @@ -198,6 +213,17 @@ const notesSlice = createSlice({ state.status.fetchNotesByDocumentIds = ReqStatus.Failed; state.error.fetchNotesByDocumentIds = action.payload ?? action.error; }) + .addCase(fetchNotesBySavedObjectIds.pending, (state) => { + state.status.fetchNotesBySavedObjectIds = ReqStatus.Loading; + }) + .addCase(fetchNotesBySavedObjectIds.fulfilled, (state, action) => { + notesAdapter.upsertMany(state, action.payload.entities.notes); + state.status.fetchNotesBySavedObjectIds = ReqStatus.Succeeded; + }) + .addCase(fetchNotesBySavedObjectIds.rejected, (state, action) => { + state.status.fetchNotesBySavedObjectIds = ReqStatus.Failed; + state.error.fetchNotesBySavedObjectIds = action.payload ?? action.error; + }) .addCase(createNote.pending, (state) => { state.status.createNote = ReqStatus.Loading; }) @@ -253,6 +279,12 @@ export const selectFetchNotesByDocumentIdsStatus = (state: State) => export const selectFetchNotesByDocumentIdsError = (state: State) => state.notes.error.fetchNotesByDocumentIds; +export const selectFetchNotesBySavedObjectIdsStatus = (state: State) => + state.notes.status.fetchNotesBySavedObjectIds; + +export const selectFetchNotesBySavedObjectIdsError = (state: State) => + state.notes.error.fetchNotesBySavedObjectIds; + export const selectCreateNoteStatus = (state: State) => state.notes.status.createNote; export const selectCreateNoteError = (state: State) => state.notes.error.createNote; @@ -280,6 +312,12 @@ export const selectNotesByDocumentId = createSelector( (notes, documentId) => notes.filter((note) => note.eventId === documentId) ); +export const selectNotesBySavedObjectId = createSelector( + [selectAllNotes, (state: State, savedObjectId: string) => savedObjectId], + (notes, savedObjectId) => + savedObjectId.length > 0 ? notes.filter((note) => note.timelineId === savedObjectId) : [] +); + export const selectSortedNotesByDocumentId = createSelector( [ selectAllNotes, @@ -305,6 +343,34 @@ export const selectSortedNotesByDocumentId = createSelector( } ); +export const selectSortedNotesBySavedObjectId = createSelector( + [ + selectAllNotes, + ( + state: State, + { + savedObjectId, + sort, + }: { savedObjectId: string; sort: { field: keyof Note; direction: 'asc' | 'desc' } } + ) => ({ savedObjectId, sort }), + ], + (notes, { savedObjectId, sort }) => { + const { field, direction } = sort; + if (savedObjectId.length === 0) { + return []; + } + return notes + .filter((note: Note) => note.timelineId === savedObjectId) + .sort((first: Note, second: Note) => { + const a = first[field]; + const b = second[field]; + if (a == null) return 1; + if (b == null) return -1; + return direction === 'asc' ? (a > b ? 1 : -1) : a > b ? -1 : 1; + }); + } +); + export const { userSelectedPage, userSelectedPerPage, diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.test.tsx index 2f923a12e3f33..8a05a42f7cd25 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.test.tsx @@ -62,6 +62,27 @@ describe('SaveTimelineButton', () => { expect(queryByTestId('save-timeline-modal')).not.toBeInTheDocument(); }); + it('should override the default text in the button', async () => { + (useUserPrivileges as jest.Mock).mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: true }, + }); + mockGetState.mockReturnValue({ + ...mockTimelineModel, + status: TimelineStatusEnum.active, + isSaving: false, + }); + (useCreateTimeline as jest.Mock).mockReturnValue({}); + + const { getByText, queryByText } = render( + <TestProviders> + <SaveTimelineButton timelineId="timeline-1" buttonText={'TEST'} /> + </TestProviders> + ); + + expect(queryByText('Save')).not.toBeInTheDocument(); + expect(getByText('TEST')).toBeInTheDocument(); + }); + it('should open the timeline save modal', async () => { (useUserPrivileges as jest.Mock).mockReturnValue({ kibanaSecuritySolutionsPrivileges: { crud: true }, 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 f89471e36827f..3a85022db9fbf 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 @@ -21,60 +21,77 @@ export interface SaveTimelineButtonProps { * Id of the timeline to be displayed in the bottom bar and within the modal */ timelineId: string; + /** + * Ability to customize the text of the button + */ + buttonText?: string; + /** + * Optional data-test-subj value + */ + ['data-test-subj']?: string; } /** - * Button that allows user to save the timeline. Clicking it opens the `SaveTimelineModal` + * Button that allows user to save the timeline. Clicking it opens the `SaveTimelineModal`. + * The default 'Save' button text can be overridden by passing the `buttonText` prop. */ -export const SaveTimelineButton = React.memo<SaveTimelineButtonProps>(({ timelineId }) => { - const [showEditTimelineOverlay, setShowEditTimelineOverlay] = useState<boolean>(false); - const toggleSaveTimeline = useCallback(() => setShowEditTimelineOverlay((prev) => !prev), []); +export const SaveTimelineButton = React.memo<SaveTimelineButtonProps>( + ({ + timelineId, + buttonText = i18n.SAVE, + 'data-test-subj': dataTestSubj = 'timeline-modal-save-timeline', + }) => { + const [showEditTimelineOverlay, setShowEditTimelineOverlay] = useState<boolean>(false); + const toggleSaveTimeline = useCallback(() => setShowEditTimelineOverlay((prev) => !prev), []); - // Case: 1 - // check if user has crud privileges so that user can be allowed to edit the timeline - // Case: 2 - // TODO: User may have Crud privileges but they may not have access to timeline index. - // Do we need to check that? - const { - kibanaSecuritySolutionsPrivileges: { crud: canEditTimelinePrivilege }, - } = useUserPrivileges(); + // Case: 1 + // check if user has crud privileges so that user can be allowed to edit the timeline + // Case: 2 + // TODO: User may have Crud privileges but they may not have access to timeline index. + // Do we need to check that? + const { + kibanaSecuritySolutionsPrivileges: { crud: canEditTimelinePrivilege }, + } = useUserPrivileges(); - const { status, isSaving } = useSelector((state: State) => selectTimelineById(state, timelineId)); + const { status, isSaving } = useSelector((state: State) => + selectTimelineById(state, timelineId) + ); - const canSaveTimeline = canEditTimelinePrivilege && status !== TimelineStatusEnum.immutable; - const isUnsaved = status === TimelineStatusEnum.draft; - const unauthorizedMessage = canSaveTimeline ? null : i18n.CALL_OUT_UNAUTHORIZED_MSG; + const canSaveTimeline = canEditTimelinePrivilege && status !== TimelineStatusEnum.immutable; + const isUnsaved = status === TimelineStatusEnum.draft; + const unauthorizedMessage = canSaveTimeline ? null : i18n.CALL_OUT_UNAUTHORIZED_MSG; - return ( - <> - <EuiToolTip - content={unauthorizedMessage} - position="bottom" - data-test-subj="timeline-modal-save-timeline-tooltip" - > - <EuiButton - id={TIMELINE_TOUR_CONFIG_ANCHORS.SAVE_TIMELINE} - fill - size="s" - iconType="save" - isLoading={isSaving} - disabled={!canSaveTimeline} - data-test-subj="timeline-modal-save-timeline" - onClick={toggleSaveTimeline} + return ( + <> + <EuiToolTip + content={unauthorizedMessage} + position="bottom" + data-test-subj="timeline-modal-save-timeline-tooltip" > - {i18n.SAVE} - </EuiButton> - </EuiToolTip> - {showEditTimelineOverlay && canSaveTimeline ? ( - <SaveTimelineModal - initialFocusOn={isUnsaved ? 'title' : 'save'} - timelineId={timelineId} - showWarning={false} - closeSaveTimeline={toggleSaveTimeline} - /> - ) : null} - </> - ); -}); + <EuiButton + id={TIMELINE_TOUR_CONFIG_ANCHORS.SAVE_TIMELINE} + fill + size="s" + iconType="save" + isLoading={isSaving} + disabled={!canSaveTimeline} + data-test-subj={dataTestSubj} + onClick={toggleSaveTimeline} + > + {buttonText} + </EuiButton> + </EuiToolTip> + {showEditTimelineOverlay && canSaveTimeline ? ( + <SaveTimelineModal + initialFocusOn={isUnsaved ? 'title' : 'save'} + timelineId={timelineId} + showWarning={false} + closeSaveTimeline={toggleSaveTimeline} + /> + ) : null} + </> + ); + } +); SaveTimelineButton.displayName = 'SaveTimelineButton'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/old_notes.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/old_notes.tsx new file mode 100644 index 0000000000000..71432267ac0da --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/old_notes.tsx @@ -0,0 +1,202 @@ +/* + * Copyright 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 { filter, uniqBy } from 'lodash/fp'; +import { + EuiAvatar, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiText, + EuiTitle, + EuiHorizontalRule, +} from '@elastic/eui'; + +import React, { Fragment, useCallback, useMemo, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import styled from 'styled-components'; + +import type { EuiTheme } from '@kbn/react-kibana-context-styled'; +import { timelineActions } from '../../store'; +import { useDeepEqualSelector, useShallowEqualSelector } from '../../../common/hooks/use_selector'; +import { TimelineStatusEnum } from '../../../../common/api/timeline'; +import { appSelectors } from '../../../common/store/app'; +import { AddNote } from './add_note'; +import { CREATED_BY } from './translations'; +import { PARTICIPANTS } from '../timeline/translations'; +import { NotePreviews } from '../open_timeline/note_previews'; +import type { TimelineResultNote } from '../open_timeline/types'; +import { getTimelineNoteSelector } from '../timeline/tabs/notes/selectors'; +import { getScrollToTopSelector } from '../timeline/tabs/selectors'; +import { useScrollToTop } from '../../../common/components/scroll_to_top'; +import { useUserPrivileges } from '../../../common/components/user_privileges'; +import { FullWidthFlexGroup, VerticalRule } from '../timeline/tabs/shared/layout'; + +const ScrollableDiv = styled.div` + overflow-x: hidden; + overflow-y: auto; + padding-inline: ${({ theme }) => (theme as EuiTheme).eui.euiSizeM}; + padding-block: ${({ theme }) => (theme as EuiTheme).eui.euiSizeS}; +`; + +const StyledEuiFlexGroup = styled(EuiFlexGroup)` + flex: 0; +`; + +const Username = styled(EuiText)` + font-weight: bold; +`; + +interface UsernameWithAvatar { + username: string; +} + +const UsernameWithAvatarComponent: React.FC<UsernameWithAvatar> = ({ username }) => ( + <StyledEuiFlexGroup gutterSize="s" responsive={false} alignItems="center"> + <EuiFlexItem grow={false}> + <EuiAvatar data-test-subj="avatar" name={username} size="l" /> + </EuiFlexItem> + <EuiFlexItem> + <Username>{username}</Username> + </EuiFlexItem> + </StyledEuiFlexGroup> +); + +const UsernameWithAvatar = React.memo(UsernameWithAvatarComponent); + +interface ParticipantsProps { + users: TimelineResultNote[]; +} + +export const ParticipantsComponent: React.FC<ParticipantsProps> = ({ users }) => { + const List = useMemo( + () => + users.map((user) => ( + <Fragment key={user.updatedBy === null ? undefined : user.updatedBy}> + <UsernameWithAvatar + key={user.updatedBy === null ? undefined : user.updatedBy} + username={String(user.updatedBy)} + /> + <EuiSpacer size="s" /> + </Fragment> + )), + [users] + ); + + if (!users.length) { + return null; + } + + return ( + <> + <EuiTitle size="xs"> + <h4>{PARTICIPANTS}</h4> + </EuiTitle> + <EuiHorizontalRule margin="s" /> + {List} + </> + ); +}; + +ParticipantsComponent.displayName = 'ParticipantsComponent'; + +const Participants = React.memo(ParticipantsComponent); + +interface NotesTabContentProps { + timelineId: string; +} + +/** + * Renders the "old" notes tab content. This should be removed when we remove the securitySolutionNotesEnabled feature flag + */ +export const OldNotes: React.FC<NotesTabContentProps> = React.memo(({ timelineId }) => { + const dispatch = useDispatch(); + const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); + + const getScrollToTop = useMemo(() => getScrollToTopSelector(), []); + const scrollToTop = useShallowEqualSelector((state) => getScrollToTop(state, timelineId)); + + useScrollToTop('#scrollableNotes', !!scrollToTop); + + const getTimelineNotes = useMemo(() => getTimelineNoteSelector(), []); + const { + createdBy, + eventIdToNoteIds, + noteIds, + status: timelineStatus, + } = useDeepEqualSelector((state) => getTimelineNotes(state, timelineId)); + const getNotesAsCommentsList = useMemo( + () => appSelectors.selectNotesAsCommentsListSelector(), + [] + ); + const [newNote, setNewNote] = useState(''); + const isImmutable = timelineStatus === TimelineStatusEnum.immutable; + const appNotes: TimelineResultNote[] = useDeepEqualSelector(getNotesAsCommentsList); + + const allTimelineNoteIds = useMemo(() => { + const eventNoteIds = Object.values(eventIdToNoteIds).reduce<string[]>( + (acc, v) => [...acc, ...v], + [] + ); + return [...noteIds, ...eventNoteIds]; + }, [noteIds, eventIdToNoteIds]); + + const notes = useMemo( + () => appNotes.filter((appNote) => allTimelineNoteIds.includes(appNote?.noteId ?? '-1')), + [appNotes, allTimelineNoteIds] + ); + + // filter for savedObjectId to make sure we don't display `elastic` user while saving the note + const participants = useMemo(() => uniqBy('updatedBy', filter('savedObjectId', notes)), [notes]); + + const associateNote = useCallback( + (noteId: string) => dispatch(timelineActions.addNote({ id: timelineId, noteId })), + [dispatch, timelineId] + ); + + const SidebarContent = useMemo( + () => ( + <> + {createdBy && ( + <> + <EuiTitle size="xs"> + <h4>{CREATED_BY}</h4> + </EuiTitle> + <EuiHorizontalRule margin="s" /> + <UsernameWithAvatar username={createdBy} /> + <EuiSpacer size="xxl" /> + </> + )} + <Participants users={participants} /> + </> + ), + [createdBy, participants] + ); + + return ( + <FullWidthFlexGroup gutterSize="none" data-test-subj={'old-notes-screen'}> + <EuiFlexItem component={ScrollableDiv} grow={2} id="scrollableNotes"> + <NotePreviews notes={notes} timelineId={timelineId} showTimelineDescription /> + <EuiSpacer size="s" /> + {!isImmutable && kibanaSecuritySolutionsPrivileges.crud === true && ( + <AddNote + associateNote={associateNote} + newNote={newNote} + updateNewNote={setNewNote} + autoFocusDisabled={!!scrollToTop} + /> + )} + </EuiFlexItem> + <VerticalRule /> + <EuiFlexItem component={ScrollableDiv} grow={1}> + {SidebarContent} + </EuiFlexItem> + </FullWidthFlexGroup> + ); +}); + +OldNotes.displayName = 'OldNotes'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/participants.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/participants.test.tsx new file mode 100644 index 0000000000000..270750e482a46 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/participants.test.tsx @@ -0,0 +1,77 @@ +/* + * Copyright 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 { Participants } from './participants'; +import type { Note } from '../../../../common/api/timeline'; +import { + NOTE_AVATAR_WITH_NAME_TEST_ID, + NOTES_PARTICIPANTS_TITLE_TEST_ID, + TIMELINE_AVATAR_WITH_NAME_TEST_ID, + TIMELINE_PARTICIPANT_TITLE_TEST_ID, +} from './test_ids'; + +const mockNote: Note = { + eventId: '1', + noteId: '1', + note: 'note-1', + timelineId: 'timeline-1', + created: 1663882629000, + createdBy: 'elastic', + updated: 1663882629000, + updatedBy: 'elastic', + version: 'version', +}; +const notes: Note[] = [ + mockNote, + { + ...mockNote, + noteId: '2', + updatedBy: 'elastic', + }, + { + ...mockNote, + noteId: '3', + updatedBy: 'another-elastic', + }, +]; +const username = 'elastic'; + +describe('Participants', () => { + it('should render the timeline username and the unique notes users', () => { + const { getByTestId } = render(<Participants notes={notes} timelineCreatedBy={username} />); + + expect(getByTestId(TIMELINE_PARTICIPANT_TITLE_TEST_ID)).toBeInTheDocument(); + + const timelineDescription = getByTestId(TIMELINE_AVATAR_WITH_NAME_TEST_ID); + expect(timelineDescription).toBeInTheDocument(); + expect(timelineDescription).toHaveTextContent(username); + + expect(getByTestId(NOTES_PARTICIPANTS_TITLE_TEST_ID)).toBeInTheDocument(); + + const firstNoteUser = getByTestId(`${NOTE_AVATAR_WITH_NAME_TEST_ID}-0`); + expect(firstNoteUser).toBeInTheDocument(); + expect(firstNoteUser).toHaveTextContent(notes[0].updatedBy as string); + + const secondNoteUser = getByTestId(`${NOTE_AVATAR_WITH_NAME_TEST_ID}-1`); + expect(secondNoteUser).toBeInTheDocument(); + expect(secondNoteUser).toHaveTextContent(notes[2].updatedBy as string); + }); + + it('should note render the timeline username if it is unavailable', () => { + const { queryByTestId } = render(<Participants notes={notes} timelineCreatedBy={undefined} />); + + expect(queryByTestId(TIMELINE_PARTICIPANT_TITLE_TEST_ID)).not.toBeInTheDocument(); + }); + + it('should note render any note usernames if no notes have been created', () => { + const { queryByTestId } = render(<Participants notes={[]} timelineCreatedBy={username} />); + + expect(queryByTestId(`${NOTE_AVATAR_WITH_NAME_TEST_ID}-0`)).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/participants.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/participants.tsx new file mode 100644 index 0000000000000..15662e0a0e6d2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/participants.tsx @@ -0,0 +1,144 @@ +/* + * Copyright 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 { filter, uniqBy } from 'lodash/fp'; +import { + EuiAvatar, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiText, + EuiTitle, + EuiHorizontalRule, + useEuiTheme, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import React, { Fragment, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + NOTE_AVATAR_WITH_NAME_TEST_ID, + NOTES_PARTICIPANTS_TITLE_TEST_ID, + TIMELINE_AVATAR_WITH_NAME_TEST_ID, + TIMELINE_PARTICIPANT_TITLE_TEST_ID, +} from './test_ids'; +import { type Note } from '../../../../common/api/timeline'; + +export const PARTICIPANTS = i18n.translate( + 'xpack.securitySolution.timeline.notes.participantsTitle', + { + defaultMessage: 'Participants', + } +); +export const CREATED_BY = i18n.translate('xpack.securitySolution.timeline notes.createdByLabel', { + defaultMessage: 'Created by', +}); + +interface UsernameWithAvatar { + /** + * The username to display + */ + username: string; + /** + * Data test subject string for testing + */ + ['data-test-subj']?: string; +} + +/** + * Renders the username with an avatar + */ +const UsernameWithAvatar: React.FC<UsernameWithAvatar> = React.memo( + ({ username, 'data-test-subj': dataTestSubj }) => { + const { euiTheme } = useEuiTheme(); + + return ( + <EuiFlexGroup + gutterSize="s" + responsive={false} + alignItems="center" + css={css` + flex-grow: 0; + `} + data-test-subj={dataTestSubj} + > + <EuiFlexItem grow={false}> + <EuiAvatar data-test-subj="avatar" name={username} size="l" /> + </EuiFlexItem> + <EuiFlexItem> + <EuiText + css={css` + font-weight: ${euiTheme.font.weight.bold}; + `} + > + {username} + </EuiText> + </EuiFlexItem> + </EuiFlexGroup> + ); + } +); + +UsernameWithAvatar.displayName = 'UsernameWithAvatar'; + +interface ParticipantsProps { + /** + * The notes associated with the timeline + */ + notes: Note[]; + /** + * The user who created the timeline + */ + timelineCreatedBy: string | undefined; +} + +/** + * Renders all the users that are participating to the timeline + * - the user who created the timeline + * - all the unique users who created notes associated with the timeline + */ +export const Participants: React.FC<ParticipantsProps> = React.memo( + ({ notes, timelineCreatedBy }) => { + // filter for savedObjectId to make sure we don't display `elastic` user while saving the note + const participants = useMemo(() => uniqBy('updatedBy', filter('noteId', notes)), [notes]); + + return ( + <> + {timelineCreatedBy && ( + <> + <EuiTitle size="xs" data-test-subj={TIMELINE_PARTICIPANT_TITLE_TEST_ID}> + <h4>{CREATED_BY}</h4> + </EuiTitle> + <EuiHorizontalRule margin="s" /> + <UsernameWithAvatar + username={timelineCreatedBy} + data-test-subj={TIMELINE_AVATAR_WITH_NAME_TEST_ID} + /> + <EuiSpacer size="xxl" /> + </> + )} + <> + <EuiTitle size="xs" data-test-subj={NOTES_PARTICIPANTS_TITLE_TEST_ID}> + <h4>{PARTICIPANTS}</h4> + </EuiTitle> + <EuiHorizontalRule margin="s" /> + {participants.map((participant, index) => ( + <Fragment key={participant.updatedBy === null ? undefined : participant.updatedBy}> + <UsernameWithAvatar + key={participant.updatedBy === null ? undefined : participant.updatedBy} + username={String(participant.updatedBy)} + data-test-subj={`${NOTE_AVATAR_WITH_NAME_TEST_ID}-${index}`} + /> + <EuiSpacer size="s" /> + </Fragment> + ))} + </> + </> + ); + } +); + +Participants.displayName = 'Participants'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx new file mode 100644 index 0000000000000..7730424befee7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright 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 { SaveTimelineCallout } from './save_timeline'; +import { SAVE_TIMELINE_BUTTON_TEST_ID, SAVE_TIMELINE_CALLOUT_TEST_ID } from './test_ids'; +import { createMockStore, mockGlobalState, TestProviders } from '../../../common/mock'; +import { TimelineId } from '../../../../common/types'; + +describe('SaveTimelineCallout', () => { + it('should render the callout and save components', () => { + const mockStore = createMockStore({ + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + }, + }, + }, + }); + + const { getByTestId, getByText, getAllByText } = render( + <TestProviders store={mockStore}> + <SaveTimelineCallout /> + </TestProviders> + ); + + expect(getByTestId(SAVE_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); + expect(getAllByText('Save timeline')).toHaveLength(2); + expect( + getByText('You need to save your timeline before creating notes for it.') + ).toBeInTheDocument(); + expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx new file mode 100644 index 0000000000000..f31822561c54b --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx @@ -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 React, { memo } from 'react'; +import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import { SAVE_TIMELINE_BUTTON_TEST_ID, SAVE_TIMELINE_CALLOUT_TEST_ID } from './test_ids'; +import { TimelineId } from '../../../../common/types'; +import { SaveTimelineButton } from '../modal/actions/save_timeline_button'; + +export const SAVE_TIMELINE_CALLOUT_TITLE = i18n.translate( + 'xpack.securitySolution.timeline.notes.saveTimeline.calloutTitle', + { + defaultMessage: 'Save timeline', + } +); +export const SAVE_TIMELINE_CALLOUT_CONTENT = i18n.translate( + 'xpack.securitySolution.timeline.notes.saveTimeline.calloutContent', + { + defaultMessage: 'You need to save your timeline before creating notes for it.', + } +); +export const SAVE_TIMELINE_BUTTON = i18n.translate( + 'xpack.securitySolution.flyout.left.notes.savedTimelineButtonLabel', + { + defaultMessage: 'Save timeline', + } +); + +/** + * Renders a callout to let the user know they have to save the timeline before creating notes + */ +export const SaveTimelineCallout = memo(() => { + return ( + <EuiCallOut + title={SAVE_TIMELINE_CALLOUT_TITLE} + color="warning" + iconType="iInCircle" + data-test-subj={SAVE_TIMELINE_CALLOUT_TEST_ID} + css={css` + margin-left: 50px; + `} + > + <EuiFlexGroup justifyContent="spaceBetween" responsive={false}> + <EuiFlexItem> + <EuiText size="s">{SAVE_TIMELINE_CALLOUT_CONTENT}</EuiText> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <SaveTimelineButton + timelineId={TimelineId.active} + buttonText={SAVE_TIMELINE_BUTTON} + data-test-subj={SAVE_TIMELINE_BUTTON_TEST_ID} + /> + </EuiFlexItem> + </EuiFlexGroup> + </EuiCallOut> + ); +}); + +SaveTimelineCallout.displayName = 'SaveTimelineCallout'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/test_ids.ts b/x-pack/plugins/security_solution/public/timelines/components/notes/test_ids.ts new file mode 100644 index 0000000000000..5e5637b9b321f --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/test_ids.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. + */ + +const PREFIX = 'timelineNotes'; + +export const SAVE_TIMELINE_CALLOUT_TEST_ID = `${PREFIX}SaveTimelineCallout` as const; +export const TIMELINE_PARTICIPANT_TITLE_TEST_ID = `${PREFIX}TimelineParticipantTitle` as const; +export const TIMELINE_AVATAR_WITH_NAME_TEST_ID = `${PREFIX}TimelineAvatarWithName` as const; +export const NOTES_PARTICIPANTS_TITLE_TEST_ID = `${PREFIX}NotesParticipantsTitle` as const; +export const NOTE_AVATAR_WITH_NAME_TEST_ID = `${PREFIX}NoteAvatarWithName` as const; +export const SAVE_TIMELINE_BUTTON_TEST_ID = `${PREFIX}SaveTimelineButton` as const; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.test.tsx index 7f117d88bf531..7c1e7eeca37a3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.test.tsx @@ -264,7 +264,7 @@ describe('NotePreviews', () => { } ); - expect(wrapper.find('[data-test-subj="notes-toggle-event-details"]').exists()).toBeTruthy(); + expect(wrapper.find(`[data-test-subj="notes-toggle-event-details"]`).exists()).toBeTruthy(); }); test('should not render toggle event details action when showToggleEventDetailsAction is false ', () => { @@ -293,7 +293,7 @@ describe('NotePreviews', () => { } ); - expect(wrapper.find('[data-test-subj="notes-toggle-event-details"]').exists()).toBeFalsy(); + expect(wrapper.find(`[data-test-subj="notes-toggle-event-details"]`).exists()).toBeFalsy(); }); describe('Delete Notes', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx index 2401e0014fd8a..442f7548bcf73 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx @@ -9,9 +9,11 @@ import { EuiBadge, EuiSkeletonText, EuiTabs, EuiTab } from '@elastic/eui'; import { isEmpty } from 'lodash/fp'; import type { Ref, ReactElement, ComponentType } from 'react'; import React, { lazy, memo, Suspense, useCallback, useEffect, useMemo } from 'react'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; +import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; +import type { State } from '../../../../common/store'; import { useEsqlAvailability } from '../../../../common/hooks/esql/use_esql_availability'; import type { SessionViewConfig } from '../../../../../common/types'; import type { RowRenderer, TimelineId } from '../../../../../common/types/timeline'; @@ -38,7 +40,8 @@ import { import * as i18n from './translations'; import { useLicense } from '../../../../common/hooks/use_license'; import { initializeTimelineSettings } from '../../../store/actions'; -import { selectTimelineESQLSavedSearchId } from '../../../store/selectors'; +import { selectTimelineById, selectTimelineESQLSavedSearchId } from '../../../store/selectors'; +import { fetchNotesBySavedObjectIds, selectSortedNotesBySavedObjectId } from '../../../../notes'; const HideShowContainer = styled.div.attrs<{ $isVisible: boolean; isOverflowYScroll: boolean }>( ({ $isVisible = false, isOverflowYScroll = false }) => ({ @@ -248,6 +251,10 @@ const TabsContentComponent: React.FC<BasicTimelineTab> = ({ selectTimelineESQLSavedSearchId(state, timelineId) ); + const securitySolutionNotesEnabled = useIsExperimentalFeatureEnabled( + 'securitySolutionNotesEnabled' + ); + const activeTab = useShallowEqualSelector((state) => getActiveTab(state, timelineId)); const showTimeline = useShallowEqualSelector((state) => getShowTimeline(state, timelineId)); const shouldShowESQLTab = useMemo(() => { @@ -273,6 +280,7 @@ const TabsContentComponent: React.FC<BasicTimelineTab> = ({ const isEnterprisePlus = useLicense().isEnterprise(); + // old notes system (through timeline) const allTimelineNoteIds = useMemo(() => { const eventNoteIds = Object.values(eventIdToNoteIds).reduce<string[]>( (acc, v) => [...acc, ...v], @@ -281,13 +289,43 @@ const TabsContentComponent: React.FC<BasicTimelineTab> = ({ return [...globalTimelineNoteIds, ...eventNoteIds]; }, [globalTimelineNoteIds, eventIdToNoteIds]); - const numberOfNotes = useMemo( + const numberOfNotesOldSystem = useMemo( () => appNotes.filter((appNote) => allTimelineNoteIds.includes(appNote.id)).length + (isEmpty(timelineDescription) ? 0 : 1), [appNotes, allTimelineNoteIds, timelineDescription] ); + const timeline = useSelector((state: State) => selectTimelineById(state, timelineId)); + const timelineSavedObjectId = useMemo(() => timeline?.savedObjectId ?? '', [timeline]); + const isTimelineSaved: boolean = useMemo( + () => timelineSavedObjectId.length > 0, + [timelineSavedObjectId] + ); + + // new note system + const fetchNotes = useCallback( + () => dispatch(fetchNotesBySavedObjectIds({ savedObjectIds: [timelineSavedObjectId] })), + [dispatch, timelineSavedObjectId] + ); + useEffect(() => { + if (isTimelineSaved) { + fetchNotes(); + } + }, [fetchNotes, isTimelineSaved]); + + const numberOfNotesNewSystem = useSelector((state: State) => + selectSortedNotesBySavedObjectId(state, { + savedObjectId: timelineSavedObjectId, + sort: { field: 'created', direction: 'asc' }, + }) + ); + + const numberOfNotes = useMemo( + () => (securitySolutionNotesEnabled ? numberOfNotesNewSystem.length : numberOfNotesOldSystem), + [numberOfNotesNewSystem, numberOfNotesOldSystem, securitySolutionNotesEnabled] + ); + const setActiveTab = useCallback( (tab: TimelineTabs) => { dispatch(timelineActions.setActiveTabTimeline({ id: timelineId, activeTab: tab })); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.test.tsx new file mode 100644 index 0000000000000..e70bd5946e3b1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.test.tsx @@ -0,0 +1,221 @@ +/* + * Copyright 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 { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; +import NotesTabContentComponent, { FETCH_NOTES_ERROR, NO_NOTES } from '.'; +import { render } from '@testing-library/react'; +import { createMockStore, mockGlobalState, TestProviders } from '../../../../../common/mock'; +import { ReqStatus } from '../../../../../notes'; +import { + NOTES_LOADING_TEST_ID, + TIMELINE_DESCRIPTION_COMMENT_TEST_ID, +} from '../../../../../notes/components/test_ids'; +import React from 'react'; +import { TimelineId } from '../../../../../../common/types'; +import { SAVE_TIMELINE_CALLOUT_TEST_ID } from '../../../notes/test_ids'; +import { useUserPrivileges } from '../../../../../common/components/user_privileges'; + +jest.mock('../../../../../common/hooks/use_experimental_features'); +jest.mock('../../../../../common/components/user_privileges'); + +const mockAddError = jest.fn(); +jest.mock('../../../../../common/hooks/use_app_toasts', () => ({ + useAppToasts: () => ({ + addError: mockAddError, + }), +})); + +const mockDispatch = jest.fn(); +jest.mock('react-redux', () => { + const original = jest.requireActual('react-redux'); + return { + ...original, + useDispatch: () => mockDispatch, + }; +}); + +const mockGlobalStateWithSavedTimeline = { + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + savedObjectId: 'savedObjectId', + }, + }, + }, +}; +const mockGlobalStateWithUnSavedTimeline = { + ...mockGlobalState, + timeline: { + ...mockGlobalState.timeline, + timelineById: { + ...mockGlobalState.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalState.timeline.timelineById[TimelineId.test], + }, + }, + }, +}; + +describe('NotesTabContentComponent', () => { + beforeEach(() => { + jest.clearAllMocks(); + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (useUserPrivileges as jest.Mock).mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: true }, + }); + }); + + it('should show the old note system', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(false); + + const { getByTestId, queryByTestId } = render( + <TestProviders> + <NotesTabContentComponent timelineId={TimelineId.test} /> + </TestProviders> + ); + + expect(getByTestId('old-notes-screen')).toBeInTheDocument(); + expect(queryByTestId('new-notes-screen')).not.toBeInTheDocument(); + }); + + it('should show the new note system', () => { + const mockStore = createMockStore(mockGlobalStateWithSavedTimeline); + + const { getByTestId, queryByTestId } = render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.test} /> + </TestProviders> + ); + + expect(getByTestId('new-notes-screen')).toBeInTheDocument(); + expect(queryByTestId('old-notes-screen')).not.toBeInTheDocument(); + }); + + it('should fetch notes for the saved object id if timeline has been saved and hide callout', () => { + const mockStore = createMockStore(mockGlobalStateWithSavedTimeline); + + const { queryByTestId } = render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.active} /> + </TestProviders> + ); + + expect(mockDispatch).toHaveBeenCalled(); + expect(queryByTestId(SAVE_TIMELINE_CALLOUT_TEST_ID)).not.toBeInTheDocument(); + }); + + it('should not fetch notes if timeline is unsaved', () => { + const mockStore = createMockStore(mockGlobalStateWithUnSavedTimeline); + + const { getByTestId } = render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.test} /> + </TestProviders> + ); + + expect(mockDispatch).not.toHaveBeenCalled(); + expect(getByTestId(SAVE_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); + }); + + it('should render loading spinner if notes are being fetched', () => { + const mockStore = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + notes: { + ...mockGlobalStateWithSavedTimeline.notes, + status: { + ...mockGlobalStateWithSavedTimeline.notes.status, + fetchNotesBySavedObjectIds: ReqStatus.Loading, + }, + }, + }); + + const { getByTestId } = render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.test} /> + </TestProviders> + ); + + expect(getByTestId(NOTES_LOADING_TEST_ID)).toBeInTheDocument(); + }); + + it('should render no data message if no notes are present and timeline has been saved', () => { + const mockStore = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + notes: { + ...mockGlobalStateWithSavedTimeline.notes, + status: { + ...mockGlobalStateWithSavedTimeline.notes.status, + fetchNotesBySavedObjectIds: ReqStatus.Succeeded, + }, + }, + }); + + const { getByText } = render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.active} /> + </TestProviders> + ); + + expect(getByText(NO_NOTES)).toBeInTheDocument(); + }); + + it('should render error toast if fetching notes fails', () => { + const mockStore = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + notes: { + ...mockGlobalStateWithSavedTimeline.notes, + status: { + ...mockGlobalStateWithSavedTimeline.notes.status, + fetchNotesBySavedObjectIds: ReqStatus.Failed, + }, + error: { + ...mockGlobalStateWithSavedTimeline.notes.error, + fetchNotesBySavedObjectIds: { type: 'http', status: 500 }, + }, + }, + }); + + render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.test} /> + </TestProviders> + ); + + expect(mockAddError).toHaveBeenCalledWith(null, { + title: FETCH_NOTES_ERROR, + }); + }); + + it('should render the timeline description at the top', () => { + const mockStore = createMockStore({ + ...mockGlobalStateWithSavedTimeline, + timeline: { + ...mockGlobalStateWithSavedTimeline.timeline, + timelineById: { + ...mockGlobalStateWithSavedTimeline.timeline.timelineById, + [TimelineId.active]: { + ...mockGlobalStateWithSavedTimeline.timeline.timelineById[TimelineId.active], + description: 'description', + }, + }, + }, + }); + + const { getByTestId, getByText } = render( + <TestProviders store={mockStore}> + <NotesTabContentComponent timelineId={TimelineId.active} /> + </TestProviders> + ); + + expect(getByTestId(TIMELINE_DESCRIPTION_COMMENT_TEST_ID)).toBeInTheDocument(); + expect(getByText('description')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx index 27d82f01828fe..959581a241764 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx @@ -5,214 +5,212 @@ * 2.0. */ -import { filter, uniqBy } from 'lodash/fp'; +import React, { useCallback, useEffect, useMemo } from 'react'; import { EuiAvatar, + EuiComment, EuiFlexGroup, EuiFlexItem, + EuiLoadingElastic, + EuiPanel, EuiSpacer, EuiText, EuiTitle, - EuiPanel, - EuiHorizontalRule, } from '@elastic/eui'; - -import React, { Fragment, useCallback, useMemo, useState } from 'react'; -import { useDispatch } from 'react-redux'; -import styled from 'styled-components'; - -import type { EuiTheme } from '@kbn/react-kibana-context-styled'; -import { timelineActions } from '../../../../store'; +import { css } from '@emotion/react'; +import { useDispatch, useSelector } from 'react-redux'; +import { FormattedRelative } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { SaveTimelineCallout } from '../../../notes/save_timeline'; +import { AddNote } from '../../../../../notes/components/add_note'; +import { useUserPrivileges } from '../../../../../common/components/user_privileges'; +import { + NOTES_LOADING_TEST_ID, + TIMELINE_DESCRIPTION_COMMENT_TEST_ID, +} from '../../../../../notes/components/test_ids'; +import { useAppToasts } from '../../../../../common/hooks/use_app_toasts'; +import { ADDED_A_DESCRIPTION } from '../../../open_timeline/note_previews/translations'; +import { defaultToEmptyTag, getEmptyValue } from '../../../../../common/components/empty_value'; +import { selectTimelineById } from '../../../../store/selectors'; import { - useDeepEqualSelector, - useShallowEqualSelector, -} from '../../../../../common/hooks/use_selector'; -import { TimelineStatusEnum } from '../../../../../../common/api/timeline'; -import { appSelectors } from '../../../../../common/store/app'; -import { AddNote } from '../../../notes/add_note'; -import { CREATED_BY, NOTES } from '../../../notes/translations'; -import { PARTICIPANTS } from '../../translations'; -import { NotePreviews } from '../../../open_timeline/note_previews'; -import type { TimelineResultNote } from '../../../open_timeline/types'; -import { getTimelineNoteSelector } from './selectors'; + fetchNotesBySavedObjectIds, + ReqStatus, + selectFetchNotesBySavedObjectIdsError, + selectFetchNotesBySavedObjectIdsStatus, + selectSortedNotesBySavedObjectId, +} from '../../../../../notes'; +import type { Note } from '../../../../../../common/api/timeline'; +import { NotesList } from '../../../../../notes/components/notes_list'; +import { OldNotes } from '../../../notes/old_notes'; +import { Participants } from '../../../notes/participants'; +import { NOTES } from '../../../notes/translations'; +import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; +import { useShallowEqualSelector } from '../../../../../common/hooks/use_selector'; import { getScrollToTopSelector } from '../selectors'; import { useScrollToTop } from '../../../../../common/components/scroll_to_top'; -import { useUserPrivileges } from '../../../../../common/components/user_privileges'; -import { FullWidthFlexGroup, VerticalRule } from '../shared/layout'; - -const ScrollableDiv = styled.div` - overflow-x: hidden; - overflow-y: auto; - padding-inline: ${({ theme }) => (theme as EuiTheme).eui.euiSizeM}; - padding-block: ${({ theme }) => (theme as EuiTheme).eui.euiSizeS}; -`; - -const StyledPanel = styled(EuiPanel)` - border: 0; - box-shadow: none; -`; - -const StyledEuiFlexGroup = styled(EuiFlexGroup)` - flex: 0; -`; - -const Username = styled(EuiText)` - font-weight: bold; -`; - -interface UsernameWithAvatar { - username: string; -} +import type { State } from '../../../../../common/store'; -const UsernameWithAvatarComponent: React.FC<UsernameWithAvatar> = ({ username }) => ( - <StyledEuiFlexGroup gutterSize="s" responsive={false} alignItems="center"> - <EuiFlexItem grow={false}> - <EuiAvatar data-test-subj="avatar" name={username} size="l" /> - </EuiFlexItem> - <EuiFlexItem> - <Username>{username}</Username> - </EuiFlexItem> - </StyledEuiFlexGroup> -); - -const UsernameWithAvatar = React.memo(UsernameWithAvatarComponent); - -interface ParticipantsProps { - users: TimelineResultNote[]; -} - -const ParticipantsComponent: React.FC<ParticipantsProps> = ({ users }) => { - const List = useMemo( - () => - users.map((user) => ( - <Fragment key={user.updatedBy === null ? undefined : user.updatedBy}> - <UsernameWithAvatar - key={user.updatedBy === null ? undefined : user.updatedBy} - username={String(user.updatedBy)} - /> - <EuiSpacer size="s" /> - </Fragment> - )), - [users] - ); - - if (!users.length) { - return null; +export const FETCH_NOTES_ERROR = i18n.translate( + 'xpack.securitySolution.notes.fetchNotesErrorLabel', + { + defaultMessage: 'Error fetching notes', } - - return ( - <> - <EuiTitle size="xs"> - <h4>{PARTICIPANTS}</h4> - </EuiTitle> - <EuiHorizontalRule margin="s" /> - {List} - </> - ); -}; - -ParticipantsComponent.displayName = 'ParticipantsComponent'; - -const Participants = React.memo(ParticipantsComponent); +); +export const NO_NOTES = i18n.translate('xpack.securitySolution.notes.noNotesLabel', { + defaultMessage: 'No notes have yet been created for this timeline', +}); interface NotesTabContentProps { + /** + * The timeline id + */ timelineId: string; } -const NotesTabContentComponent: React.FC<NotesTabContentProps> = ({ timelineId }) => { +/** + * Renders the notes tab content. + * At this time the component support the old notes system and the new notes system (via the securitySolutionNotesEnabled feature flag). + * The old notes system is deprecated and will be removed in the future. + * In both cases, the component fetches the notes for the timeline and renders: + * - the timeline description + * - the notes list + * - the participants list + * - the markdown to create a new note and the add note button + */ +const NotesTabContentComponent: React.FC<NotesTabContentProps> = React.memo(({ timelineId }) => { + const { addError: addErrorToast } = useAppToasts(); const dispatch = useDispatch(); + const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); + const canCreateNotes = kibanaSecuritySolutionsPrivileges.crud; + + const securitySolutionNotesEnabled = useIsExperimentalFeatureEnabled( + 'securitySolutionNotesEnabled' + ); const getScrollToTop = useMemo(() => getScrollToTopSelector(), []); const scrollToTop = useShallowEqualSelector((state) => getScrollToTop(state, timelineId)); - useScrollToTop('#scrollableNotes', !!scrollToTop); - const getTimelineNotes = useMemo(() => getTimelineNoteSelector(), []); - const { - createdBy, - eventIdToNoteIds, - noteIds, - status: timelineStatus, - } = useDeepEqualSelector((state) => getTimelineNotes(state, timelineId)); - const getNotesAsCommentsList = useMemo( - () => appSelectors.selectNotesAsCommentsListSelector(), - [] + const timeline = useSelector((state: State) => selectTimelineById(state, timelineId)); + const timelineSavedObjectId = useMemo(() => timeline?.savedObjectId ?? '', [timeline]); + const isTimelineSaved: boolean = useMemo( + () => timelineSavedObjectId.length > 0, + [timelineSavedObjectId] ); - const [newNote, setNewNote] = useState(''); - const isImmutable = timelineStatus === TimelineStatusEnum.immutable; - const appNotes: TimelineResultNote[] = useDeepEqualSelector(getNotesAsCommentsList); - - const allTimelineNoteIds = useMemo(() => { - const eventNoteIds = Object.values(eventIdToNoteIds).reduce<string[]>( - (acc, v) => [...acc, ...v], - [] - ); - return [...noteIds, ...eventNoteIds]; - }, [noteIds, eventIdToNoteIds]); - const notes = useMemo( - () => appNotes.filter((appNote) => allTimelineNoteIds.includes(appNote?.noteId ?? '-1')), - [appNotes, allTimelineNoteIds] + const fetchNotes = useCallback( + () => dispatch(fetchNotesBySavedObjectIds({ savedObjectIds: [timelineSavedObjectId] })), + [dispatch, timelineSavedObjectId] ); - // filter for savedObjectId to make sure we don't display `elastic` user while saving the note - const participants = useMemo(() => uniqBy('updatedBy', filter('savedObjectId', notes)), [notes]); - - const associateNote = useCallback( - (noteId: string) => dispatch(timelineActions.addNote({ id: timelineId, noteId })), - [dispatch, timelineId] + useEffect(() => { + if (isTimelineSaved) { + fetchNotes(); + } + }, [fetchNotes, isTimelineSaved]); + + const notes: Note[] = useSelector((state: State) => + selectSortedNotesBySavedObjectId(state, { + savedObjectId: timelineSavedObjectId, + sort: { field: 'created', direction: 'asc' }, + }) ); - - const SidebarContent = useMemo( - () => ( + const fetchStatus = useSelector((state: State) => selectFetchNotesBySavedObjectIdsStatus(state)); + const fetchError = useSelector((state: State) => selectFetchNotesBySavedObjectIdsError(state)); + + // show a toast if the fetch notes call fails + useEffect(() => { + if (fetchStatus === ReqStatus.Failed && fetchError) { + addErrorToast(null, { + title: FETCH_NOTES_ERROR, + }); + } + }, [addErrorToast, fetchError, fetchStatus]); + + // if timeline was saved with a description, we show it at the very top of the notes tab + const timelineDescription = useMemo(() => { + if (!timeline?.description) { + return null; + } + + return ( <> - {createdBy && ( - <> - <EuiTitle size="xs"> - <h4>{CREATED_BY}</h4> - </EuiTitle> - <EuiHorizontalRule margin="s" /> - <UsernameWithAvatar username={createdBy} /> - <EuiSpacer size="xxl" /> - </> - )} - <Participants users={participants} /> + <EuiComment + key={'note-preview-description'} + username={defaultToEmptyTag(timeline.updatedBy)} + timestamp={ + <> + {timeline.updated ? ( + <FormattedRelative data-test-subj="updated" value={new Date(timeline.updated)} /> + ) : ( + getEmptyValue() + )} + </> + } + event={ADDED_A_DESCRIPTION} + timelineAvatar={<EuiAvatar size="l" name={timeline.updatedBy || '?'} />} + data-test-subj={TIMELINE_DESCRIPTION_COMMENT_TEST_ID} + > + <EuiText size="s">{timeline.description}</EuiText> + </EuiComment> + <EuiSpacer /> </> - ), - [createdBy, participants] - ); + ); + }, [timeline.description, timeline.updated, timeline.updatedBy]); return ( - <FullWidthFlexGroup gutterSize="none"> - <EuiFlexItem component={ScrollableDiv} grow={2} id="scrollableNotes"> - <StyledPanel paddingSize="none"> + <EuiPanel> + <EuiFlexGroup direction="column"> + <EuiFlexItem grow={false}> <EuiTitle> <h3>{NOTES}</h3> </EuiTitle> - <NotePreviews notes={notes} timelineId={timelineId} showTimelineDescription /> - <EuiSpacer size="s" /> - {!isImmutable && kibanaSecuritySolutionsPrivileges.crud === true && ( - <AddNote - associateNote={associateNote} - newNote={newNote} - updateNewNote={setNewNote} - autoFocusDisabled={!!scrollToTop} - /> + </EuiFlexItem> + <EuiFlexItem> + {securitySolutionNotesEnabled ? ( + <EuiFlexGroup data-test-subj={'new-notes-screen'}> + <EuiFlexItem> + {timelineDescription} + {fetchStatus === ReqStatus.Loading && ( + <EuiLoadingElastic data-test-subj={NOTES_LOADING_TEST_ID} size="xxl" /> + )} + {isTimelineSaved && fetchStatus === ReqStatus.Succeeded && notes.length === 0 ? ( + <EuiFlexGroup justifyContent="center"> + <EuiFlexItem grow={false}> + <p>{NO_NOTES}</p> + </EuiFlexItem> + </EuiFlexGroup> + ) : ( + <NotesList notes={notes} options={{ hideTimelineIcon: true }} /> + )} + {canCreateNotes && ( + <> + <EuiSpacer /> + <AddNote timelineId={timeline.savedObjectId} disableButton={!isTimelineSaved}> + {!isTimelineSaved && <SaveTimelineCallout />} + </AddNote> + </> + )} + </EuiFlexItem> + <EuiFlexItem + css={css` + max-width: 350px; + `} + > + <Participants notes={notes} timelineCreatedBy={timeline.createdBy} /> + </EuiFlexItem> + </EuiFlexGroup> + ) : ( + <OldNotes timelineId={timelineId} /> )} - </StyledPanel> - </EuiFlexItem> - <VerticalRule /> - <EuiFlexItem component={ScrollableDiv} grow={1}> - {SidebarContent} - </EuiFlexItem> - </FullWidthFlexGroup> + </EuiFlexItem> + </EuiFlexGroup> + </EuiPanel> ); -}; +}); NotesTabContentComponent.displayName = 'NotesTabContentComponent'; -const NotesTabContent = React.memo(NotesTabContentComponent); - // eslint-disable-next-line import/no-default-export -export { NotesTabContent as default }; +export { NotesTabContentComponent as default }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx index 7e5e9a221ffee..2fa1b53881b08 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx @@ -37,6 +37,7 @@ import { getEndpointPrivilegesInitialStateMock } from '../../../../../common/com import * as timelineActions from '../../../../store/actions'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { createExpandableFlyoutApiMock } from '../../../../../common/mock/expandable_flyout'; +import { OPEN_FLYOUT_BUTTON_TEST_ID } from '../../../../../notes/components/test_ids'; jest.mock('../../../../../common/components/user_privileges'); @@ -1004,7 +1005,7 @@ describe('query tab with unified timeline', () => { fireEvent.click(screen.getByTestId('timeline-notes-button-small')); await waitFor(() => { - expect(screen.queryByTestId('notes-toggle-event-details')).not.toBeInTheDocument(); + expect(screen.queryByTestId(OPEN_FLYOUT_BUTTON_TEST_ID)).not.toBeInTheDocument(); }); }, SPECIAL_TEST_TIMEOUT diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts index 30ae41c1da820..4fd39ade7df0c 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { v4 as uuidv4 } from 'uuid'; import type { SecurityPluginSetup } from '@kbn/security-plugin/server'; import { serverMock, @@ -23,20 +24,20 @@ const getAllNotesRequest = (query?: GetNotesRequestQuery) => query, }); -const createMockedNotes = (numberOfNotes: number) => { - return Array.from({ length: numberOfNotes }, (_, index) => { - return { - id: index + 1, - timelineId: 'timeline', - eventId: 'event', - note: `test note ${index}`, - created: 1280120812453, - createdBy: 'test', - updated: 108712801280, - updatedBy: 'test', - }; - }); -}; +const createMockedNotes = ( + numberOfNotes: number, + options?: { documentId?: string; savedObjectId?: string } +) => + Array.from({ length: numberOfNotes }, () => ({ + id: uuidv4(), + timelineId: options?.savedObjectId || 'timeline', + eventId: options?.documentId || 'event', + note: `test note`, + created: 1280120812453, + createdBy: 'test', + updated: 108712801280, + updatedBy: 'test', + })); describe('get notes route', () => { let server: ReturnType<typeof serverMock.create>; @@ -45,7 +46,7 @@ describe('get notes route', () => { let mockGetAllSavedNote: jest.Mock; beforeEach(() => { - jest.clearAllMocks(); + jest.resetModules(); server = serverMock.create(); context = requestContextMock.createTools().context; @@ -61,14 +62,16 @@ describe('get notes route', () => { jest.doMock('../../saved_object/notes', () => ({ getAllSavedNote: mockGetAllSavedNote, })); + const getNotesRoute = jest.requireActual('.').getNotesRoute; getNotesRoute(server.router, createMockConfig(), securitySetup); }); test('should return a list of notes and the count by default', async () => { + const mockNotes = createMockedNotes(3); mockGetAllSavedNote.mockResolvedValue({ - notes: createMockedNotes(5), - totalCount: 5, + notes: mockNotes, + totalCount: mockNotes.length, }); const response = await server.inject( @@ -78,8 +81,88 @@ describe('get notes route', () => { expect(response.status).toEqual(200); expect(response.body).toEqual({ - totalCount: 5, - notes: createMockedNotes(5), + notes: mockNotes, + totalCount: mockNotes.length, + }); + }); + + test('should return a list of notes filtered by an array of document ids', async () => { + const documentId = 'document1'; + const mockDocumentNotes = createMockedNotes(3, { documentId }); + mockGetAllSavedNote.mockResolvedValue({ + notes: mockDocumentNotes, + totalCount: mockDocumentNotes.length, + }); + + const response = await server.inject( + getAllNotesRequest({ documentIds: [documentId] }), + requestContextMock.convertContext(context) + ); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + notes: mockDocumentNotes, + totalCount: mockDocumentNotes.length, + }); + }); + + test('should return a list of notes filtered by a single document id', async () => { + const documentId = 'document2'; + const mockDocumentNotes = createMockedNotes(3, { documentId }); + mockGetAllSavedNote.mockResolvedValue({ + notes: mockDocumentNotes, + totalCount: mockDocumentNotes.length, + }); + + const response = await server.inject( + getAllNotesRequest({ documentIds: documentId }), + requestContextMock.convertContext(context) + ); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + notes: mockDocumentNotes, + totalCount: mockDocumentNotes.length, + }); + }); + + test('should return a list of notes filtered by an array of saved object ids', async () => { + const savedObjectId = 'savedObject1'; + const mockSavedObjectIdNotes = createMockedNotes(3, { savedObjectId }); + mockGetAllSavedNote.mockResolvedValue({ + notes: mockSavedObjectIdNotes, + totalCount: mockSavedObjectIdNotes.length, + }); + + const response = await server.inject( + getAllNotesRequest({ savedObjectIds: [savedObjectId] }), + requestContextMock.convertContext(context) + ); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + notes: mockSavedObjectIdNotes, + totalCount: mockSavedObjectIdNotes.length, + }); + }); + + test('should return a list of notes filtered by a single saved object id', async () => { + const savedObjectId = 'savedObject2'; + const mockSavedObjectIdNotes = createMockedNotes(3, { savedObjectId }); + mockGetAllSavedNote.mockResolvedValue({ + notes: mockSavedObjectIdNotes, + totalCount: mockSavedObjectIdNotes.length, + }); + + const response = await server.inject( + getAllNotesRequest({ savedObjectIds: savedObjectId }), + requestContextMock.convertContext(context) + ); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + notes: mockSavedObjectIdNotes, + totalCount: mockSavedObjectIdNotes.length, }); }); }); 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 920a7ef763dd5..2794fd5d8cd7d 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 @@ -9,6 +9,7 @@ import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; +import { timelineSavedObjectType } from '../../saved_object_mappings'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; @@ -39,6 +40,7 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter) => { const queryParams = request.query; const frameworkRequest = await buildFrameworkRequest(context, request); const documentIds = queryParams.documentIds ?? null; + const savedObjectIds = queryParams.savedObjectIds ?? null; if (documentIds != null) { if (Array.isArray(documentIds)) { const docIdSearchString = documentIds?.join(' | '); @@ -61,6 +63,34 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter) => { const res = await getAllSavedNote(frameworkRequest, options); return response.ok({ body: res ?? {} }); } + } else if (savedObjectIds != null) { + if (Array.isArray(savedObjectIds)) { + const soIdSearchString = savedObjectIds?.join(' | '); + const options = { + type: noteSavedObjectType, + hasReference: { + type: timelineSavedObjectType, + id: soIdSearchString, + }, + page: 1, + perPage: MAX_UNASSOCIATED_NOTES, + }; + const res = await getAllSavedNote(frameworkRequest, options); + const body: GetNotesResponse = res ?? {}; + return response.ok({ body }); + } else { + const options = { + type: noteSavedObjectType, + hasReference: { + type: timelineSavedObjectType, + id: savedObjectIds, + }, + perPage: MAX_UNASSOCIATED_NOTES, + }; + const res = await getAllSavedNote(frameworkRequest, options); + const body: GetNotesResponse = res ?? {}; + return response.ok({ body }); + } } else { const perPage = queryParams?.perPage ? parseInt(queryParams.perPage, 10) : 10; const page = queryParams?.page ? parseInt(queryParams.page, 10) : 1; From c7e44c834e1e4ed5581bfef4f95b5456203612d0 Mon Sep 17 00:00:00 2001 From: Tim Sullivan <tsullivan@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:45:48 -0700 Subject: [PATCH 086/107] [Reporting] Unskip tests on access to download link in stack management (#193353) ## Summary Closes #192014 Flaky test runner: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7021 --- .../reporting_and_security/management.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/x-pack/test/reporting_functional/reporting_and_security/management.ts b/x-pack/test/reporting_functional/reporting_and_security/management.ts index e1d124ede931e..f48dbd3271f70 100644 --- a/x-pack/test/reporting_functional/reporting_and_security/management.ts +++ b/x-pack/test/reporting_functional/reporting_and_security/management.ts @@ -15,8 +15,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { const reportingFunctional = getService('reportingFunctional'); const esArchiver = getService('esArchiver'); - // Failing: See https://github.com/elastic/kibana/issues/192014 - describe.skip('Access to Management > Reporting', () => { + describe('Access to Management > Reporting', () => { before(async () => { await reportingFunctional.initEcommerce(); }); @@ -59,22 +58,27 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { describe('Download report', () => { // use archived reports to allow reporting_user to view report jobs they've created - before(async () => { + before('log in as reporting user', async () => { await esArchiver.load('x-pack/test/functional/es_archives/reporting/archived_reports'); - - await reportingFunctional.loginReportingUser(); - await PageObjects.common.navigateToApp('reporting'); - await testSubjects.existOrFail('reportJobListing'); }); + after(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/reporting/archived_reports'); }); it('user can access download link', async () => { + await reportingFunctional.loginReportingUser(); + await PageObjects.common.navigateToApp('reporting'); + await testSubjects.existOrFail('reportJobListing'); + await testSubjects.existOrFail('reportDownloadLink-kraz9db6154g0763b5141viu'); }); it('user can access download link for export type that is no longer supported', async () => { + await reportingFunctional.loginReportingUser(); + await PageObjects.common.navigateToApp('reporting'); + await testSubjects.existOrFail('reportJobListing'); + // The "csv" export type, aka CSV V1, was removed and can no longer be created. // Downloading a report of this export type does still work await testSubjects.existOrFail('reportDownloadLink-krb7arhe164k0763b50bjm31'); From 4a2ae7aa5129d0f83c2da3c34d39aa42dc1c4f8e Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:54:00 -0700 Subject: [PATCH 087/107] Update ftr (main) (#194509) 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 | |---|---|---|---|---| | [chromedriver](https://togithub.com/giggio/node-chromedriver) | devDependencies | major | [`^128.0.3` -> `^129.0.0`](https://renovatebot.com/diffs/npm/chromedriver/128.0.3/129.0.0) | `129.0.1` | | [selenium-webdriver](https://togithub.com/SeleniumHQ/selenium/tree/trunk/javascript/node/selenium-webdriver#readme) ([source](https://togithub.com/SeleniumHQ/selenium)) | devDependencies | patch | [`^4.24.1` -> `^4.25.0`](https://renovatebot.com/diffs/npm/selenium-webdriver/4.25.0/4.25.0) | | --- ### Release Notes <details> <summary>giggio/node-chromedriver (chromedriver)</summary> ### [`v129.0.0`](https://togithub.com/giggio/node-chromedriver/compare/128.0.3...129.0.0) [Compare Source](https://togithub.com/giggio/node-chromedriver/compare/128.0.3...129.0.0) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJUZWFtOk9wZXJhdGlvbnMiLCJyZWxlYXNlX25vdGU6c2tpcCJdfQ==--> Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- package.json | 4 ++-- yarn.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 9c19effacf164..525bedcab5ef9 100644 --- a/package.json +++ b/package.json @@ -1672,7 +1672,7 @@ "buildkite-test-collector": "^1.7.0", "callsites": "^3.1.0", "chance": "1.0.18", - "chromedriver": "^128.0.3", + "chromedriver": "^129.0.0", "clean-webpack-plugin": "^3.0.0", "cli-progress": "^3.12.0", "cli-table3": "^0.6.1", @@ -1797,7 +1797,7 @@ "rxjs-marbles": "^7.0.1", "sass-embedded": "^1.78.0", "sass-loader": "^10.5.1", - "selenium-webdriver": "^4.24.1", + "selenium-webdriver": "^4.25.0", "sharp": "0.32.6", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/yarn.lock b/yarn.lock index ac4dfd08d254d..8146185716b37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14211,10 +14211,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^128.0.3: - version "128.0.3" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-128.0.3.tgz#7c2cd2d160f269e78f40840ee7a043dac3687148" - integrity sha512-Xn/bknOpGlY9tKinwS/hVWeNblSeZvbbJbF8XZ73X1jeWfAFPRXx3fMLdNNz8DqruDbx3cKEJ5wR3mnst6G3iw== +chromedriver@^129.0.0: + version "129.0.1" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-129.0.1.tgz#4a7215f57c419e87468f04f3b011db51e6bc80fc" + integrity sha512-thJqK3c7p9rIhmjBvs/cgaK0Hk30g7LbnmMXQ2aLnn75ZOiEl/2GBcgc6fw+4GIw1SmOYhnNmaEI1iTP3qob0w== dependencies: "@testim/chrome-version" "^1.1.4" axios "^1.7.4" @@ -28374,7 +28374,7 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@^4.24.1: +selenium-webdriver@^4.25.0: version "4.25.0" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.25.0.tgz#3562b49668817974bb1d13d25a50e8bc0264fcf3" integrity sha512-zl9IX93caOT8wbcCpZzAkEtYa+hNgJ4C5GUN8uhpzggqRLvsg1asfKi0p1uNZC8buYVvsBZbx8S+9MjVAjs4oA== From 83d321b59da437c0493760b2d264d30e06807474 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski <jon@elastic.co> Date: Tue, 1 Oct 2024 16:42:09 -0500 Subject: [PATCH 088/107] skip failing test suite (#188133) --- .../public/components/case_form_fields/custom_fields.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/case_form_fields/custom_fields.test.tsx b/x-pack/plugins/cases/public/components/case_form_fields/custom_fields.test.tsx index 74ac6e612cbc2..f11e5826ca91c 100644 --- a/x-pack/plugins/cases/public/components/case_form_fields/custom_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/case_form_fields/custom_fields.test.tsx @@ -15,7 +15,8 @@ import { FormTestComponent } from '../../common/test_utils'; import { customFieldsConfigurationMock } from '../../containers/mock'; import { CustomFields } from './custom_fields'; -describe('CustomFields', () => { +// Failing: See https://github.com/elastic/kibana/issues/188133 +describe.skip('CustomFields', () => { let appMockRender: AppMockRenderer; const onSubmit = jest.fn(); From 58e6233679d7f2d7c45ac4cafedb73cf1a449501 Mon Sep 17 00:00:00 2001 From: Brad White <brad.white@elastic.co> Date: Tue, 1 Oct 2024 16:43:43 -0600 Subject: [PATCH 089/107] Skip failing test suite (#193103) --- .../timelines/components/timeline/tabs/query/index.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx index 4f879ce52b310..8f6540f54eaf1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx @@ -137,7 +137,8 @@ describe('Timeline', () => { }; }); - describe('rendering', () => { + // Failing: see https://github.com/elastic/kibana/issues/193103 + describe.skip('rendering', () => { let spyCombineQueries: jest.SpyInstance; beforeEach(() => { From 7a9a5194d7acf8a9e507ae6b6acc9d22f56cf2ea Mon Sep 17 00:00:00 2001 From: Rachel Shen <rshen@elastic.co> Date: Tue, 1 Oct 2024 17:01:20 -0600 Subject: [PATCH 090/107] [Observability] fix slo observability compressed styles to be not compressed (#193081) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Building off of PR https://github.com/elastic/kibana/pull/192993 to revert the compressed styles for SLOs Compressed styles PR [here](https://github.com/elastic/kibana/pull/190636) ### Before In the SLO page in Observability, the status and tags fields are uneven with the unified search bar. ![Screenshot 2024-09-30 at 2 10 17 PM](https://github.com/user-attachments/assets/63391aa2-ec7d-43f5-9803-8094e73b8a6c) ### After ![Screenshot 2024-09-30 at 2 52 37 PM](https://github.com/user-attachments/assets/fb70109d-15d1-4278-81c6-318da290594f) --- .../components/control_panel.tsx | 5 ++- .../control_group_renderer.tsx | 3 ++ .../control_group/utils/is_compressed.test.ts | 33 +++++++++++++++++++ .../control_group/utils/is_compressed.ts | 23 +++++++++++++ .../components/options_list_control.tsx | 3 +- .../components/range_slider_control.tsx | 4 ++- .../get_range_slider_control_factory.tsx | 2 ++ .../components/time_slider_anchored_range.tsx | 3 +- .../time_slider_popover_content.tsx | 3 ++ .../time_slider_sliding_window_range.tsx | 3 +- .../get_timeslider_control_factory.tsx | 2 ++ .../slos/components/common/quick_filters.tsx | 1 + 12 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 src/plugins/controls/public/control_group/utils/is_compressed.test.ts create mode 100644 src/plugins/controls/public/control_group/utils/is_compressed.ts diff --git a/src/plugins/controls/public/control_group/components/control_panel.tsx b/src/plugins/controls/public/control_group/components/control_panel.tsx index 73eee5c5146ae..acff284eeba1f 100644 --- a/src/plugins/controls/public/control_group/components/control_panel.tsx +++ b/src/plugins/controls/public/control_group/components/control_panel.tsx @@ -34,6 +34,7 @@ import { ControlPanelProps, DefaultControlApi } from '../../controls/types'; import { ControlError } from './control_error'; import './control_panel.scss'; +import { isCompressed } from '../utils/is_compressed'; const DragHandle = ({ isEditable, @@ -122,7 +123,6 @@ export const ControlPanel = <ApiType extends DefaultControlApi = DefaultControlA const isEditable = viewMode === ViewMode.EDIT; const controlWidth = width ?? DEFAULT_CONTROL_WIDTH; const controlGrow = grow ?? DEFAULT_CONTROL_GROW; - return ( <EuiFlexItem ref={setNodeRef} @@ -154,12 +154,10 @@ export const ControlPanel = <ApiType extends DefaultControlApi = DefaultControlA data-test-subj="control-frame-title" fullWidth label={usingTwoLineLayout ? panelTitle || defaultPanelTitle || '...' : undefined} - display="rowCompressed" > <EuiFormControlLayout fullWidth isLoading={Boolean(dataLoading)} - compressed className={classNames( 'controlFrame__formControlLayout', { @@ -191,6 +189,7 @@ export const ControlPanel = <ApiType extends DefaultControlApi = DefaultControlA )} </> } + compressed={isCompressed(api)} > <> {blockingError && ( diff --git a/src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer.tsx b/src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer.tsx index 728c8ca551a28..6a50c60c4e597 100644 --- a/src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer.tsx +++ b/src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer.tsx @@ -40,6 +40,7 @@ export interface ControlGroupRendererProps { timeRange?: TimeRange; query?: Query; dataLoading?: boolean; + compressed?: boolean; } export const ControlGroupRenderer = ({ @@ -50,6 +51,7 @@ export const ControlGroupRenderer = ({ query, viewMode, dataLoading, + compressed, }: ControlGroupRendererProps) => { const id = useMemo(() => uuidv4(), []); const [regenerateId, setRegenerateId] = useState(uuidv4()); @@ -171,6 +173,7 @@ export const ControlGroupRenderer = ({ getRuntimeStateForChild: () => { return runtimeState$.getValue(); }, + compressed: compressed ?? true, })} onApiAvailable={(controlGroupApi) => { const controlGroupRendererApi: ControlGroupRendererApi = { diff --git a/src/plugins/controls/public/control_group/utils/is_compressed.test.ts b/src/plugins/controls/public/control_group/utils/is_compressed.test.ts new file mode 100644 index 0000000000000..e17fced5831bf --- /dev/null +++ b/src/plugins/controls/public/control_group/utils/is_compressed.test.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", 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 { isCompressed } from './is_compressed'; + +describe('isCompressed', () => { + test('should return true by default', () => { + const mockApi = {}; + expect(isCompressed(mockApi)).toBe(true); + }); + test('should return false if compressed is false', () => { + const mockApi = { compressed: false }; + expect(isCompressed(mockApi)).toBe(false); + }); + test('should return false if parent api has compressed false', () => { + const mockApi = { parentApi: { compressed: false } }; + expect(isCompressed(mockApi)).toBe(false); + }); + test('should return false if nested api has compressed false', () => { + const mockApi = { parentApi: { parentApi: { parentApi: { compressed: false } } } }; + expect(isCompressed(mockApi)).toBe(false); + }); + test('should return true if parent api does not specify compressed', () => { + const mockApi = { parentApi: { parentApi: {} } }; + expect(isCompressed(mockApi)).toBe(true); + }); +}); diff --git a/src/plugins/controls/public/control_group/utils/is_compressed.ts b/src/plugins/controls/public/control_group/utils/is_compressed.ts new file mode 100644 index 0000000000000..46f7f27b66251 --- /dev/null +++ b/src/plugins/controls/public/control_group/utils/is_compressed.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 { apiHasParentApi } from '@kbn/presentation-publishing'; + +interface HasCompressed { + compressed: boolean; +} + +const apiHasCompressed = (unknownApi: unknown): unknownApi is HasCompressed => { + return Boolean(unknownApi) && typeof (unknownApi as HasCompressed).compressed === 'boolean'; +}; + +export function isCompressed(api: unknown): boolean { + if (apiHasCompressed(api)) return api.compressed; + return apiHasParentApi(api) ? isCompressed(api.parentApi) : true; +} diff --git a/src/plugins/controls/public/controls/data_controls/options_list_control/components/options_list_control.tsx b/src/plugins/controls/public/controls/data_controls/options_list_control/components/options_list_control.tsx index da9aa000dcef0..ebb5458478531 100644 --- a/src/plugins/controls/public/controls/data_controls/options_list_control/components/options_list_control.tsx +++ b/src/plugins/controls/public/controls/data_controls/options_list_control/components/options_list_control.tsx @@ -25,6 +25,7 @@ import { useBatchedPublishingSubjects, } from '@kbn/presentation-publishing'; +import { isCompressed } from '../../../../control_group/utils/is_compressed'; import { OptionsListSelection } from '../../../../../common/options_list/options_list_selections'; import { MIN_POPOVER_WIDTH } from '../../../constants'; import { useOptionsListContext } from '../options_list_context_provider'; @@ -174,7 +175,7 @@ export const OptionsListControl = ({ ); return ( - <EuiFilterGroup fullWidth compressed className={controlPanelClassName}> + <EuiFilterGroup fullWidth compressed={isCompressed(api)} className={controlPanelClassName}> <EuiInputPopover id={popoverId} ownFocus diff --git a/src/plugins/controls/public/controls/data_controls/range_slider/components/range_slider_control.tsx b/src/plugins/controls/public/controls/data_controls/range_slider/components/range_slider_control.tsx index 16c7ad967e8df..a05957d083086 100644 --- a/src/plugins/controls/public/controls/data_controls/range_slider/components/range_slider_control.tsx +++ b/src/plugins/controls/public/controls/data_controls/range_slider/components/range_slider_control.tsx @@ -33,6 +33,7 @@ interface Props { value: RangeValue | undefined; uuid: string; controlPanelClassName?: string; + compressed: boolean; } export const RangeSliderControl: FC<Props> = ({ @@ -46,6 +47,7 @@ export const RangeSliderControl: FC<Props> = ({ value, uuid, controlPanelClassName, + compressed, }: Props) => { const rangeSliderRef = useRef<EuiDualRangeProps | null>(null); @@ -194,7 +196,7 @@ export const RangeSliderControl: FC<Props> = ({ min={displayedMin} max={displayedMax} isLoading={isLoading} - compressed + compressed={compressed} inputPopoverProps={{ className: controlPanelClassName, panelMinWidth: MIN_POPOVER_WIDTH, diff --git a/src/plugins/controls/public/controls/data_controls/range_slider/get_range_slider_control_factory.tsx b/src/plugins/controls/public/controls/data_controls/range_slider/get_range_slider_control_factory.tsx index 0605fe4586abb..3d0fa52c6a113 100644 --- a/src/plugins/controls/public/controls/data_controls/range_slider/get_range_slider_control_factory.tsx +++ b/src/plugins/controls/public/controls/data_controls/range_slider/get_range_slider_control_factory.tsx @@ -14,6 +14,7 @@ import { EuiFieldNumber, EuiFormRow } from '@elastic/eui'; import { Filter, RangeFilterParams, buildRangeFilter } from '@kbn/es-query'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import { isCompressed } from '../../../control_group/utils/is_compressed'; import { RANGE_SLIDER_CONTROL } from '../../../../common'; import { initializeDataControl } from '../initialize_data_control'; import type { DataControlFactory } from '../types'; @@ -248,6 +249,7 @@ export const getRangesliderControlFactory = (): DataControlFactory< step={step ?? 1} value={value} uuid={uuid} + compressed={isCompressed(api)} /> ); }, diff --git a/src/plugins/controls/public/controls/timeslider_control/components/time_slider_anchored_range.tsx b/src/plugins/controls/public/controls/timeslider_control/components/time_slider_anchored_range.tsx index 0ab4a467e8694..88cd7fb1f1034 100644 --- a/src/plugins/controls/public/controls/timeslider_control/components/time_slider_anchored_range.tsx +++ b/src/plugins/controls/public/controls/timeslider_control/components/time_slider_anchored_range.tsx @@ -19,6 +19,7 @@ interface Props { ticks: EuiRangeTick[]; timeRangeMin: number; timeRangeMax: number; + compressed: boolean; } export function TimeSliderAnchoredRange(props: Props) { @@ -40,7 +41,7 @@ export function TimeSliderAnchoredRange(props: Props) { max={props.timeRangeMax} step={props.stepSize} ticks={props.ticks} - compressed + compressed={props.compressed} /> ); } diff --git a/src/plugins/controls/public/controls/timeslider_control/components/time_slider_popover_content.tsx b/src/plugins/controls/public/controls/timeslider_control/components/time_slider_popover_content.tsx index 0d45797d42799..fc4d050d71d59 100644 --- a/src/plugins/controls/public/controls/timeslider_control/components/time_slider_popover_content.tsx +++ b/src/plugins/controls/public/controls/timeslider_control/components/time_slider_popover_content.tsx @@ -24,6 +24,7 @@ interface Props { ticks: EuiRangeTick[]; timeRangeMin: number; timeRangeMax: number; + compressed: boolean; } export function TimeSliderPopoverContent(props: Props) { @@ -35,6 +36,7 @@ export function TimeSliderPopoverContent(props: Props) { ticks={props.ticks} timeRangeMin={props.timeRangeMin} timeRangeMax={props.timeRangeMax} + compressed={props.compressed} /> ) : ( <TimeSliderSlidingWindowRange @@ -44,6 +46,7 @@ export function TimeSliderPopoverContent(props: Props) { ticks={props.ticks} timeRangeMin={props.timeRangeMin} timeRangeMax={props.timeRangeMax} + compressed={props.compressed} /> ); const anchorStartToggleButtonLabel = props.isAnchored diff --git a/src/plugins/controls/public/controls/timeslider_control/components/time_slider_sliding_window_range.tsx b/src/plugins/controls/public/controls/timeslider_control/components/time_slider_sliding_window_range.tsx index aa699a3082ebd..f1b93ccfb57a8 100644 --- a/src/plugins/controls/public/controls/timeslider_control/components/time_slider_sliding_window_range.tsx +++ b/src/plugins/controls/public/controls/timeslider_control/components/time_slider_sliding_window_range.tsx @@ -18,6 +18,7 @@ interface Props { ticks: EuiRangeTick[]; timeRangeMin: number; timeRangeMax: number; + compressed: boolean; } export function TimeSliderSlidingWindowRange(props: Props) { @@ -36,7 +37,7 @@ export function TimeSliderSlidingWindowRange(props: Props) { step={props.stepSize} ticks={props.ticks} isDraggable - compressed + compressed={props.compressed} /> ); } diff --git a/src/plugins/controls/public/controls/timeslider_control/get_timeslider_control_factory.tsx b/src/plugins/controls/public/controls/timeslider_control/get_timeslider_control_factory.tsx index b7d5b6f077080..a0c6c237ace00 100644 --- a/src/plugins/controls/public/controls/timeslider_control/get_timeslider_control_factory.tsx +++ b/src/plugins/controls/public/controls/timeslider_control/get_timeslider_control_factory.tsx @@ -37,6 +37,7 @@ import { roundUpToNextStepSizeFactor, } from './time_utils'; import { Timeslice, TimesliderControlApi, TimesliderControlState } from './types'; +import { isCompressed } from '../../control_group/utils/is_compressed'; const displayName = i18n.translate('controls.timesliderControl.displayName', { defaultMessage: 'Time slider', @@ -306,6 +307,7 @@ export const getTimesliderControlFactory = (): ControlFactory< ticks={timeRangeMeta.ticks} timeRangeMin={timeRangeMeta.timeRangeMin} timeRangeMax={timeRangeMeta.timeRangeMax} + compressed={isCompressed(api)} /> </EuiInputPopover> ); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx index 82781a53612f3..ad350a3d17fbe 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/common/quick_filters.tsx @@ -92,6 +92,7 @@ export function QuickFilters({ }; }} timeRange={{ from: 'now-24h', to: 'now' }} + compressed={false} /> </Container> ); From 49a0e9d24b5acb2cdce9d67e667f29a6c5639666 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 2 Oct 2024 15:08:41 +1000 Subject: [PATCH 091/107] [api-docs] 2024-10-02 Daily api_docs build (#194654) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/848 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.devdocs.json | 48 ++-- 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.devdocs.json | 40 ++-- api_docs/charts.mdx | 2 +- api_docs/cloud.devdocs.json | 8 +- 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.devdocs.json | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.devdocs.json | 8 +- api_docs/content_management.mdx | 2 +- api_docs/controls.devdocs.json | 16 +- api_docs/controls.mdx | 4 +- api_docs/custom_integrations.devdocs.json | 24 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.devdocs.json | 6 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.devdocs.json | 8 +- 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.devdocs.json | 8 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.devdocs.json | 10 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.devdocs.json | 4 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.devdocs.json | 24 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.devdocs.json | 8 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 6 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.devdocs.json | 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 | 14 +- 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.devdocs.json | 32 +-- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.devdocs.json | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.devdocs.json | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.devdocs.json | 4 +- api_docs/event_annotation.mdx | 2 +- .../event_annotation_listing.devdocs.json | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.devdocs.json | 6 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.devdocs.json | 14 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.devdocs.json | 12 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.devdocs.json | 4 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.devdocs.json | 4 +- 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.devdocs.json | 12 +- 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.devdocs.json | 24 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.devdocs.json | 18 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.devdocs.json | 10 +- 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 | 209 ++++-------------- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.devdocs.json | 22 +- 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.devdocs.json | 12 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.devdocs.json | 34 ++- 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 +- .../kbn_alerts_as_data_utils.devdocs.json | 6 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.devdocs.json | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.devdocs.json | 54 ++--- 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.devdocs.json | 6 +- api_docs/kbn_apm_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.devdocs.json | 6 +- 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.devdocs.json | 6 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cbor.mdx | 2 +- api_docs/kbn_cell_actions.devdocs.json | 16 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.devdocs.json | 90 ++++---- 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 | 2 +- api_docs/kbn_cloud_security_posture.mdx | 2 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_code_editor.devdocs.json | 20 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.devdocs.json | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.devdocs.json | 12 +- 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 +- ...ent_management_content_editor.devdocs.json | 16 +- .../kbn_content_management_content_editor.mdx | 2 +- ...ement_content_insights_public.devdocs.json | 12 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...t_management_favorites_public.devdocs.json | 8 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.mdx | 2 +- ...gement_tabbed_table_list_view.devdocs.json | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...nt_management_table_list_view.devdocs.json | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...agement_table_list_view_table.devdocs.json | 20 +- ...ntent_management_table_list_view_table.mdx | 2 +- ...tent_management_user_profiles.devdocs.json | 24 +- .../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 +- .../kbn_core_application_browser.devdocs.json | 4 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.devdocs.json | 8 +- 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 +- ...e_http_router_server_internal.devdocs.json | 5 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 43 ++-- api_docs/kbn_core_http_server.mdx | 2 +- ...kbn_core_http_server_internal.devdocs.json | 9 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- .../kbn_core_http_server_mocks.devdocs.json | 205 +++++++++-------- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.devdocs.json | 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 +- ...cs_collectors_server_internal.devdocs.json | 5 +- ...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 +- ...bn_core_notifications_browser.devdocs.json | 4 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- .../kbn_core_overlays_browser.devdocs.json | 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 +- ...ore_rendering_server_internal.devdocs.json | 6 +- .../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 +- .../kbn_core_ui_settings_common.devdocs.json | 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.devdocs.json | 4 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.devdocs.json | 12 +- 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.devdocs.json | 4 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.devdocs.json | 4 +- 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 +- .../kbn_deeplinks_observability.devdocs.json | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.devdocs.json | 4 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.devdocs.json | 12 +- 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.devdocs.json | 22 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.devdocs.json | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- ...bn_ecs_data_quality_dashboard.devdocs.json | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.devdocs.json | 4 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.devdocs.json | 40 ++-- api_docs/kbn_elastic_assistant.mdx | 2 +- .../kbn_elastic_assistant_common.devdocs.json | 20 +- 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.devdocs.json | 2 +- api_docs/kbn_esql_editor.mdx | 2 +- api_docs/kbn_esql_utils.mdx | 2 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- .../kbn_event_annotation_common.devdocs.json | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- ...n_event_annotation_components.devdocs.json | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.devdocs.json | 18 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.devdocs.json | 12 +- 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.devdocs.json | 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.devdocs.json | 197 +++++++++-------- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- .../kbn_home_sample_data_card.devdocs.json | 18 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- .../kbn_home_sample_data_tab.devdocs.json | 18 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.devdocs.json | 52 ++--- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- ...index_management_shared_types.devdocs.json | 2 +- .../kbn_index_management_shared_types.mdx | 2 +- ..._inference_integration_flyout.devdocs.json | 16 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- .../kbn_investigation_shared.devdocs.json | 40 ++-- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.devdocs.json | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation.devdocs.json | 16 +- 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 +- ...n_management_cards_navigation.devdocs.json | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- ...nagement_settings_application.devdocs.json | 20 +- .../kbn_management_settings_application.mdx | 2 +- ...ngs_components_field_category.devdocs.json | 16 +- ...ent_settings_components_field_category.mdx | 2 +- ...ttings_components_field_input.devdocs.json | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...settings_components_field_row.devdocs.json | 14 +- ...nagement_settings_components_field_row.mdx | 2 +- ...ment_settings_components_form.devdocs.json | 12 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- .../kbn_management_settings_ids.devdocs.json | 15 ++ api_docs/kbn_management_settings_ids.mdx | 4 +- ...n_management_settings_section_registry.mdx | 2 +- ...kbn_management_settings_types.devdocs.json | 6 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.devdocs.json | 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.devdocs.json | 28 +-- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.devdocs.json | 24 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- .../kbn_ml_field_stats_flyout.devdocs.json | 46 ++-- api_docs/kbn_ml_field_stats_flyout.mdx | 2 +- api_docs/kbn_ml_in_memory_table.devdocs.json | 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.devdocs.json | 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.devdocs.json | 4 +- 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 +- ...n_observability_alert_details.devdocs.json | 8 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ..._padded_alert_time_range_util.devdocs.json | 4 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- ...vability_synthetics_test_data.devdocs.json | 98 ++++++++ ...kbn_observability_synthetics_test_data.mdx | 30 +++ 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.devdocs.json | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.devdocs.json | 4 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.devdocs.json | 12 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- ...n_react_kibana_context_render.devdocs.json | 8 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- ...kbn_react_kibana_context_root.devdocs.json | 16 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- ...n_react_kibana_context_styled.devdocs.json | 4 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- ...bn_react_kibana_context_theme.devdocs.json | 4 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.devdocs.json | 10 +- 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.devdocs.json | 14 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.devdocs.json | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.devdocs.json | 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.devdocs.json | 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_panels.devdocs.json | 82 ++++--- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.devdocs.json | 16 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.devdocs.json | 4 +- api_docs/kbn_search_errors.mdx | 2 +- .../kbn_search_index_documents.devdocs.json | 86 +++++-- api_docs/kbn_search_index_documents.mdx | 4 +- .../kbn_search_response_warnings.devdocs.json | 10 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- ...n_security_api_key_management.devdocs.json | 56 ++--- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- .../kbn_security_form_components.devdocs.json | 23 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- ..._security_plugin_types_public.devdocs.json | 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 +- .../kbn_security_solution_common.devdocs.json | 76 ++++--- api_docs/kbn_security_solution_common.mdx | 2 +- ...ity_solution_distribution_bar.devdocs.json | 8 +- ...kbn_security_solution_distribution_bar.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- ..._security_solution_navigation.devdocs.json | 8 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- ...bn_security_solution_side_nav.devdocs.json | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_security_ui_components.devdocs.json | 4 +- api_docs/kbn_security_ui_components.mdx | 2 +- ...securitysolution_autocomplete.devdocs.json | 48 ++-- .../kbn_securitysolution_autocomplete.mdx | 2 +- ...n_securitysolution_data_table.devdocs.json | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ion_exception_list_components.devdocs.json | 40 ++-- ...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.devdocs.json | 36 ++- 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 +- ...n_serverless_project_switcher.devdocs.json | 18 +- 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 +- ...kbn_shared_ux_avatar_solution.devdocs.json | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ed_ux_button_exit_full_screen.devdocs.json | 10 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- .../kbn_shared_ux_button_toolbar.devdocs.json | 18 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- .../kbn_shared_ux_card_no_data.devdocs.json | 18 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- ...n_shared_ux_chrome_navigation.devdocs.json | 26 +-- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- .../kbn_shared_ux_error_boundary.devdocs.json | 16 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- .../kbn_shared_ux_file_context.devdocs.json | 4 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- .../kbn_shared_ux_file_image.devdocs.json | 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 +- .../kbn_shared_ux_file_picker.devdocs.json | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- .../kbn_shared_ux_file_upload.devdocs.json | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- ...n_shared_ux_link_redirect_app.devdocs.json | 44 ++-- 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.devdocs.json | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- ...red_ux_page_analytics_no_data.devdocs.json | 22 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- ...shared_ux_page_kibana_no_data.devdocs.json | 18 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- ...hared_ux_page_kibana_template.devdocs.json | 30 +-- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- .../kbn_shared_ux_page_no_data.devdocs.json | 18 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- ...shared_ux_page_no_data_config.devdocs.json | 42 ++-- .../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 +- ...n_shared_ux_page_solution_nav.devdocs.json | 12 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- ...hared_ux_prompt_no_data_views.devdocs.json | 22 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- ...bn_shared_ux_prompt_not_found.devdocs.json | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.devdocs.json | 14 +- 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 +- .../kbn_shared_ux_tabbed_modal.devdocs.json | 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.devdocs.json | 4 +- 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.devdocs.json | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.devdocs.json | 8 +- 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_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.devdocs.json | 2 +- api_docs/kbn_try_in_console.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- ...kbn_typed_react_router_config.devdocs.json | 16 +- 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.devdocs.json | 16 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.devdocs.json | 4 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.devdocs.json | 80 ++++--- api_docs/kbn_unified_field_list.mdx | 2 +- .../kbn_unsaved_changes_badge.devdocs.json | 10 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- .../kbn_user_profile_components.devdocs.json | 60 +++-- api_docs/kbn_user_profile_components.mdx | 4 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- ...n_visualization_ui_components.devdocs.json | 44 ++-- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.devdocs.json | 4 +- 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.devdocs.json | 4 +- api_docs/kbn_zod.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 88 ++++---- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.devdocs.json | 8 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 34 +-- 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.devdocs.json | 14 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.devdocs.json | 90 ++++---- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.devdocs.json | 16 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.devdocs.json | 150 ++++++------- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.devdocs.json | 14 +- 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.devdocs.json | 6 +- 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.devdocs.json | 70 ++---- api_docs/observability.mdx | 2 +- .../observability_a_i_assistant.devdocs.json | 12 +- 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.devdocs.json | 74 +++---- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.devdocs.json | 10 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 19 +- api_docs/presentation_panel.devdocs.json | 4 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.devdocs.json | 110 +++------ 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.devdocs.json | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.devdocs.json | 4 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.devdocs.json | 4 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.devdocs.json | 4 +- api_docs/saved_objects_finder.mdx | 2 +- .../saved_objects_management.devdocs.json | 6 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- .../saved_objects_tagging_oss.devdocs.json | 24 +- 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.devdocs.json | 10 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- .../search_inference_endpoints.devdocs.json | 18 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.devdocs.json | 28 +-- api_docs/search_playground.mdx | 2 +- api_docs/security.devdocs.json | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 83 +------ 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.devdocs.json | 4 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.devdocs.json | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.devdocs.json | 10 +- 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 +- .../telemetry_management_section.devdocs.json | 30 +-- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.devdocs.json | 4 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.devdocs.json | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 102 +++------ api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.devdocs.json | 44 ++-- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.devdocs.json | 8 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.devdocs.json | 29 ++- api_docs/unified_histogram.mdx | 4 +- api_docs/unified_search.devdocs.json | 22 +- 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.devdocs.json | 12 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.devdocs.json | 32 +-- 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.devdocs.json | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.devdocs.json | 12 +- api_docs/visualizations.mdx | 2 +- 963 files changed, 2935 insertions(+), 3091 deletions(-) create mode 100644 api_docs/kbn_observability_synthetics_test_data.devdocs.json create mode 100644 api_docs/kbn_observability_synthetics_test_data.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index e19f0a36853c9..c6edd912477f0 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-01 +date: 2024-10-02 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 a3bf748aad326..821490f515c09 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-01 +date: 2024-10-02 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 2a3a249cc5930..d67584a3a1272 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.devdocs.json b/api_docs/aiops.devdocs.json index 47928bc65edd2..2a772d91031ee 100644 --- a/api_docs/aiops.devdocs.json +++ b/api_docs/aiops.devdocs.json @@ -13,7 +13,7 @@ "\nLazy-wrapped ChangePointDetectionAppStateProps React component" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "aiops", "scope": "public", @@ -21,7 +21,7 @@ "section": "def-public.ChangePointDetectionAppStateProps", "text": "ChangePointDetectionAppStateProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -30,22 +30,20 @@ { "parentPluginId": "aiops", "id": "def-public.ChangePointDetection.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- properties specifying the data on which to run the analysis." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "aiops", "scope": "public", "docId": "kibAiopsPluginApi", "section": "def-public.ChangePointDetectionAppStateProps", "text": "ChangePointDetectionAppStateProps" - }, - ">" + } ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -66,7 +64,7 @@ "\nLazy-wrapped LogCategorizationAppStateProps React component" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "aiops", "scope": "public", @@ -74,7 +72,7 @@ "section": "def-public.LogCategorizationAppStateProps", "text": "LogCategorizationAppStateProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -83,22 +81,20 @@ { "parentPluginId": "aiops", "id": "def-public.LogCategorization.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- properties specifying the data on which to run the analysis." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "aiops", "scope": "public", "docId": "kibAiopsPluginApi", "section": "def-public.LogCategorizationAppStateProps", "text": "LogCategorizationAppStateProps" - }, - ">" + } ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -119,7 +115,7 @@ "\nLazy-wrapped LogRateAnalysisAppState React component" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "aiops", "scope": "public", @@ -127,7 +123,7 @@ "section": "def-public.LogRateAnalysisAppStateProps", "text": "LogRateAnalysisAppStateProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -136,22 +132,20 @@ { "parentPluginId": "aiops", "id": "def-public.LogRateAnalysis.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- properties specifying the data on which to run the analysis." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "aiops", "scope": "public", "docId": "kibAiopsPluginApi", "section": "def-public.LogRateAnalysisAppStateProps", "text": "LogRateAnalysisAppStateProps" - }, - ">" + } ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -172,7 +166,7 @@ "\nLazy-wrapped LogRateAnalysisContentWrapperReact component" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "aiops", "scope": "public", @@ -180,7 +174,7 @@ "section": "def-public.LogRateAnalysisContentWrapperProps", "text": "LogRateAnalysisContentWrapperProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -189,22 +183,20 @@ { "parentPluginId": "aiops", "id": "def-public.LogRateAnalysisContent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- properties specifying the data on which to run the analysis." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "aiops", "scope": "public", "docId": "kibAiopsPluginApi", "section": "def-public.LogRateAnalysisContentWrapperProps", "text": "LogRateAnalysisContentWrapperProps" - }, - ">" + } ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", "deprecated": false, @@ -1497,14 +1489,14 @@ { "parentPluginId": "aiops", "id": "def-public.AiopsPluginStart.ChangePointDetectionComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -1518,7 +1510,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 3d1156cee457f..da7f39ccb9393 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-01 +date: 2024-10-02 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 0eb8a1e05b356..79d79541a91e2 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-01 +date: 2024-10-02 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 a714c1d587005..d88ea1f446bb4 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-01 +date: 2024-10-02 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 dc7275dadaf75..6bfb7ef09d470 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-01 +date: 2024-10-02 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 ca34d4982b920..9fe5f48c4d565 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-01 +date: 2024-10-02 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 7cc518b0c1507..91141576eae3d 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-01 +date: 2024-10-02 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 cae84e39aaca4..f5283551d4a36 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-01 +date: 2024-10-02 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 58978bdb98fe5..e192c69a138f2 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.devdocs.json b/api_docs/charts.devdocs.json index ad5f7038d72fe..51115cb02b934 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -40,7 +40,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -57,11 +57,9 @@ "\nThe Lazily-loaded `ColorPicker` component. Consumers should use `React.Suspense` or\nthe withSuspense` HOC to load this component." ], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<({ onChange, color: selectedColor, label, useLegacyColors, colorIsOverwritten, onKeyDown, maxDepth, layerIndex, }: ", "ColorPickerProps", - "> & { readonly _result: ({ onChange, color: selectedColor, label, useLegacyColors, colorIsOverwritten, onKeyDown, maxDepth, layerIndex, }: ", - "ColorPickerProps", - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/charts/public/static/components/index.ts", "deprecated": false, @@ -78,7 +76,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -130,7 +128,7 @@ "\nRender current time line annotation on @elastic/charts `Chart`" ], "signature": [ - "({ isDarkMode, domainEnd }: React.PropsWithChildren<CurrentTimeProps>) => JSX.Element" + "({ isDarkMode, domainEnd }: CurrentTimeProps) => React.JSX.Element" ], "path": "src/plugins/charts/public/static/components/current_time.tsx", "deprecated": false, @@ -139,12 +137,12 @@ { "parentPluginId": "charts", "id": "def-public.CurrentTime.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ isDarkMode, domainEnd }", "description": [], "signature": [ - "React.PropsWithChildren<CurrentTimeProps>" + "CurrentTimeProps" ], "path": "src/plugins/charts/public/static/components/current_time.tsx", "deprecated": false, @@ -165,7 +163,7 @@ "signature": [ "({ icon, iconColor, message, dataTestSubj, className, renderComplete, }: ", "EmptyPlaceholderProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/charts/public/static/components/empty_placeholder.tsx", "deprecated": false, @@ -198,7 +196,7 @@ "label": "Endzones", "description": [], "signature": [ - "({ isDarkMode, domainStart, domainEnd, interval, domainMin, domainMax, hideTooltips, isFullBin, }: React.PropsWithChildren<EndzonesProps>) => JSX.Element" + "({ isDarkMode, domainStart, domainEnd, interval, domainMin, domainMax, hideTooltips, isFullBin, }: EndzonesProps) => React.JSX.Element" ], "path": "src/plugins/charts/public/static/components/endzones.tsx", "deprecated": false, @@ -207,12 +205,12 @@ { "parentPluginId": "charts", "id": "def-public.Endzones.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n isDarkMode,\n domainStart,\n domainEnd,\n interval,\n domainMin,\n domainMax,\n hideTooltips = true,\n isFullBin = false,\n}", "description": [], "signature": [ - "React.PropsWithChildren<EndzonesProps>" + "EndzonesProps" ], "path": "src/plugins/charts/public/static/components/endzones.tsx", "deprecated": false, @@ -390,7 +388,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -407,11 +405,9 @@ "\nThe Lazily-loaded `LegendToggle` component. Consumers should use `React.Suspense` or\nthe withSuspense` HOC to load this component." ], "signature": [ - "React.ExoticComponent<", - "LegendToggleProps", - "> & { readonly _result: React.MemoExoticComponent<({ onClick, showLegend, legendPosition }: ", + "React.LazyExoticComponent<React.MemoExoticComponent<({ onClick, showLegend, legendPosition }: ", "LegendToggleProps", - ") => JSX.Element>; }" + ") => React.JSX.Element>>" ], "path": "src/plugins/charts/public/static/components/index.ts", "deprecated": false, @@ -428,7 +424,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -696,7 +692,7 @@ "label": "Warnings", "description": [], "signature": [ - "({\n warnings,\n compressed = false,\n 'data-test-subj': dataTestSubj = 'chart-inline-warning-button',\n}: { warnings: React.ReactNode[]; compressed?: boolean | undefined; 'data-test-subj'?: string | undefined; }) => JSX.Element | null" + "({\n warnings,\n compressed = false,\n 'data-test-subj': dataTestSubj = 'chart-inline-warning-button',\n}: { warnings: React.ReactNode[]; compressed?: boolean | undefined; 'data-test-subj'?: string | undefined; }) => React.JSX.Element | null" ], "path": "src/plugins/charts/public/static/components/warnings.tsx", "deprecated": false, @@ -3378,7 +3374,7 @@ "label": "AllowedSettingsOverrides", "description": [], "signature": [ - "{ settings?: { theme?: ", + "{ settings?: { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -3414,7 +3410,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; } | undefined; }" ], diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 18da84da335ec..c405c187a8510 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.devdocs.json b/api_docs/cloud.devdocs.json index 9c44d677eb6ee..08dbd1e77d8ef 100644 --- a/api_docs/cloud.devdocs.json +++ b/api_docs/cloud.devdocs.json @@ -287,14 +287,14 @@ { "parentPluginId": "cloud", "id": "def-public.CloudStart.CloudContextProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -308,7 +308,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 40f6d88be4953..4eda611ef766c 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-01 +date: 2024-10-02 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 9cdf8e8844355..4404b17803798 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-01 +date: 2024-10-02 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 7947d1f8c3c85..5bf3d60451db0 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-01 +date: 2024-10-02 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 8632afdd38b82..9563ea97e2471 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.devdocs.json b/api_docs/console.devdocs.json index 8201b8d4ca4ac..f4330cd610315 100644 --- a/api_docs/console.devdocs.json +++ b/api_docs/console.devdocs.json @@ -635,7 +635,7 @@ "signature": [ "E" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 7b4be885990c1..4ad6b48583a17 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.devdocs.json b/api_docs/content_management.devdocs.json index 92c9bfb7bf4a9..3c2f55ee37ecd 100644 --- a/api_docs/content_management.devdocs.json +++ b/api_docs/content_management.devdocs.json @@ -490,7 +490,7 @@ "label": "ContentClientProvider", "description": [], "signature": [ - "({ contentClient, children }: React.PropsWithChildren<React.PropsWithChildren<{ contentClient: ", + "({ contentClient, children }: React.PropsWithChildren<{ contentClient: ", { "pluginId": "contentManagement", "scope": "public", @@ -498,7 +498,7 @@ "section": "def-public.ContentClient", "text": "ContentClient" }, - "; }>>) => JSX.Element" + "; }>) => React.JSX.Element" ], "path": "src/plugins/content_management/public/content_client/content_client_context.tsx", "deprecated": false, @@ -512,7 +512,7 @@ "label": "{ contentClient, children }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<{ contentClient: ", + "React.PropsWithChildren<{ contentClient: ", { "pluginId": "contentManagement", "scope": "public", @@ -520,7 +520,7 @@ "section": "def-public.ContentClient", "text": "ContentClient" }, - "; }>>" + "; }>" ], "path": "src/plugins/content_management/public/content_client/content_client_context.tsx", "deprecated": false, diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index fcdd5213ba6c5..aee84a70d1e83 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.devdocs.json b/api_docs/controls.devdocs.json index a683c8bf221a3..edd1e4198cb54 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -19,7 +19,7 @@ "section": "def-public.ControlGroupRendererProps", "text": "ControlGroupRendererProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer_lazy.tsx", "deprecated": false, @@ -510,6 +510,20 @@ "path": "src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupRendererProps.compressed", + "type": "CompoundType", + "tags": [], + "label": "compressed", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/controls/public/control_group/control_group_renderer/control_group_renderer.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index d21ed59f7a3fd..901196d356a9c 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.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 | |-------------------|-----------|------------------------|-----------------| -| 134 | 0 | 130 | 14 | +| 135 | 0 | 131 | 14 | ## Client diff --git a/api_docs/custom_integrations.devdocs.json b/api_docs/custom_integrations.devdocs.json index ad2516824b0a5..ddfe8f9e29600 100644 --- a/api_docs/custom_integrations.devdocs.json +++ b/api_docs/custom_integrations.devdocs.json @@ -84,11 +84,9 @@ "label": "LazyReplacementCard", "description": [], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<({ eprPackageName }: ", "Props", - "> & { readonly _result: ({ eprPackageName }: ", - "Props", - ") => JSX.Element | null; }" + ") => React.JSX.Element | null>" ], "path": "src/plugins/custom_integrations/public/components/index.tsx", "deprecated": false, @@ -105,7 +103,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -263,14 +261,14 @@ { "parentPluginId": "customIntegrations", "id": "def-public.CustomIntegrationsStart.ContextProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -284,7 +282,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -452,7 +450,7 @@ "label": "shipper", "description": [], "signature": [ - "\"beats\" | \"enterprise_search\" | \"language_clients\" | \"other\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\"" + "\"other\" | \"beats\" | \"enterprise_search\" | \"language_clients\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\"" ], "path": "src/plugins/custom_integrations/common/index.ts", "deprecated": false, @@ -742,7 +740,7 @@ "label": "shipper", "description": [], "signature": [ - "\"beats\" | \"enterprise_search\" | \"language_clients\" | \"other\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\"" + "\"other\" | \"beats\" | \"enterprise_search\" | \"language_clients\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\"" ], "path": "src/plugins/custom_integrations/common/index.ts", "deprecated": false, @@ -945,7 +943,7 @@ "\nThe list of all known shippers." ], "signature": [ - "(\"beats\" | \"enterprise_search\" | \"language_clients\" | \"other\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\")[]" + "(\"other\" | \"beats\" | \"enterprise_search\" | \"language_clients\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\")[]" ], "path": "src/plugins/custom_integrations/common/index.ts", "deprecated": false, @@ -962,7 +960,7 @@ "\nA shipper-- an internal or external system capable of storing data in ES/Kibana-- applicable to an Integration." ], "signature": [ - "\"beats\" | \"enterprise_search\" | \"language_clients\" | \"other\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\"" + "\"other\" | \"beats\" | \"enterprise_search\" | \"language_clients\" | \"sample_data\" | \"tests\" | \"tutorial\" | \"placeholders\"" ], "path": "src/plugins/custom_integrations/common/index.ts", "deprecated": false, diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 99c0dc5938a58..dd844564858c3 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-01 +date: 2024-10-02 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 02d0be68081fa..60c23f4e39a9c 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -94,7 +94,7 @@ "signature": [ "(props: ", "DashboardListingProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/dashboard/public/dashboard_listing/index.tsx", "deprecated": false, @@ -129,7 +129,7 @@ "signature": [ "(props: ", "DashboardTopNavProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/dashboard/public/dashboard_top_nav/index.tsx", "deprecated": false, @@ -346,7 +346,7 @@ "signature": [ "(props: ", "DashboardRendererProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/dashboard/public/dashboard_container/external_api/lazy_dashboard_renderer.tsx", "deprecated": false, diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index aa0d6ec753213..c434789de863d 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.devdocs.json b/api_docs/dashboard_enhanced.devdocs.json index aa7aaa42cafef..e983a159cfcf2 100644 --- a/api_docs/dashboard_enhanced.devdocs.json +++ b/api_docs/dashboard_enhanced.devdocs.json @@ -276,14 +276,14 @@ { "parentPluginId": "dashboardEnhanced", "id": "def-public.AbstractDashboardDrilldown.CollectConfig.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -297,7 +297,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index fe9f903aef46f..02d2ce1a39305 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-01 +date: 2024-10-02 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 2980b3a038866..e14d697754462 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-01 +date: 2024-10-02 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 9fa64990a3465..97a91dfde86b6 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-01 +date: 2024-10-02 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 6706a52b70c65..7c6a33015f43a 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-01 +date: 2024-10-02 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 67a982e2a441b..1127fb38cb48f 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-01 +date: 2024-10-02 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 41a9229c29bc0..38c6224b8d53e 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.devdocs.json b/api_docs/data_view_editor.devdocs.json index ce62a71b7b210..24482960414e5 100644 --- a/api_docs/data_view_editor.devdocs.json +++ b/api_docs/data_view_editor.devdocs.json @@ -560,14 +560,14 @@ { "parentPluginId": "dataViewEditor", "id": "def-public.PluginStart.IndexPatternEditorComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -581,7 +581,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index d0aac23bae84b..db3fda515f11d 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.devdocs.json b/api_docs/data_view_field_editor.devdocs.json index 05646d029a3dc..8a352b74907a2 100644 --- a/api_docs/data_view_field_editor.devdocs.json +++ b/api_docs/data_view_field_editor.devdocs.json @@ -195,7 +195,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "src/plugins/data_view_field_editor/public/components/field_format_editor/editors/default/default.tsx", "deprecated": false, @@ -1193,14 +1193,14 @@ { "parentPluginId": "dataViewFieldEditor", "id": "def-public.PluginStart.DeleteRuntimeFieldProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -1214,7 +1214,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 2372c9dadcdb8..87628e7b13d72 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-01 +date: 2024-10-02 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 a98647849e10a..cce8885d2842c 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 5497e49cdbe89..d922a67b17353 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -22384,7 +22384,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"autoFocus\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"nonce\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"content\" | \"datatype\" | \"inlist\" | \"property\" | \"rel\" | \"resource\" | \"rev\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-braillelabel\" | \"aria-brailleroledescription\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colindextext\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-description\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowindextext\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onResize\" | \"onResizeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerLeave\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "public", @@ -27530,7 +27530,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"autoFocus\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"nonce\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"content\" | \"datatype\" | \"inlist\" | \"property\" | \"rel\" | \"resource\" | \"rev\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-braillelabel\" | \"aria-brailleroledescription\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colindextext\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-description\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowindextext\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onResize\" | \"onResizeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerLeave\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "public", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 7d3df3aade9f3..6903101680db6 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.devdocs.json b/api_docs/data_visualizer.devdocs.json index c312215472758..801c326f72a76 100644 --- a/api_docs/data_visualizer.devdocs.json +++ b/api_docs/data_visualizer.devdocs.json @@ -320,14 +320,14 @@ { "parentPluginId": "dataVisualizer", "id": "def-public.DataDriftSpec.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -341,7 +341,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -368,14 +368,14 @@ { "parentPluginId": "dataVisualizer", "id": "def-public.FileDataVisualizerSpec.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -389,7 +389,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -447,14 +447,14 @@ { "parentPluginId": "dataVisualizer", "id": "def-public.IndexDataVisualizerSpec.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -468,7 +468,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 343fa28ad1ca2..067616553a4aa 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-01 +date: 2024-10-02 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 103f09c82d1ef..8dc318fe6be21 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -300,7 +300,7 @@ "Type", "<number, string, unknown>; }>; }>, ", "DatasetQualityRouteHandlerResources", - ", { lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | null | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; userPrivileges?: { canMonitor: boolean; } | undefined; }, ", + ", { lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; userPrivileges?: { canMonitor: boolean; } | undefined; }, ", "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values\": ", { @@ -458,7 +458,7 @@ "StringC", "; }>]>; }>, ", "DatasetQualityRouteHandlerResources", - ", { datasetUserPrivileges: { canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }; dataStreamsStats: ({ name: string; userPrivileges: { canMonitor: boolean; }; } & { size?: string | undefined; sizeBytes?: number | undefined; lastActivity?: number | undefined; integration?: string | undefined; totalDocs?: number | null | undefined; })[]; }, ", + ", { datasetUserPrivileges: { canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }; dataStreamsStats: ({ name: string; userPrivileges: { canMonitor: boolean; }; } & { size?: string | undefined; sizeBytes?: number | undefined; lastActivity?: number | undefined; integration?: string | undefined; totalDocs?: number | undefined; })[]; }, ", "DatasetQualityRouteCreateOptions", ">; }[TEndpoint] extends ", { @@ -577,7 +577,7 @@ "Type", "<number, string, unknown>; }>; }>, ", "DatasetQualityRouteHandlerResources", - ", { lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | null | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; userPrivileges?: { canMonitor: boolean; } | undefined; }, ", + ", { lastActivity?: number | undefined; degradedDocsCount?: number | undefined; docsCount?: number | undefined; sizeBytes?: number | undefined; services?: { [x: string]: string[]; } | undefined; hosts?: { [x: string]: string[]; } | undefined; userPrivileges?: { canMonitor: boolean; } | undefined; }, ", "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/values\": ", { @@ -735,7 +735,7 @@ "StringC", "; }>]>; }>, ", "DatasetQualityRouteHandlerResources", - ", { datasetUserPrivileges: { canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }; dataStreamsStats: ({ name: string; userPrivileges: { canMonitor: boolean; }; } & { size?: string | undefined; sizeBytes?: number | undefined; lastActivity?: number | undefined; integration?: string | undefined; totalDocs?: number | null | undefined; })[]; }, ", + ", { datasetUserPrivileges: { canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }; dataStreamsStats: ({ name: string; userPrivileges: { canMonitor: boolean; }; } & { size?: string | undefined; sizeBytes?: number | undefined; lastActivity?: number | undefined; integration?: string | undefined; totalDocs?: number | undefined; })[]; }, ", "DatasetQualityRouteCreateOptions", ">; }[TEndpoint] extends ", { diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 822196c269de0..82ae9735fe64c 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-01 +date: 2024-10-02 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 23adfc5efa65a..d44d253492775 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index d84bc1c468ee6..eb904631e18da 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1366,8 +1366,8 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | <DocLink id="kibDataPluginApi" section="def-common.SearchSource.fetch" text="fetch"/> | [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch) | - | | <DocLink id="kibDataPluginApi" section="def-common.EqlSearchStrategyRequest.options" text="options"/> | [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts#:~:text=options) | - | | <DocLink id="kibDataViewsPluginApi" section="def-common.AbstractDataView.title" text="title"/> | [create_sourcerer_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts#:~:text=title), [create_sourcerer_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts#:~:text=title), [create_sourcerer_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/sourcerer/containers/create_sourcerer_data_view.ts#:~:text=title), [validators.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.ts#:~:text=title) | - | -| <DocLink id="kibFleetPluginApi" section="def-public.NewPackagePolicy.policy_id" text="policy_id"/> | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx#:~:text=policy_id), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx#:~:text=policy_id), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx#:~:text=policy_id), [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [endpoint_metadata_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts#:~:text=policy_id), [endpoint_package_policies.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/endpoint_package_policies.test.ts#:~:text=policy_id), [index.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/index.test.ts#:~:text=policy_id) | - | -| <DocLink id="kibFleetPluginApi" section="def-common.NewPackagePolicy.policy_id" text="policy_id"/> | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx#:~:text=policy_id), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx#:~:text=policy_id), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx#:~:text=policy_id), [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [endpoint_metadata_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts#:~:text=policy_id), [endpoint_package_policies.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/endpoint_package_policies.test.ts#:~:text=policy_id), [index.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/index.test.ts#:~:text=policy_id) | - | +| <DocLink id="kibFleetPluginApi" section="def-public.NewPackagePolicy.policy_id" text="policy_id"/> | [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [endpoint_metadata_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts#:~:text=policy_id), [endpoint_package_policies.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/endpoint_package_policies.test.ts#:~:text=policy_id), [index.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/index.test.ts#:~:text=policy_id) | - | +| <DocLink id="kibFleetPluginApi" section="def-common.NewPackagePolicy.policy_id" text="policy_id"/> | [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [fleet_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts#:~:text=policy_id), [endpoint_metadata_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts#:~:text=policy_id), [endpoint_package_policies.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/endpoint_package_policies.test.ts#:~:text=policy_id), [index.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/index.test.ts#:~:text=policy_id) | - | | <DocLink id="kibLicensingPluginApi" section="def-public.PublicLicense.mode" 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), [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 | | <DocLink id="kibLicensingPluginApi" section="def-server.PublicLicense.mode" 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), [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 | | <DocLink id="kibLicensingPluginApi" section="def-server.LicensingPluginSetup.license$" text="license$"/> | [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 | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 728f448d53255..6acdeb7ea5fc0 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 4b5f4950bf116..f4005ad7d785b 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index 870d48408426d..5e299afffebcd 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -103,7 +103,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index fce799f4d4840..2c35592e39351 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-01 +date: 2024-10-02 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 b1896fb867ee2..74cabe5d39294 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-01 +date: 2024-10-02 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 0705a6b0d4292..7e29745a17898 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-01 +date: 2024-10-02 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 5d7e9a371568b..1a50cef3c834b 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-01 +date: 2024-10-02 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 acb89fa9d4ec4..cb329de3ea535 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-01 +date: 2024-10-02 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 0c3410b6da91f..24eebae51a423 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -7502,7 +7502,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "src/plugins/embeddable/public/lib/embeddables/error_embeddable.tsx", "deprecated": false, @@ -7992,7 +7992,7 @@ "signature": [ "(props: ", "EmbeddablePanelProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/embeddable/public/embeddable_panel/embeddable_panel.tsx", "deprecated": true, @@ -8069,7 +8069,7 @@ "section": "def-public.EmbeddableRendererProps", "text": "EmbeddableRendererProps" }, - "<I>) => JSX.Element" + "<I>) => React.JSX.Element" ], "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", "deprecated": false, @@ -8111,7 +8111,7 @@ "label": "EmbeddableRoot", "description": [], "signature": [ - "({ embeddable, loading, error, input }: React.PropsWithChildren<Props>) => JSX.Element" + "({ embeddable, loading, error, input }: Props) => React.JSX.Element" ], "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_root.tsx", "deprecated": false, @@ -8120,12 +8120,12 @@ { "parentPluginId": "embeddable", "id": "def-public.EmbeddableRoot.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ embeddable, loading, error, input }", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_root.tsx", "deprecated": false, @@ -9019,7 +9019,7 @@ "section": "def-public.SerializedPanelState", "text": "SerializedPanelState" }, - "<SerializedState>) => void) | undefined; }) => JSX.Element" + "<SerializedState>) => void) | undefined; }) => React.JSX.Element" ], "path": "src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx", "deprecated": false, diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 2b41648402d00..92bdfe838d115 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-01 +date: 2024-10-02 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 a2e86dbeac429..c604e28b12b17 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-01 +date: 2024-10-02 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 1a0561c270a30..6e6cdee618d1b 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-01 +date: 2024-10-02 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 98c25fc5ecc02..50222e3d8ccfe 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-01 +date: 2024-10-02 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 69c8b325b5069..a6573fff0bf32 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-01 +date: 2024-10-02 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 c3e58e1d578a2..6cb8296ad0a3c 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.devdocs.json b/api_docs/es_ui_shared.devdocs.json index 828eb8c02dfed..9c63dfd307e9d 100644 --- a/api_docs/es_ui_shared.devdocs.json +++ b/api_docs/es_ui_shared.devdocs.json @@ -178,7 +178,7 @@ "label": "renderForm", "description": [], "signature": [ - "() => JSX.Element | undefined" + "() => React.JSX.Element | undefined" ], "path": "src/plugins/es_ui_shared/public/components/cron_editor/cron_editor.tsx", "deprecated": false, @@ -194,7 +194,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/public/components/cron_editor/cron_editor.tsx", "deprecated": false, @@ -248,7 +248,7 @@ "label": "AuthorizationProvider", "description": [], "signature": [ - "({ privilegesEndpoint, httpClient, children }: Props) => JSX.Element" + "({ privilegesEndpoint, httpClient, children }: Props) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx", "deprecated": false, @@ -316,7 +316,7 @@ "label": "JsonEditor", "description": [], "signature": [ - "<T extends object = { [key: string]: any; }>({ label, helpText, onUpdate, value, defaultValue, codeEditorProps, error: propsError, ...rest }: Props<T>) => JSX.Element" + "<T extends object = { [key: string]: any; }>({ label, helpText, onUpdate, value, defaultValue, codeEditorProps, error: propsError, ...rest }: Props<T>) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/public/components/json_editor/json_editor.tsx", "deprecated": false, @@ -348,7 +348,7 @@ "label": "NotAuthorizedSection", "description": [], "signature": [ - "({ title, message, dataTestSubj }: Props) => JSX.Element" + "({ title, message, dataTestSubj }: Props) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/not_authorized_section.tsx", "deprecated": false, @@ -381,7 +381,7 @@ "label": "PageError", "description": [], "signature": [ - "({ title, error, actions, isCentered, ...rest }: React.PropsWithChildren<Props>) => JSX.Element" + "({ title, error, actions, isCentered, ...rest }: Props) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx", "deprecated": false, @@ -390,12 +390,12 @@ { "parentPluginId": "esUiShared", "id": "def-public.PageError.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n title,\n error,\n actions,\n isCentered,\n ...rest\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx", "deprecated": false, @@ -414,7 +414,7 @@ "label": "PageLoading", "description": [], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/public/components/page_loading/page_loading.tsx", "deprecated": false, @@ -447,7 +447,7 @@ "label": "SectionError", "description": [], "signature": [ - "({ title, error, actions, ...rest }: React.PropsWithChildren<Props>) => JSX.Element" + "({ title, error, actions, ...rest }: Props) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", "deprecated": false, @@ -456,12 +456,12 @@ { "parentPluginId": "esUiShared", "id": "def-public.SectionError.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n title,\n error,\n actions,\n ...rest\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", "deprecated": false, @@ -480,7 +480,7 @@ "label": "SectionLoading", "description": [], "signature": [ - "({ inline, \"data-test-subj\": dataTestSubj, children, ...rest }: React.PropsWithChildren<Props>) => JSX.Element" + "({ inline, \"data-test-subj\": dataTestSubj, children, ...rest }: Props) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/public/components/section_loading/section_loading.tsx", "deprecated": false, @@ -489,12 +489,12 @@ { "parentPluginId": "esUiShared", "id": "def-public.SectionLoading.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n inline,\n 'data-test-subj': dataTestSubj,\n children,\n ...rest\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "src/plugins/es_ui_shared/public/components/section_loading/section_loading.tsx", "deprecated": false, @@ -699,7 +699,7 @@ "label": "ViewApiRequestFlyout", "description": [], "signature": [ - "(props: ViewApiRequestFlyoutProps) => JSX.Element" + "(props: ViewApiRequestFlyoutProps) => React.JSX.Element" ], "path": "src/plugins/es_ui_shared/public/components/view_api_request_flyout/view_api_request_flyout.tsx", "deprecated": false, diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index cf60a4ca6125c..911870c0d1ec2 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.devdocs.json b/api_docs/esql.devdocs.json index 29c31d5f3b749..f035a2d8d1d8c 100644 --- a/api_docs/esql.devdocs.json +++ b/api_docs/esql.devdocs.json @@ -19,7 +19,7 @@ "section": "def-public.ESQLEditorProps", "text": "ESQLEditorProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/esql/public/create_editor.tsx", "deprecated": false, diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 2ebdb6c75d9fc..0dc1de3e74add 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.devdocs.json b/api_docs/esql_data_grid.devdocs.json index ea15ca5487f8b..9d9dcfee0671f 100644 --- a/api_docs/esql_data_grid.devdocs.json +++ b/api_docs/esql_data_grid.devdocs.json @@ -11,7 +11,7 @@ "label": "ESQLDataGrid", "description": [], "signature": [ - "(props: ESQLDataGridProps) => JSX.Element" + "(props: ESQLDataGridProps) => React.JSX.Element" ], "path": "src/plugins/esql_datagrid/public/create_datagrid.tsx", "deprecated": false, diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 5fdf075745f31..3ee1ec5545838 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.devdocs.json b/api_docs/event_annotation.devdocs.json index 98898fe9d597e..0a5040cd0d515 100644 --- a/api_docs/event_annotation.devdocs.json +++ b/api_docs/event_annotation.devdocs.json @@ -1911,7 +1911,7 @@ "label": "options", "description": [], "signature": [ - "(\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\")[]" + "(\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\")[]" ], "path": "src/plugins/event_annotation/common/manual_event_annotation/index.ts", "deprecated": false, @@ -3033,7 +3033,7 @@ "label": "options", "description": [], "signature": [ - "(\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\")[]" + "(\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\")[]" ], "path": "src/plugins/event_annotation/common/query_point_event_annotation/index.ts", "deprecated": false, diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index d414fbf1e5d7c..6b5c8d6927a69 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.devdocs.json b/api_docs/event_annotation_listing.devdocs.json index 0e7d13bdd46ad..2a49dbf41ad72 100644 --- a/api_docs/event_annotation_listing.devdocs.json +++ b/api_docs/event_annotation_listing.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "(props: ", "Props", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-event-annotation-components/components/annotation_editor_controls/index.tsx", "deprecated": false, diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index e444777ab2ecc..0b3c8ff5b341a 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.devdocs.json b/api_docs/event_log.devdocs.json index 5a66164ffcf07..8e12d781ee276 100644 --- a/api_docs/event_log.devdocs.json +++ b/api_docs/event_log.devdocs.json @@ -1514,7 +1514,7 @@ "label": "data", "description": [], "signature": [ - "(Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; version?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; uuid?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; usage?: Readonly<{ request_body_bytes?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; type_id?: string | undefined; } & {}> | undefined; version?: string | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; flapping?: boolean | undefined; uuid?: string | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; space_ids?: string[] | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; severity?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; code?: string | undefined; created?: string | undefined; url?: string | undefined; provider?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" + "(Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; version?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; uuid?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; usage?: Readonly<{ request_body_bytes?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; type_id?: string | undefined; } & {}> | undefined; version?: string | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; flapping?: boolean | undefined; uuid?: string | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; space_ids?: string[] | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; severity?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; code?: string | undefined; url?: string | undefined; created?: string | undefined; provider?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" ], "path": "x-pack/plugins/event_log/server/es/cluster_client_adapter.ts", "deprecated": false, @@ -1534,7 +1534,7 @@ "label": "IEvent", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; version?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; uuid?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; usage?: Readonly<{ request_body_bytes?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; type_id?: string | undefined; } & {}> | undefined; version?: string | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; flapping?: boolean | undefined; uuid?: string | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; space_ids?: string[] | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; severity?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; code?: string | undefined; created?: string | undefined; url?: string | undefined; provider?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; version?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; uuid?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; usage?: Readonly<{ request_body_bytes?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; type_id?: string | undefined; } & {}> | undefined; version?: string | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; flapping?: boolean | undefined; uuid?: string | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; space_ids?: string[] | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; severity?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; code?: string | undefined; url?: string | undefined; created?: string | undefined; provider?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, @@ -1549,7 +1549,7 @@ "label": "IValidatedEvent", "description": [], "signature": [ - "Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; version?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; uuid?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; usage?: Readonly<{ request_body_bytes?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; type_id?: string | undefined; } & {}> | undefined; version?: string | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; flapping?: boolean | undefined; uuid?: string | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; space_ids?: string[] | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; severity?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; code?: string | undefined; created?: string | undefined; url?: string | undefined; provider?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined" + "Readonly<{ log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; error?: Readonly<{ id?: string | undefined; type?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; message?: string | undefined; tags?: string[] | undefined; rule?: Readonly<{ id?: string | undefined; version?: string | undefined; name?: string | undefined; license?: string | undefined; description?: string | undefined; uuid?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; } & {}> | undefined; kibana?: Readonly<{ task?: Readonly<{ id?: string | undefined; schedule_delay?: string | number | undefined; scheduled?: string | undefined; } & {}> | undefined; action?: Readonly<{ id?: string | undefined; name?: string | undefined; execution?: Readonly<{ source?: string | undefined; uuid?: string | undefined; gen_ai?: Readonly<{ usage?: Readonly<{ prompt_tokens?: string | number | undefined; completion_tokens?: string | number | undefined; total_tokens?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; usage?: Readonly<{ request_body_bytes?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; type_id?: string | undefined; } & {}> | undefined; version?: string | undefined; alerting?: Readonly<{ outcome?: string | undefined; status?: string | undefined; summary?: Readonly<{ recovered?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; new?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; ongoing?: Readonly<{ count?: string | number | undefined; } & {}> | undefined; } & {}> | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; alert?: Readonly<{ rule?: Readonly<{ consumer?: string | undefined; revision?: string | number | undefined; execution?: Readonly<{ uuid?: string | undefined; status?: string | undefined; metrics?: Readonly<{ total_search_duration_ms?: string | number | undefined; total_indexing_duration_ms?: string | number | undefined; number_of_triggered_actions?: string | number | undefined; number_of_generated_actions?: string | number | undefined; alert_counts?: Readonly<{ recovered?: string | number | undefined; active?: string | number | undefined; new?: string | number | undefined; } & {}> | undefined; number_of_delayed_alerts?: string | number | undefined; number_of_searches?: string | number | undefined; es_search_duration_ms?: string | number | undefined; execution_gap_duration_s?: string | number | undefined; rule_type_run_duration_ms?: string | number | undefined; process_alerts_duration_ms?: string | number | undefined; trigger_actions_duration_ms?: string | number | undefined; process_rule_duration_ms?: string | number | undefined; claim_to_start_duration_ms?: string | number | undefined; persist_alerts_duration_ms?: string | number | undefined; prepare_rule_duration_ms?: string | number | undefined; total_run_duration_ms?: string | number | undefined; total_enrichment_duration_ms?: string | number | undefined; } & {}> | undefined; status_order?: string | number | undefined; backfill?: Readonly<{ id?: string | undefined; start?: string | undefined; interval?: string | undefined; } & {}> | undefined; } & {}> | undefined; rule_type_id?: string | undefined; } & {}> | undefined; flapping?: boolean | undefined; uuid?: string | undefined; maintenance_window_ids?: string[] | undefined; } & {}> | undefined; space_ids?: string[] | undefined; server_uuid?: string | undefined; saved_objects?: Readonly<{ id?: string | undefined; type?: string | undefined; namespace?: string | undefined; rel?: string | undefined; type_id?: string | undefined; space_agnostic?: boolean | undefined; } & {}>[] | undefined; } & {}> | undefined; event?: Readonly<{ id?: string | undefined; type?: string[] | undefined; reason?: string | undefined; action?: string | undefined; start?: string | undefined; end?: string | undefined; outcome?: string | undefined; duration?: string | number | undefined; severity?: string | number | undefined; category?: string[] | undefined; timezone?: string | undefined; risk_score?: number | undefined; code?: string | undefined; url?: string | undefined; created?: string | undefined; provider?: string | undefined; dataset?: string | undefined; hash?: string | undefined; ingested?: string | undefined; kind?: string | undefined; module?: string | undefined; original?: string | undefined; reference?: string | undefined; risk_score_norm?: number | undefined; sequence?: string | number | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; user?: Readonly<{ id?: string | undefined; name?: string | undefined; } & {}> | undefined; } & {}> | undefined" ], "path": "x-pack/plugins/event_log/generated/schemas.ts", "deprecated": false, diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 2babf07041cb2..c03cae104655b 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.devdocs.json b/api_docs/exploratory_view.devdocs.json index 177d2f188b26e..5738ed0fdc2af 100644 --- a/api_docs/exploratory_view.devdocs.json +++ b/api_docs/exploratory_view.devdocs.json @@ -104,7 +104,7 @@ "signature": [ "(props: ", "ExploratoryViewPageProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/index.tsx", "deprecated": false, @@ -139,7 +139,7 @@ "signature": [ "(props: ", "FilterValueLabelProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/index.tsx", "deprecated": false, @@ -207,7 +207,7 @@ "signature": [ "(props: ", "SelectableUrlListProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/index.tsx", "deprecated": false, @@ -713,7 +713,7 @@ "label": "align", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false, @@ -1133,7 +1133,7 @@ "signature": [ "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", - ") => JSX.Element; registerSections: (sections$: ", + ") => React.JSX.Element; registerSections: (sections$: ", "Observable", "<", { @@ -1449,7 +1449,7 @@ "label": "defaultSeriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" + "\"area\" | \"line\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" ], "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/types.ts", "deprecated": false, @@ -2232,7 +2232,7 @@ "section": "def-public.ExploratoryEmbeddableProps", "text": "ExploratoryEmbeddableProps" }, - ") => JSX.Element | null; }" + ") => React.JSX.Element | null; }" ], "path": "x-pack/plugins/observability_solution/exploratory_view/public/plugin.ts", "deprecated": false, diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 6a4e253a221de..fd83c471d824a 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.devdocs.json b/api_docs/expression_error.devdocs.json index a08a32b04b3cb..d1652a5e8550d 100644 --- a/api_docs/expression_error.devdocs.json +++ b/api_docs/expression_error.devdocs.json @@ -247,7 +247,7 @@ "label": "LazyDebugComponent", "description": [], "signature": [ - "React.ExoticComponent<{ payload: unknown; }> & { readonly _result: ({ payload }: { payload: unknown; }) => JSX.Element; }" + "React.LazyExoticComponent<({ payload }: { payload: unknown; }) => React.JSX.Element>" ], "path": "src/plugins/expression_error/public/components/index.ts", "deprecated": false, @@ -264,7 +264,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -279,11 +279,9 @@ "label": "LazyErrorComponent", "description": [], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<React.FC<", "Props", - " & { children?: React.ReactNode; }> & { readonly _result: React.FC<", - "Props", - ">; }" + ">>" ], "path": "src/plugins/expression_error/public/components/index.ts", "deprecated": false, @@ -300,7 +298,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 650b8d836b6da..6affb7ba1409f 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-01 +date: 2024-10-02 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 16f8d3bf1e5a1..36eaab1ae4e2f 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -1219,7 +1219,7 @@ "section": "def-common.MakeOverridesSerializable", "text": "MakeOverridesSerializable" }, - "<string[] | undefined>; tooltipValueFormatter?: \"ignore\" | undefined; }>> & Partial<Record<\"settings\", { theme?: ", + "<string[] | undefined>; tooltipValueFormatter?: \"ignore\" | undefined; }>> & Partial<Record<\"settings\", { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -1255,7 +1255,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial<Record<\"chart\", { title?: string | undefined; description?: string | undefined; }>>) | undefined; setChartSize: (d: ", { diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index e557b3a20d9ea..b29a8ac789ea4 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-01 +date: 2024-10-02 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 95cc01b8a9c30..c4a662df7e25c 100644 --- a/api_docs/expression_heatmap.devdocs.json +++ b/api_docs/expression_heatmap.devdocs.json @@ -493,7 +493,7 @@ "label": "overrides", "description": [], "signature": [ - "(Partial<Record<\"settings\", { theme?: ", + "(Partial<Record<\"settings\", { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -529,7 +529,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial<Record<\"chart\", { title?: string | undefined; description?: string | undefined; }>>) | undefined" ], diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index e9e1f55a55433..27e6cb567d404 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-01 +date: 2024-10-02 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 19781fee1f7da..b6a540bd622da 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-01 +date: 2024-10-02 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 b63a00ee55163..1ed9e3dda84ce 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-01 +date: 2024-10-02 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 b84f0f1abe9f7..c70f3e3507d5c 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-01 +date: 2024-10-02 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 920c0a7b141d0..130655e8ca53b 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -457,7 +457,7 @@ "label": "titlesTextAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\"" + "\"right\" | \"center\" | \"left\"" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", "deprecated": false, @@ -471,7 +471,7 @@ "label": "valuesTextAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\"" + "\"right\" | \"center\" | \"left\"" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", "deprecated": false, @@ -809,7 +809,7 @@ "label": "titlesTextAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\"" + "\"right\" | \"center\" | \"left\"" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", "deprecated": false, @@ -823,7 +823,7 @@ "label": "valuesTextAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\"" + "\"right\" | \"center\" | \"left\"" ], "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", "deprecated": false, @@ -982,7 +982,7 @@ "label": "overrides", "description": [], "signature": [ - "(Partial<Record<\"settings\", { theme?: ", + "(Partial<Record<\"settings\", { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -1018,7 +1018,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial<Record<\"chart\", { title?: string | undefined; description?: string | undefined; }>>) | undefined" ], diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index d121c981880de..784c744888ac0 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-01 +date: 2024-10-02 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 e8ffd7397c7b4..ad8286e342c69 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-01 +date: 2024-10-02 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 cdd49f61fdb6c..93f94609bf53c 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-01 +date: 2024-10-02 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 9cf7f7489be16..97a84cb4e4ab6 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.devdocs.json b/api_docs/expression_shape.devdocs.json index 2001cc78cbd92..68e74f630e34d 100644 --- a/api_docs/expression_shape.devdocs.json +++ b/api_docs/expression_shape.devdocs.json @@ -171,7 +171,7 @@ "label": "ProgressDrawerComponent", "description": [], "signature": [ - "React.ForwardRefExoticComponent<Pick<", + "React.ForwardRefExoticComponent<Omit<React.PropsWithChildren<", { "pluginId": "expressionShape", "scope": "public", @@ -179,7 +179,7 @@ "section": "def-public.ShapeDrawerComponentProps", "text": "ShapeDrawerComponentProps" }, - ", \"children\" | \"shapeType\" | \"shapeAttributes\" | \"shapeContentAttributes\" | \"textAttributes\"> & React.RefAttributes<", + ">, \"ref\"> & React.RefAttributes<", { "pluginId": "expressionShape", "scope": "public", @@ -204,7 +204,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -283,7 +283,7 @@ "label": "ShapeDrawerComponent", "description": [], "signature": [ - "React.ForwardRefExoticComponent<Pick<", + "React.ForwardRefExoticComponent<Omit<", { "pluginId": "expressionShape", "scope": "public", @@ -291,7 +291,7 @@ "section": "def-public.ShapeDrawerComponentProps", "text": "ShapeDrawerComponentProps" }, - ", \"children\" | \"shapeType\" | \"shapeAttributes\" | \"shapeContentAttributes\" | \"textAttributes\"> & React.RefAttributes<", + ", \"ref\"> & React.RefAttributes<", { "pluginId": "expressionShape", "scope": "public", @@ -316,7 +316,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1333,7 +1333,7 @@ "section": "def-public.SpecificShapeContentAttributes", "text": "SpecificShapeContentAttributes" }, - " & Readonly<{}> & Readonly<{ children?: React.ReactNode; }> & { ref?: React.RefObject<any> | undefined; }" + " & Readonly<{}> & { ref?: React.RefObject<any> | undefined; }" ], "path": "src/plugins/expression_shape/public/components/reusable/types.tsx", "deprecated": false, @@ -1642,7 +1642,7 @@ "label": "ShapeDrawerComponentProps", "description": [], "signature": [ - "{ readonly children?: React.ReactNode; ref: React.Ref<", + "{ ref: React.Ref<", { "pluginId": "expressionShape", "scope": "public", @@ -1705,7 +1705,7 @@ "section": "def-public.ShapeProps", "text": "ShapeProps" }, - ">) => JSX.Element; data: ", + ">) => React.JSX.Element; data: ", { "pluginId": "expressionShape", "scope": "public", @@ -1753,7 +1753,7 @@ "section": "def-public.SvgTextAttributes", "text": "SvgTextAttributes" }, - " | undefined; } & Readonly<{}> & Readonly<{ children?: React.ReactNode; }> & { ref?: React.RefObject<any> | undefined; }" + " | undefined; } & Readonly<{}> & { ref?: React.RefObject<any> | undefined; }" ], "path": "src/plugins/expression_shape/public/components/reusable/types.tsx", "deprecated": false, @@ -1800,7 +1800,7 @@ "section": "def-public.SvgTextAttributes", "text": "SvgTextAttributes" }, - " | undefined; } & Readonly<{}> & Readonly<{ children?: React.ReactNode; }> & { ref?: React.RefObject<any> | undefined; }" + " | undefined; } & Readonly<{}> & { ref?: React.RefObject<any> | undefined; }" ], "path": "src/plugins/expression_shape/public/components/reusable/types.tsx", "deprecated": false, @@ -1823,7 +1823,7 @@ "section": "def-public.ShapeProps", "text": "ShapeProps" }, - ">) => JSX.Element; data: ", + ">) => React.JSX.Element; data: ", { "pluginId": "expressionShape", "scope": "public", diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index c2162999c75ba..974297fc7df33 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-01 +date: 2024-10-02 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 ff770a0250e5b..39fb4fe998a62 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-01 +date: 2024-10-02 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 db9449e105d89..03327aba5ca08 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -576,7 +576,7 @@ "label": "seriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\"" + "\"area\" | \"line\" | \"bar\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -1980,7 +1980,7 @@ "RecursivePartial", "<Omit<", "AxisStyle", - ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2002,7 +2002,7 @@ }, "<", "YDomainRange", - " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; maximumFractionDigits?: number | undefined; tickFormat?: \"ignore\" | undefined; integersOnly?: boolean | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; }>> & Partial<Record<\"settings\", { theme?: ", + " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; maximumFractionDigits?: number | undefined; tickFormat?: \"ignore\" | undefined; integersOnly?: boolean | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; }>> & Partial<Record<\"settings\", { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -2038,7 +2038,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial<Record<\"chart\", { title?: string | undefined; description?: string | undefined; }>>) | undefined" ], @@ -2221,7 +2221,7 @@ "RecursivePartial", "<Omit<", "AxisStyle", - ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2255,7 +2255,7 @@ "RecursivePartial", "<Omit<", "AxisStyle", - ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2289,7 +2289,7 @@ "RecursivePartial", "<Omit<", "AxisStyle", - ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -2326,7 +2326,7 @@ "label": "AvailableReferenceLineIcon", "description": [], "signature": [ - "\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"empty\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\"" + "\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"empty\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -3352,7 +3352,7 @@ "label": "SeriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\"" + "\"area\" | \"line\" | \"bar\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 98f03775f85d9..d619cfeb41a73 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-01 +date: 2024-10-02 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 79c72f7198445..0dc103b885dc1 100644 --- a/api_docs/expressions.devdocs.json +++ b/api_docs/expressions.devdocs.json @@ -12282,14 +12282,14 @@ { "parentPluginId": "expressions", "id": "def-public.ExpressionRendererComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -12303,7 +12303,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -13588,7 +13588,7 @@ "section": "def-public.ReactExpressionRendererProps", "text": "ReactExpressionRendererProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/expressions/public/plugin.ts", "deprecated": false, diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index d06dac03f942c..7a663c9bd7aea 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-01 +date: 2024-10-02 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 695a32fa634ee..093fd0e271d68 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-01 +date: 2024-10-02 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 64aa5d7b225f5..4ceb3f6ac33f6 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-01 +date: 2024-10-02 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 f4daba871e1aa..c65ffd15da8ae 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-01 +date: 2024-10-02 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 7645fecaa540a..1b249c276fbff 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-01 +date: 2024-10-02 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 a70e8903322bd..1e0235127c676 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-01 +date: 2024-10-02 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 e7f4a617ecd9d..45504c1bfa9aa 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-01 +date: 2024-10-02 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 4a0ccabbf4e9e..3fadbaf27716c 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -30,7 +30,7 @@ "label": "CustomAssetsAccordion", "description": [], "signature": [ - "({ views, initialIsOpen, title, }: React.PropsWithChildren<", + "({ views, initialIsOpen, title, }: ", { "pluginId": "fleet", "scope": "public", @@ -38,7 +38,7 @@ "section": "def-public.CustomAssetsAccordionProps", "text": "CustomAssetsAccordionProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/fleet/public/components/custom_assets_accordion.tsx", "deprecated": false, @@ -47,20 +47,18 @@ { "parentPluginId": "fleet", "id": "def-public.CustomAssetsAccordion.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n views,\n initialIsOpen = false,\n title,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "fleet", "scope": "public", "docId": "kibFleetPluginApi", "section": "def-public.CustomAssetsAccordionProps", "text": "CustomAssetsAccordionProps" - }, - ">" + } ], "path": "x-pack/plugins/fleet/public/components/custom_assets_accordion.tsx", "deprecated": false, @@ -79,7 +77,7 @@ "label": "LazyPackagePolicyInputVarField", "description": [], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<React.FunctionComponent<", { "pluginId": "fleet", "scope": "public", @@ -87,15 +85,7 @@ "section": "def-public.InputFieldProps", "text": "InputFieldProps" }, - " & { children?: React.ReactNode; }> & { readonly _result: React.FunctionComponent<", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.InputFieldProps", - "text": "InputFieldProps" - }, - ">; }" + ">>" ], "path": "x-pack/plugins/fleet/public/index.ts", "deprecated": false, @@ -112,7 +102,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -127,11 +117,11 @@ "label": "PackageIcon", "description": [], "signature": [ - "({ packageName, integrationName, version, icons, tryApi, ...euiIconProps }: React.PropsWithChildren<", + "({ packageName, integrationName, version, icons, tryApi, ...euiIconProps }: ", "UsePackageIconType", " & Omit<", "EuiIconProps", - ", \"type\">>) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "x-pack/plugins/fleet/public/components/package_icon.tsx", "deprecated": false, @@ -145,11 +135,10 @@ "label": "{ packageName, integrationName, version, icons, tryApi, ...euiIconProps }", "description": [], "signature": [ - "React.PropsWithChildren<", "UsePackageIconType", " & Omit<", "EuiIconProps", - ", \"type\">>" + ", \"type\">" ], "path": "x-pack/plugins/fleet/public/components/package_icon.tsx", "deprecated": false, @@ -187,7 +176,7 @@ "label": "PackagePolicyEditorDatastreamMappings", "description": [], "signature": [ - "({ packageInputStream, packageInfo, customDataset }: React.PropsWithChildren<", + "({ packageInputStream, packageInfo, customDataset }: ", { "pluginId": "fleet", "scope": "public", @@ -195,7 +184,7 @@ "section": "def-public.PackagePolicyEditorDatastreamMappingsProps", "text": "PackagePolicyEditorDatastreamMappingsProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/datastream_mappings.tsx", "deprecated": false, @@ -204,20 +193,18 @@ { "parentPluginId": "fleet", "id": "def-public.PackagePolicyEditorDatastreamMappings.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ packageInputStream, packageInfo, customDataset }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "fleet", "scope": "public", "docId": "kibFleetPluginApi", "section": "def-public.PackagePolicyEditorDatastreamMappingsProps", "text": "PackagePolicyEditorDatastreamMappingsProps" - }, - ">" + } ], "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/datastream_mappings.tsx", "deprecated": false, @@ -236,7 +223,7 @@ "label": "PackagePolicyEditorDatastreamPipelines", "description": [], "signature": [ - "({ packageInputStream, packageInfo, customDataset }: React.PropsWithChildren<", + "({ packageInputStream, packageInfo, customDataset }: ", { "pluginId": "fleet", "scope": "public", @@ -244,7 +231,7 @@ "section": "def-public.PackagePolicyEditorDatastreamPipelinesProps", "text": "PackagePolicyEditorDatastreamPipelinesProps" }, - ">) => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/datastream_pipelines.tsx", "deprecated": false, @@ -253,20 +240,18 @@ { "parentPluginId": "fleet", "id": "def-public.PackagePolicyEditorDatastreamPipelines.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ packageInputStream, packageInfo, customDataset }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "fleet", "scope": "public", "docId": "kibFleetPluginApi", "section": "def-public.PackagePolicyEditorDatastreamPipelinesProps", "text": "PackagePolicyEditorDatastreamPipelinesProps" - }, - ">" + } ], "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/datastream_pipelines.tsx", "deprecated": false, @@ -1508,18 +1493,6 @@ "plugin": "cloudDefend", "path": "x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts" @@ -1722,7 +1695,7 @@ "label": "Component", "description": [], "signature": [ - "React.ExoticComponent<{ children?: React.ReactNode; } | React.RefAttributes<React.Component<{}, any, any>>> & { readonly _result: ", + "React.LazyExoticComponent<", { "pluginId": "fleet", "scope": "public", @@ -1730,7 +1703,7 @@ "section": "def-public.PackageAssetsComponent", "text": "PackageAssetsComponent" }, - "; }" + ">" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -1747,7 +1720,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1802,31 +1775,7 @@ "label": "Component", "description": [], "signature": [ - "React.ExoticComponent<(", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackageCustomExtensionComponentProps", - "text": "PackageCustomExtensionComponentProps" - }, - " & React.RefAttributes<React.Component<", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackageCustomExtensionComponentProps", - "text": "PackageCustomExtensionComponentProps" - }, - ", any, any>>) | (", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackageCustomExtensionComponentProps", - "text": "PackageCustomExtensionComponentProps" - }, - " & { children?: React.ReactNode; })> & { readonly _result: ", + "React.LazyExoticComponent<", { "pluginId": "fleet", "scope": "public", @@ -1834,7 +1783,7 @@ "section": "def-public.PackageCustomExtensionComponent", "text": "PackageCustomExtensionComponent" }, - "; }" + ">" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -1851,7 +1800,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2402,31 +2351,7 @@ "label": "Component", "description": [], "signature": [ - "React.ExoticComponent<(", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyCreateExtensionComponentProps", - "text": "PackagePolicyCreateExtensionComponentProps" - }, - " & React.RefAttributes<React.Component<", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyCreateExtensionComponentProps", - "text": "PackagePolicyCreateExtensionComponentProps" - }, - ", any, any>>) | (", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyCreateExtensionComponentProps", - "text": "PackagePolicyCreateExtensionComponentProps" - }, - " & { children?: React.ReactNode; })> & { readonly _result: ", + "React.LazyExoticComponent<", { "pluginId": "fleet", "scope": "public", @@ -2434,7 +2359,7 @@ "section": "def-public.PackagePolicyCreateExtensionComponent", "text": "PackagePolicyCreateExtensionComponent" }, - "; }" + ">" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -2451,7 +2376,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2617,7 +2542,7 @@ "label": "Component", "description": [], "signature": [ - "React.ExoticComponent<{ children?: React.ReactNode; } | React.RefAttributes<React.Component<{}, any, any>>> & { readonly _result: ", + "React.LazyExoticComponent<", { "pluginId": "fleet", "scope": "public", @@ -2625,7 +2550,7 @@ "section": "def-public.PackagePolicyCreateMultiStepExtensionComponent", "text": "PackagePolicyCreateMultiStepExtensionComponent" }, - "; }" + ">" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -2642,7 +2567,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2711,31 +2636,7 @@ "label": "Component", "description": [], "signature": [ - "React.ExoticComponent<(", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyEditExtensionComponentProps", - "text": "PackagePolicyEditExtensionComponentProps" - }, - " & React.RefAttributes<React.Component<", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyEditExtensionComponentProps", - "text": "PackagePolicyEditExtensionComponentProps" - }, - ", any, any>>) | (", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyEditExtensionComponentProps", - "text": "PackagePolicyEditExtensionComponentProps" - }, - " & { children?: React.ReactNode; })> & { readonly _result: ", + "React.LazyExoticComponent<", { "pluginId": "fleet", "scope": "public", @@ -2743,7 +2644,7 @@ "section": "def-public.PackagePolicyEditExtensionComponent", "text": "PackagePolicyEditExtensionComponent" }, - "; }" + ">" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -2760,7 +2661,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -3233,31 +3134,7 @@ "label": "Component", "description": [], "signature": [ - "React.ExoticComponent<(", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyResponseExtensionComponentProps", - "text": "PackagePolicyResponseExtensionComponentProps" - }, - " & React.RefAttributes<React.Component<", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyResponseExtensionComponentProps", - "text": "PackagePolicyResponseExtensionComponentProps" - }, - ", any, any>>) | (", - { - "pluginId": "fleet", - "scope": "public", - "docId": "kibFleetPluginApi", - "section": "def-public.PackagePolicyResponseExtensionComponentProps", - "text": "PackagePolicyResponseExtensionComponentProps" - }, - " & { children?: React.ReactNode; })> & { readonly _result: ", + "React.LazyExoticComponent<", { "pluginId": "fleet", "scope": "public", @@ -3265,7 +3142,7 @@ "section": "def-public.PackagePolicyResponseExtensionComponent", "text": "PackagePolicyResponseExtensionComponent" }, - "; }" + ">" ], "path": "x-pack/plugins/fleet/public/types/ui_extensions.ts", "deprecated": false, @@ -3282,7 +3159,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -23896,18 +23773,6 @@ "plugin": "cloudDefend", "path": "x-pack/plugins/cloud_defend/server/lib/telemetry/collectors/installation_stats_collector.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts" @@ -26102,7 +25967,7 @@ "label": "[RegistryVarsEntryKeys.type]", "description": [], "signature": [ - "\"string\" | \"text\" | \"integer\" | \"password\" | \"bool\" | \"select\" | \"textarea\" | \"yaml\"" + "\"string\" | \"text\" | \"integer\" | \"password\" | \"select\" | \"textarea\" | \"bool\" | \"yaml\"" ], "path": "x-pack/plugins/fleet/common/types/models/epm.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 7932f117b7a94..22aadf426779a 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-01 +date: 2024-10-02 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 b54168b054e6c..953f206f954d9 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-01 +date: 2024-10-02 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 b384290f6e7e9..c4b0eaecc4371 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.devdocs.json b/api_docs/home.devdocs.json index aaae09d932377..1b22af8001d6b 100644 --- a/api_docs/home.devdocs.json +++ b/api_docs/home.devdocs.json @@ -902,14 +902,14 @@ { "parentPluginId": "home", "id": "def-public.TutorialDirectoryHeaderLinkComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -923,7 +923,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -948,14 +948,14 @@ { "parentPluginId": "home", "id": "def-public.TutorialModuleNoticeComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -969,7 +969,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1810,7 +1810,7 @@ "label": "ArtifactsSchema", "description": [], "signature": [ - "{ readonly application?: Readonly<{} & { path: string; label: string; }> | undefined; readonly exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; readonly dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }" + "{ readonly application?: Readonly<{} & { label: string; path: string; }> | undefined; readonly exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; readonly dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }" ], "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", "deprecated": false, @@ -1984,7 +1984,7 @@ "section": "def-server.TutorialContext", "text": "TutorialContext" }, - ") => Readonly<{ artifacts?: Readonly<{ application?: Readonly<{} & { path: string; label: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; savedObjects?: any[] | undefined; euiIconType?: string | undefined; isBeta?: boolean | undefined; previewImagePath?: string | undefined; moduleName?: string | undefined; completionTimeMinutes?: number | undefined; elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; savedObjectsInstallMsg?: string | undefined; customStatusCheckName?: string | undefined; integrationBrowserCategories?: string[] | undefined; eprPackageOverlap?: string | undefined; } & { id: string; name: string; category: \"security\" | \"metrics\" | \"other\" | \"logging\"; shortDescription: string; longDescription: string; onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }>" + ") => Readonly<{ artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; savedObjects?: any[] | undefined; euiIconType?: string | undefined; isBeta?: boolean | undefined; previewImagePath?: string | undefined; moduleName?: string | undefined; completionTimeMinutes?: number | undefined; elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; savedObjectsInstallMsg?: string | undefined; customStatusCheckName?: string | undefined; integrationBrowserCategories?: string[] | undefined; eprPackageOverlap?: string | undefined; } & { id: string; name: string; category: \"security\" | \"metrics\" | \"other\" | \"logging\"; shortDescription: string; longDescription: string; onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }>" ], "path": "src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts", "deprecated": false, @@ -2022,7 +2022,7 @@ "label": "TutorialSchema", "description": [], "signature": [ - "{ readonly artifacts?: Readonly<{ application?: Readonly<{} & { path: string; label: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; readonly savedObjects?: any[] | undefined; readonly euiIconType?: string | undefined; readonly isBeta?: boolean | undefined; readonly previewImagePath?: string | undefined; readonly moduleName?: string | undefined; readonly completionTimeMinutes?: number | undefined; readonly elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly savedObjectsInstallMsg?: string | undefined; readonly customStatusCheckName?: string | undefined; readonly integrationBrowserCategories?: string[] | undefined; readonly eprPackageOverlap?: string | undefined; readonly id: string; readonly name: string; readonly category: \"security\" | \"metrics\" | \"other\" | \"logging\"; readonly shortDescription: string; readonly longDescription: string; readonly onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }" + "{ readonly artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; readonly savedObjects?: any[] | undefined; readonly euiIconType?: string | undefined; readonly isBeta?: boolean | undefined; readonly previewImagePath?: string | undefined; readonly moduleName?: string | undefined; readonly completionTimeMinutes?: number | undefined; readonly elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly savedObjectsInstallMsg?: string | undefined; readonly customStatusCheckName?: string | undefined; readonly integrationBrowserCategories?: string[] | undefined; readonly eprPackageOverlap?: string | undefined; readonly id: string; readonly name: string; readonly category: \"security\" | \"metrics\" | \"other\" | \"logging\"; readonly shortDescription: string; readonly longDescription: string; readonly onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { id: string; type: \"string\" | \"number\"; label: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ message?: string | undefined; iconType?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ error?: string | undefined; text?: string | undefined; title?: string | undefined; success?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { index: string | string[]; query: Record<string, any>; }>; }> | undefined; } & { instructionVariants: Readonly<{ initialSelected?: boolean | undefined; } & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }" ], "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", "deprecated": false, diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 38c29f4f96872..f7f68ea1803a6 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-01 +date: 2024-10-02 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 02f71dca31f35..52c3403ff4ee8 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-01 +date: 2024-10-02 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 325a208ae2f2a..3a787f7dd9ad1 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-01 +date: 2024-10-02 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 c2bea389415fc..c69e9b247eee3 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-01 +date: 2024-10-02 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 277ce86a234ae..edce88eb0094c 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-01 +date: 2024-10-02 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 1272abf42c87b..35c6abd5ef9ea 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-01 +date: 2024-10-02 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 7432394ddbe80..3d9b9a7619344 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-01 +date: 2024-10-02 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 52b5b9460dc45..a2d5eb00d5dfc 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-01 +date: 2024-10-02 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 97330aafdea68..fa671a9d517d8 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-01 +date: 2024-10-02 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 b9d0f39e39114..fd003bdb2b15b 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-01 +date: 2024-10-02 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 e37d1388eda5b..99cf8f920ae00 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-01 +date: 2024-10-02 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 aee15ec404242..f05591b01bc00 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.devdocs.json b/api_docs/investigate_app.devdocs.json index 01ab8650761b2..7786b5f08d823 100644 --- a/api_docs/investigate_app.devdocs.json +++ b/api_docs/investigate_app.devdocs.json @@ -168,7 +168,7 @@ }, "<\"GET /api/observability/investigations/{investigationId}/notes 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; }, { path: { investigationId: string; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[], ", + ", { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[], ", "InvestigateAppRouteCreateOptions", ">; \"POST /api/observability/investigations/{investigationId}/notes 2023-10-31\": ", { @@ -180,7 +180,7 @@ }, "<\"POST /api/observability/investigations/{investigationId}/notes 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; body: Zod.ZodObject<{ content: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { content: string; }, { content: string; }>; }, \"strip\", Zod.ZodTypeAny, { body: { content: string; }; path: { investigationId: string; }; }, { body: { content: string; }; path: { investigationId: string; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, ", + ", { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, ", "InvestigateAppRouteCreateOptions", ">; \"DELETE /api/observability/investigations/{investigationId} 2023-10-31\": ", { @@ -204,7 +204,7 @@ }, "<\"PUT /api/observability/investigations/{investigationId} 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; body: Zod.ZodObject<{ title: Zod.ZodOptional<Zod.ZodString>; status: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>>; params: Zod.ZodOptional<Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>>; tags: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; externalIncidentUrl: Zod.ZodOptional<Zod.ZodNullable<Zod.ZodString>>; }, \"strip\", Zod.ZodTypeAny, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }, { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }>; }, \"strip\", Zod.ZodTypeAny, { body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }; path: { investigationId: string; }; }, { body: { params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; externalIncidentUrl?: string | null | undefined; }; path: { investigationId: string; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, ", + ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, ", "InvestigateAppRouteCreateOptions", ">; \"GET /api/observability/investigations/{investigationId} 2023-10-31\": ", { @@ -216,7 +216,7 @@ }, "<\"GET /api/observability/investigations/{investigationId} 2023-10-31\", Zod.ZodObject<{ path: Zod.ZodObject<{ investigationId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { investigationId: string; }, { investigationId: string; }>; }, \"strip\", Zod.ZodTypeAny, { path: { investigationId: string; }; }, { path: { investigationId: string; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, ", + ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, ", "InvestigateAppRouteCreateOptions", ">; \"GET /api/observability/investigations 2023-10-31\": ", { @@ -228,7 +228,7 @@ }, "<\"GET /api/observability/investigations 2023-10-31\", Zod.ZodObject<{ query: Zod.ZodOptional<Zod.ZodObject<{ alertId: Zod.ZodOptional<Zod.ZodString>; search: Zod.ZodOptional<Zod.ZodString>; filter: Zod.ZodOptional<Zod.ZodString>; page: Zod.ZodOptional<Zod.ZodNumber>; perPage: Zod.ZodOptional<Zod.ZodNumber>; }, \"strip\", Zod.ZodTypeAny, { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; }, { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { query?: { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; } | undefined; }, { query?: { page?: number | undefined; filter?: string | undefined; search?: string | undefined; perPage?: number | undefined; alertId?: string | undefined; } | undefined; }>, ", "InvestigateAppRouteHandlerResources", - ", { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }[]; perPage: number; total: number; }, ", + ", { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }, ", "InvestigateAppRouteCreateOptions", ">; \"POST /api/observability/investigations 2023-10-31\": ", { @@ -240,7 +240,7 @@ }, "<\"POST /api/observability/investigations 2023-10-31\", Zod.ZodObject<{ body: Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }>; }, \"strip\", Zod.ZodTypeAny, { body: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }; }, { body: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; }; }>, ", "InvestigateAppRouteHandlerResources", - ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, ", + ", { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, ", "InvestigateAppRouteCreateOptions", ">; }" ], diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 6011475cea216..2a367923f9b7d 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 3ecb118bde677..8d2d35f04b981 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-10-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index a936d14880a10..8c3a1f521d0c2 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.devdocs.json b/api_docs/kbn_aiops_components.devdocs.json index f6a24b9e21f89..90b929e81e677 100644 --- a/api_docs/kbn_aiops_components.devdocs.json +++ b/api_docs/kbn_aiops_components.devdocs.json @@ -29,7 +29,7 @@ "\nDocument count chart with draggable brushes to select time ranges\nby default use `Baseline` and `Deviation` for the badge names\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/aiops-components", "scope": "common", @@ -37,7 +37,7 @@ "section": "def-common.DocumentCountChartProps", "text": "DocumentCountChartProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx", "deprecated": false, @@ -46,22 +46,20 @@ { "parentPluginId": "@kbn/aiops-components", "id": "def-common.DocumentCountChart.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "DocumentCountChart component props" ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/aiops-components", "scope": "common", "docId": "kibKbnAiopsComponentsPluginApi", "section": "def-common.DocumentCountChartProps", "text": "DocumentCountChartProps" - }, - ">" + } ], "path": "x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx", "deprecated": false, @@ -96,16 +94,16 @@ { "parentPluginId": "@kbn/aiops-components", "id": "def-common.DocumentCountChartRedux.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [ "- The properties passed to the DocumentCountChart component." ], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -119,7 +117,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -136,7 +134,7 @@ "\nDualBrush React Component\nDual brush component that overlays the document count chart\n" ], "signature": [ - "(props: React.PropsWithChildren<DualBrushProps>) => JSX.Element" + "(props: DualBrushProps) => React.JSX.Element" ], "path": "x-pack/packages/ml/aiops_components/src/dual_brush/dual_brush.tsx", "deprecated": false, @@ -145,14 +143,14 @@ { "parentPluginId": "@kbn/aiops-components", "id": "def-common.DualBrush.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "DualBrushProps component props" ], "signature": [ - "React.PropsWithChildren<DualBrushProps>" + "DualBrushProps" ], "path": "x-pack/packages/ml/aiops_components/src/dual_brush/dual_brush.tsx", "deprecated": false, @@ -175,7 +173,7 @@ "\nDualBrushAnnotation React Component\nDual brush annotation component that overlays the document count chart\n" ], "signature": [ - "(props: React.PropsWithChildren<BrushAnnotationProps>) => JSX.Element" + "(props: BrushAnnotationProps) => React.JSX.Element" ], "path": "x-pack/packages/ml/aiops_components/src/dual_brush/dual_brush_annotation.tsx", "deprecated": false, @@ -184,14 +182,14 @@ { "parentPluginId": "@kbn/aiops-components", "id": "def-common.DualBrushAnnotation.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "BrushAnnotationProps component props" ], "signature": [ - "React.PropsWithChildren<BrushAnnotationProps>" + "BrushAnnotationProps" ], "path": "x-pack/packages/ml/aiops_components/src/dual_brush/dual_brush_annotation.tsx", "deprecated": false, @@ -214,7 +212,7 @@ "\nProgressControls React Component\nComponent with ability to run & cancel analysis\nby default uses `Baseline` and `Deviation` for the badge name\n" ], "signature": [ - "(props: React.PropsWithChildren<React.PropsWithChildren<ProgressControlProps>>) => JSX.Element" + "(props: React.PropsWithChildren<ProgressControlProps>) => React.JSX.Element" ], "path": "x-pack/packages/ml/aiops_components/src/progress_controls/progress_controls.tsx", "deprecated": false, @@ -230,7 +228,7 @@ "ProgressControls component props" ], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<ProgressControlProps>>" + "React.PropsWithChildren<ProgressControlProps>" ], "path": "x-pack/packages/ml/aiops_components/src/progress_controls/progress_controls.tsx", "deprecated": false, diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 2338b5fac0648..3e47e8edbb342 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-01 +date: 2024-10-02 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 f98f40e40796d..ec2c54b5bc848 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-01 +date: 2024-10-02 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 bc4fd57cb0bf7..6fa13266f8c70 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-01 +date: 2024-10-02 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 15378ab23c20f..2bd946f0ac43d 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-01 +date: 2024-10-02 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 723ba3eca2c7a..8aed2a1215b0a 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-01 +date: 2024-10-02 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 95471606618f7..d21579428fbc5 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-01 +date: 2024-10-02 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 7c10c27a4d38a..b4b14b827cfb6 100644 --- a/api_docs/kbn_alerting_types.devdocs.json +++ b/api_docs/kbn_alerting_types.devdocs.json @@ -3116,7 +3116,7 @@ "section": "def-common.BasicFields", "text": "BasicFields" }, - " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; } & { [x: string]: unknown[]; }" + " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; } & { [x: string]: unknown[]; }" ], "path": "packages/kbn-alerting-types/alert_type.ts", "deprecated": false, diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 53080181fd9dc..28306925d7b9a 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_alerts_as_data_utils.devdocs.json index 2f6d423f51040..a08de5c9b187b 100644 --- a/api_docs/kbn_alerts_as_data_utils.devdocs.json +++ b/api_docs/kbn_alerts_as_data_utils.devdocs.json @@ -196,7 +196,7 @@ "label": "AADAlert", "description": [], "signature": [ - "({ '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & {} & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'container.id'?: string | undefined; 'error.grouping_key'?: string | undefined; 'error.grouping_name'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; labels?: unknown; 'processor.event'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.name'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'slo.id'?: string | undefined; 'slo.instanceId'?: string | undefined; 'slo.revision'?: string | number | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'anomaly.bucket_span.minutes'?: string | undefined; 'anomaly.start'?: string | number | undefined; configId?: string | undefined; 'error.message'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'location.id'?: string | undefined; 'location.name'?: string | undefined; 'monitor.id'?: string | undefined; 'monitor.name'?: string | undefined; 'monitor.tags'?: string[] | undefined; 'monitor.type'?: string | undefined; 'observer.geo.name'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.x509.issuer.common_name'?: string | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.subject.common_name'?: string | undefined; 'url.full'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ '@timestamp': string | number; 'kibana.alert.ancestors': { depth: string | number; id: string; index: string; type: string; }[]; 'kibana.alert.depth': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.original_event.action': string; 'kibana.alert.original_event.category': string[]; 'kibana.alert.original_event.created': string | number; 'kibana.alert.original_event.dataset': string; 'kibana.alert.original_event.id': string; 'kibana.alert.original_event.ingested': string | number; 'kibana.alert.original_event.kind': string; 'kibana.alert.original_event.module': string; 'kibana.alert.original_event.original': string; 'kibana.alert.original_event.outcome': string; 'kibana.alert.original_event.provider': string; 'kibana.alert.original_event.sequence': string | number; 'kibana.alert.original_event.type': string[]; 'kibana.alert.original_time': string | number; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.false_positives': string[]; 'kibana.alert.rule.max_signals': (string | number)[]; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.threat.framework': string; 'kibana.alert.rule.threat.tactic.id': string; 'kibana.alert.rule.threat.tactic.name': string; 'kibana.alert.rule.threat.tactic.reference': string; 'kibana.alert.rule.threat.technique.id': string; 'kibana.alert.rule.threat.technique.name': string; 'kibana.alert.rule.threat.technique.reference': string; 'kibana.alert.rule.threat.technique.subtechnique.id': string; 'kibana.alert.rule.threat.technique.subtechnique.name': string; 'kibana.alert.rule.threat.technique.subtechnique.reference': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'ecs.version'?: string | undefined; 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'host.asset.criticality'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.ancestors.rule'?: string | undefined; 'kibana.alert.building_block_type'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.group.id'?: string | undefined; 'kibana.alert.group.index'?: number | undefined; 'kibana.alert.host.criticality_level'?: string | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.new_terms'?: string[] | undefined; 'kibana.alert.original_event.agent_id_status'?: string | undefined; 'kibana.alert.original_event.code'?: string | undefined; 'kibana.alert.original_event.duration'?: string | undefined; 'kibana.alert.original_event.end'?: string | number | undefined; 'kibana.alert.original_event.hash'?: string | undefined; 'kibana.alert.original_event.reason'?: string | undefined; 'kibana.alert.original_event.reference'?: string | undefined; 'kibana.alert.original_event.risk_score'?: number | undefined; 'kibana.alert.original_event.risk_score_norm'?: number | undefined; 'kibana.alert.original_event.severity'?: string | number | undefined; 'kibana.alert.original_event.start'?: string | number | undefined; 'kibana.alert.original_event.timezone'?: string | undefined; 'kibana.alert.original_event.url'?: string | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.building_block_type'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.immutable'?: string[] | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.rule.timeline_id'?: string[] | undefined; 'kibana.alert.rule.timeline_title'?: string[] | undefined; 'kibana.alert.rule.timestamp_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.threshold_result.cardinality'?: unknown; 'kibana.alert.threshold_result.count'?: string | number | undefined; 'kibana.alert.threshold_result.from'?: string | number | undefined; 'kibana.alert.threshold_result.terms'?: { field?: string | undefined; value?: string | undefined; }[] | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.user.criticality_level'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.alert.workflow_user'?: string | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; 'user.asset.criticality'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ 'kibana.alert.job_id': string; } & { 'kibana.alert.anomaly_score'?: number[] | undefined; 'kibana.alert.anomaly_timestamp'?: string | number | undefined; 'kibana.alert.is_interim'?: boolean | undefined; 'kibana.alert.top_influencers'?: { influencer_field_name?: string | undefined; influencer_field_value?: string | undefined; influencer_score?: number | undefined; initial_influencer_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; timestamp?: string | number | undefined; }[] | undefined; 'kibana.alert.top_records'?: { actual?: number | undefined; by_field_name?: string | undefined; by_field_value?: string | undefined; detector_index?: number | undefined; field_name?: string | undefined; function?: string | undefined; initial_record_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; over_field_name?: string | undefined; over_field_value?: string | undefined; partition_field_name?: string | undefined; partition_field_value?: string | undefined; record_score?: number | undefined; timestamp?: string | number | undefined; typical?: number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.datafeed_results'?: { datafeed_id?: string | undefined; datafeed_state?: string | undefined; job_id?: string | undefined; job_state?: string | undefined; }[] | undefined; 'kibana.alert.delayed_data_results'?: { annotation?: string | undefined; end_timestamp?: string | number | undefined; job_id?: string | undefined; missed_docs_count?: string | number | undefined; }[] | undefined; 'kibana.alert.job_errors_results'?: { errors?: unknown; job_id?: string | undefined; }[] | undefined; 'kibana.alert.mml_results'?: { job_id?: string | undefined; log_time?: string | number | undefined; memory_status?: string | undefined; model_bytes?: string | number | undefined; model_bytes_exceeded?: string | number | undefined; model_bytes_memory_limit?: string | number | undefined; peak_model_bytes?: string | number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.results'?: { description?: string | undefined; health_status?: string | undefined; issues?: unknown; node_name?: string | undefined; transform_id?: string | undefined; transform_state?: string | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; })" + "({ '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & {} & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'container.id'?: string | undefined; 'error.grouping_key'?: string | undefined; 'error.grouping_name'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; labels?: unknown; 'processor.event'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.name'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'slo.id'?: string | undefined; 'slo.instanceId'?: string | undefined; 'slo.revision'?: string | number | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'anomaly.bucket_span.minutes'?: string | undefined; 'anomaly.start'?: string | number | undefined; configId?: string | undefined; 'error.message'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'location.id'?: string[] | undefined; 'location.name'?: string[] | undefined; 'monitor.id'?: string | undefined; 'monitor.name'?: string | undefined; 'monitor.state.id'?: string | undefined; 'monitor.tags'?: string[] | undefined; 'monitor.type'?: string | undefined; 'observer.geo.name'?: string[] | undefined; 'observer.name'?: string[] | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.x509.issuer.common_name'?: string | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.subject.common_name'?: string | undefined; 'url.full'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ '@timestamp': string | number; 'kibana.alert.ancestors': { depth: string | number; id: string; index: string; type: string; }[]; 'kibana.alert.depth': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.original_event.action': string; 'kibana.alert.original_event.category': string[]; 'kibana.alert.original_event.created': string | number; 'kibana.alert.original_event.dataset': string; 'kibana.alert.original_event.id': string; 'kibana.alert.original_event.ingested': string | number; 'kibana.alert.original_event.kind': string; 'kibana.alert.original_event.module': string; 'kibana.alert.original_event.original': string; 'kibana.alert.original_event.outcome': string; 'kibana.alert.original_event.provider': string; 'kibana.alert.original_event.sequence': string | number; 'kibana.alert.original_event.type': string[]; 'kibana.alert.original_time': string | number; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.false_positives': string[]; 'kibana.alert.rule.max_signals': (string | number)[]; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.threat.framework': string; 'kibana.alert.rule.threat.tactic.id': string; 'kibana.alert.rule.threat.tactic.name': string; 'kibana.alert.rule.threat.tactic.reference': string; 'kibana.alert.rule.threat.technique.id': string; 'kibana.alert.rule.threat.technique.name': string; 'kibana.alert.rule.threat.technique.reference': string; 'kibana.alert.rule.threat.technique.subtechnique.id': string; 'kibana.alert.rule.threat.technique.subtechnique.name': string; 'kibana.alert.rule.threat.technique.subtechnique.reference': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'ecs.version'?: string | undefined; 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'host.asset.criticality'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.ancestors.rule'?: string | undefined; 'kibana.alert.building_block_type'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.group.id'?: string | undefined; 'kibana.alert.group.index'?: number | undefined; 'kibana.alert.host.criticality_level'?: string | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.new_terms'?: string[] | undefined; 'kibana.alert.original_event.agent_id_status'?: string | undefined; 'kibana.alert.original_event.code'?: string | undefined; 'kibana.alert.original_event.duration'?: string | undefined; 'kibana.alert.original_event.end'?: string | number | undefined; 'kibana.alert.original_event.hash'?: string | undefined; 'kibana.alert.original_event.reason'?: string | undefined; 'kibana.alert.original_event.reference'?: string | undefined; 'kibana.alert.original_event.risk_score'?: number | undefined; 'kibana.alert.original_event.risk_score_norm'?: number | undefined; 'kibana.alert.original_event.severity'?: string | number | undefined; 'kibana.alert.original_event.start'?: string | number | undefined; 'kibana.alert.original_event.timezone'?: string | undefined; 'kibana.alert.original_event.url'?: string | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.building_block_type'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.immutable'?: string[] | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.rule.timeline_id'?: string[] | undefined; 'kibana.alert.rule.timeline_title'?: string[] | undefined; 'kibana.alert.rule.timestamp_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.threshold_result.cardinality'?: unknown; 'kibana.alert.threshold_result.count'?: string | number | undefined; 'kibana.alert.threshold_result.from'?: string | number | undefined; 'kibana.alert.threshold_result.terms'?: { field?: string | undefined; value?: string | undefined; }[] | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.user.criticality_level'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.alert.workflow_user'?: string | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; 'user.asset.criticality'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ 'kibana.alert.job_id': string; } & { 'kibana.alert.anomaly_score'?: number[] | undefined; 'kibana.alert.anomaly_timestamp'?: string | number | undefined; 'kibana.alert.is_interim'?: boolean | undefined; 'kibana.alert.top_influencers'?: { influencer_field_name?: string | undefined; influencer_field_value?: string | undefined; influencer_score?: number | undefined; initial_influencer_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; timestamp?: string | number | undefined; }[] | undefined; 'kibana.alert.top_records'?: { actual?: number | undefined; by_field_name?: string | undefined; by_field_value?: string | undefined; detector_index?: number | undefined; field_name?: string | undefined; function?: string | undefined; initial_record_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; over_field_name?: string | undefined; over_field_value?: string | undefined; partition_field_name?: string | undefined; partition_field_value?: string | undefined; record_score?: number | undefined; timestamp?: string | number | undefined; typical?: number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.datafeed_results'?: { datafeed_id?: string | undefined; datafeed_state?: string | undefined; job_id?: string | undefined; job_state?: string | undefined; }[] | undefined; 'kibana.alert.delayed_data_results'?: { annotation?: string | undefined; end_timestamp?: string | number | undefined; job_id?: string | undefined; missed_docs_count?: string | number | undefined; }[] | undefined; 'kibana.alert.job_errors_results'?: { errors?: unknown; job_id?: string | undefined; }[] | undefined; 'kibana.alert.mml_results'?: { job_id?: string | undefined; log_time?: string | number | undefined; memory_status?: string | undefined; model_bytes?: string | number | undefined; model_bytes_exceeded?: string | number | undefined; model_bytes_memory_limit?: string | number | undefined; peak_model_bytes?: string | number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.results'?: { description?: string | undefined; health_status?: string | undefined; issues?: unknown; node_name?: string | undefined; transform_id?: string | undefined; transform_state?: string | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; })" ], "path": "packages/kbn-alerts-as-data-utils/src/schemas/index.ts", "deprecated": false, @@ -405,7 +405,7 @@ "label": "ObservabilitySloAlert", "description": [], "signature": [ - "{} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'slo.id'?: string | undefined; 'slo.instanceId'?: string | undefined; 'slo.revision'?: string | number | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }" + "{} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'slo.id'?: string | undefined; 'slo.instanceId'?: string | undefined; 'slo.revision'?: string | number | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }" ], "path": "packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_slo_schema.ts", "deprecated": false, @@ -420,7 +420,7 @@ "label": "ObservabilityUptimeAlert", "description": [], "signature": [ - "{} & { 'agent.name'?: string | undefined; 'anomaly.bucket_span.minutes'?: string | undefined; 'anomaly.start'?: string | number | undefined; configId?: string | undefined; 'error.message'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'location.id'?: string | undefined; 'location.name'?: string | undefined; 'monitor.id'?: string | undefined; 'monitor.name'?: string | undefined; 'monitor.tags'?: string[] | undefined; 'monitor.type'?: string | undefined; 'observer.geo.name'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.x509.issuer.common_name'?: string | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.subject.common_name'?: string | undefined; 'url.full'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }" + "{} & { 'agent.name'?: string | undefined; 'anomaly.bucket_span.minutes'?: string | undefined; 'anomaly.start'?: string | number | undefined; configId?: string | undefined; 'error.message'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'location.id'?: string[] | undefined; 'location.name'?: string[] | undefined; 'monitor.id'?: string | undefined; 'monitor.name'?: string | undefined; 'monitor.state.id'?: string | undefined; 'monitor.tags'?: string[] | undefined; 'monitor.type'?: string | undefined; 'observer.geo.name'?: string[] | undefined; 'observer.name'?: string[] | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.x509.issuer.common_name'?: string | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.subject.common_name'?: string | undefined; 'url.full'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'event.original'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.intended_timestamp'?: string | number | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.previous_action_group'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.timestamp'?: string | number | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.severity_improving'?: boolean | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }" ], "path": "packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_uptime_schema.ts", "deprecated": false, diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 10ceb25fb8207..4019a570990ca 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_alerts_grouping.devdocs.json index e3042f1c99a59..e1841971236c8 100644 --- a/api_docs/kbn_alerts_grouping.devdocs.json +++ b/api_docs/kbn_alerts_grouping.devdocs.json @@ -29,7 +29,7 @@ "section": "def-public.AlertsGroupingProps", "text": "AlertsGroupingProps" }, - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/kbn-alerts-grouping/src/components/alerts_grouping.tsx", "deprecated": false, diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index dd194433b2108..653d3d6a315a9 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_alerts_ui_shared.devdocs.json index a7a8fbc6d55eb..2d3db47dd2c9e 100644 --- a/api_docs/kbn_alerts_ui_shared.devdocs.json +++ b/api_docs/kbn_alerts_ui_shared.devdocs.json @@ -11,7 +11,7 @@ "label": "AddMessageVariables", "description": [], "signature": [ - "({ buttonTitle, messageVariables, paramsProperty, onSelectEventHandler, showButtonTitle, }: React.PropsWithChildren<Props>) => JSX.Element" + "({ buttonTitle, messageVariables, paramsProperty, onSelectEventHandler, showButtonTitle, }: Props) => React.JSX.Element" ], "path": "packages/kbn-alerts-ui-shared/src/add_message_variables/index.tsx", "deprecated": false, @@ -20,12 +20,12 @@ { "parentPluginId": "@kbn/alerts-ui-shared", "id": "def-public.AddMessageVariables.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n buttonTitle,\n messageVariables,\n paramsProperty,\n onSelectEventHandler,\n showButtonTitle = false,\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "packages/kbn-alerts-ui-shared/src/add_message_variables/index.tsx", "deprecated": false, @@ -62,7 +62,7 @@ "section": "def-public.AlertFieldsTableProps", "text": "AlertFieldsTableProps" }, - ") => JSX.Element; }" + ") => React.JSX.Element; }" ], "path": "packages/kbn-alerts-ui-shared/src/alert_fields_table/index.tsx", "deprecated": false, @@ -79,7 +79,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -110,7 +110,7 @@ "section": "def-public.AlertLifecycleStatusBadgeProps", "text": "AlertLifecycleStatusBadgeProps" }, - ") => JSX.Element; }" + ") => React.JSX.Element; }" ], "path": "packages/kbn-alerts-ui-shared/src/alert_lifecycle_status_badge/index.tsx", "deprecated": false, @@ -127,7 +127,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -252,7 +252,7 @@ "signature": [ "(props: ", "EuiTabbedContentProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-alerts-ui-shared/src/alert_fields_table/index.tsx", "deprecated": false, @@ -1811,31 +1811,7 @@ "label": "actionParamsFields", "description": [], "signature": [ - "React.ExoticComponent<(", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.ActionParamsProps", - "text": "ActionParamsProps" - }, - "<ActionParams> & React.RefAttributes<React.Component<", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.ActionParamsProps", - "text": "ActionParamsProps" - }, - "<ActionParams>, any, any>>) | (", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.ActionParamsProps", - "text": "ActionParamsProps" - }, - "<ActionParams> & { children?: React.ReactNode; })> & { readonly _result: React.ComponentType<", + "React.LazyExoticComponent<React.ComponentType<", { "pluginId": "@kbn/alerts-ui-shared", "scope": "public", @@ -1843,7 +1819,7 @@ "section": "def-public.ActionParamsProps", "text": "ActionParamsProps" }, - "<ActionParams>>; }" + "<ActionParams>>>" ], "path": "packages/kbn-alerts-ui-shared/src/common/types/action_types.ts", "deprecated": false, @@ -1860,7 +1836,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2072,7 +2048,7 @@ "section": "def-common.BasicFields", "text": "BasicFields" }, - " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; } & { [x: string]: unknown[]; }" + " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; } & { [x: string]: unknown[]; }" ], "path": "packages/kbn-alerts-ui-shared/src/alert_fields_table/index.tsx", "deprecated": false, @@ -2955,7 +2931,7 @@ "label": "message", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-alerts-ui-shared/src/common/types/action_types.ts", "deprecated": false, @@ -3577,7 +3553,7 @@ "section": "def-public.ControlGroupRendererProps", "text": "ControlGroupRendererProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-alerts-ui-shared/src/alert_filter_controls/types.ts", "deprecated": false, @@ -4128,7 +4104,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index b50e6437178fe..bf9201d00dabf 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-01 +date: 2024-10-02 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 4150cfef9aba6..40e523e46b44d 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-01 +date: 2024-10-02 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 2c0a69a10f484..d55ddd5f907bd 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-01 +date: 2024-10-02 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 4c157b1dd7413..62db652d77803 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-01 +date: 2024-10-02 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 2e677862515bd..acdede58c6ba7 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-01 +date: 2024-10-02 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 8b2d1ff57c159..8dab281e8cbe1 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-01 +date: 2024-10-02 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 04b97cf570759..117fd42f64bfd 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_apm_types.devdocs.json index 100d04dd2c450..786b95f6f5955 100644 --- a/api_docs/kbn_apm_types.devdocs.json +++ b/api_docs/kbn_apm_types.devdocs.json @@ -53,7 +53,7 @@ "label": "name", "description": [], "signature": [ - "\"java\" | \"opentelemetry\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"ruby\" | \"rum-js\" | \"android/java\" | \"otlp\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/java\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\" | \"opentelemetry/webjs\" | \"otlp/cpp\" | \"otlp/dotnet\" | \"otlp/erlang\" | \"otlp/go\" | \"otlp/java\" | \"otlp/nodejs\" | \"otlp/php\" | \"otlp/python\" | \"otlp/ruby\" | \"otlp/rust\" | \"otlp/swift\" | \"otlp/android\" | \"otlp/webjs\" | \"ios/swift\"" + "\"java\" | \"ruby\" | \"opentelemetry\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"rum-js\" | \"android/java\" | \"otlp\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/java\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\" | \"opentelemetry/webjs\" | \"otlp/cpp\" | \"otlp/dotnet\" | \"otlp/erlang\" | \"otlp/go\" | \"otlp/java\" | \"otlp/nodejs\" | \"otlp/php\" | \"otlp/python\" | \"otlp/ruby\" | \"otlp/rust\" | \"otlp/swift\" | \"otlp/android\" | \"otlp/webjs\" | \"ios/swift\"" ], "path": "packages/kbn-apm-types/src/es_schemas/ui/fields/agent.ts", "deprecated": false, @@ -2678,7 +2678,7 @@ "label": "AgentName", "description": [], "signature": [ - "\"java\" | \"opentelemetry\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"ruby\" | \"rum-js\" | \"android/java\" | \"otlp\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/java\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\" | \"opentelemetry/webjs\" | \"otlp/cpp\" | \"otlp/dotnet\" | \"otlp/erlang\" | \"otlp/go\" | \"otlp/java\" | \"otlp/nodejs\" | \"otlp/php\" | \"otlp/python\" | \"otlp/ruby\" | \"otlp/rust\" | \"otlp/swift\" | \"otlp/android\" | \"otlp/webjs\" | \"ios/swift\"" + "\"java\" | \"ruby\" | \"opentelemetry\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"rum-js\" | \"android/java\" | \"otlp\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/java\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\" | \"opentelemetry/webjs\" | \"otlp/cpp\" | \"otlp/dotnet\" | \"otlp/erlang\" | \"otlp/go\" | \"otlp/java\" | \"otlp/nodejs\" | \"otlp/php\" | \"otlp/python\" | \"otlp/ruby\" | \"otlp/rust\" | \"otlp/swift\" | \"otlp/android\" | \"otlp/webjs\" | \"ios/swift\"" ], "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", "deprecated": false, @@ -3025,7 +3025,7 @@ "\nWe cannot mark these arrays as const and derive their type\nbecause we need to be able to assign them as mutable entities for ES queries." ], "signature": [ - "\"java\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"ruby\" | \"rum-js\" | \"android/java\"" + "\"java\" | \"ruby\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"rum-js\" | \"android/java\"" ], "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_types.mdx b/api_docs/kbn_apm_types.mdx index ce8210415752e..cd11f45a5ea9e 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-01 +date: 2024-10-02 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 1a80039f68965..0ebd815ee270b 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.devdocs.json b/api_docs/kbn_avc_banner.devdocs.json index 84622adb07ab7..4e98d1ddaa1b1 100644 --- a/api_docs/kbn_avc_banner.devdocs.json +++ b/api_docs/kbn_avc_banner.devdocs.json @@ -11,7 +11,7 @@ "label": "AVCResultsBanner2024", "description": [], "signature": [ - "({ onDismiss }: React.PropsWithChildren<{ onDismiss: () => void; }>) => JSX.Element" + "({ onDismiss }: { onDismiss: () => void; }) => React.JSX.Element" ], "path": "packages/kbn-avc-banner/src/index.tsx", "deprecated": false, @@ -20,12 +20,12 @@ { "parentPluginId": "@kbn/avc-banner", "id": "def-public.AVCResultsBanner2024.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ onDismiss }", "description": [], "signature": [ - "React.PropsWithChildren<{ onDismiss: () => void; }>" + "{ onDismiss: () => void; }" ], "path": "packages/kbn-avc-banner/src/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index c9494fed2085b..7e3a189f1f5b5 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-01 +date: 2024-10-02 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 4fc4ebf1fd5f0..021066811c9dd 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-01 +date: 2024-10-02 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 09a1db03a46a8..21c8dbe9b89ff 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-01 +date: 2024-10-02 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 1a61772a0bee9..5565f9fc11d71 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-01 +date: 2024-10-02 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 f29584f4f83b8..9d45ff6363cd9 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_cases_components.devdocs.json index 074fdc9435b06..3cefe54c20c17 100644 --- a/api_docs/kbn_cases_components.devdocs.json +++ b/api_docs/kbn_cases_components.devdocs.json @@ -61,7 +61,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -109,7 +109,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -229,7 +229,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-cases-components/src/tooltip/types.ts", "deprecated": false, diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 431a3ffb08646..0991fe08162ef 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-01 +date: 2024-10-02 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 9dc60e5f52381..fc6be060ea7cf 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.devdocs.json b/api_docs/kbn_cell_actions.devdocs.json index 2e8ff82e45238..e7ad74ad1b42d 100644 --- a/api_docs/kbn_cell_actions.devdocs.json +++ b/api_docs/kbn_cell_actions.devdocs.json @@ -27,7 +27,7 @@ "label": "CellActions", "description": [], "signature": [ - "({ data, triggerId, children, mode, showActionTooltips, visibleCellActions, disabledActionTypes, metadata, className, }: React.PropsWithChildren<", + "({ data, triggerId, children, mode, showActionTooltips, visibleCellActions, disabledActionTypes, metadata, className, }: ", { "pluginId": "@kbn/cell-actions", "scope": "common", @@ -35,7 +35,7 @@ "section": "def-common.CellActionsProps", "text": "CellActionsProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-cell-actions/src/components/cell_actions.tsx", "deprecated": false, @@ -49,15 +49,13 @@ "label": "{\n data,\n triggerId,\n children,\n mode,\n showActionTooltips = true,\n visibleCellActions = 3,\n disabledActionTypes = [],\n metadata,\n className,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/cell-actions", "scope": "common", "docId": "kibKbnCellActionsPluginApi", "section": "def-common.CellActionsProps", "text": "CellActionsProps" - }, - ">" + } ], "path": "packages/kbn-cell-actions/src/components/cell_actions.tsx", "deprecated": false, @@ -76,7 +74,7 @@ "label": "CellActionsProvider", "description": [], "signature": [ - "({ children, getTriggerCompatibleActions, }: React.PropsWithChildren<", + "({ children, getTriggerCompatibleActions, }: ", { "pluginId": "@kbn/cell-actions", "scope": "common", @@ -84,7 +82,7 @@ "section": "def-common.CellActionsProviderProps", "text": "CellActionsProviderProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-cell-actions/src/context/cell_actions_context.tsx", "deprecated": false, @@ -98,15 +96,13 @@ "label": "{\n children,\n getTriggerCompatibleActions,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/cell-actions", "scope": "common", "docId": "kibKbnCellActionsPluginApi", "section": "def-common.CellActionsProviderProps", "text": "CellActionsProviderProps" - }, - ">" + } ], "path": "packages/kbn-cell-actions/src/context/cell_actions_context.tsx", "deprecated": false, diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index ad413ec0d25bb..71e71a31f4ef9 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-01 +date: 2024-10-02 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 91bd6528e4238..0b347fd3b9dc6 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_chart_icons.devdocs.json index 7a2a2b215fc43..219d01df4dd55 100644 --- a/api_docs/kbn_chart_icons.devdocs.json +++ b/api_docs/kbn_chart_icons.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({ title, titleId, ...props }: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/drop_illustration.tsx", "deprecated": false, @@ -66,7 +66,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/axis_bottom.tsx", "deprecated": false, @@ -103,7 +103,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/axis_left.tsx", "deprecated": false, @@ -140,7 +140,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/axis_right.tsx", "deprecated": false, @@ -177,7 +177,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/axis_top.tsx", "deprecated": false, @@ -214,7 +214,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/legend.tsx", "deprecated": false, @@ -251,7 +251,7 @@ "signature": [ "({ title, titleId, ...props }: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/globe_illustration.tsx", "deprecated": false, @@ -288,7 +288,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_area.tsx", "deprecated": false, @@ -325,7 +325,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_area_percentage.tsx", "deprecated": false, @@ -362,7 +362,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_area_stacked.tsx", "deprecated": false, @@ -399,7 +399,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar.tsx", "deprecated": false, @@ -436,7 +436,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_annotations.tsx", "deprecated": false, @@ -473,7 +473,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_horizontal.tsx", "deprecated": false, @@ -510,7 +510,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_horizontal_percentage.tsx", "deprecated": false, @@ -547,7 +547,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_horizontal_stacked.tsx", "deprecated": false, @@ -584,7 +584,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_percentage.tsx", "deprecated": false, @@ -621,7 +621,7 @@ "signature": [ "({ title, titleId, ...props }: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_reference_line.tsx", "deprecated": false, @@ -658,7 +658,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_bar_stacked.tsx", "deprecated": false, @@ -695,7 +695,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_datatable.tsx", "deprecated": false, @@ -732,7 +732,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_donut.tsx", "deprecated": false, @@ -769,7 +769,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge.tsx", "deprecated": false, @@ -806,7 +806,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_arc.tsx", "deprecated": false, @@ -843,7 +843,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_simple_icons.tsx", "deprecated": false, @@ -880,7 +880,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_circle.tsx", "deprecated": false, @@ -917,7 +917,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_simple_icons.tsx", "deprecated": false, @@ -954,7 +954,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_semi_circle.tsx", "deprecated": false, @@ -991,7 +991,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_simple_icons.tsx", "deprecated": false, @@ -1028,7 +1028,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_heatmap.tsx", "deprecated": false, @@ -1065,7 +1065,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_horizontal_bullet.tsx", "deprecated": false, @@ -1102,7 +1102,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_line.tsx", "deprecated": false, @@ -1139,7 +1139,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_gauge_simple_icons.tsx", "deprecated": false, @@ -1176,7 +1176,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_metric.tsx", "deprecated": false, @@ -1213,7 +1213,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_mixed_xy.tsx", "deprecated": false, @@ -1250,7 +1250,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_mosaic.tsx", "deprecated": false, @@ -1287,7 +1287,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_pie.tsx", "deprecated": false, @@ -1324,7 +1324,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_tagcloud.tsx", "deprecated": false, @@ -1361,7 +1361,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_treemap.tsx", "deprecated": false, @@ -1398,7 +1398,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_vertical_bullet.tsx", "deprecated": false, @@ -1435,7 +1435,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/chart_waffle.tsx", "deprecated": false, @@ -1472,7 +1472,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/annotation_icons/circle.tsx", "deprecated": false, @@ -1509,7 +1509,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/donut_hole_icons.tsx", "deprecated": false, @@ -1546,7 +1546,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/donut_hole_icons.tsx", "deprecated": false, @@ -1583,7 +1583,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/donut_hole_icons.tsx", "deprecated": false, @@ -1620,7 +1620,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/region_map.tsx", "deprecated": false, @@ -1657,7 +1657,7 @@ "signature": [ "(props: Omit<", "EuiIconProps", - ", \"type\">) => JSX.Element" + ", \"type\">) => React.JSX.Element" ], "path": "packages/kbn-chart-icons/src/assets/annotation_icons/triangle.tsx", "deprecated": false, diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 80363b09a0210..ae654670bae21 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-01 +date: 2024-10-02 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 2b10e9ddd20e9..fa7472d472b51 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-01 +date: 2024-10-02 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 eebc2de7e279a..7384c9146049f 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-01 +date: 2024-10-02 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 fbd305dd8d605..ba079451adef1 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-01 +date: 2024-10-02 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 ddce54fe2b62c..2d520801210ff 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-01 +date: 2024-10-02 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 04959cb492f0b..4282c09f0c9a1 100644 --- a/api_docs/kbn_cloud_security_posture.devdocs.json +++ b/api_docs/kbn_cloud_security_posture.devdocs.json @@ -11,7 +11,7 @@ "label": "CspEvaluationBadge", "description": [], "signature": [ - "({ type }: Props) => JSX.Element" + "({ type }: Props) => React.JSX.Element" ], "path": "x-pack/packages/kbn-cloud-security-posture/src/components/csp_evaluation_badge.tsx", "deprecated": false, diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 409b49c99c1a3..36db7ccb7eae9 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-01 +date: 2024-10-02 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 b4f97284d288e..c11c346ad6270 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_code_editor.devdocs.json index 0d9f217514fbc..e6ed57e11ad27 100644 --- a/api_docs/kbn_code_editor.devdocs.json +++ b/api_docs/kbn_code_editor.devdocs.json @@ -31,7 +31,7 @@ "\nRenders a Monaco code editor with EUI color theme.\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/code-editor", "scope": "common", @@ -39,7 +39,7 @@ "section": "def-common.CodeEditorProps", "text": "CodeEditorProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/code_editor/impl/index.tsx", "deprecated": false, @@ -48,20 +48,18 @@ { "parentPluginId": "@kbn/code-editor", "id": "def-common.CodeEditor.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/code-editor", "scope": "common", "docId": "kibKbnCodeEditorPluginApi", "section": "def-common.CodeEditorProps", "text": "CodeEditorProps" - }, - ">" + } ], "path": "packages/shared-ux/code_editor/impl/index.tsx", "deprecated": false, @@ -82,7 +80,7 @@ "\nRenders a Monaco code editor in the same style as other EUI form fields." ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/code-editor", "scope": "common", @@ -90,7 +88,7 @@ "section": "def-common.CodeEditorProps", "text": "CodeEditorProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/code_editor/impl/index.tsx", "deprecated": false, @@ -99,20 +97,18 @@ { "parentPluginId": "@kbn/code-editor", "id": "def-common.CodeEditorField.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/code-editor", "scope": "common", "docId": "kibKbnCodeEditorPluginApi", "section": "def-common.CodeEditorProps", "text": "CodeEditorProps" - }, - ">" + } ], "path": "packages/shared-ux/code_editor/impl/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index bfdd0e5508583..0438fd506c8f6 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_code_editor_mock.devdocs.json index a4ad55009b418..b7fff10768a78 100644 --- a/api_docs/kbn_code_editor_mock.devdocs.json +++ b/api_docs/kbn_code_editor_mock.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "(props: Omit<", "MonacoEditorProps", - ", \"className\"> & { className?: string | undefined; \"data-test-subj\"?: string | undefined; }) => JSX.Element" + ", \"className\"> & { className?: string | undefined; \"data-test-subj\"?: string | undefined; }) => React.JSX.Element" ], "path": "packages/shared-ux/code_editor/mocks/code_editor_mock.tsx", "deprecated": false, diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index d6a399933674e..99c24b7fed1b1 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-01 +date: 2024-10-02 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 07b1a75112054..b7e83f40b691c 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.devdocs.json b/api_docs/kbn_coloring.devdocs.json index a1d23178234a6..c219a0dfa7778 100644 --- a/api_docs/kbn_coloring.devdocs.json +++ b/api_docs/kbn_coloring.devdocs.json @@ -196,7 +196,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/kbn-coloring/src/shared_components/color_mapping/categorical_color_mapping.tsx", "deprecated": false, @@ -342,7 +342,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -359,11 +359,9 @@ "\nThe Lazily-loaded `CustomizablePalette` component. Consumers should use `React.Suspense` or\nthe withSuspense` HOC to load this component." ], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<({ palettes, activePalette, setPalette, dataBounds, showExtraActions, showRangeTypeSelector, disableSwitchingContinuity, }: ", "CustomizablePaletteProps", - "> & { readonly _result: ({ palettes, activePalette, setPalette, dataBounds, showExtraActions, showRangeTypeSelector, disableSwitchingContinuity, }: ", - "CustomizablePaletteProps", - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "packages/kbn-coloring/src/shared_components/index.ts", "deprecated": false, @@ -380,7 +378,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 76f6745f3013c..67373ca0ac80a 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-01 +date: 2024-10-02 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 497399e928ff2..45b99e1d01ccf 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-01 +date: 2024-10-02 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 f6e98bfbe9d32..94392d5ea18ab 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-01 +date: 2024-10-02 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 be8322ba44e5d..82252ace01d39 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_content_editor.devdocs.json index fc863182b74d3..d08941f77886f 100644 --- a/api_docs/kbn_content_management_content_editor.devdocs.json +++ b/api_docs/kbn_content_management_content_editor.devdocs.json @@ -13,9 +13,9 @@ "\nKibana-specific Provider that maps to known dependency types." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "ContentEditorKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/content-management/content_editor/src/services.tsx", "deprecated": false, @@ -29,9 +29,9 @@ "label": "{ children, ...services }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "ContentEditorKibanaDependencies", - ">>" + ">" ], "path": "packages/content-management/content_editor/src/services.tsx", "deprecated": false, @@ -52,9 +52,9 @@ "\nAbstract external service Provider." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "Services", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/content-management/content_editor/src/services.tsx", "deprecated": false, @@ -68,9 +68,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "Services", - ">>" + ">" ], "path": "packages/content-management/content_editor/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index ffe6711a7318c..1b55d481441d5 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_content_insights_public.devdocs.json index 0e6c72081bd1b..815d122e119e7 100644 --- a/api_docs/kbn_content_management_content_insights_public.devdocs.json +++ b/api_docs/kbn_content_management_content_insights_public.devdocs.json @@ -229,7 +229,7 @@ "section": "def-public.ActivityViewProps", "text": "ActivityViewProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/content-management/content_insights/content_insights_public/src/components/activity_view.tsx", "deprecated": false, @@ -270,7 +270,7 @@ "\nAbstract external service Provider." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<Partial<", + "({ children, ...services }: React.PropsWithChildren<Partial<", { "pluginId": "@kbn/content-management-content-insights-public", "scope": "public", @@ -278,7 +278,7 @@ "section": "def-public.ContentInsightsServices", "text": "ContentInsightsServices" }, - ">>>) => JSX.Element" + ">>) => React.JSX.Element" ], "path": "packages/content-management/content_insights/content_insights_public/src/services.tsx", "deprecated": false, @@ -292,7 +292,7 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<Partial<", + "React.PropsWithChildren<Partial<", { "pluginId": "@kbn/content-management-content-insights-public", "scope": "public", @@ -300,7 +300,7 @@ "section": "def-public.ContentInsightsServices", "text": "ContentInsightsServices" }, - ">>>" + ">>" ], "path": "packages/content-management/content_insights/content_insights_public/src/services.tsx", "deprecated": false, @@ -352,7 +352,7 @@ "section": "def-common.UserContentCommonSchema", "text": "UserContentCommonSchema" }, - "; }) => JSX.Element" + "; }) => React.JSX.Element" ], "path": "packages/content-management/content_insights/content_insights_public/src/components/views_stats/views_stats.tsx", "deprecated": false, diff --git a/api_docs/kbn_content_management_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index 91f837f7d7e83..0981a62c3fcdf 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-01 +date: 2024-10-02 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 3bb4ee45d8c8d..0a8d2ca4618b7 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_favorites_public.devdocs.json index e7c64f1fedd24..e4efbf68df82e 100644 --- a/api_docs/kbn_content_management_favorites_public.devdocs.json +++ b/api_docs/kbn_content_management_favorites_public.devdocs.json @@ -361,7 +361,7 @@ "section": "def-public.FavoriteButtonProps", "text": "FavoriteButtonProps" }, - ") => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "packages/content-management/favorites/favorites_public/src/components/favorite_button.tsx", "deprecated": false, @@ -400,7 +400,7 @@ "label": "FavoritesContextProvider", "description": [], "signature": [ - "({ favoritesClient, notifyError, children, }: React.PropsWithChildren<React.PropsWithChildren<FavoritesContextValue>>) => JSX.Element" + "({ favoritesClient, notifyError, children, }: React.PropsWithChildren<FavoritesContextValue>) => React.JSX.Element" ], "path": "packages/content-management/favorites/favorites_public/src/favorites_context.tsx", "deprecated": false, @@ -414,7 +414,7 @@ "label": "{\n favoritesClient,\n notifyError,\n children,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<FavoritesContextValue>>" + "React.PropsWithChildren<FavoritesContextValue>" ], "path": "packages/content-management/favorites/favorites_public/src/favorites_context.tsx", "deprecated": false, @@ -433,7 +433,7 @@ "label": "FavoritesEmptyState", "description": [], "signature": [ - "({ emptyStateType, entityNamePlural, entityName, }: { emptyStateType: \"noItems\" | \"noMatchingItems\"; entityNamePlural?: string | undefined; entityName?: string | undefined; }) => JSX.Element" + "({ emptyStateType, entityNamePlural, entityName, }: { emptyStateType: \"noItems\" | \"noMatchingItems\"; entityNamePlural?: string | undefined; entityName?: string | undefined; }) => React.JSX.Element" ], "path": "packages/content-management/favorites/favorites_public/src/components/favorites_empty_state.tsx", "deprecated": false, diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 3858e6ad13e9f..199a31f57e08b 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-01 +date: 2024-10-02 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 2cf068eea34ae..1b3765d0c4914 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_tabbed_table_list_view.devdocs.json index 3ad9eef4c28cc..b66e4702fb4e8 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.devdocs.json +++ b/api_docs/kbn_content_management_tabbed_table_list_view.devdocs.json @@ -11,7 +11,7 @@ "label": "TabbedTableListView", "description": [], "signature": [ - "({ title, description, headingId, children, tabs, activeTabId, changeActiveTab, }: TabbedTableListViewProps) => JSX.Element" + "({ title, description, headingId, children, tabs, activeTabId, changeActiveTab, }: TabbedTableListViewProps) => React.JSX.Element" ], "path": "packages/content-management/tabbed_table_list_view/src/tabbed_table_list_view.tsx", "deprecated": false, 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 848c7491b96af..515e50b7d02aa 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_table_list_view.devdocs.json index 2768884c3da7a..8e3f45f10ce5d 100644 --- a/api_docs/kbn_content_management_table_list_view.devdocs.json +++ b/api_docs/kbn_content_management_table_list_view.devdocs.json @@ -27,7 +27,7 @@ "section": "def-public.TableListViewProps", "text": "TableListViewProps" }, - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/content-management/table_list_view/src/table_list_view.tsx", "deprecated": false, diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 55a8064e83f6d..ce3056284aacb 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-01 +date: 2024-10-02 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 0a8cdc33231d7..7c5173933b541 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_table_list_view_table.devdocs.json index 958e9a551308d..7e9c12541d758 100644 --- a/api_docs/kbn_content_management_table_list_view_table.devdocs.json +++ b/api_docs/kbn_content_management_table_list_view_table.devdocs.json @@ -13,7 +13,7 @@ "\nKibana-specific Provider that maps to known dependency types." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", { "pluginId": "@kbn/content-management-table-list-view-table", "scope": "public", @@ -21,7 +21,7 @@ "section": "def-public.TableListViewKibanaDependencies", "text": "TableListViewKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/content-management/table_list_view_table/src/services.tsx", "deprecated": false, @@ -35,7 +35,7 @@ "label": "{ children, ...services }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/content-management-table-list-view-table", "scope": "public", @@ -43,7 +43,7 @@ "section": "def-public.TableListViewKibanaDependencies", "text": "TableListViewKibanaDependencies" }, - ">>" + ">" ], "path": "packages/content-management/table_list_view_table/src/services.tsx", "deprecated": false, @@ -64,9 +64,9 @@ "\nAbstract external service Provider." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "Services", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/content-management/table_list_view_table/src/services.tsx", "deprecated": false, @@ -80,9 +80,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "Services", - ">>" + ">" ], "path": "packages/content-management/table_list_view_table/src/services.tsx", "deprecated": false, @@ -117,7 +117,7 @@ "section": "def-public.TableListViewTableProps", "text": "TableListViewTableProps" }, - "<T>) => JSX.Element | null" + "<T>) => React.JSX.Element | null" ], "path": "packages/content-management/table_list_view_table/src/table_list_view_table.tsx", "deprecated": false, @@ -297,7 +297,7 @@ "section": "def-common.FormattedRelativeProps", "text": "FormattedRelativeProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/content-management/table_list_view_table/src/services.tsx", "deprecated": false, 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 2ae812052de35..81e8bfcc3d891 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_content_management_user_profiles.devdocs.json index ebf081e4808e0..8173f84b73568 100644 --- a/api_docs/kbn_content_management_user_profiles.devdocs.json +++ b/api_docs/kbn_content_management_user_profiles.devdocs.json @@ -11,7 +11,7 @@ "label": "ManagedAvatarTip", "description": [], "signature": [ - "({\n entityName = i18n.translate('contentManagement.userProfiles.managedAvatarTip.defaultEntityName', {\n defaultMessage: 'object',\n }),\n}: { entityName?: string | undefined; }) => JSX.Element" + "({\n entityName = i18n.translate('contentManagement.userProfiles.managedAvatarTip.defaultEntityName', {\n defaultMessage: 'object',\n }),\n}: { entityName?: string | undefined; }) => React.JSX.Element" ], "path": "packages/content-management/user_profiles/src/components/managed_avatar_tip.tsx", "deprecated": false, @@ -58,7 +58,7 @@ "signature": [ "(props: { iconType?: ", "IconType", - " | undefined; }) => JSX.Element" + " | undefined; }) => React.JSX.Element" ], "path": "packages/content-management/user_profiles/src/components/user_missing_tip.tsx", "deprecated": false, @@ -104,7 +104,7 @@ "label": "NoUpdaterTip", "description": [], "signature": [ - "(props: { iconType?: string | undefined; }) => JSX.Element" + "(props: { iconType?: string | undefined; }) => React.JSX.Element" ], "path": "packages/content-management/user_profiles/src/components/user_missing_tip.tsx", "deprecated": false, @@ -149,7 +149,7 @@ "label": "UserAvatarTip", "description": [], "signature": [ - "(props: { uid: string; }) => JSX.Element | null" + "(props: { uid: string; }) => React.JSX.Element | null" ], "path": "packages/content-management/user_profiles/src/components/user_avatar_tip.tsx", "deprecated": false, @@ -191,7 +191,7 @@ "label": "UserProfilesKibanaProvider", "description": [], "signature": [ - "({ children, core, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, core, }: React.PropsWithChildren<", { "pluginId": "@kbn/content-management-user-profiles", "scope": "public", @@ -199,7 +199,7 @@ "section": "def-public.UserProfilesKibanaDependencies", "text": "UserProfilesKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/content-management/user_profiles/src/services.tsx", "deprecated": false, @@ -213,7 +213,7 @@ "label": "{\n children,\n core,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/content-management-user-profiles", "scope": "public", @@ -221,7 +221,7 @@ "section": "def-public.UserProfilesKibanaDependencies", "text": "UserProfilesKibanaDependencies" }, - ">>" + ">" ], "path": "packages/content-management/user_profiles/src/services.tsx", "deprecated": false, @@ -240,7 +240,7 @@ "label": "UserProfilesProvider", "description": [], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", { "pluginId": "@kbn/content-management-user-profiles", "scope": "public", @@ -248,7 +248,7 @@ "section": "def-public.UserProfilesServices", "text": "UserProfilesServices" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/content-management/user_profiles/src/services.tsx", "deprecated": false, @@ -262,7 +262,7 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/content-management-user-profiles", "scope": "public", @@ -270,7 +270,7 @@ "section": "def-public.UserProfilesServices", "text": "UserProfilesServices" }, - ">>" + ">" ], "path": "packages/content-management/user_profiles/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index e3a129efc04fb..0a9212bce9ffd 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-01 +date: 2024-10-02 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 66e965f5200aa..1fd41b8360dc0 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-01 +date: 2024-10-02 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 dd8459b9c5025..8fabc8567faf4 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-01 +date: 2024-10-02 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 9f5ff975e667b..e76fd8ad1d743 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-01 +date: 2024-10-02 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 ffef9bd5229db..17eb124d0c737 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-01 +date: 2024-10-02 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 cdbc7d1b815ad..24d8910ae1d64 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-01 +date: 2024-10-02 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 ba1894cf9236b..38985cd24d3d3 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-01 +date: 2024-10-02 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 16a50f7b7626c..42cf867f5d414 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_application_browser.devdocs.json index aa338198fad39..006c517538dd8 100644 --- a/api_docs/kbn_core_application_browser.devdocs.json +++ b/api_docs/kbn_core_application_browser.devdocs.json @@ -2009,7 +2009,7 @@ "section": "def-public.AppStatus", "text": "AppStatus" }, - " | undefined; visibleIn?: ", + " | undefined; tooltip?: string | undefined; visibleIn?: ", { "pluginId": "@kbn/core-application-browser", "scope": "public", @@ -2017,7 +2017,7 @@ "section": "def-public.AppDeepLinkLocations", "text": "AppDeepLinkLocations" }, - "[] | undefined; tooltip?: string | undefined; deepLinks?: ", + "[] | undefined; deepLinks?: ", { "pluginId": "@kbn/core-application-browser", "scope": "public", diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 193cbc80e7b48..d75ad7f1a2c32 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-01 +date: 2024-10-02 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 320935b72f49f..5b907e56edd15 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-01 +date: 2024-10-02 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 bd0d19ddbee70..f47cf9c2dbfb4 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-01 +date: 2024-10-02 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 0ce2ecc6ac6aa..d16a95554eabe 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-01 +date: 2024-10-02 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 2d1ae36f74550..7f34ac11e7c10 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-01 +date: 2024-10-02 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 210c03bbbfebc..23fd58af63b28 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-01 +date: 2024-10-02 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 86145623392f4..acbdb8d2b3595 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-01 +date: 2024-10-02 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 9a94242cc4f37..d391c1ce32499 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-01 +date: 2024-10-02 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 d01d2bfadd2d6..44820bda89eaa 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-01 +date: 2024-10-02 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 7a1ed385cc97a..8b3639a5aafe3 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-01 +date: 2024-10-02 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 495dff641a577..3d1d4d08a437e 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-01 +date: 2024-10-02 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 5b74e0b644293..00fd7e1cb29c3 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-01 +date: 2024-10-02 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 0bc55cbba5e03..a5a2440225f7a 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-01 +date: 2024-10-02 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 3d788d2663631..4b42b2cab5747 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-01 +date: 2024-10-02 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 9ba9276c2e0f3..214f6a1dca1e6 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index 90af2b41148d2..c1778d1c185b3 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -449,7 +449,7 @@ "\nContent of the button (in lieu of `children`)" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/core/chrome/core-chrome-browser/src/help_extension.ts", "deprecated": false, @@ -3714,7 +3714,7 @@ "label": "AppDeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"profiling\" | \"metrics\" | \"management\" | \"apm\" | \"synthetics\" | \"ux\" | \"logs\" | \"dashboards\" | \"slo\" | \"observabilityAIAssistant\" | \"home\" | \"integrations\" | \"canvas\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:logPatternAnalysis\" | \"ml:logRateAnalysis\" | \"ml:singleMetricViewer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"ml:suppliedConfigurations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:cross_cluster_replication\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchRelevance\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchInferenceEndpoints\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"enterpriseSearchRelevance:inferenceEndpoints\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"inventory\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:services\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:functions\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"inventory:datastreams\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"securitySolutionUI:notes-management\" | \"fleet:settings\" | \"fleet:agents\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\"" + "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"profiling\" | \"metrics\" | \"management\" | \"apm\" | \"synthetics\" | \"ux\" | \"canvas\" | \"logs\" | \"dashboards\" | \"slo\" | \"observabilityAIAssistant\" | \"home\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:logPatternAnalysis\" | \"ml:logRateAnalysis\" | \"ml:singleMetricViewer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"ml:suppliedConfigurations\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:cross_cluster_replication\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchRelevance\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchInferenceEndpoints\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"enterpriseSearchRelevance:inferenceEndpoints\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"inventory\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:services\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:functions\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"inventory:datastreams\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:notes\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"fleet:settings\" | \"fleet:agents\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\"" ], "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", "deprecated": false, @@ -3768,9 +3768,9 @@ "label": "ChromeHelpExtensionLinkBase", "description": [], "signature": [ - "{ 'data-test-subj'?: string | undefined; iconType?: ", + "{ rel?: string | undefined; 'data-test-subj'?: string | undefined; iconType?: ", "IconType", - " | undefined; rel?: string | undefined; target?: string | (string & {}) | undefined; }" + " | undefined; target?: string | (string & {}) | undefined; }" ], "path": "packages/core/chrome/core-chrome-browser/src/help_extension.ts", "deprecated": false, diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 26a776d8de6aa..2488096537fc0 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-01 +date: 2024-10-02 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 5cdc7fccc068f..e3db3e7d15f88 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-01 +date: 2024-10-02 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 afffb741973a2..34de9096dd6fe 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-01 +date: 2024-10-02 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 36d03e5cf51a2..be2489c0d1d30 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-01 +date: 2024-10-02 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 32d309c90918f..0a3c146307d37 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-01 +date: 2024-10-02 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 8bf417d52c2bb..c267014a65c17 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-01 +date: 2024-10-02 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 702a340808af6..aa8d909a50185 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-01 +date: 2024-10-02 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 02b180a6f8bb5..22f4a7a2b58ce 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-01 +date: 2024-10-02 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 32d723fc7af10..82f1691bc6713 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-01 +date: 2024-10-02 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 b9604db0cb01f..351463f5a9e03 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-01 +date: 2024-10-02 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 c360e0506fc8d..14815639d6f87 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-01 +date: 2024-10-02 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 1f699cdb70256..2a0794dc01063 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-01 +date: 2024-10-02 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 fbf534bdf9610..f66b76fc515e7 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-01 +date: 2024-10-02 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 bba47c306b3f5..657ff388d7017 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-01 +date: 2024-10-02 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 1b014f453d4ce..c24d815709baa 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-01 +date: 2024-10-02 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 292d0199b37d1..349a095d1a948 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-01 +date: 2024-10-02 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 eeb8777a6f5f2..80cec5a42424b 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-01 +date: 2024-10-02 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 a4a403512ce73..8988b67fd7c2f 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-01 +date: 2024-10-02 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 978884605cd72..68b2a63e35651 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-01 +date: 2024-10-02 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 52ea8c4e16f1a..ab41db6cdd717 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-01 +date: 2024-10-02 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 bce7b75a82848..bf653c5548ef4 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-01 +date: 2024-10-02 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 079de0432786a..ec5efc22f8dc9 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-01 +date: 2024-10-02 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 180c091912cb5..f823a08d30713 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-01 +date: 2024-10-02 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 b54ea151107de..8fe7ca10a1e27 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-01 +date: 2024-10-02 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 c9b316083ceb5..dc09baa18b820 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-01 +date: 2024-10-02 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 71759693bb652..41aaa4d0ca9f4 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-01 +date: 2024-10-02 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 4fb3049d4250c..d8e3a48f72067 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-01 +date: 2024-10-02 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 05b2858995dce..8c931d43fefbd 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-01 +date: 2024-10-02 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 ea5a293075a69..5b27f12cc9268 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-01 +date: 2024-10-02 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 8630149294337..68490bf2e6155 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-01 +date: 2024-10-02 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 ee53ff873e760..8b9576033f3b1 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-01 +date: 2024-10-02 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 2a9d1243df193..4584d7f56e646 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-01 +date: 2024-10-02 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 ff1c19d8c75d3..349e91747d3e6 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-01 +date: 2024-10-02 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 af3d0fb89a9be..d5ae05c5467e0 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-01 +date: 2024-10-02 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 7d30c1c11b2a2..becdc03bf384b 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-01 +date: 2024-10-02 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 f3b8fff70126d..532b41d468ec1 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-01 +date: 2024-10-02 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 29877e2c83b4d..e7a3017a2e7af 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-01 +date: 2024-10-02 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 46562e4eb5d34..fca31cae115dc 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-01 +date: 2024-10-02 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 e58c2f915baac..63f61cae2e31b 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-01 +date: 2024-10-02 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 0056a6bc4c575..54a1f819e79a7 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-01 +date: 2024-10-02 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 27b4daad7ceff..8c3d8c389585e 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-01 +date: 2024-10-02 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 0056153b1b89f..3e75bb717e5de 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-01 +date: 2024-10-02 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 7a99351a04975..f7ad0d42a1dd5 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-01 +date: 2024-10-02 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 27224a167f0bd..45b76cc088eef 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-01 +date: 2024-10-02 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 d89087b83dc8b..851ac45fb3d66 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-01 +date: 2024-10-02 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 f6b41bbb0ccce..0cf62cdc6dccf 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-01 +date: 2024-10-02 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 c66f9aaf45038..da70b88184c2a 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-01 +date: 2024-10-02 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 0e5e0df6c244e..01d46db67212f 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-01 +date: 2024-10-02 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 470330cdbc120..df0b7fb3f3536 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-01 +date: 2024-10-02 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 b416bf84af438..80eb973481e7c 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-01 +date: 2024-10-02 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 724520397eb55..aa0540e57ef2f 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-01 +date: 2024-10-02 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 c032e1de4715d..9115526a1df9e 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_http_router_server_internal.devdocs.json index ede556280b205..640117913948d 100644 --- a/api_docs/kbn_core_http_router_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_router_server_internal.devdocs.json @@ -677,10 +677,7 @@ "signature": [ "(kibanaResponse: ", "KibanaResponse", - "<any>) => ", - "Boom", - "<any> | ", - "ResponseObject" + "<any>) => any" ], "path": "packages/core/http/core-http-router-server-internal/src/response_adapter.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 4550ad2f41790..b0bfceea0f927 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-01 +date: 2024-10-02 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 5f84e5c180b2f..7485915b0c389 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-01 +date: 2024-10-02 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 7b7082d5b4639..3927696ddf000 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -7451,6 +7451,10 @@ "plugin": "searchPlayground", "path": "x-pack/plugins/search_playground/server/routes.ts" }, + { + "plugin": "searchPlayground", + "path": "x-pack/plugins/search_playground/server/routes.ts" + }, { "plugin": "searchprofiler", "path": "x-pack/plugins/searchprofiler/server/routes/profile.ts" @@ -9819,7 +9823,7 @@ }, { "plugin": "actions", - "path": "x-pack/plugins/actions/server/routes/delete.ts" + "path": "x-pack/plugins/actions/server/routes/connector/delete/delete.ts" }, { "plugin": "actions", @@ -10093,18 +10097,6 @@ "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" }, - { - "plugin": "actions", - "path": "x-pack/plugins/actions/server/routes/delete.test.ts" - }, - { - "plugin": "actions", - "path": "x-pack/plugins/actions/server/routes/delete.test.ts" - }, - { - "plugin": "actions", - "path": "x-pack/plugins/actions/server/routes/delete.test.ts" - }, { "plugin": "globalSearch", "path": "x-pack/plugins/global_search/server/routes/index.test.ts" @@ -10153,6 +10145,18 @@ "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/delete_route.test.ts" }, + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/routes/connector/delete/delete.test.ts" + }, + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/routes/connector/delete/delete.test.ts" + }, + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/routes/connector/delete/delete.test.ts" + }, { "plugin": "crossClusterReplication", "path": "x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.test.ts" @@ -13692,7 +13696,9 @@ "signature": [ "(req: ", "Request", - ", responseToolkit: ", + "<", + "ReqRefDefaults", + ">, responseToolkit: ", "ResponseToolkit", ") => Promise<", "Boom", @@ -13712,7 +13718,10 @@ "label": "req", "description": [], "signature": [ - "Request" + "Request", + "<", + "ReqRefDefaults", + ">" ], "path": "packages/core/http/core-http-server/src/router/router.ts", "deprecated": false, @@ -19574,7 +19583,9 @@ "description": [], "signature": [ "Request", - " | ", + "<", + "ReqRefDefaults", + "> | ", { "pluginId": "@kbn/core-http-server", "scope": "server", diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 1d755fd067ec2..6320c1e4419b3 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_http_server_internal.devdocs.json index 045ecc84f81c8..2abb537aeabba 100644 --- a/api_docs/kbn_core_http_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_server_internal.devdocs.json @@ -1123,7 +1123,9 @@ }, ", server: ", "Server", - ", cookieOptions: ", + "<", + "ServerApplicationState", + ">, cookieOptions: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -1176,7 +1178,10 @@ "- hapi server to create SessionStorage for" ], "signature": [ - "Server" + "Server", + "<", + "ServerApplicationState", + ">" ], "path": "packages/core/http/core-http-server-internal/src/cookie_session_storage.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 91ae86b098cc8..bead3bdb8a64f 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_http_server_mocks.devdocs.json index e7856f80d70b4..4cb9dd96496ff 100644 --- a/api_docs/kbn_core_http_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_server_mocks.devdocs.json @@ -436,7 +436,9 @@ }, "; server: ", "Server", - "; auth: ", + "<", + "ServerApplicationState", + ">; auth: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -527,7 +529,9 @@ }, "; server: ", "Server", - "; registerStaticDir: jest.MockInstance<void, [path: string, dirPath: string], unknown>; registerRouteHandlerContext: <Context extends ", + "<", + "ServerApplicationState", + ">; registerStaticDir: jest.MockInstance<void, [path: string, dirPath: string], unknown>; registerRouteHandlerContext: <Context extends ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -817,8 +821,13 @@ }, "<", "Request", - ">) => ", - "Request" + "<", + "ReqRefDefaults", + ">>) => ", + "Request", + "<", + "ReqRefDefaults", + ">" ], "path": "packages/core/http/core-http-server-mocks/src/http_server.mocks.ts", "deprecated": false, @@ -853,7 +862,11 @@ }, "<", "RequestAuth", - "> | undefined; events?: ", + "<", + "UserCredentials", + ", ", + "AppCredentials", + ", Record<string, unknown>, Record<string, unknown>>> | undefined; events?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -871,9 +884,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<string>> | undefined; readonly info?: ", + "<Record<string, any>> | undefined; readonly info?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -893,9 +904,7 @@ }, "<", "RequestLog", - "> | undefined; readonly method?: ", - "Util", - ".HTTP_METHODS_PARTIAL_LOWERCASE | undefined; readonly mime?: string | undefined; readonly orig?: ", + "> | undefined; readonly method?: \"source\" | \"get\" | \"delete\" | \"options\" | \"search\" | \"link\" | \"head\" | \"post\" | \"put\" | \"patch\" | \"purge\" | \"unlink\" | \"copy\" | \"move\" | \"merge\" | \"subscribe\" | \"trace\" | \"lock\" | \"unsubscribe\" | \"report\" | \"acl\" | \"bind\" | \"checkout\" | \"connect\" | \"m-search\" | \"mkactivity\" | \"mkcalendar\" | \"mkcol\" | \"notify\" | \"propfind\" | \"proppatch\" | \"rebind\" | \"unbind\" | \"unlock\" | undefined; readonly mime?: string | undefined; readonly orig?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -913,9 +922,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; readonly paramsArray?: ", + "<Record<string, any>> | undefined; readonly paramsArray?: string | ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -959,9 +966,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; response?: ", + "<Record<string, any>> | undefined; response?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -989,9 +994,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; readonly query?: ", + "<Record<string, any>> | undefined; readonly query?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1025,7 +1028,9 @@ }, "<", "RequestRoute", - "> | undefined; server?: ", + "<", + "ReqRefDefaults", + ">> | undefined; readonly server?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1035,7 +1040,9 @@ }, "<", "Server", - "> | undefined; readonly state?: ", + "<", + "ServerApplicationState", + ">> | undefined; readonly state?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1043,9 +1050,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; readonly url?: ", + "<Record<string, any>> | undefined; readonly url?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1099,9 +1104,9 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<(method: ", - "Util", - ".HTTP_METHODS_PARTIAL) => void> | undefined; setUrl?: ", + "<(method: \"source\" | \"get\" | \"delete\" | \"options\" | \"search\" | \"link\" | \"head\" | \"post\" | \"put\" | \"patch\" | \"purge\" | \"unlink\" | \"copy\" | \"move\" | \"merge\" | \"subscribe\" | \"trace\" | \"lock\" | \"unsubscribe\" | \"report\" | ", + "HTTP_METHODS", + " | \"acl\" | \"bind\" | \"checkout\" | \"connect\" | \"m-search\" | \"mkactivity\" | \"mkcalendar\" | \"mkcol\" | \"notify\" | \"propfind\" | \"proppatch\" | \"rebind\" | \"unbind\" | \"unlock\") => void> | undefined; setUrl?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1128,10 +1133,12 @@ "text": "DeepPartialObject" }, "<(events: ", - "Event", - " | ", - "Event", - "[]) => void> | undefined; registerPodium?: ", + "Podium", + ".EventOptions<string> | ", + "Podium", + ".EventOptions<string>[], options?: ", + "Podium", + ".EventSettings | undefined) => void> | undefined; emit?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1139,11 +1146,9 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<(podiums: ", - "node_modules/@hapi/podium/lib/index", - " | ", - "node_modules/@hapi/podium/lib/index", - "[]) => void> | undefined; emit?: ", + "<(criteria: ", + "Podium", + ".EmitCriteria<string>, data?: any) => void> | undefined; gauge?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1151,9 +1156,9 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<(criteria: string | ", - "EmitCriteria", - ", data?: any) => Promise<void>> | undefined; on?: ", + "<(<T = unknown>(criteria: ", + "Podium", + ".EmitCriteria<string>, data?: any) => Promise<PromiseSettledResult<T>[]>)> | undefined; on?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1161,23 +1166,39 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<{ <TArgs extends any[] = unknown[], Tcontext extends object = ", + "<(<TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".Criteria<string>, listener: ", + "EventListener", + "<undefined, TArgs, Tcontext>, context?: Tcontext | undefined) => ", "Request", - "; <TArgs extends any[] = any[], Tcontext extends object = ", + "<", + "ReqRefDefaults", + ">)> | undefined; addListener?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.DeepPartialObject", + "text": "DeepPartialObject" + }, + "<(<TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".Criteria<string>, listener: ", + "EventListener", + "<undefined, TArgs, Tcontext>, context?: Tcontext | undefined) => ", "Request", - "; }> | undefined; addListener?: ", + "<", + "ReqRefDefaults", + ">)> | undefined; once?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1187,21 +1208,23 @@ }, "<{ <TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", - "Request", - "; <TArgs extends any[] = any[], Tcontext extends object = ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".OnceCriteria<string>, listener: ", + "EventListener", + "<undefined, TArgs, Tcontext>, context?: Tcontext | undefined): ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">; <TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - "; }> | undefined; once?: ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".OnceCriteria<string>): Promise<TArgs>; }> | undefined; few?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1209,27 +1232,27 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<{ <TArgs extends any[] = unknown[], Tcontext extends object = ", + "<(<TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">, listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", - "Request", - "; <TArgs extends any[] = any[], Tcontext extends object = ", - "Request", - ">(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">, listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".FewCriteria<string>) => Promise<TArgs>)> | undefined; off?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.DeepPartialObject", + "text": "DeepPartialObject" + }, + "<(name: string, listener: ", + "Podium", + ".Listener<any, any[]>) => ", "Request", - "; <TArgs extends any[] = unknown[], Tcontext extends void = void>(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">): Promise<TArgs>; <TArgs extends any[] = any[], Tcontext extends void = void>(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">): Promise<TArgs>; }> | undefined; removeListener?: ", + "<", + "ReqRefDefaults", + ">> | undefined; removeListener?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1238,10 +1261,12 @@ "text": "DeepPartialObject" }, "<(name: string, listener: ", - "Listener", - "<any, any[]>) => ", + "Podium", + ".Listener<any, any[]>) => ", "Request", - "> | undefined; removeAllListeners?: ", + "<", + "ReqRefDefaults", + ">> | undefined; removeAllListeners?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1251,7 +1276,9 @@ }, "<(name: string) => ", "Request", - "> | undefined; hasListeners?: ", + "<", + "ReqRefDefaults", + ">> | undefined; hasListeners?: ", { "pluginId": "@kbn/utility-types", "scope": "common", diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 38ce3cb89c9fe..214fa2364d2cf 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_i18n_browser.devdocs.json index 4a5e478eec90b..2a3fc9a73cc0d 100644 --- a/api_docs/kbn_core_i18n_browser.devdocs.json +++ b/api_docs/kbn_core_i18n_browser.devdocs.json @@ -52,7 +52,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/core/i18n/core-i18n-browser/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index a1bb917f0a554..57b96a75596fe 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-01 +date: 2024-10-02 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 74a04bbc0e63a..10c849bc4b9de 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-01 +date: 2024-10-02 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 db80eda8e4113..c62f285465203 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-01 +date: 2024-10-02 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 c83bcfc01b9ba..e0ee708876a8b 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-01 +date: 2024-10-02 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 fa1bfda4d4f08..38ff5644f1243 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-01 +date: 2024-10-02 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 bc788f6bfcbdf..560c4ebe78a5d 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-01 +date: 2024-10-02 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 f6f3e08774d3c..1a17692e0101d 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-01 +date: 2024-10-02 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 7b293a2c4e73b..3b555f391b2da 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-01 +date: 2024-10-02 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 cbecdf78998bc..0a5f20d83864e 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-01 +date: 2024-10-02 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 92e90fc3d49f6..f2df30eb950e4 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-01 +date: 2024-10-02 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 8b8a288c25d5d..0d722e13b8a5c 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-01 +date: 2024-10-02 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 b45eed3402a67..c1e5ed1e76c07 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-01 +date: 2024-10-02 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 7b9156bbe3bc8..190cdf4c2d9b7 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-01 +date: 2024-10-02 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 a6d3f9d197482..8551bc22177cd 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-01 +date: 2024-10-02 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 9baa8923384e7..99b59d9d71884 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-01 +date: 2024-10-02 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 fa5ce18f8f68a..9e8dd8f6a10a5 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-01 +date: 2024-10-02 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 ecde70734f41f..6c5dfac58e4c1 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json index cbce3eb61d0fa..52b518b67b709 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json +++ b/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json @@ -559,7 +559,10 @@ "label": "server", "description": [], "signature": [ - "Server" + "Server", + "<", + "ServerApplicationState", + ">" ], "path": "packages/core/metrics/core-metrics-collectors-server-internal/src/server.ts", "deprecated": false, diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 3a22611eb9070..79aec1965d86d 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-01 +date: 2024-10-02 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 e21e9083c81e5..6f69a23109ef5 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-01 +date: 2024-10-02 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 9d3640f11768e..d0115031cecab 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-01 +date: 2024-10-02 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 c75ef3d712c18..908ff01461f74 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-01 +date: 2024-10-02 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 a64d092522bf3..31743f3dae202 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-01 +date: 2024-10-02 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 7d89b670ead29..a0f4e85aab989 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-01 +date: 2024-10-02 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 51ac5870ae176..c7bf5b08e79ef 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-01 +date: 2024-10-02 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 aeb99514efc46..87ac73dbf4e85 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-01 +date: 2024-10-02 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 8c448a3ae4aaa..6002129de7484 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_notifications_browser.devdocs.json index 3cfd66936100a..c76c400a6caf7 100644 --- a/api_docs/kbn_core_notifications_browser.devdocs.json +++ b/api_docs/kbn_core_notifications_browser.devdocs.json @@ -720,7 +720,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"autoFocus\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"nonce\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"content\" | \"datatype\" | \"inlist\" | \"property\" | \"rel\" | \"resource\" | \"rev\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-braillelabel\" | \"aria-brailleroledescription\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colindextext\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-description\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowindextext\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onResize\" | \"onResizeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerLeave\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "public", @@ -779,7 +779,7 @@ "signature": [ "Pick<", "Toast", - ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", + ", \"prefix\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"autoFocus\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"nonce\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"content\" | \"datatype\" | \"inlist\" | \"property\" | \"rel\" | \"resource\" | \"rev\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-braillelabel\" | \"aria-brailleroledescription\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colindextext\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-description\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowindextext\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onResize\" | \"onResizeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerLeave\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"iconType\" | \"onClose\" | \"toastLifeTimeMs\"> & { title?: string | ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "public", diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 7cc1c2cf1bac2..936413083449d 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-01 +date: 2024-10-02 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 8b9885bfd4550..5064d5526d0de 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-01 +date: 2024-10-02 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 f4df1c28c1f90..c5ae2680ec131 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_overlays_browser.devdocs.json index e5c1fc4d6353d..9fa49593ede09 100644 --- a/api_docs/kbn_core_overlays_browser.devdocs.json +++ b/api_docs/kbn_core_overlays_browser.devdocs.json @@ -1072,7 +1072,7 @@ "EuiFlyoutProps", "<\"div\"> | ", "EuiFlyoutResizableProps", - ", \"onClose\"> & { onClose?: ((flyout: ", + ", \"onResize\" | \"onClose\"> & { onClose?: ((flyout: ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "public", diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 54af2731e0adf..ac196f1784e75 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-01 +date: 2024-10-02 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 d7d35d7c6e229..c71e77fae9613 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-01 +date: 2024-10-02 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 efdbbb455be61..3670d51133129 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-01 +date: 2024-10-02 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 fafa6d3a06d7d..3f1eadabd6f6f 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-01 +date: 2024-10-02 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 884ac3922e63f..482968dcdba6f 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-01 +date: 2024-10-02 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 5d8350eb2eb2e..15b6200472c5c 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-01 +date: 2024-10-02 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 dc3b14e28cf59..19277fa7accac 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-01 +date: 2024-10-02 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 e9a6696f4038b..fd6e4df8a33cb 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-01 +date: 2024-10-02 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 45997c647b7fe..3fc7760318d08 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-01 +date: 2024-10-02 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 7946283a6f514..bfed42469779f 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-01 +date: 2024-10-02 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 6e085205576e6..cf0fa1e08447e 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-01 +date: 2024-10-02 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 22f6a606b16cd..4727791fec03c 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_rendering_server_internal.devdocs.json index d765832debee1..29bb11f4848ed 100644 --- a/api_docs/kbn_core_rendering_server_internal.devdocs.json +++ b/api_docs/kbn_core_rendering_server_internal.devdocs.json @@ -19,7 +19,7 @@ "label": "Fonts", "description": [], "signature": [ - "({ url }: React.PropsWithChildren<Props>) => JSX.Element" + "({ url }: Props) => React.JSX.Element" ], "path": "packages/core/rendering/core-rendering-server-internal/src/views/fonts.tsx", "deprecated": false, @@ -28,12 +28,12 @@ { "parentPluginId": "@kbn/core-rendering-server-internal", "id": "def-server.Fonts.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ url }", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "packages/core/rendering/core-rendering-server-internal/src/views/fonts.tsx", "deprecated": false, diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 28d97c9514d2b..9dc8889751bba 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-01 +date: 2024-10-02 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 ef533ad0fa3ef..573c5f004f06e 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-01 +date: 2024-10-02 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 280ad7fbbc8ff..6871c6d65c3bf 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-01 +date: 2024-10-02 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 6dc38390484aa..8e5fe58b8f9f4 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-01 +date: 2024-10-02 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 ec10013d865bd..975976ddbf959 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-01 +date: 2024-10-02 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 6c8ad6fd3279c..b74ebf1737f34 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-01 +date: 2024-10-02 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 161e523b0a1d0..a179081f3fc14 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-01 +date: 2024-10-02 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 ea62ba0226054..dc93321115e6f 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-01 +date: 2024-10-02 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 7819a0e652f4d..e1201f0a3fd19 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-01 +date: 2024-10-02 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 c3da4d02e1518..e6c659bc4b45f 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-01 +date: 2024-10-02 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 95bff7fefaeda..00c69c23de3bb 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-01 +date: 2024-10-02 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 294def97417bb..69a958fee5a85 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-01 +date: 2024-10-02 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 8fc83a3d3837b..ff5c52d85795f 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-01 +date: 2024-10-02 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 4a3180afeca82..a5ed83355225e 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-01 +date: 2024-10-02 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 df68bb0fd6d07..89c5a64a0ee53 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-01 +date: 2024-10-02 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 4a6d19d8a8eb8..be235d0124461 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-01 +date: 2024-10-02 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 14d7d24eef56b..2b7a9c0314cd2 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-01 +date: 2024-10-02 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 52c4d63f504c9..b51884502d1a6 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-01 +date: 2024-10-02 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 c896cbfacf26d..8a6a7adac7a92 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-01 +date: 2024-10-02 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 3205a706aab30..e27f3fbe064ee 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-01 +date: 2024-10-02 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 971f8cc65aaa9..f2722340abae5 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-01 +date: 2024-10-02 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 df8f0ac12a6a1..69fabe522b939 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-01 +date: 2024-10-02 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 2d68c293f9fe4..dc6b99acdfef0 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-01 +date: 2024-10-02 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 4b1e28a7de9c9..4b109124b4014 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-01 +date: 2024-10-02 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 2c6fa3bf01ef7..99c64c4a60131 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-01 +date: 2024-10-02 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 6b2fd5644e4b3..100b4d9512330 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-01 +date: 2024-10-02 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 93bc79d9aaeca..6ff73fb7164f5 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-01 +date: 2024-10-02 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 23939f977b189..6ca8c3ea1ec95 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-01 +date: 2024-10-02 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 cbb589dc104d4..616414f9b64cd 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-01 +date: 2024-10-02 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 e02c9bdca1df4..0fd79f8baae3e 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-01 +date: 2024-10-02 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 93adba1d38b85..d0e58823803fc 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-01 +date: 2024-10-02 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 8f058e2ebcaad..d6d2b3edfbed9 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-01 +date: 2024-10-02 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 24a4d4b7d58d3..2616d15c319cc 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-01 +date: 2024-10-02 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 34ed2e7886e5e..617afb16d3362 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-01 +date: 2024-10-02 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 9eff12f75942d..abd6b41b20a94 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-01 +date: 2024-10-02 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 2e62a928fcd75..f761e2a89198d 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-01 +date: 2024-10-02 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 56761fa7fa94a..025128dfd44bd 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-01 +date: 2024-10-02 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 f914a13c42f8d..3ec48c428b291 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-01 +date: 2024-10-02 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 215d265e20262..a8416335ff5de 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-01 +date: 2024-10-02 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 1df80afbd4c7c..a819151a99ed3 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-01 +date: 2024-10-02 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 c56c9998fddec..ef29856e13035 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-01 +date: 2024-10-02 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 59c1937198e78..260118967b14b 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-01 +date: 2024-10-02 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 34d13d6ed7874..2a5ef407acbe8 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_core_ui_settings_common.devdocs.json index 7e6ddbebbc0c5..5e1bb26a62417 100644 --- a/api_docs/kbn_core_ui_settings_common.devdocs.json +++ b/api_docs/kbn_core_ui_settings_common.devdocs.json @@ -657,7 +657,7 @@ "\nUI element type to represent the settings." ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"array\" | \"image\" | \"select\" | \"json\" | \"markdown\"" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"select\" | \"image\" | \"array\" | \"json\" | \"markdown\"" ], "path": "packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts", "deprecated": false, diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 9d648b7ed0ab1..75b59cf2db377 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-01 +date: 2024-10-02 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 ea244aacf9c2e..e162572c85a4e 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-01 +date: 2024-10-02 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 1406599df4d8a..4ed86d83ec08a 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-01 +date: 2024-10-02 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 8e70643d30c5f..ee7ab715c0a4f 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-01 +date: 2024-10-02 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 d45e41bc85ff6..a66519dcf55dc 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-01 +date: 2024-10-02 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 468dc3db9c1dc..3603fe9404e17 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-01 +date: 2024-10-02 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 112bd28ab3c98..a725a070e0c39 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-01 +date: 2024-10-02 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 fce03e2b207bc..8ee59b20a1c25 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-01 +date: 2024-10-02 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 ff19d701ea5e2..32be2e463f5d2 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-01 +date: 2024-10-02 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 eed024a60aac8..32c14373765be 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-01 +date: 2024-10-02 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 6ac848ba164df..36b463936899b 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-01 +date: 2024-10-02 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 35bf221601950..123e028fd41a1 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-01 +date: 2024-10-02 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 77f84b1f1a224..5dc0cba234e80 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-01 +date: 2024-10-02 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 fdb8768b547ad..bd204d52301ce 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-01 +date: 2024-10-02 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 8c3729ed18d3d..dfc28ec737be0 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-01 +date: 2024-10-02 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 fe864ebc4a974..e9e8f93c9fd92 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-01 +date: 2024-10-02 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 b459dd9010a93..4e37f307e6cbb 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-01 +date: 2024-10-02 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 52ea567c77e3a..6f76756c2eb2c 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.devdocs.json b/api_docs/kbn_custom_icons.devdocs.json index 7bf78ecff15a2..bc0a6de71888a 100644 --- a/api_docs/kbn_custom_icons.devdocs.json +++ b/api_docs/kbn_custom_icons.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.AgentIconProps", "text": "AgentIconProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-custom-icons/src/components/agent_icon/index.tsx", "deprecated": false, @@ -82,7 +82,7 @@ "section": "def-common.CloudProviderIconProps", "text": "CloudProviderIconProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 412063d1eb26e..6dc34e58c3f3f 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.devdocs.json b/api_docs/kbn_custom_integrations.devdocs.json index e86cfe2858ef9..bc61d44d54e79 100644 --- a/api_docs/kbn_custom_integrations.devdocs.json +++ b/api_docs/kbn_custom_integrations.devdocs.json @@ -11,7 +11,7 @@ "label": "ConnectedCustomIntegrationsButton", "description": [], "signature": [ - "({ isDisabled, onClick, testSubj, }: ConnectedCustomIntegrationsButtonProps) => JSX.Element | null" + "({ isDisabled, onClick, testSubj, }: ConnectedCustomIntegrationsButtonProps) => React.JSX.Element | null" ], "path": "packages/kbn-custom-integrations/src/components/custom_integrations_button.tsx", "deprecated": false, @@ -44,7 +44,7 @@ "label": "ConnectedCustomIntegrationsForm", "description": [], "signature": [ - "({ testSubjects }: Props) => JSX.Element | null" + "({ testSubjects }: Props) => React.JSX.Element | null" ], "path": "packages/kbn-custom-integrations/src/components/custom_integrations_form.tsx", "deprecated": false, @@ -87,14 +87,14 @@ { "parentPluginId": "@kbn/custom-integrations", "id": "def-public.CustomIntegrationsProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -108,7 +108,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 12c2f120f2c2f..082be039ac7df 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-01 +date: 2024-10-02 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 a48f6d770dd09..f498792132ead 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-01 +date: 2024-10-02 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 806a21029dec2..384928b3b38f1 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-01 +date: 2024-10-02 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 0abcd0d819ff6..a3254cb3fd3ca 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-01 +date: 2024-10-02 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 b3082b2375683..e3bf9de4fe8ff 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-01 +date: 2024-10-02 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 ada2be47729b4..40b58ddb312fa 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_datemath.devdocs.json index dd5303cfd095e..eab4721dc49ff 100644 --- a/api_docs/kbn_datemath.devdocs.json +++ b/api_docs/kbn_datemath.devdocs.json @@ -119,7 +119,7 @@ "label": "Unit", "description": [], "signature": [ - "\"m\" | \"y\" | \"M\" | \"w\" | \"d\" | \"h\" | \"s\" | \"ms\"" + "\"m\" | \"s\" | \"y\" | \"M\" | \"w\" | \"d\" | \"h\" | \"ms\"" ], "path": "packages/kbn-datemath/index.ts", "deprecated": false, @@ -200,7 +200,7 @@ "label": "UnitsMap", "description": [], "signature": [ - "{ m: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; y: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; M: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; w: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; d: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; h: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; s: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; ms: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; }" + "{ m: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; s: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; y: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; M: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; w: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; d: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; h: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; ms: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; }" ], "path": "packages/kbn-datemath/index.ts", "deprecated": false, diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index c06023f45c2fd..64d4b70e45f51 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.devdocs.json b/api_docs/kbn_deeplinks_analytics.devdocs.json index 43e87f618c492..c3d0c2a831af1 100644 --- a/api_docs/kbn_deeplinks_analytics.devdocs.json +++ b/api_docs/kbn_deeplinks_analytics.devdocs.json @@ -30,7 +30,7 @@ "label": "AppId", "description": [], "signature": [ - "\"graph\" | \"dashboards\" | \"canvas\" | \"discover\" | \"maps\" | \"visualize\"" + "\"graph\" | \"canvas\" | \"dashboards\" | \"discover\" | \"maps\" | \"visualize\"" ], "path": "packages/deeplinks/analytics/deep_links.ts", "deprecated": false, @@ -75,7 +75,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"graph\" | \"dashboards\" | \"canvas\" | \"discover\" | \"maps\" | \"visualize\"" + "\"graph\" | \"canvas\" | \"dashboards\" | \"discover\" | \"maps\" | \"visualize\"" ], "path": "packages/deeplinks/analytics/deep_links.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 7f6f7dba3f7e9..e0899fcee40b3 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-01 +date: 2024-10-02 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 206189e105f8b..ba9d5ca04ac03 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-01 +date: 2024-10-02 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 8ceab799c19be..0e07b92baa15f 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-01 +date: 2024-10-02 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 af3c80c29f21f..dac6e0f4a5d82 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-01 +date: 2024-10-02 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 ea572390f3362..f33413fd42725 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.devdocs.json b/api_docs/kbn_deeplinks_observability.devdocs.json index 2a82d0cbccbf1..7c0c1af2b6682 100644 --- a/api_docs/kbn_deeplinks_observability.devdocs.json +++ b/api_docs/kbn_deeplinks_observability.devdocs.json @@ -1186,7 +1186,7 @@ "label": "SmartFieldGridColumnOptions", "description": [], "signature": [ - "{ type: \"smart-field\"; smartField: \"resource\" | \"content\"; width?: number | undefined; }" + "{ type: \"smart-field\"; smartField: \"content\" | \"resource\"; width?: number | undefined; }" ], "path": "packages/deeplinks/observability/locators/logs_explorer.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 4f2af16db8f67..52398d0d45bc0 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-01 +date: 2024-10-02 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 e50d3157080ba..af0f305faebfd 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.devdocs.json b/api_docs/kbn_deeplinks_security.devdocs.json index b1e26ac98f9d7..b61adf48389b5 100644 --- a/api_docs/kbn_deeplinks_security.devdocs.json +++ b/api_docs/kbn_deeplinks_security.devdocs.json @@ -58,7 +58,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"securitySolutionUI:notes-management\"" + "\"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:notes\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\"" ], "path": "packages/deeplinks/security/index.ts", "deprecated": false, @@ -73,7 +73,7 @@ "label": "LinkId", "description": [], "signature": [ - "\"\" | \"cases\" | \"alerts\" | \"rules\" | \"policy\" | \"overview\" | \"dashboards\" | \"kubernetes\" | \"cases_create\" | \"cases_configure\" | \"hosts\" | \"users\" | \"cloud_defend-policies\" | \"cloud_security_posture-dashboard\" | \"cloud_security_posture-findings\" | \"cloud_security_posture-benchmarks\" | \"network\" | \"data_quality\" | \"explore\" | \"assets\" | \"cloud_defend\" | \"administration\" | \"attack_discovery\" | \"blocklist\" | \"cloud_security_posture-rules\" | \"detections\" | \"detection_response\" | \"endpoints\" | \"event_filters\" | \"exceptions\" | \"host_isolation_exceptions\" | \"hosts-all\" | \"hosts-anomalies\" | \"hosts-risk\" | \"hosts-events\" | \"hosts-sessions\" | \"hosts-uncommon_processes\" | \"investigations\" | \"get_started\" | \"machine_learning-landing\" | \"network-anomalies\" | \"network-dns\" | \"network-events\" | \"network-flows\" | \"network-http\" | \"network-tls\" | \"response_actions_history\" | \"rules-add\" | \"rules-create\" | \"rules-landing\" | \"threat_intelligence\" | \"timelines\" | \"timelines-templates\" | \"trusted_apps\" | \"users-all\" | \"users-anomalies\" | \"users-authentications\" | \"users-events\" | \"users-risk\" | \"entity_analytics\" | \"entity_analytics-management\" | \"entity_analytics-asset-classification\" | \"coverage-overview\" | \"notes-management\"" + "\"\" | \"cases\" | \"alerts\" | \"rules\" | \"policy\" | \"overview\" | \"dashboards\" | \"kubernetes\" | \"cases_create\" | \"cases_configure\" | \"hosts\" | \"users\" | \"cloud_defend-policies\" | \"cloud_security_posture-dashboard\" | \"cloud_security_posture-findings\" | \"cloud_security_posture-benchmarks\" | \"network\" | \"data_quality\" | \"explore\" | \"assets\" | \"cloud_defend\" | \"notes\" | \"administration\" | \"attack_discovery\" | \"blocklist\" | \"cloud_security_posture-rules\" | \"detections\" | \"detection_response\" | \"endpoints\" | \"event_filters\" | \"exceptions\" | \"host_isolation_exceptions\" | \"hosts-all\" | \"hosts-anomalies\" | \"hosts-risk\" | \"hosts-events\" | \"hosts-sessions\" | \"hosts-uncommon_processes\" | \"investigations\" | \"get_started\" | \"machine_learning-landing\" | \"network-anomalies\" | \"network-dns\" | \"network-events\" | \"network-flows\" | \"network-http\" | \"network-tls\" | \"response_actions_history\" | \"rules-add\" | \"rules-create\" | \"rules-landing\" | \"threat_intelligence\" | \"timelines\" | \"timelines-templates\" | \"trusted_apps\" | \"users-all\" | \"users-anomalies\" | \"users-authentications\" | \"users-events\" | \"users-risk\" | \"entity_analytics\" | \"entity_analytics-management\" | \"entity_analytics-asset-classification\" | \"coverage-overview\"" ], "path": "packages/deeplinks/security/index.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 965ef3bcdc279..e8a9385b227d9 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-01 +date: 2024-10-02 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 91c86e4067133..f87cdda90e1e8 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-01 +date: 2024-10-02 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 991063cb1c9ea..41b8f4f5390cf 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-01 +date: 2024-10-02 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 0916876f1a1c3..4a0e26e18e1da 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-01 +date: 2024-10-02 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 3b513aa74dc05..4bf7fe24204d5 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-01 +date: 2024-10-02 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 ba2c1c9b29333..6dc8c17d6509c 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-01 +date: 2024-10-02 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 29e4317828f86..5e7cf0336d211 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-01 +date: 2024-10-02 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 81b74a73d4373..d21d789644b39 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-01 +date: 2024-10-02 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 2d8cd04e30ed5..1762ba89ca4b7 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-01 +date: 2024-10-02 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 147ce18d35a25..a0cb38871746d 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.devdocs.json b/api_docs/kbn_discover_utils.devdocs.json index 2d3b734d648e2..52022cb6da268 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -1954,7 +1954,7 @@ "signature": [ "({ logLevel, fallback, \"data-test-subj\": dataTestSubj, ...badgeProps }: Omit<", "EuiBadgeProps", - ", \"color\" | \"children\"> & { logLevel: {}; fallback?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined; }) => JSX.Element" + ", \"color\" | \"children\"> & { logLevel: {}; fallback?: React.ReactElement<any, string | React.JSXElementConstructor<any>> | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-discover-utils/src/data_types/logs/components/log_level_badge.tsx", "deprecated": false, @@ -2908,7 +2908,7 @@ "label": "tooltipContent", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", "deprecated": false, @@ -3250,14 +3250,14 @@ { "parentPluginId": "@kbn/discover-utils", "id": "def-common.RowControlComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -3271,7 +3271,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 0f5d0f043ea52..3ebf2c240bb93 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-01 +date: 2024-10-02 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 521545ee89718..8cb3ecdcb52da 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-01 +date: 2024-10-02 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 e3eae99b96058..df9a5d1442ab5 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_dom_drag_drop.devdocs.json index 4112bf83a67b0..50a5e45690567 100644 --- a/api_docs/kbn_dom_drag_drop.devdocs.json +++ b/api_docs/kbn_dom_drag_drop.devdocs.json @@ -31,7 +31,7 @@ "signature": [ "({ value, children }: ", "ProviderProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-dom-drag-drop/src/providers/providers.tsx", "deprecated": false, @@ -68,7 +68,7 @@ "\nDraggable component" ], "signature": [ - "({ reorderableGroup, ...props }: DraggableProps) => JSX.Element" + "({ reorderableGroup, ...props }: DraggableProps) => React.JSX.Element" ], "path": "packages/kbn-dom-drag-drop/src/draggable.tsx", "deprecated": false, @@ -105,7 +105,7 @@ "\nThis prevents the in-place droppable styles (under children) and allows to rather show an overlay with droppable styles (on top of children)" ], "signature": [ - "({ isVisible, children, overlayProps, className, ...otherProps }: React.PropsWithChildren<React.PropsWithChildren<", + "({ isVisible, children, overlayProps, className, ...otherProps }: React.PropsWithChildren<", { "pluginId": "@kbn/dom-drag-drop", "scope": "common", @@ -113,7 +113,7 @@ "section": "def-common.DropOverlayWrapperProps", "text": "DropOverlayWrapperProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-dom-drag-drop/src/drop_overlay_wrapper.tsx", "deprecated": false, @@ -127,7 +127,7 @@ "label": "{\n isVisible,\n children,\n overlayProps,\n className,\n ...otherProps\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/dom-drag-drop", "scope": "common", @@ -135,7 +135,7 @@ "section": "def-common.DropOverlayWrapperProps", "text": "DropOverlayWrapperProps" }, - ">>" + ">" ], "path": "packages/kbn-dom-drag-drop/src/drop_overlay_wrapper.tsx", "deprecated": false, @@ -166,7 +166,7 @@ "section": "def-common.DroppableProps", "text": "DroppableProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-dom-drag-drop/src/droppable.tsx", "deprecated": false, @@ -205,7 +205,7 @@ "label": "ReorderProvider", "description": [], "signature": [ - "({\n children,\n className,\n dataTestSubj = DEFAULT_DATA_TEST_SUBJ,\n}: { children: React.ReactNode; className?: string | undefined; dataTestSubj?: string | undefined; }) => JSX.Element" + "({\n children,\n className,\n dataTestSubj = DEFAULT_DATA_TEST_SUBJ,\n}: { children: React.ReactNode; className?: string | undefined; dataTestSubj?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-dom-drag-drop/src/providers/reorder_provider.tsx", "deprecated": false, @@ -230,7 +230,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-dom-drag-drop/src/providers/reorder_provider.tsx", "deprecated": false, @@ -288,7 +288,7 @@ "section": "def-common.DragContextState", "text": "DragContextState" }, - "> | undefined; }) => JSX.Element" + "> | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-dom-drag-drop/src/providers/providers.tsx", "deprecated": false, @@ -313,7 +313,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-dom-drag-drop/src/providers/providers.tsx", "deprecated": false, diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 81d89982c57f6..af4e6b3bea640 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ebt_tools.devdocs.json index a7441d35b485e..005175472345e 100644 --- a/api_docs/kbn_ebt_tools.devdocs.json +++ b/api_docs/kbn_ebt_tools.devdocs.json @@ -44,7 +44,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 10996d3869e8e..2832b494f43f9 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ecs_data_quality_dashboard.devdocs.json index a74c5506b1f6a..b70583710b651 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.devdocs.json +++ b/api_docs/kbn_ecs_data_quality_dashboard.devdocs.json @@ -63,7 +63,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 42e633b1bf3cd..bbd9582686ec6 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_elastic_agent_utils.devdocs.json index 23de678c645bc..2be1fc1f5a55e 100644 --- a/api_docs/kbn_elastic_agent_utils.devdocs.json +++ b/api_docs/kbn_elastic_agent_utils.devdocs.json @@ -479,7 +479,7 @@ "label": "AgentName", "description": [], "signature": [ - "\"java\" | \"opentelemetry\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"ruby\" | \"rum-js\" | \"android/java\" | \"otlp\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/java\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\" | \"opentelemetry/webjs\" | \"otlp/cpp\" | \"otlp/dotnet\" | \"otlp/erlang\" | \"otlp/go\" | \"otlp/java\" | \"otlp/nodejs\" | \"otlp/php\" | \"otlp/python\" | \"otlp/ruby\" | \"otlp/rust\" | \"otlp/swift\" | \"otlp/android\" | \"otlp/webjs\" | \"ios/swift\"" + "\"java\" | \"ruby\" | \"opentelemetry\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"rum-js\" | \"android/java\" | \"otlp\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/java\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\" | \"opentelemetry/android\" | \"opentelemetry/webjs\" | \"otlp/cpp\" | \"otlp/dotnet\" | \"otlp/erlang\" | \"otlp/go\" | \"otlp/java\" | \"otlp/nodejs\" | \"otlp/php\" | \"otlp/python\" | \"otlp/ruby\" | \"otlp/rust\" | \"otlp/swift\" | \"otlp/android\" | \"otlp/webjs\" | \"ios/swift\"" ], "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", "deprecated": false, @@ -518,7 +518,7 @@ "\nWe cannot mark these arrays as const and derive their type\nbecause we need to be able to assign them as mutable entities for ES queries." ], "signature": [ - "\"java\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"ruby\" | \"rum-js\" | \"android/java\"" + "\"java\" | \"ruby\" | \"dotnet\" | \"go\" | \"iOS/swift\" | \"js-base\" | \"nodejs\" | \"php\" | \"python\" | \"rum-js\" | \"android/java\"" ], "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 9339a96ad0078..7a4d965624e48 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_elastic_assistant.devdocs.json index 9c1d79634bee5..fd8e2a2d26089 100644 --- a/api_docs/kbn_elastic_assistant.devdocs.json +++ b/api_docs/kbn_elastic_assistant.devdocs.json @@ -73,7 +73,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -92,7 +92,7 @@ "signature": [ "({ className, size }: ", "AssistantAvatarProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_avatar/assistant_avatar.tsx", "deprecated": false, @@ -144,7 +144,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -159,9 +159,9 @@ "label": "AssistantProvider", "description": [], "signature": [ - "({ actionTypeRegistry, alertsIndexPattern, assistantAvailability, assistantTelemetry, augmentMessageCodeBlocks, docLinks, basePath, basePromptContexts, children, getComments, http, baseConversations, navigateToApp, nameSpace, title, toasts, currentAppId, }: React.PropsWithChildren<", + "({ actionTypeRegistry, alertsIndexPattern, assistantAvailability, assistantTelemetry, augmentMessageCodeBlocks, docLinks, basePath, basePromptContexts, children, getComments, http, baseConversations, navigateToApp, nameSpace, title, toasts, currentAppId, }: ", "AssistantProviderProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx", "deprecated": false, @@ -170,14 +170,12 @@ { "parentPluginId": "@kbn/elastic-assistant", "id": "def-public.AssistantProvider.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n actionTypeRegistry,\n alertsIndexPattern,\n assistantAvailability,\n assistantTelemetry,\n augmentMessageCodeBlocks,\n docLinks,\n basePath,\n basePromptContexts = [],\n children,\n getComments,\n http,\n baseConversations,\n navigateToApp,\n nameSpace = DEFAULT_ASSISTANT_NAMESPACE,\n title = DEFAULT_ASSISTANT_TITLE,\n toasts,\n currentAppId,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "AssistantProviderProps", - ">" + "AssistantProviderProps" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx", "deprecated": false, @@ -318,7 +316,7 @@ "section": "def-public.HttpSetup", "text": "HttpSetup" }, - ", prompts: { create?: { name: string; content: string; promptType: \"system\" | \"quick\"; consumer?: string | undefined; color?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; update?: { id: string; consumer?: string | undefined; color?: string | undefined; content?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }, toasts?: ", + ", prompts: { create?: { name: string; content: string; promptType: \"system\" | \"quick\"; consumer?: string | undefined; color?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; update?: { id: string; consumer?: string | undefined; content?: string | undefined; color?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }, toasts?: ", { "pluginId": "@kbn/core-notifications-browser", "scope": "public", @@ -361,7 +359,7 @@ "label": "prompts", "description": [], "signature": [ - "{ create?: { name: string; content: string; promptType: \"system\" | \"quick\"; consumer?: string | undefined; color?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; update?: { id: string; consumer?: string | undefined; color?: string | undefined; content?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }" + "{ create?: { name: string; content: string; promptType: \"system\" | \"quick\"; consumer?: string | undefined; color?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; update?: { id: string; consumer?: string | undefined; content?: string | undefined; color?: string | undefined; categories?: string[] | undefined; isDefault?: boolean | undefined; isNewConversationDefault?: boolean | undefined; }[] | undefined; delete?: { ids?: string[] | undefined; query?: string | undefined; } | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.ts", "deprecated": false, @@ -414,14 +412,14 @@ { "parentPluginId": "@kbn/elastic-assistant", "id": "def-public.ConnectorSelectorInline.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -435,7 +433,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -797,7 +795,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -833,7 +831,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -848,7 +846,7 @@ "label": "UpgradeButtons", "description": [], "signature": [ - "React.NamedExoticComponent<{ basePath: string; }> & { readonly type: ({ basePath }: { basePath: string; }) => JSX.Element; }" + "React.NamedExoticComponent<{ basePath: string; }> & { readonly type: ({ basePath }: { basePath: string; }) => React.JSX.Element; }" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/upgrade/upgrade_buttons.tsx", "deprecated": false, @@ -865,7 +863,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2006,7 +2004,7 @@ "label": "button", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts", "deprecated": false, @@ -2458,7 +2456,7 @@ "\nThe Elastic AI Assistant will display this tooltip when the user hovers over the context pill" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_context/types.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 67ebd23beb45d..b2f0b7ccba926 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index 48301e65f7fd4..bffb3a21b4f4b 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -1244,7 +1244,7 @@ "label": "ChatCompleteProps", "description": [], "signature": [ - "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" + "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1259,7 +1259,7 @@ "label": "ChatCompleteRequestBody", "description": [], "signature": [ - "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" + "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1274,7 +1274,7 @@ "label": "ChatCompleteRequestBodyInput", "description": [], "signature": [ - "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" + "{ connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1291,7 +1291,7 @@ "\nAI assistant message." ], "signature": [ - "{ role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }" + "{ role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -1372,7 +1372,7 @@ "\nThe conversation confidence." ], "signature": [ - "\"medium\" | \"low\" | \"high\"" + "\"medium\" | \"high\" | \"low\"" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -1387,7 +1387,7 @@ "label": "ConversationConfidenceEnum", "description": [], "signature": [ - "{ medium: \"medium\"; low: \"low\"; high: \"high\"; }" + "{ medium: \"medium\"; high: \"high\"; low: \"low\"; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, @@ -4175,7 +4175,7 @@ "label": "ChatCompleteProps", "description": [], "signature": [ - "Zod.ZodObject<{ conversationId: Zod.ZodOptional<Zod.ZodString>; promptId: Zod.ZodOptional<Zod.ZodString>; isStream: Zod.ZodOptional<Zod.ZodBoolean>; responseLanguage: Zod.ZodOptional<Zod.ZodString>; langSmithProject: Zod.ZodOptional<Zod.ZodString>; langSmithApiKey: Zod.ZodOptional<Zod.ZodString>; connectorId: Zod.ZodString; model: Zod.ZodOptional<Zod.ZodString>; persist: Zod.ZodBoolean; messages: Zod.ZodArray<Zod.ZodObject<{ content: Zod.ZodOptional<Zod.ZodString>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodUnknown, Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\">, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" + "Zod.ZodObject<{ conversationId: Zod.ZodOptional<Zod.ZodString>; promptId: Zod.ZodOptional<Zod.ZodString>; isStream: Zod.ZodOptional<Zod.ZodBoolean>; responseLanguage: Zod.ZodOptional<Zod.ZodString>; langSmithProject: Zod.ZodOptional<Zod.ZodString>; langSmithApiKey: Zod.ZodOptional<Zod.ZodString>; connectorId: Zod.ZodString; model: Zod.ZodOptional<Zod.ZodString>; persist: Zod.ZodBoolean; messages: Zod.ZodArray<Zod.ZodObject<{ content: Zod.ZodOptional<Zod.ZodString>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodUnknown, Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\">, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -4190,7 +4190,7 @@ "label": "ChatCompleteRequestBody", "description": [], "signature": [ - "Zod.ZodObject<{ conversationId: Zod.ZodOptional<Zod.ZodString>; promptId: Zod.ZodOptional<Zod.ZodString>; isStream: Zod.ZodOptional<Zod.ZodBoolean>; responseLanguage: Zod.ZodOptional<Zod.ZodString>; langSmithProject: Zod.ZodOptional<Zod.ZodString>; langSmithApiKey: Zod.ZodOptional<Zod.ZodString>; connectorId: Zod.ZodString; model: Zod.ZodOptional<Zod.ZodString>; persist: Zod.ZodBoolean; messages: Zod.ZodArray<Zod.ZodObject<{ content: Zod.ZodOptional<Zod.ZodString>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodUnknown, Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\">, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" + "Zod.ZodObject<{ conversationId: Zod.ZodOptional<Zod.ZodString>; promptId: Zod.ZodOptional<Zod.ZodString>; isStream: Zod.ZodOptional<Zod.ZodBoolean>; responseLanguage: Zod.ZodOptional<Zod.ZodString>; langSmithProject: Zod.ZodOptional<Zod.ZodString>; langSmithApiKey: Zod.ZodOptional<Zod.ZodString>; connectorId: Zod.ZodString; model: Zod.ZodOptional<Zod.ZodString>; persist: Zod.ZodBoolean; messages: Zod.ZodArray<Zod.ZodObject<{ content: Zod.ZodOptional<Zod.ZodString>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodUnknown, Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\">, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }, { connectorId: string; persist: boolean; messages: { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }[]; conversationId?: string | undefined; model?: string | undefined; langSmithProject?: string | undefined; langSmithApiKey?: string | undefined; promptId?: string | undefined; isStream?: boolean | undefined; responseLanguage?: string | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -4205,7 +4205,7 @@ "label": "ChatMessage", "description": [], "signature": [ - "Zod.ZodObject<{ content: Zod.ZodOptional<Zod.ZodString>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodUnknown, Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\">, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; content?: string | undefined; fields_to_anonymize?: string[] | undefined; }>" + "Zod.ZodObject<{ content: Zod.ZodOptional<Zod.ZodString>; role: Zod.ZodEnum<[\"system\", \"user\", \"assistant\"]>; data: Zod.ZodOptional<Zod.ZodObject<{}, \"strip\", Zod.ZodUnknown, Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\">, Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\">>>; fields_to_anonymize: Zod.ZodOptional<Zod.ZodArray<Zod.ZodString, \"many\">>; }, \"strip\", Zod.ZodTypeAny, { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }, { role: \"user\" | \"system\" | \"assistant\"; content?: string | undefined; data?: Zod.objectInputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; fields_to_anonymize?: string[] | undefined; }>" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/chat/post_chat_complete_route.gen.ts", "deprecated": false, @@ -4295,7 +4295,7 @@ "label": "ConversationConfidenceEnum", "description": [], "signature": [ - "{ medium: \"medium\"; low: \"low\"; high: \"high\"; }" + "{ medium: \"medium\"; high: \"high\"; low: \"low\"; }" ], "path": "x-pack/packages/kbn-elastic-assistant-common/impl/schemas/conversations/common_attributes.gen.ts", "deprecated": false, diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 642fd2f06b012..d5e009158aa35 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-01 +date: 2024-10-02 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 0677fb33a8f04..fe20b6e440531 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-01 +date: 2024-10-02 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 cdad5b2fec3bc..e9096c25f7c0e 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-01 +date: 2024-10-02 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 260857abbd005..2187478ca31ae 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-01 +date: 2024-10-02 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 b3aab2ccb6655..424c2a9a4365d 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-01 +date: 2024-10-02 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 95ab60d012b3c..966064f0818e9 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-01 +date: 2024-10-02 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 ecb40ec85497b..03008b177be16 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-01 +date: 2024-10-02 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 b5468890cd5d3..fffde06ae6cfb 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-01 +date: 2024-10-02 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 37d2ef2c0719a..6a019d50fd9ac 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.devdocs.json b/api_docs/kbn_esql_editor.devdocs.json index 4e3942cddc17c..05d3150878aa9 100644 --- a/api_docs/kbn_esql_editor.devdocs.json +++ b/api_docs/kbn_esql_editor.devdocs.json @@ -36,7 +36,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index b44f95809d84b..1337217fb680b 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-01 +date: 2024-10-02 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 90941e5d63252..f288fdb246cac 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-01 +date: 2024-10-02 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 82ab9f9a68fe4..8ff91e34c7104 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_event_annotation_common.devdocs.json index 7764cbf7c83ea..814d911efbf79 100644 --- a/api_docs/kbn_event_annotation_common.devdocs.json +++ b/api_docs/kbn_event_annotation_common.devdocs.json @@ -521,7 +521,7 @@ "label": "AvailableAnnotationIcon", "description": [], "signature": [ - "\"alert\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"circle\" | \"triangle\"" + "\"alert\" | \"circle\" | \"tag\" | \"asterisk\" | \"bell\" | \"bolt\" | \"bug\" | \"editorComment\" | \"flag\" | \"heart\" | \"mapMarker\" | \"pinFilled\" | \"starEmpty\" | \"starFilled\" | \"triangle\"" ], "path": "packages/kbn-event-annotation-common/types.ts", "deprecated": false, diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 7ed16b15b54c4..1409d60f2c1ce 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_event_annotation_components.devdocs.json index aa0a62e976a09..c8bbcbb29c55c 100644 --- a/api_docs/kbn_event_annotation_components.devdocs.json +++ b/api_docs/kbn_event_annotation_components.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "(props: ", "Props", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-event-annotation-components/components/annotation_editor_controls/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 03b880b6aa9f9..fc490df33383b 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_expandable_flyout.devdocs.json index 56671dc282906..8224ebb0e15ac 100644 --- a/api_docs/kbn_expandable_flyout.devdocs.json +++ b/api_docs/kbn_expandable_flyout.devdocs.json @@ -13,7 +13,7 @@ "\nExpandable flyout UI React component.\nDisplays 3 sections (right, left, preview) depending on the panels in the context.\n\nThe behavior expects that the left and preview sections should only be displayed is a right section\nis already rendered." ], "signature": [ - "{ ({ ...props }: React.PropsWithChildren<", + "{ ({ ...props }: ", { "pluginId": "@kbn/expandable-flyout", "scope": "public", @@ -21,7 +21,7 @@ "section": "def-public.ExpandableFlyoutProps", "text": "ExpandableFlyoutProps" }, - ">): JSX.Element | null; displayName: string | undefined; }" + "): React.JSX.Element | null; displayName: string | undefined; }" ], "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, @@ -30,20 +30,18 @@ { "parentPluginId": "@kbn/expandable-flyout", "id": "def-public.ExpandableFlyout.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ ...props }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/expandable-flyout", "scope": "public", "docId": "kibKbnExpandableFlyoutPluginApi", "section": "def-public.ExpandableFlyoutProps", "text": "ExpandableFlyoutProps" - }, - ">" + } ], "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, @@ -64,7 +62,7 @@ "\nWrap your plugin with this context for the ExpandableFlyout React component." ], "signature": [ - "({ children, urlKey, }: React.PropsWithChildren<React.PropsWithChildren<ExpandableFlyoutProviderProps>>) => JSX.Element" + "({ children, urlKey, }: React.PropsWithChildren<ExpandableFlyoutProviderProps>) => React.JSX.Element" ], "path": "packages/kbn-expandable-flyout/src/provider.tsx", "deprecated": false, @@ -78,7 +76,7 @@ "label": "{\n children,\n urlKey,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<ExpandableFlyoutProviderProps>>" + "React.PropsWithChildren<ExpandableFlyoutProviderProps>" ], "path": "packages/kbn-expandable-flyout/src/provider.tsx", "deprecated": false, @@ -151,7 +149,7 @@ "signature": [ "<Props extends {}>(Component: React.ComponentType<Props>, expandableProviderProps?: ", "ExpandableFlyoutContextProviderProps", - " | undefined) => (props: Props) => JSX.Element" + " | undefined) => (props: Props) => React.JSX.Element" ], "path": "packages/kbn-expandable-flyout/src/with_provider.tsx", "deprecated": false, @@ -636,7 +634,7 @@ "\nCallback function to let application's code the flyout is closed" ], "signature": [ - "((event: MouseEvent | KeyboardEvent | TouchEvent) => void) | undefined" + "((event: KeyboardEvent | MouseEvent | TouchEvent) => void) | undefined" ], "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index d43ee875371cd..68378b6ee06e6 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-01 +date: 2024-10-02 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 6297654e49f3d..56d8c297118f2 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.devdocs.json b/api_docs/kbn_field_utils.devdocs.json index ed7709116eb80..dbf48df734d64 100644 --- a/api_docs/kbn_field_utils.devdocs.json +++ b/api_docs/kbn_field_utils.devdocs.json @@ -85,7 +85,7 @@ "label": "FieldDescription", "description": [], "signature": [ - "({ fieldsMetadataService, ...props }: React.PropsWithChildren<", + "({ fieldsMetadataService, ...props }: ", { "pluginId": "@kbn/field-utils", "scope": "common", @@ -93,7 +93,7 @@ "section": "def-common.FieldDescriptionProps", "text": "FieldDescriptionProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-field-utils/src/components/field_description/field_description.tsx", "deprecated": false, @@ -102,20 +102,18 @@ { "parentPluginId": "@kbn/field-utils", "id": "def-common.FieldDescription.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n fieldsMetadataService,\n ...props\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/field-utils", "scope": "common", "docId": "kibKbnFieldUtilsPluginApi", "section": "def-common.FieldDescriptionProps", "text": "FieldDescriptionProps" - }, - ">" + } ], "path": "packages/kbn-field-utils/src/components/field_description/field_description.tsx", "deprecated": false, @@ -158,7 +156,7 @@ "section": "def-common.FieldIconProps", "text": "FieldIconProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-field-utils/src/components/field_icon/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index ccc8d29b7a048..62fec5954dba8 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-01 +date: 2024-10-02 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 a3dfd34cfe7f8..6014d2d64f2e0 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-01 +date: 2024-10-02 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 d54dbfec4d997..760fe5eaacfc9 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-01 +date: 2024-10-02 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 4443520e21885..7bcbf12f9f9b5 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-01 +date: 2024-10-02 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 c8165efdbc07f..491dcd91193a6 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-01 +date: 2024-10-02 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 98aa56d6288f2..e1980f7a4f55c 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-01 +date: 2024-10-02 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 8ae2b60a76b2a..5c8ac12174a2c 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-01 +date: 2024-10-02 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 3ba302aac67dd..7d89c774a8526 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.devdocs.json b/api_docs/kbn_grid_layout.devdocs.json index db3bfcc3e8db1..ee536685622ef 100644 --- a/api_docs/kbn_grid_layout.devdocs.json +++ b/api_docs/kbn_grid_layout.devdocs.json @@ -27,7 +27,7 @@ "section": "def-public.GridSettings", "text": "GridSettings" }, - "; }; renderPanelContents: (panelId: string) => React.ReactNode; }) => JSX.Element" + "; }; renderPanelContents: (panelId: string) => React.ReactNode; }) => React.JSX.Element" ], "path": "packages/kbn-grid-layout/grid/grid_layout.tsx", "deprecated": false, diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 6778905579cdb..159d9f82fb15d 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-01 +date: 2024-10-02 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 49e77ae481dc4..9c2a14c026f9b 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-01 +date: 2024-10-02 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 2df84955942c6..0167d8868d17e 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-01 +date: 2024-10-02 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 7b0a02caa876b..72461484e0e28 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.devdocs.json b/api_docs/kbn_hapi_mocks.devdocs.json index 75d572d502e8d..3892e25965688 100644 --- a/api_docs/kbn_hapi_mocks.devdocs.json +++ b/api_docs/kbn_hapi_mocks.devdocs.json @@ -52,8 +52,13 @@ }, "<", "Request", - ">) => ", - "Request" + "<", + "ReqRefDefaults", + ">>) => ", + "Request", + "<", + "ReqRefDefaults", + ">" ], "path": "packages/kbn-hapi-mocks/index.ts", "deprecated": false, @@ -88,7 +93,11 @@ }, "<", "RequestAuth", - "> | undefined; events?: ", + "<", + "UserCredentials", + ", ", + "AppCredentials", + ", Record<string, unknown>, Record<string, unknown>>> | undefined; events?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -106,9 +115,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<string>> | undefined; readonly info?: ", + "<Record<string, any>> | undefined; readonly info?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -128,9 +135,7 @@ }, "<", "RequestLog", - "> | undefined; readonly method?: ", - "Util", - ".HTTP_METHODS_PARTIAL_LOWERCASE | undefined; readonly mime?: string | undefined; readonly orig?: ", + "> | undefined; readonly method?: \"source\" | \"get\" | \"delete\" | \"options\" | \"search\" | \"link\" | \"head\" | \"post\" | \"put\" | \"patch\" | \"purge\" | \"unlink\" | \"copy\" | \"move\" | \"merge\" | \"subscribe\" | \"trace\" | \"lock\" | \"unsubscribe\" | \"report\" | \"acl\" | \"bind\" | \"checkout\" | \"connect\" | \"m-search\" | \"mkactivity\" | \"mkcalendar\" | \"mkcol\" | \"notify\" | \"propfind\" | \"proppatch\" | \"rebind\" | \"unbind\" | \"unlock\" | undefined; readonly mime?: string | undefined; readonly orig?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -148,9 +153,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; readonly paramsArray?: ", + "<Record<string, any>> | undefined; readonly paramsArray?: string | ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -194,9 +197,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; response?: ", + "<Record<string, any>> | undefined; response?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -224,9 +225,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; readonly query?: ", + "<Record<string, any>> | undefined; readonly query?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -260,7 +259,9 @@ }, "<", "RequestRoute", - "> | undefined; server?: ", + "<", + "ReqRefDefaults", + ">> | undefined; readonly server?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -270,7 +271,9 @@ }, "<", "Server", - "> | undefined; readonly state?: ", + "<", + "ServerApplicationState", + ">> | undefined; readonly state?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -278,9 +281,7 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<", - "Util", - ".Dictionary<any>> | undefined; readonly url?: ", + "<Record<string, any>> | undefined; readonly url?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -334,9 +335,9 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<(method: ", - "Util", - ".HTTP_METHODS_PARTIAL) => void> | undefined; setUrl?: ", + "<(method: \"source\" | \"get\" | \"delete\" | \"options\" | \"search\" | \"link\" | \"head\" | \"post\" | \"put\" | \"patch\" | \"purge\" | \"unlink\" | \"copy\" | \"move\" | \"merge\" | \"subscribe\" | \"trace\" | \"lock\" | \"unsubscribe\" | \"report\" | ", + "HTTP_METHODS", + " | \"acl\" | \"bind\" | \"checkout\" | \"connect\" | \"m-search\" | \"mkactivity\" | \"mkcalendar\" | \"mkcol\" | \"notify\" | \"propfind\" | \"proppatch\" | \"rebind\" | \"unbind\" | \"unlock\") => void> | undefined; setUrl?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -363,10 +364,12 @@ "text": "DeepPartialObject" }, "<(events: ", - "Event", - " | ", - "Event", - "[]) => void> | undefined; registerPodium?: ", + "Podium", + ".EventOptions<string> | ", + "Podium", + ".EventOptions<string>[], options?: ", + "Podium", + ".EventSettings | undefined) => void> | undefined; emit?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -374,11 +377,9 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<(podiums: ", - "node_modules/@hapi/podium/lib/index", - " | ", - "node_modules/@hapi/podium/lib/index", - "[]) => void> | undefined; emit?: ", + "<(criteria: ", + "Podium", + ".EmitCriteria<string>, data?: any) => void> | undefined; gauge?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -386,9 +387,9 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<(criteria: string | ", - "EmitCriteria", - ", data?: any) => Promise<void>> | undefined; on?: ", + "<(<T = unknown>(criteria: ", + "Podium", + ".EmitCriteria<string>, data?: any) => Promise<PromiseSettledResult<T>[]>)> | undefined; on?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -396,23 +397,39 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<{ <TArgs extends any[] = unknown[], Tcontext extends object = ", + "<(<TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".Criteria<string>, listener: ", + "EventListener", + "<undefined, TArgs, Tcontext>, context?: Tcontext | undefined) => ", "Request", - "; <TArgs extends any[] = any[], Tcontext extends object = ", + "<", + "ReqRefDefaults", + ">)> | undefined; addListener?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.DeepPartialObject", + "text": "DeepPartialObject" + }, + "<(<TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".Criteria<string>, listener: ", + "EventListener", + "<undefined, TArgs, Tcontext>, context?: Tcontext | undefined) => ", "Request", - "; }> | undefined; addListener?: ", + "<", + "ReqRefDefaults", + ">)> | undefined; once?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -422,21 +439,23 @@ }, "<{ <TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", - "Request", - "; <TArgs extends any[] = any[], Tcontext extends object = ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".OnceCriteria<string>, listener: ", + "EventListener", + "<undefined, TArgs, Tcontext>, context?: Tcontext | undefined): ", "Request", - ">(criteria: string | ", - "CriteriaObject", - ", listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">; <TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - "; }> | undefined; once?: ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".OnceCriteria<string>): Promise<TArgs>; }> | undefined; few?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -444,27 +463,27 @@ "section": "def-common.DeepPartialObject", "text": "DeepPartialObject" }, - "<{ <TArgs extends any[] = unknown[], Tcontext extends object = ", - "Request", - ">(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">, listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", - "Request", - "; <TArgs extends any[] = any[], Tcontext extends object = ", + "<(<TArgs extends any[] = unknown[], Tcontext extends object = ", "Request", - ">(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">, listener: ", - "Listener", - "<Tcontext, TArgs>, context?: Tcontext | undefined): ", + "<", + "ReqRefDefaults", + ">>(criteria: ", + "Podium", + ".FewCriteria<string>) => Promise<TArgs>)> | undefined; off?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.DeepPartialObject", + "text": "DeepPartialObject" + }, + "<(name: string, listener: ", + "Podium", + ".Listener<any, any[]>) => ", "Request", - "; <TArgs extends any[] = unknown[], Tcontext extends void = void>(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">): Promise<TArgs>; <TArgs extends any[] = any[], Tcontext extends void = void>(criteria: string | Omit<", - "CriteriaObject", - ", \"count\">): Promise<TArgs>; }> | undefined; removeListener?: ", + "<", + "ReqRefDefaults", + ">> | undefined; removeListener?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -473,10 +492,12 @@ "text": "DeepPartialObject" }, "<(name: string, listener: ", - "Listener", - "<any, any[]>) => ", + "Podium", + ".Listener<any, any[]>) => ", "Request", - "> | undefined; removeAllListeners?: ", + "<", + "ReqRefDefaults", + ">> | undefined; removeAllListeners?: ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -486,7 +507,9 @@ }, "<(name: string) => ", "Request", - "> | undefined; hasListeners?: ", + "<", + "ReqRefDefaults", + ">> | undefined; hasListeners?: ", { "pluginId": "@kbn/utility-types", "scope": "common", diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 61d4578c8df43..4a704fcad35ce 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-01 +date: 2024-10-02 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 803e195207c12..d668f389a1ba1 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_home_sample_data_card.devdocs.json index 9ba3c0ed776ac..a9fc95391b708 100644 --- a/api_docs/kbn_home_sample_data_card.devdocs.json +++ b/api_docs/kbn_home_sample_data_card.devdocs.json @@ -157,7 +157,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/home/sample_data_card/src/sample_data_card.tsx", "deprecated": false, @@ -198,7 +198,7 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", { "pluginId": "@kbn/home-sample-data-card", "scope": "common", @@ -206,7 +206,7 @@ "section": "def-common.KibanaDependencies", "text": "KibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/home/sample_data_card/src/services.tsx", "deprecated": false, @@ -220,7 +220,7 @@ "label": "{\n children,\n ...dependencies\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/home-sample-data-card", "scope": "common", @@ -228,7 +228,7 @@ "section": "def-common.KibanaDependencies", "text": "KibanaDependencies" }, - ">>" + ">" ], "path": "packages/home/sample_data_card/src/services.tsx", "deprecated": false, @@ -249,7 +249,7 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", { "pluginId": "@kbn/home-sample-data-card", "scope": "common", @@ -257,7 +257,7 @@ "section": "def-common.Services", "text": "Services" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/home/sample_data_card/src/services.tsx", "deprecated": false, @@ -271,7 +271,7 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/home-sample-data-card", "scope": "common", @@ -279,7 +279,7 @@ "section": "def-common.Services", "text": "Services" }, - ">>" + ">" ], "path": "packages/home/sample_data_card/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 4836506d39a4d..97a396e7165fb 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_home_sample_data_tab.devdocs.json index 2e24a72e96f46..fa3f53b37053f 100644 --- a/api_docs/kbn_home_sample_data_tab.devdocs.json +++ b/api_docs/kbn_home_sample_data_tab.devdocs.json @@ -29,7 +29,7 @@ "\nThe content for the Sample Data Tab in the `home` plugin." ], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/home/sample_data_tab/src/sample_data_tab.tsx", "deprecated": false, @@ -48,9 +48,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "SampleDataTabKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/home/sample_data_tab/src/services.tsx", "deprecated": false, @@ -64,9 +64,9 @@ "label": "{ children, ...dependencies }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "SampleDataTabKibanaDependencies", - ">>" + ">" ], "path": "packages/home/sample_data_tab/src/services.tsx", "deprecated": false, @@ -87,9 +87,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "SampleDataTabServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/home/sample_data_tab/src/services.tsx", "deprecated": false, @@ -103,9 +103,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "SampleDataTabServices", - ">>" + ">" ], "path": "packages/home/sample_data_tab/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index e9c8cb7ab2278..16c128f219065 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-01 +date: 2024-10-02 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 2533b80f1e732..befdacc081d9a 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.devdocs.json b/api_docs/kbn_i18n_react.devdocs.json index 89ec6ffe995e6..f15296d254072 100644 --- a/api_docs/kbn_i18n_react.devdocs.json +++ b/api_docs/kbn_i18n_react.devdocs.json @@ -29,7 +29,7 @@ "\nAdded for now while doing the i18n upgrade.\nTODO: remove in a separate PR and update the 200+ test files we have using this to simply\nuse the `I18nProvider` and the `IntlShape` instead of `InjectedIntl`." ], "signature": [ - "({ children, }: React.PropsWithChildren<React.PropsWithChildren<{ locale?: string | undefined; messages?: unknown; }>>) => JSX.Element" + "({ children, }: React.PropsWithChildren<{ locale?: string | undefined; messages?: unknown; }>) => React.JSX.Element" ], "path": "packages/kbn-i18n-react/src/compatiblity_layer.tsx", "deprecated": false, @@ -43,7 +43,7 @@ "label": "{\n children,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<{ locale?: string | undefined; messages?: unknown; }>>" + "React.PropsWithChildren<{ locale?: string | undefined; messages?: unknown; }>" ], "path": "packages/kbn-i18n-react/src/compatiblity_layer.tsx", "deprecated": false, @@ -74,14 +74,14 @@ { "parentPluginId": "@kbn/i18n-react", "id": "def-common.FormattedDate.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -95,7 +95,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -124,14 +124,14 @@ { "parentPluginId": "@kbn/i18n-react", "id": "def-common.FormattedNumber.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -145,7 +145,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -170,14 +170,14 @@ { "parentPluginId": "@kbn/i18n-react", "id": "def-common.FormattedPlural.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -191,7 +191,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -216,7 +216,7 @@ "section": "def-common.FormattedRelativeProps", "text": "FormattedRelativeProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-i18n-react/src/compatiblity_layer.tsx", "deprecated": false, @@ -267,14 +267,14 @@ { "parentPluginId": "@kbn/i18n-react", "id": "def-common.FormattedRelativeTime.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -288,7 +288,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -315,14 +315,14 @@ { "parentPluginId": "@kbn/i18n-react", "id": "def-common.FormattedTime.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -336,7 +336,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -353,7 +353,7 @@ "\nThe library uses the provider pattern to scope an i18n context to a tree\nof components. This component is used to setup the i18n context for a tree.\nIntlProvider should wrap react app's root component (inside each react render method)." ], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "packages/kbn-i18n-react/src/provider.tsx", "deprecated": false, @@ -610,11 +610,11 @@ "signature": [ "React.ComponentClass<", "Props", - "<Record<string, string | number | boolean | {} | Date | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | ", + "<Record<string, string | number | boolean | Date | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | ", "FormatXMLElementFn", "<React.ReactNode, React.ReactNode> | null | undefined>>, any> | React.FunctionComponent<", "Props", - "<Record<string, string | number | boolean | {} | Date | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | ", + "<Record<string, string | number | boolean | Date | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | ", "FormatXMLElementFn", "<React.ReactNode, React.ReactNode> | null | undefined>>>" ], diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index a1be22ef39755..536c9a66eefd7 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-01 +date: 2024-10-02 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 5c8de142e5ea8..aa034210af4bb 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-01 +date: 2024-10-02 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 346fe84c2a0d3..692858a05ed31 100644 --- a/api_docs/kbn_index_management_shared_types.devdocs.json +++ b/api_docs/kbn_index_management_shared_types.devdocs.json @@ -999,7 +999,7 @@ "label": "name", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/packages/index-management/index_management_shared_types/src/home_sections.ts", "deprecated": false, diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 707f869ebe87e..c759d431c8c76 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_inference_integration_flyout.devdocs.json index 1e148d80c696c..2ad03937be3cd 100644 --- a/api_docs/kbn_inference_integration_flyout.devdocs.json +++ b/api_docs/kbn_inference_integration_flyout.devdocs.json @@ -27,7 +27,7 @@ "label": "ElandPythonClient", "description": [], "signature": [ - "({ supportedNlpModels, nlpImportModel }: React.PropsWithChildren<{ supportedNlpModels: string; nlpImportModel: string; }>) => JSX.Element" + "({ supportedNlpModels, nlpImportModel }: { supportedNlpModels: string; nlpImportModel: string; }) => React.JSX.Element" ], "path": "x-pack/packages/ml/inference_integration_flyout/components/eland_python_client.tsx", "deprecated": false, @@ -36,12 +36,12 @@ { "parentPluginId": "@kbn/inference_integration_flyout", "id": "def-common.ElandPythonClient.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ supportedNlpModels, nlpImportModel }", "description": [], "signature": [ - "React.PropsWithChildren<{ supportedNlpModels: string; nlpImportModel: string; }>" + "{ supportedNlpModels: string; nlpImportModel: string; }" ], "path": "x-pack/packages/ml/inference_integration_flyout/components/eland_python_client.tsx", "deprecated": false, @@ -60,9 +60,9 @@ "label": "InferenceFlyoutWrapper", "description": [], "signature": [ - "({ onSaveInferenceEndpoint, onFlyoutClose, isInferenceFlyoutVisible, e5documentationUrl, elserv2documentationUrl, supportedNlpModels, nlpImportModel, errorCallout, trainedModels, isCreateInferenceApiLoading, onInferenceEndpointChange, inferenceEndpointError, setInferenceEndpointError, }: React.PropsWithChildren<", + "({ onSaveInferenceEndpoint, onFlyoutClose, isInferenceFlyoutVisible, e5documentationUrl, elserv2documentationUrl, supportedNlpModels, nlpImportModel, errorCallout, trainedModels, isCreateInferenceApiLoading, onInferenceEndpointChange, inferenceEndpointError, setInferenceEndpointError, }: ", "InferenceFlyoutProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/ml/inference_integration_flyout/components/inference_flyout_wrapper.tsx", "deprecated": false, @@ -71,14 +71,12 @@ { "parentPluginId": "@kbn/inference_integration_flyout", "id": "def-common.InferenceFlyoutWrapper.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n onSaveInferenceEndpoint,\n onFlyoutClose,\n isInferenceFlyoutVisible,\n e5documentationUrl = '',\n elserv2documentationUrl = '',\n supportedNlpModels = '',\n nlpImportModel = '',\n errorCallout,\n trainedModels = [],\n isCreateInferenceApiLoading,\n onInferenceEndpointChange,\n inferenceEndpointError = undefined,\n setInferenceEndpointError,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "InferenceFlyoutProps", - ">" + "InferenceFlyoutProps" ], "path": "x-pack/packages/ml/inference_integration_flyout/components/inference_flyout_wrapper.tsx", "deprecated": false, diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 4c89e81521072..d31f674f9b9d6 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-01 +date: 2024-10-02 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 fd720ed14ac54..3c80763128c77 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-01 +date: 2024-10-02 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 2c3a09d4b358c..8f12564a03651 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.devdocs.json b/api_docs/kbn_investigation_shared.devdocs.json index d4c9945d9e37f..7706d48836d91 100644 --- a/api_docs/kbn_investigation_shared.devdocs.json +++ b/api_docs/kbn_investigation_shared.devdocs.json @@ -75,7 +75,7 @@ "label": "CreateInvestigationNoteResponse", "description": [], "signature": [ - "{ id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }" + "{ id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create_note.ts", "deprecated": false, @@ -105,7 +105,7 @@ "label": "CreateInvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -195,7 +195,7 @@ "label": "FindInvestigationsResponse", "description": [], "signature": [ - "{ page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }[]; perPage: number; total: number; }" + "{ page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/find.ts", "deprecated": false, @@ -285,7 +285,7 @@ "label": "GetInvestigationNotesResponse", "description": [], "signature": [ - "{ id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]" + "{ id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get_notes.ts", "deprecated": false, @@ -315,7 +315,7 @@ "label": "GetInvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get.ts", "deprecated": false, @@ -360,7 +360,7 @@ "label": "InvestigationNoteResponse", "description": [], "signature": [ - "{ id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }" + "{ id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/investigation_note.ts", "deprecated": false, @@ -375,7 +375,7 @@ "label": "InvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/investigation.ts", "deprecated": false, @@ -465,7 +465,7 @@ "label": "UpdateInvestigationNoteResponse", "description": [], "signature": [ - "{ id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }" + "{ id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update_note.ts", "deprecated": false, @@ -495,7 +495,7 @@ "label": "UpdateInvestigationResponse", "description": [], "signature": [ - "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }" + "{ params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -587,7 +587,7 @@ "label": "createInvestigationNoteResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>" + "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create_note.ts", "deprecated": false, @@ -617,7 +617,7 @@ "label": "createInvestigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -722,7 +722,7 @@ "label": "findInvestigationsResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; results: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }[]; perPage: number; total: number; }, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }[]; perPage: number; total: number; }>" + "Zod.ZodObject<{ page: Zod.ZodNumber; perPage: Zod.ZodNumber; total: Zod.ZodNumber; results: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>, \"many\">; }, \"strip\", Zod.ZodTypeAny, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }, { page: number; results: { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }[]; perPage: number; total: number; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/find.ts", "deprecated": false, @@ -872,7 +872,7 @@ "label": "getInvestigationNotesResponseSchema", "description": [], "signature": [ - "Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">" + "Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get_notes.ts", "deprecated": false, @@ -902,7 +902,7 @@ "label": "getInvestigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get.ts", "deprecated": false, @@ -947,7 +947,7 @@ "label": "investigationNoteResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>" + "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/investigation_note.ts", "deprecated": false, @@ -962,7 +962,7 @@ "label": "investigationNoteSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>" + "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>" ], "path": "packages/kbn-investigation-shared/src/schema/investigation_note.ts", "deprecated": false, @@ -977,7 +977,7 @@ "label": "investigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/investigation.ts", "deprecated": false, @@ -992,7 +992,7 @@ "label": "investigationSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" ], "path": "packages/kbn-investigation-shared/src/schema/investigation.ts", "deprecated": false, @@ -1082,7 +1082,7 @@ "label": "updateInvestigationNoteResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>" + "Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update_note.ts", "deprecated": false, @@ -1112,7 +1112,7 @@ "label": "updateInvestigationResponseSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; createdBy: string; createdAt: number; updatedAt: number; content: string; }[]; }>" + "Zod.ZodObject<{ id: Zod.ZodString; title: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; params: Zod.ZodObject<{ timeRange: Zod.ZodObject<{ from: Zod.ZodNumber; to: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { from: number; to: number; }, { from: number; to: number; }>; }, \"strip\", Zod.ZodTypeAny, { timeRange: { from: number; to: number; }; }, { timeRange: { from: number; to: number; }; }>; origin: Zod.ZodUnion<[Zod.ZodObject<{ type: Zod.ZodLiteral<\"alert\">; id: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; type: \"alert\"; }, { id: string; type: \"alert\"; }>, Zod.ZodObject<{ type: Zod.ZodLiteral<\"blank\">; }, \"strip\", Zod.ZodTypeAny, { type: \"blank\"; }, { type: \"blank\"; }>]>; status: Zod.ZodUnion<[Zod.ZodLiteral<\"triage\">, Zod.ZodLiteral<\"active\">, Zod.ZodLiteral<\"mitigated\">, Zod.ZodLiteral<\"resolved\">, Zod.ZodLiteral<\"cancelled\">]>; tags: Zod.ZodArray<Zod.ZodString, \"many\">; notes: Zod.ZodArray<Zod.ZodObject<{ id: Zod.ZodString; content: Zod.ZodString; createdAt: Zod.ZodNumber; updatedAt: Zod.ZodNumber; createdBy: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }>, \"many\">; items: Zod.ZodArray<Zod.ZodIntersection<Zod.ZodObject<{ id: Zod.ZodString; createdAt: Zod.ZodNumber; createdBy: Zod.ZodString; updatedAt: Zod.ZodNumber; }, \"strip\", Zod.ZodTypeAny, { id: string; createdBy: string; createdAt: number; updatedAt: number; }, { id: string; createdBy: string; createdAt: number; updatedAt: number; }>, Zod.ZodObject<{ title: Zod.ZodString; type: Zod.ZodString; params: Zod.ZodRecord<Zod.ZodString, Zod.ZodAny>; }, \"strip\", Zod.ZodTypeAny, { params: Record<string, any>; type: string; title: string; }, { params: Record<string, any>; type: string; title: string; }>>, \"many\">; externalIncidentUrl: Zod.ZodNullable<Zod.ZodString>; }, \"strip\", Zod.ZodTypeAny, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }, { params: { timeRange: { from: number; to: number; }; }; id: string; tags: string[]; title: string; createdBy: string; createdAt: number; updatedAt: number; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; items: ({ id: string; createdBy: string; createdAt: number; updatedAt: number; } & { params: Record<string, any>; type: string; title: string; })[]; origin: { id: string; type: \"alert\"; } | { type: \"blank\"; }; externalIncidentUrl: string | null; notes: { id: string; content: string; createdBy: string; createdAt: number; updatedAt: number; }[]; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index f52e304ff36c9..122e7ba51d187 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-01 +date: 2024-10-02 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 2e35c2de50370..a05b44bb8bc59 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ipynb.devdocs.json index f0742196f8739..21eefbf467bd9 100644 --- a/api_docs/kbn_ipynb.devdocs.json +++ b/api_docs/kbn_ipynb.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.NotebookRendererProps", "text": "NotebookRendererProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-ipynb/components/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 43a3780cc6a9f..d542d566445b2 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 6428ab7c6b463..cc2f8d6e4282d 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-01 +date: 2024-10-02 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 0debf9e57a5a1..5a30df119c0f1 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-01 +date: 2024-10-02 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 ebcbab6f60c0c..23b6b30c516c4 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-01 +date: 2024-10-02 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 39c959324ae46..6a5ebd718a33e 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-01 +date: 2024-10-02 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 bbf6600847392..c56391c12edad 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_language_documentation.devdocs.json index 09a01624ef1c6..1d5cee18e66d3 100644 --- a/api_docs/kbn_language_documentation.devdocs.json +++ b/api_docs/kbn_language_documentation.devdocs.json @@ -27,7 +27,7 @@ "label": "LanguageDocumentationFlyout", "description": [], "signature": [ - "React.NamedExoticComponent<DocumentationFlyoutProps> & { readonly type: ({ searchInDescription, linkToDocumentation, isHelpMenuOpen, onHelpMenuVisibilityChange, }: DocumentationFlyoutProps) => JSX.Element; }" + "React.NamedExoticComponent<DocumentationFlyoutProps> & { readonly type: ({ searchInDescription, linkToDocumentation, isHelpMenuOpen, onHelpMenuVisibilityChange, }: DocumentationFlyoutProps) => React.JSX.Element; }" ], "path": "packages/kbn-language-documentation/src/components/as_flyout/index.tsx", "deprecated": false, @@ -44,7 +44,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -59,7 +59,7 @@ "label": "LanguageDocumentationInline", "description": [], "signature": [ - "React.NamedExoticComponent<DocumentationInlineProps> & { readonly type: ({ searchInDescription, height }: DocumentationInlineProps) => JSX.Element; }" + "React.NamedExoticComponent<DocumentationInlineProps> & { readonly type: ({ searchInDescription, height }: DocumentationInlineProps) => React.JSX.Element; }" ], "path": "packages/kbn-language-documentation/src/components/as_inline/index.tsx", "deprecated": false, @@ -76,7 +76,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -91,7 +91,7 @@ "label": "LanguageDocumentationPopover", "description": [], "signature": [ - "React.NamedExoticComponent<DocumentationPopoverProps> & { readonly type: ({ language, sections, buttonProps, searchInDescription, linkToDocumentation, isHelpMenuOpen, onHelpMenuVisibilityChange, }: DocumentationPopoverProps) => JSX.Element; }" + "React.NamedExoticComponent<DocumentationPopoverProps> & { readonly type: ({ language, sections, buttonProps, searchInDescription, linkToDocumentation, isHelpMenuOpen, onHelpMenuVisibilityChange, }: DocumentationPopoverProps) => React.JSX.Element; }" ], "path": "packages/kbn-language-documentation/src/components/as_popover/index.tsx", "deprecated": false, @@ -108,7 +108,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -123,7 +123,7 @@ "label": "LanguageDocumentationPopoverContent", "description": [], "signature": [ - "React.NamedExoticComponent<DocumentationProps> & { readonly type: ({ language, sections, searchInDescription, linkToDocumentation, }: DocumentationProps) => JSX.Element; }" + "React.NamedExoticComponent<DocumentationProps> & { readonly type: ({ language, sections, searchInDescription, linkToDocumentation, }: DocumentationProps) => React.JSX.Element; }" ], "path": "packages/kbn-language-documentation/src/components/as_popover/popover_content.tsx", "deprecated": false, @@ -140,7 +140,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_language_documentation.mdx b/api_docs/kbn_language_documentation.mdx index f8b2d671c9010..72c2a4ea130bf 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-01 +date: 2024-10-02 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 3737133cd0b66..a4037ae0ffbce 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-01 +date: 2024-10-02 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 3bc1132770cbd..95d4b8c483673 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-01 +date: 2024-10-02 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 14ce7091f242d..3657dabb318cc 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-01 +date: 2024-10-02 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 3a5a0761fd9f7..f784359d8a7e5 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-01 +date: 2024-10-02 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 14be6eeb6fd91..4222aee132d31 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-01 +date: 2024-10-02 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 3e61f0cbad0ea..575b78cedb169 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_cards_navigation.devdocs.json index 869f8b691b806..09bcfb00d4e2d 100644 --- a/api_docs/kbn_management_cards_navigation.devdocs.json +++ b/api_docs/kbn_management_cards_navigation.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.CardsNavigationComponentProps", "text": "CardsNavigationComponentProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/cards_navigation/src/cards_navigation.tsx", "deprecated": false, diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index df95e83ac2971..515eb0d80429d 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_application.devdocs.json index 1c7c1a74e4ce1..12a0227cdc241 100644 --- a/api_docs/kbn_management_settings_application.devdocs.json +++ b/api_docs/kbn_management_settings_application.devdocs.json @@ -19,7 +19,7 @@ "section": "def-public.SettingsApplicationKibanaDependencies", "text": "SettingsApplicationKibanaDependencies" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/application/index.tsx", "deprecated": false, @@ -60,7 +60,7 @@ "\nComponent for displaying the {@link SettingsApplication} component." ], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/kbn-management/settings/application/application.tsx", "deprecated": false, @@ -79,7 +79,7 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-application", "scope": "public", @@ -87,7 +87,7 @@ "section": "def-public.SettingsApplicationKibanaDependencies", "text": "SettingsApplicationKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-management/settings/application/services.tsx", "deprecated": false, @@ -101,7 +101,7 @@ "label": "{ children, ...dependencies }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-application", "scope": "public", @@ -109,7 +109,7 @@ "section": "def-public.SettingsApplicationKibanaDependencies", "text": "SettingsApplicationKibanaDependencies" }, - ">>" + ">" ], "path": "packages/kbn-management/settings/application/services.tsx", "deprecated": false, @@ -130,7 +130,7 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-application", "scope": "public", @@ -138,7 +138,7 @@ "section": "def-public.SettingsApplicationServices", "text": "SettingsApplicationServices" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-management/settings/application/services.tsx", "deprecated": false, @@ -152,7 +152,7 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-application", "scope": "public", @@ -160,7 +160,7 @@ "section": "def-public.SettingsApplicationServices", "text": "SettingsApplicationServices" }, - ">>" + ">" ], "path": "packages/kbn-management/settings/application/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index e6d3c59c829fc..d788a42a63056 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_components_field_category.devdocs.json index 248ccaf7e5712..15e17ede31cad 100644 --- a/api_docs/kbn_management_settings_components_field_category.devdocs.json +++ b/api_docs/kbn_management_settings_components_field_category.devdocs.json @@ -21,7 +21,7 @@ "section": "def-public.FieldCategoriesProps", "text": "FieldCategoriesProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/field_category/categories.tsx", "deprecated": false, @@ -70,7 +70,7 @@ "section": "def-public.FieldCategoryProps", "text": "FieldCategoryProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/field_category/category.tsx", "deprecated": false, @@ -131,14 +131,14 @@ { "parentPluginId": "@kbn/management-settings-components-field-category", "id": "def-public.FieldCategoryKibanaProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -152,7 +152,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -177,7 +177,7 @@ "section": "def-public.FieldRowProviderProps", "text": "FieldRowProviderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/field_category/services.tsx", "deprecated": false, @@ -493,7 +493,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-management/settings/components/field_category/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 80b94b11cf70c..77a297e35e0a8 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_components_field_input.devdocs.json index 3abc828e87b69..8580042c07f55 100644 --- a/api_docs/kbn_management_settings_components_field_input.devdocs.json +++ b/api_docs/kbn_management_settings_components_field_input.devdocs.json @@ -56,7 +56,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 0fef3c793ab12..825434e116f2a 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_components_field_row.devdocs.json index e9428d2ec8988..662eb40589eef 100644 --- a/api_docs/kbn_management_settings_components_field_row.devdocs.json +++ b/api_docs/kbn_management_settings_components_field_row.devdocs.json @@ -21,7 +21,7 @@ "section": "def-public.FieldRowProps", "text": "FieldRowProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", "deprecated": false, @@ -64,7 +64,7 @@ "\nKibana-specific Provider that maps Kibana plugins and services to a {@link FieldRowProvider}." ], "signature": [ - "({ children, docLinks, notifications, settings, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, docLinks, notifications, settings, }: React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-components-field-row", "scope": "public", @@ -72,7 +72,7 @@ "section": "def-public.FieldRowKibanaDependencies", "text": "FieldRowKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/field_row/services.tsx", "deprecated": false, @@ -86,7 +86,7 @@ "label": "{\n children,\n docLinks,\n notifications,\n settings,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-components-field-row", "scope": "public", @@ -94,7 +94,7 @@ "section": "def-public.FieldRowKibanaDependencies", "text": "FieldRowKibanaDependencies" }, - ">>" + ">" ], "path": "packages/kbn-management/settings/components/field_row/services.tsx", "deprecated": false, @@ -123,7 +123,7 @@ "section": "def-public.FieldRowProviderProps", "text": "FieldRowProviderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/field_row/services.tsx", "deprecated": false, @@ -381,7 +381,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-management/settings/components/field_row/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 482fb62959150..f3030f2ee5e65 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_components_form.devdocs.json index 32a2c89100f0e..278d0f42383d9 100644 --- a/api_docs/kbn_management_settings_components_form.devdocs.json +++ b/api_docs/kbn_management_settings_components_form.devdocs.json @@ -15,7 +15,7 @@ "signature": [ "(props: ", "FormProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/form/form.tsx", "deprecated": false, @@ -52,7 +52,7 @@ "\nKibana-specific Provider that maps Kibana plugins and services to a {@link FormProvider}." ], "signature": [ - "({ children, ...deps }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...deps }: React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-components-form", "scope": "public", @@ -60,7 +60,7 @@ "section": "def-public.FormKibanaDependencies", "text": "FormKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/form/services.tsx", "deprecated": false, @@ -74,7 +74,7 @@ "label": "{\n children,\n ...deps\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-components-form", "scope": "public", @@ -82,7 +82,7 @@ "section": "def-public.FormKibanaDependencies", "text": "FormKibanaDependencies" }, - ">>" + ">" ], "path": "packages/kbn-management/settings/components/form/services.tsx", "deprecated": false, @@ -105,7 +105,7 @@ "signature": [ "({ children, ...services }: ", "FormProviderProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-management/settings/components/form/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 0ebd5498dc48e..8acad8cb0a065 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-01 +date: 2024-10-02 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 190d69e66c82f..8720e6e52d014 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_ids.devdocs.json index 1e433c58a1c89..da29d9b9f1fd3 100644 --- a/api_docs/kbn_management_settings_ids.devdocs.json +++ b/api_docs/kbn_management_settings_ids.devdocs.json @@ -1749,6 +1749,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_ENABLE_VISUALIZATIONS_IN_FLYOUT_SETTING", + "description": [], + "signature": [ + "\"securitySolution:enableVisualizationsInFlyout\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/management-settings-ids", "id": "def-common.SECURITY_SOLUTION_EXCLUDE_COLD_AND_FROZEN_TIERS_IN_ANALYZER", diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 9d5845197a9c9..dfa7bc87f43da 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-01 +date: 2024-10-02 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 | |-------------------|-----------|------------------------|-----------------| -| 142 | 0 | 140 | 0 | +| 143 | 0 | 141 | 0 | ## Common diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 970803071fff4..de62f87a23050 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_management_settings_types.devdocs.json index 590f1a7c44d3f..0ac6f8bbccb8e 100644 --- a/api_docs/kbn_management_settings_types.devdocs.json +++ b/api_docs/kbn_management_settings_types.devdocs.json @@ -1255,7 +1255,7 @@ "\nThis is a narrowing type, which finds the correct primitive type based on a\ngiven {@link SettingType}." ], "signature": [ - "T extends \"string\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\" ? string : T extends \"boolean\" ? boolean : T extends \"number\" | \"bigint\" ? number : T extends \"array\" ? (string | number)[] : T extends \"undefined\" ? undefined : never" + "T extends \"string\" | \"color\" | \"select\" | \"image\" | \"json\" | \"markdown\" ? string : T extends \"boolean\" ? boolean : T extends \"number\" | \"bigint\" ? number : T extends \"array\" ? (string | number)[] : T extends \"undefined\" ? undefined : never" ], "path": "packages/kbn-management/settings/types/setting_type.ts", "deprecated": false, @@ -1613,7 +1613,7 @@ "\nThis is a local type equivalent to {@link UiSettingsType} for flexibility." ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"array\" | \"image\" | \"select\" | \"json\" | \"markdown\"" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"select\" | \"image\" | \"array\" | \"json\" | \"markdown\"" ], "path": "packages/kbn-management/settings/types/setting_type.ts", "deprecated": false, @@ -1654,7 +1654,7 @@ "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `string` primitive type value." ], "signature": [ - "\"string\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\"" + "\"string\" | \"color\" | \"select\" | \"image\" | \"json\" | \"markdown\"" ], "path": "packages/kbn-management/settings/types/setting_type.ts", "deprecated": false, diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index a970ffe068eef..9da0a85ed075b 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-01 +date: 2024-10-02 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 1275ba3987bd7..6da23db534e49 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-01 +date: 2024-10-02 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 f874d68e25c4b..cf7f184d2dafc 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.devdocs.json b/api_docs/kbn_mapbox_gl.devdocs.json index cf9525be91e6e..2f8e5ff4b1091 100644 --- a/api_docs/kbn_mapbox_gl.devdocs.json +++ b/api_docs/kbn_mapbox_gl.devdocs.json @@ -9009,7 +9009,7 @@ "label": "sourceDataType", "description": [], "signature": [ - "\"metadata\" | \"content\" | \"visibility\" | \"idle\"" + "\"content\" | \"metadata\" | \"visibility\" | \"idle\"" ], "path": "node_modules/maplibre-gl/dist/maplibre-gl.d.ts", "deprecated": false, diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 3e946b549a9ea..aafb885ecd057 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-01 +date: 2024-10-02 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 40514d7e726e4..70e9a3c1b570e 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-01 +date: 2024-10-02 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 cb2244fa168e3..c418f5b8ef240 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-01 +date: 2024-10-02 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 eef8d334d4684..3650fa6459714 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-01 +date: 2024-10-02 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 0e06abf57ba09..11c33650e0323 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-01 +date: 2024-10-02 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 e618ff9739440..a874106c746f5 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-01 +date: 2024-10-02 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 bd77f992694df..ec8ee555277fb 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-01 +date: 2024-10-02 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 078672d989cf9..e1295bdbe5b51 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ml_data_grid.devdocs.json index dfb0f3c62a61a..7c96b84ed088d 100644 --- a/api_docs/kbn_ml_data_grid.devdocs.json +++ b/api_docs/kbn_ml_data_grid.devdocs.json @@ -39,14 +39,14 @@ { "parentPluginId": "@kbn/ml-data-grid", "id": "def-common.DataGrid.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -60,7 +60,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1930,7 +1930,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1971,7 +1971,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2004,7 +2004,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2037,7 +2037,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2072,7 +2072,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2113,7 +2113,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2148,7 +2148,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2189,7 +2189,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2230,7 +2230,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2263,7 +2263,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index c9406eede84be..f24d4ead23ea8 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ml_date_picker.devdocs.json index a2401c59a14ba..d43a34799b5ba 100644 --- a/api_docs/kbn_ml_date_picker.devdocs.json +++ b/api_docs/kbn_ml_date_picker.devdocs.json @@ -15,7 +15,7 @@ "\nReact Component that acts as a wrapper for DatePickerContext.\n" ], "signature": [ - "(props: React.PropsWithChildren<React.PropsWithChildren<", + "(props: React.PropsWithChildren<", { "pluginId": "@kbn/ml-date-picker", "scope": "public", @@ -23,7 +23,7 @@ "section": "def-public.DatePickerDependencies", "text": "DatePickerDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "x-pack/packages/ml/date_picker/src/hooks/use_date_picker_context.tsx", "deprecated": false, @@ -39,7 +39,7 @@ "- The component props" ], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/ml-date-picker", "scope": "public", @@ -47,7 +47,7 @@ "section": "def-public.DatePickerDependencies", "text": "DatePickerDependencies" }, - ">>" + ">" ], "path": "x-pack/packages/ml/date_picker/src/hooks/use_date_picker_context.tsx", "deprecated": false, @@ -72,7 +72,7 @@ "\nDatePickerWrapper React Component\n" ], "signature": [ - "(props: React.PropsWithChildren<DatePickerWrapperProps>) => JSX.Element | null" + "(props: DatePickerWrapperProps) => React.JSX.Element | null" ], "path": "x-pack/packages/ml/date_picker/src/components/date_picker_wrapper.tsx", "deprecated": false, @@ -81,14 +81,14 @@ { "parentPluginId": "@kbn/ml-date-picker", "id": "def-public.DatePickerWrapper.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- `DatePickerWrapper` component props" ], "signature": [ - "React.PropsWithChildren<DatePickerWrapperProps>" + "DatePickerWrapperProps" ], "path": "x-pack/packages/ml/date_picker/src/components/date_picker_wrapper.tsx", "deprecated": false, @@ -113,7 +113,7 @@ "\nComponent for rendering a button which automatically sets the range of the time filter\nto the time range of data in the index(es) mapped to the supplied Kibana data view or query.\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/ml-date-picker", "scope": "public", @@ -121,7 +121,7 @@ "section": "def-public.FullTimeRangeSelectorProps", "text": "FullTimeRangeSelectorProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx", "deprecated": false, @@ -130,22 +130,20 @@ { "parentPluginId": "@kbn/ml-date-picker", "id": "def-public.FullTimeRangeSelector.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- `FullTimeRangeSelectorProps` component props" ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/ml-date-picker", "scope": "public", "docId": "kibKbnMlDatePickerPluginApi", "section": "def-public.FullTimeRangeSelectorProps", "text": "FullTimeRangeSelectorProps" - }, - ">" + } ], "path": "x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx", "deprecated": false, diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 488f87e30fd05..522d6c7a50983 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-01 +date: 2024-10-02 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 eb90efe54b7f6..c432841c40427 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-01 +date: 2024-10-02 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 7fea72d99e3c2..0e4aca03581c1 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ml_field_stats_flyout.devdocs.json index 5920645b6870f..d286eb16a26d3 100644 --- a/api_docs/kbn_ml_field_stats_flyout.devdocs.json +++ b/api_docs/kbn_ml_field_stats_flyout.devdocs.json @@ -15,7 +15,7 @@ "\nReact component that wraps the EuiComboBox component and adds field statistics functionality.\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", @@ -23,7 +23,7 @@ "section": "def-public.EuiComboBoxWithFieldStatsProps", "text": "EuiComboBoxWithFieldStatsProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/ml/field_stats_flyout/eui_combo_box_with_field_stats.tsx", "deprecated": false, @@ -39,15 +39,13 @@ "- The component props." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", "docId": "kibKbnMlFieldStatsFlyoutPluginApi", "section": "def-public.EuiComboBoxWithFieldStatsProps", "text": "EuiComboBoxWithFieldStatsProps" - }, - ">" + } ], "path": "x-pack/packages/ml/field_stats_flyout/eui_combo_box_with_field_stats.tsx", "deprecated": false, @@ -68,7 +66,7 @@ "\nRenders the content for the field statistics flyout." ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", @@ -76,7 +74,7 @@ "section": "def-public.FieldStatsFlyoutProps", "text": "FieldStatsFlyoutProps" }, - ">) => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_content.tsx", "deprecated": false, @@ -85,22 +83,20 @@ { "parentPluginId": "@kbn/ml-field-stats-flyout", "id": "def-public.FieldStatsContent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- The props for the FieldStatsContent component." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", "docId": "kibKbnMlFieldStatsFlyoutPluginApi", "section": "def-public.FieldStatsFlyoutProps", "text": "FieldStatsFlyoutProps" - }, - ">" + } ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_content.tsx", "deprecated": false, @@ -125,7 +121,7 @@ "\nRenders a flyout component for displaying field statistics.\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", @@ -133,7 +129,7 @@ "section": "def-public.FieldStatsFlyoutProps", "text": "FieldStatsFlyoutProps" }, - ">) => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_flyout.tsx", "deprecated": false, @@ -142,22 +138,20 @@ { "parentPluginId": "@kbn/ml-field-stats-flyout", "id": "def-public.FieldStatsFlyout.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- The component props." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", "docId": "kibKbnMlFieldStatsFlyoutPluginApi", "section": "def-public.FieldStatsFlyoutProps", "text": "FieldStatsFlyoutProps" - }, - ">" + } ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_flyout.tsx", "deprecated": false, @@ -180,7 +174,7 @@ "\nProvides field statistics in a flyout component.\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", @@ -188,7 +182,7 @@ "section": "def-public.FieldStatsFlyoutProviderProps", "text": "FieldStatsFlyoutProviderProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_flyout_provider.tsx", "deprecated": false, @@ -204,15 +198,13 @@ "- The component props." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", "docId": "kibKbnMlFieldStatsFlyoutPluginApi", "section": "def-public.FieldStatsFlyoutProviderProps", "text": "FieldStatsFlyoutProviderProps" - }, - ">" + } ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_flyout_provider.tsx", "deprecated": false, @@ -235,7 +227,7 @@ "\nRenders a button component for field statistics information.\n" ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", @@ -243,7 +235,7 @@ "section": "def-public.FieldStatsInfoButtonProps", "text": "FieldStatsInfoButtonProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_info_button.tsx", "deprecated": false, @@ -252,22 +244,20 @@ { "parentPluginId": "@kbn/ml-field-stats-flyout", "id": "def-public.FieldStatsInfoButton.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "- The props for the FieldStatsInfoButton component." ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/ml-field-stats-flyout", "scope": "public", "docId": "kibKbnMlFieldStatsFlyoutPluginApi", "section": "def-public.FieldStatsInfoButtonProps", "text": "FieldStatsInfoButtonProps" - }, - ">" + } ], "path": "x-pack/packages/ml/field_stats_flyout/field_stats_info_button.tsx", "deprecated": false, diff --git a/api_docs/kbn_ml_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index 97c7ada0a8de6..0d2e31f771817 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ml_in_memory_table.devdocs.json index 6d72e5a158c23..9436302e6e522 100644 --- a/api_docs/kbn_ml_in_memory_table.devdocs.json +++ b/api_docs/kbn_ml_in_memory_table.devdocs.json @@ -237,7 +237,7 @@ "signature": [ "A" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 6b69a8403ed3e..4f8883bbc5fca 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-01 +date: 2024-10-02 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 2257374763016..8e7b1a0229752 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-01 +date: 2024-10-02 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 2b476984688b9..597348ffcbda2 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-01 +date: 2024-10-02 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 bbc86966dde13..69ce3852420c7 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ml_local_storage.devdocs.json index 6b0abed5166d2..7bb343c45db01 100644 --- a/api_docs/kbn_ml_local_storage.devdocs.json +++ b/api_docs/kbn_ml_local_storage.devdocs.json @@ -29,7 +29,7 @@ "\nProvider to manage context for the `useStorage` hook." ], "signature": [ - "({\n children,\n storage,\n storageKeys,\n}: React.PropsWithChildren<StorageContextProviderProps<K>>) => JSX.Element" + "({\n children,\n storage,\n storageKeys,\n}: React.PropsWithChildren<StorageContextProviderProps<K>>) => React.JSX.Element" ], "path": "x-pack/packages/ml/local_storage/src/storage_context.tsx", "deprecated": false, diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 0dc0e5fa0a06d..ba24bef7a4418 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-01 +date: 2024-10-02 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 362168657f29e..84c993a1a0a0f 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-01 +date: 2024-10-02 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 5478f89183c97..6fa092a0905ef 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-01 +date: 2024-10-02 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 9ea5269642814..93b4d7c831304 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-01 +date: 2024-10-02 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 22cc194900007..89630524f24d3 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-01 +date: 2024-10-02 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 c348d149f1cd7..dd6a169e08c9f 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-01 +date: 2024-10-02 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 abc608daca077..736d692782227 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-01 +date: 2024-10-02 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 6050ce5528184..772381f5aa399 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-01 +date: 2024-10-02 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 2c187ef245cd4..aa320164c865b 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-01 +date: 2024-10-02 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 c9ddf77603092..ecd07a94e81d5 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-01 +date: 2024-10-02 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 d10bd6f0041d7..e22f3a95d2a25 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-01 +date: 2024-10-02 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 3e6752339f44a..f8c6754dea81c 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_ml_url_state.devdocs.json index 23d6834de272a..e2f8e56166522 100644 --- a/api_docs/kbn_ml_url_state.devdocs.json +++ b/api_docs/kbn_ml_url_state.devdocs.json @@ -300,7 +300,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -315,7 +315,7 @@ "label": "UrlStateProvider", "description": [], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "x-pack/packages/ml/url_state/src/url_state.tsx", "deprecated": false, diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 86aaf5b62eda1..4cfdb2fb7a07a 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-01 +date: 2024-10-02 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 0b825a146b981..89ca953807d73 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-01 +date: 2024-10-02 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 5d77909202cf3..d9628b92fe987 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-01 +date: 2024-10-02 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 ca3b0561307c2..b68e3e9c53f88 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-01 +date: 2024-10-02 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 058170b55816a..1b4e01582f806 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-01 +date: 2024-10-02 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 a14d50ef62b93..b675639a07cf1 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_observability_alert_details.devdocs.json index f5de812cee8b5..3c81625eeaff7 100644 --- a/api_docs/kbn_observability_alert_details.devdocs.json +++ b/api_docs/kbn_observability_alert_details.devdocs.json @@ -27,7 +27,7 @@ "label": "AlertActiveTimeRangeAnnotation", "description": [], "signature": [ - "({ alertStart, alertEnd, color, id }: Props) => JSX.Element" + "({ alertStart, alertEnd, color, id }: Props) => React.JSX.Element" ], "path": "x-pack/packages/observability/alert_details/src/components/alert_active_time_range_annotation.tsx", "deprecated": false, @@ -60,7 +60,7 @@ "label": "AlertAnnotation", "description": [], "signature": [ - "({ alertStart, color, dateFormat, id }: Props) => JSX.Element" + "({ alertStart, color, dateFormat, id }: Props) => React.JSX.Element" ], "path": "x-pack/packages/observability/alert_details/src/components/alert_annotation.tsx", "deprecated": false, @@ -93,7 +93,7 @@ "label": "AlertThresholdAnnotation", "description": [], "signature": [ - "({ threshold, color, id }: Props) => JSX.Element" + "({ threshold, color, id }: Props) => React.JSX.Element" ], "path": "x-pack/packages/observability/alert_details/src/components/alert_threshold_annotation.tsx", "deprecated": false, @@ -126,7 +126,7 @@ "label": "AlertThresholdTimeRangeRect", "description": [], "signature": [ - "({ color, id, threshold }: Props) => JSX.Element" + "({ color, id, threshold }: Props) => React.JSX.Element" ], "path": "x-pack/packages/observability/alert_details/src/components/alert_threshold_time_range_rect.tsx", "deprecated": false, diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 543b80574160a..45cfbb222a9da 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-01 +date: 2024-10-02 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 28d5410a30011..0341ed8db84e6 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-01 +date: 2024-10-02 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 48c8adfc9a894..69c2a282997b5 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_observability_get_padded_alert_time_range_util.devdocs.json index be1ffb88134bc..ae2d7079bfc75 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.devdocs.json +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.devdocs.json @@ -27,7 +27,7 @@ "label": "getPaddedAlertTimeRange", "description": [], "signature": [ - "(alertStart: string, alertEnd?: string | undefined, lookBackWindow?: { size: number; unit: \"m\" | \"d\" | \"h\" | \"s\"; } | undefined) => ", + "(alertStart: string, alertEnd?: string | undefined, lookBackWindow?: { size: number; unit: \"m\" | \"s\" | \"d\" | \"h\"; } | undefined) => ", "TimeRange" ], "path": "x-pack/packages/observability/get_padded_alert_time_range_util/src/get_padded_alert_time_range.ts", @@ -94,7 +94,7 @@ "label": "unit", "description": [], "signature": [ - "\"m\" | \"d\" | \"h\" | \"s\"" + "\"m\" | \"s\" | \"d\" | \"h\"" ], "path": "x-pack/packages/observability/get_padded_alert_time_range_util/src/get_padded_alert_time_range.ts", "deprecated": false, 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 1d4246facea11..d0f7690035c09 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-01 +date: 2024-10-02 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_synthetics_test_data.devdocs.json b/api_docs/kbn_observability_synthetics_test_data.devdocs.json new file mode 100644 index 0000000000000..21c91a98e0540 --- /dev/null +++ b/api_docs/kbn_observability_synthetics_test_data.devdocs.json @@ -0,0 +1,98 @@ +{ + "id": "@kbn/observability-synthetics-test-data", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/observability-synthetics-test-data", + "id": "def-common.makeDownSummary", + "type": "Function", + "tags": [], + "label": "makeDownSummary", + "description": [], + "signature": [ + "({ name, timestamp, monitorId, location, configId, }?: ", + "DocOverrides", + ") => { summary: { up: number; down: number; final_attempt: boolean; }; monitor: { duration: { us: number; }; origin: string; ip: string; name: string; fleet_managed: boolean; check_group: string; timespan: { lt: string; gte: string | moment.Moment; }; id: string; type: string; status: \"up\" | \"down\"; }; error: { message: string; type: string; }; '@timestamp': string; config_id: string; state: { duration_ms: number; checks: number; ends: null; started_at: string; id: string; up: number; down: number; flap_history: never[]; status: string; }; url: { scheme: string; port: number; domain: string; full: string; }; ecs: { version: string; }; tcp: { rtt: { connect: { us: number; }; }; }; event: { agent_id_status: string; ingested: string; dataset: string; }; agent: { name: string; id: string; type: string; ephemeral_id: string; version: string; }; elastic_agent: { id: string; version: string; snapshot: boolean; }; data_stream: { namespace: string; type: string; dataset: string; }; resolve: { rtt: { us: number; }; ip: string; }; tls: { established: boolean; cipher: string; certificate_not_valid_before: string; server: { x509: { not_after: string; subject: { distinguished_name: string; common_name: string; }; not_before: string; public_key_algorithm: string; public_key_curve: string; signature_algorithm: string; serial_number: string; issuer: { distinguished_name: string; common_name: string; }; }; hash: { sha1: string; sha256: string; }; }; rtt: { handshake: { us: number; }; }; version: string; certificate_not_valid_after: string; version_protocol: string; }; http: { rtt: { response_header: { us: number; }; total: { us: number; }; write_request: { us: number; }; content: { us: number; }; validate: { us: number; }; }; response: { headers: { Server: string; P3p: string; Date: string; 'X-Frame-Options': string; 'Accept-Ranges': string; 'Cache-Control': string; 'X-Xss-Protection': string; 'Cross-Origin-Opener-Policy-Report-Only': string; Vary: string; Expires: string; 'Content-Type': string; }; status_code: number; mime_type: string; body: { bytes: number; hash: string; }; }; }; observer: { geo: { name: string; location: string; }; name: string; }; }" + ], + "path": "x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/observability-synthetics-test-data", + "id": "def-common.makeDownSummary.$1", + "type": "Object", + "tags": [], + "label": "{\n name,\n timestamp,\n monitorId,\n location,\n configId,\n}", + "description": [], + "signature": [ + "DocOverrides" + ], + "path": "x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/observability-synthetics-test-data", + "id": "def-common.makeUpSummary", + "type": "Function", + "tags": [], + "label": "makeUpSummary", + "description": [], + "signature": [ + "({ name, timestamp, monitorId, configId, testRunId, location, }?: ", + "DocOverrides", + ") => { test_run_id?: string | undefined; summary: { up: number; down: number; final_attempt: boolean; }; monitor: { duration: { us: number; }; origin: string; ip: string; name: string; fleet_managed: boolean; check_group: string; timespan: { lt: string; gte: string | moment.Moment; }; id: string; type: string; status: \"up\" | \"down\"; }; '@timestamp': string; config_id: string; state: { duration_ms: number; checks: number; ends: null; started_at: string; up: number; id: string; down: number; flap_history: never[]; status: string; }; url: { scheme: string; port: number; domain: string; full: string; }; ecs: { version: string; }; tcp: { rtt: { connect: { us: number; }; }; }; event: { agent_id_status: string; ingested: string; dataset: string; }; agent: { name: string; id: string; type: string; ephemeral_id: string; version: string; }; elastic_agent: { id: string; version: string; snapshot: boolean; }; data_stream: { namespace: string; type: string; dataset: string; }; resolve: { rtt: { us: number; }; ip: string; }; tls: { established: boolean; cipher: string; certificate_not_valid_before: string; server: { x509: { not_after: string; subject: { distinguished_name: string; common_name: string; }; not_before: string; public_key_algorithm: string; public_key_curve: string; signature_algorithm: string; serial_number: string; issuer: { distinguished_name: string; common_name: string; }; }; hash: { sha1: string; sha256: string; }; }; rtt: { handshake: { us: number; }; }; version: string; certificate_not_valid_after: string; version_protocol: string; }; http: { rtt: { response_header: { us: number; }; total: { us: number; }; write_request: { us: number; }; content: { us: number; }; validate: { us: number; }; }; response: { headers: { Server: string; P3p: string; Date: string; 'X-Frame-Options': string; 'Accept-Ranges': string; 'Cache-Control': string; 'X-Xss-Protection': string; 'Cross-Origin-Opener-Policy-Report-Only': string; Vary: string; Expires: string; 'Content-Type': string; }; status_code: number; mime_type: string; body: { bytes: number; hash: string; }; }; }; observer: { geo: { name: string; location: string; }; name: string; }; }" + ], + "path": "x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/observability-synthetics-test-data", + "id": "def-common.makeUpSummary.$1", + "type": "Object", + "tags": [], + "label": "{\n name,\n timestamp,\n monitorId,\n configId,\n testRunId,\n location,\n}", + "description": [], + "signature": [ + "DocOverrides" + ], + "path": "x-pack/packages/observability/synthetics_test_data/src/make_summaries.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx new file mode 100644 index 0000000000000..6b9cd770a0c40 --- /dev/null +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -0,0 +1,30 @@ +--- +#### +#### 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: kibKbnObservabilitySyntheticsTestDataPluginApi +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-02 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] +--- +import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; + + + +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 4 | 0 | 4 | 1 | + +## Common + +### Functions +<DocDefinitionList data={kbnObservabilitySyntheticsTestDataObj.common.functions}/> + diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 13f9b5bd318e6..db3feb3e173df 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-01 +date: 2024-10-02 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 2fa42a1620c1d..c112e8317c5dc 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-01 +date: 2024-10-02 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 77fe323165ace..45d7e94e982e1 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-01 +date: 2024-10-02 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 953ed23eb8836..86f72287785fc 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-01 +date: 2024-10-02 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 1de7980a16039..c97fd218f3d80 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_panel_loader.devdocs.json index 74454cf0c107b..666bb9078ab7e 100644 --- a/api_docs/kbn_panel_loader.devdocs.json +++ b/api_docs/kbn_panel_loader.devdocs.json @@ -11,7 +11,7 @@ "label": "PanelLoader", "description": [], "signature": [ - "(props: { showShadow?: boolean | undefined; showBorder?: boolean | undefined; dataTestSubj?: string | undefined; }) => JSX.Element" + "(props: { showShadow?: boolean | undefined; showBorder?: boolean | undefined; dataTestSubj?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-panel-loader/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 53f46ee3f0b56..a129cf6e5301a 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-01 +date: 2024-10-02 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 ac19c831ad2c5..4c16ed4e2420d 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-01 +date: 2024-10-02 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 63e0c3c8af852..94f28451242ca 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-01 +date: 2024-10-02 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 4f8f6419b5451..79ce57171bac6 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-01 +date: 2024-10-02 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 7c95f6be43a41..5639cf03f8996 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-01 +date: 2024-10-02 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 7b09886fdb7ef..4eb024b775701 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-01 +date: 2024-10-02 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 aede943c2a5c4..693593693d056 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index bf61f9a86fa69..43db1d651062a 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.devdocs.json b/api_docs/kbn_random_sampling.devdocs.json index d0980a8860449..0071d86ec405c 100644 --- a/api_docs/kbn_random_sampling.devdocs.json +++ b/api_docs/kbn_random_sampling.devdocs.json @@ -19,7 +19,7 @@ "section": "def-public.ControlSliderProps", "text": "ControlSliderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/kbn-random-sampling/src/ui/slider_control/index.tsx", "deprecated": false, @@ -66,7 +66,7 @@ "section": "def-public.RandomSamplingIconProps", "text": "RandomSamplingIconProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/kbn-random-sampling/src/ui/icon/sampling_icon.tsx", "deprecated": false, diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 2ff242a545971..af35100df2e05 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.devdocs.json b/api_docs/kbn_react_field.devdocs.json index 6f4f8b23736e2..adfb4e7e852c6 100644 --- a/api_docs/kbn_react_field.devdocs.json +++ b/api_docs/kbn_react_field.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.FieldButtonProps", "text": "FieldButtonProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-react-field/src/field_button/field_button.tsx", "deprecated": false, @@ -84,7 +84,7 @@ "section": "def-common.FieldIconProps", "text": "FieldIconProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-react-field/src/field_icon/field_icon.tsx", "deprecated": false, @@ -148,7 +148,7 @@ "\nLabel for the button" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-react-field/src/field_button/field_button.tsx", "deprecated": false, @@ -164,7 +164,7 @@ "\nIcon representing the field type.\nRecommend using FieldIcon" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-react-field/src/field_button/field_button.tsx", "deprecated": false, @@ -180,7 +180,7 @@ "\nAn optional node to place inside and at the end of the <button>" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-react-field/src/field_button/field_button.tsx", "deprecated": false, @@ -196,7 +196,7 @@ "\nAn optional node to place outside of and to the right of the <button>" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-react-field/src/field_button/field_button.tsx", "deprecated": false, diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 7d46fc90fbea8..6f1abca96f171 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-01 +date: 2024-10-02 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 9258a199ae78b..65f5b8c9b09b9 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-01 +date: 2024-10-02 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 80b24d5f7cc37..c451af9283a78 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_react_kibana_context_render.devdocs.json index 934552542af49..e8d53123a8180 100644 --- a/api_docs/kbn_react_kibana_context_render.devdocs.json +++ b/api_docs/kbn_react_kibana_context_render.devdocs.json @@ -29,7 +29,7 @@ "\nThe `KibanaRenderContextProvider` provides the necessary context for an out-of-current\nReact render, such as using `ReactDOM.render()`." ], "signature": [ - "({ children, ...props }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...props }: React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-render", "scope": "common", @@ -37,7 +37,7 @@ "section": "def-common.KibanaRenderContextProviderProps", "text": "KibanaRenderContextProviderProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/react/kibana_context/render/render_provider.tsx", "deprecated": false, @@ -51,7 +51,7 @@ "label": "{ children, ...props }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-render", "scope": "common", @@ -59,7 +59,7 @@ "section": "def-common.KibanaRenderContextProviderProps", "text": "KibanaRenderContextProviderProps" }, - ">>" + ">" ], "path": "packages/react/kibana_context/render/render_provider.tsx", "deprecated": false, diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index d1f9057e516d0..9c74c3cd1eba5 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_react_kibana_context_root.devdocs.json index fbab61142d754..f0bce73d3d1e4 100644 --- a/api_docs/kbn_react_kibana_context_root.devdocs.json +++ b/api_docs/kbn_react_kibana_context_root.devdocs.json @@ -13,7 +13,7 @@ "\nPrepares and returns a configured `EuiProvider` for use in Kibana roots. In most cases, this utility context\nshould not be used. Instead, refer to `KibanaRootContextProvider` to set up the root of Kibana." ], "signature": [ - "({ theme: { theme$ }, globalStyles: globalStylesProp, colorMode: colorModeProp, modify, children, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ theme: { theme$ }, globalStyles: globalStylesProp, colorMode: colorModeProp, modify, children, }: React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-root", "scope": "public", @@ -21,7 +21,7 @@ "section": "def-public.KibanaEuiProviderProps", "text": "KibanaEuiProviderProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/react/kibana_context/root/eui_provider.tsx", "deprecated": false, @@ -35,7 +35,7 @@ "label": "{\n theme: { theme$ },\n globalStyles: globalStylesProp,\n colorMode: colorModeProp,\n modify,\n children,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-root", "scope": "public", @@ -43,7 +43,7 @@ "section": "def-public.KibanaEuiProviderProps", "text": "KibanaEuiProviderProps" }, - ">>" + ">" ], "path": "packages/react/kibana_context/root/eui_provider.tsx", "deprecated": false, @@ -64,7 +64,7 @@ "\nThe `KibanaRootContextProvider` provides the necessary context at the root of Kibana, including\ninitialization and the theme and i18n contexts. This context should only be used _once_, and\nat the _very top_ of the application root, rendered by the `RenderingService`.\n\nWhile this context is exposed for edge cases and tooling, (e.g. Storybook, Jest, etc.), it should\n_not_ be used in applications. Instead, applications should choose the context that makes the\nmost sense for the problem they are trying to solve:\n\n- Consider `KibanaRenderContextProvider` for rendering components outside the current tree, (e.g.\nwith `ReactDOM.render`).\n- Consider `KibanaThemeContextProvider` for altering the theme of a component or tree of components.\n" ], "signature": [ - "({ children, i18n, ...props }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, i18n, ...props }: React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-root", "scope": "public", @@ -72,7 +72,7 @@ "section": "def-public.KibanaRootContextProviderProps", "text": "KibanaRootContextProviderProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/react/kibana_context/root/root_provider.tsx", "deprecated": false, @@ -86,7 +86,7 @@ "label": "{\n children,\n i18n,\n ...props\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-context-root", "scope": "public", @@ -94,7 +94,7 @@ "section": "def-public.KibanaRootContextProviderProps", "text": "KibanaRootContextProviderProps" }, - ">>" + ">" ], "path": "packages/react/kibana_context/root/root_provider.tsx", "deprecated": false, diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 5bbc7ceef7b4c..8230a0a2b3429 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_react_kibana_context_styled.devdocs.json index 8ec9d6a84fb7c..89d721ec1754d 100644 --- a/api_docs/kbn_react_kibana_context_styled.devdocs.json +++ b/api_docs/kbn_react_kibana_context_styled.devdocs.json @@ -243,7 +243,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ">, \"theme\"> & { darkMode?: boolean | undefined; }) => JSX.Element" + ">, \"theme\"> & { darkMode?: boolean | undefined; }) => React.JSX.Element" ], "path": "packages/react/kibana_context/styled/styled_provider.tsx", "deprecated": false, @@ -302,7 +302,7 @@ "StoryFnReactReturnType", ">, ", "Args", - ">) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/react/kibana_context/styled/styled_provider.tsx", "deprecated": true, diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 40725a847a075..567c28dcf7bc3 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_react_kibana_context_theme.devdocs.json index d972bd111941a..5e0547a0326b2 100644 --- a/api_docs/kbn_react_kibana_context_theme.devdocs.json +++ b/api_docs/kbn_react_kibana_context_theme.devdocs.json @@ -21,7 +21,7 @@ "section": "def-public.KibanaThemeProviderProps", "text": "KibanaThemeProviderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/react/kibana_context/theme/theme_provider.tsx", "deprecated": false, @@ -69,7 +69,7 @@ "section": "def-public.ThemeServiceStart", "text": "ThemeServiceStart" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/react/kibana_context/theme/with_theme.tsx", "deprecated": false, diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index eb43a8e747d11..c38d9bb4adf14 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_react_kibana_mount.devdocs.json index 9340067e42c1e..7f37d6c028ca7 100644 --- a/api_docs/kbn_react_kibana_mount.devdocs.json +++ b/api_docs/kbn_react_kibana_mount.devdocs.json @@ -29,7 +29,7 @@ "\nUtility component to portal a part of a react application into the provided `MountPoint`." ], "signature": [ - "({ children, setMountPoint, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, setMountPoint, }: React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-mount", "scope": "common", @@ -37,7 +37,7 @@ "section": "def-common.MountPointPortalProps", "text": "MountPointPortalProps" }, - ">>) => React.ReactPortal | null" + ">) => React.ReactPortal | null" ], "path": "packages/react/kibana_mount/mount_point_portal.tsx", "deprecated": false, @@ -51,7 +51,7 @@ "label": "{\n children,\n setMountPoint,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/react-kibana-mount", "scope": "common", @@ -59,7 +59,7 @@ "section": "def-common.MountPointPortalProps", "text": "MountPointPortalProps" }, - ">>" + ">" ], "path": "packages/react/kibana_mount/mount_point_portal.tsx", "deprecated": false, @@ -229,7 +229,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/react/kibana_mount/mount_point_portal.tsx", "deprecated": false, diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 61f69006d9b6a..2214cc1d8188f 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-01 +date: 2024-10-02 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 31b2513d2059e..ff0781dfaf8ca 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-01 +date: 2024-10-02 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 ff5a113a597ea..224c2f851e6c8 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-01 +date: 2024-10-02 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 0be339f20f47e..88e84947d44ff 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-01 +date: 2024-10-02 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 e2b8c32308503..be540a09bb843 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-01 +date: 2024-10-02 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 ae355d010e8df..daaf58ad6552a 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-01 +date: 2024-10-02 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 d8d24e9e310c8..ff0ae6f1fea0a 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-01 +date: 2024-10-02 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 56379d994c6af..0285cca1feec4 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-01 +date: 2024-10-02 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 4f6dd7cc454fc..fbed9a45ea331 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-01 +date: 2024-10-02 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 5790ced14523e..1291811e67e20 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-01 +date: 2024-10-02 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 1bd38c8e2deba..5a4e099060f2b 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-01 +date: 2024-10-02 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 adf330132e99f..41a51e322a38f 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-01 +date: 2024-10-02 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 de177903c61cb..f69fa6ad2429b 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-01 +date: 2024-10-02 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 8bb958aa52a56..2719cab81ddf7 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-01 +date: 2024-10-02 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 04494f84d39af..e07116c044605 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_reporting_public.devdocs.json index 7fce7fe5bf0c1..c3bc7ab3007fd 100644 --- a/api_docs/kbn_reporting_public.devdocs.json +++ b/api_docs/kbn_reporting_public.devdocs.json @@ -532,7 +532,7 @@ "label": "getStatusMessage", "description": [], "signature": [ - "() => JSX.Element | null" + "() => React.JSX.Element | null" ], "path": "packages/kbn-reporting/public/job.tsx", "deprecated": false, @@ -642,7 +642,7 @@ "label": "getCreatedAtLabel", "description": [], "signature": [ - "() => string | JSX.Element" + "() => string | React.JSX.Element" ], "path": "packages/kbn-reporting/public/job.tsx", "deprecated": false, @@ -690,7 +690,7 @@ "label": "getWarnings", "description": [], "signature": [ - "() => JSX.Element | undefined" + "() => React.JSX.Element | undefined" ], "path": "packages/kbn-reporting/public/job.tsx", "deprecated": false, @@ -1562,7 +1562,7 @@ "label": "InternalApiClientProvider", "description": [], "signature": [ - "({ apiClient, http, children }: React.PropsWithChildren<React.PropsWithChildren<{ apiClient: ", + "({ apiClient, http, children }: React.PropsWithChildren<{ apiClient: ", { "pluginId": "@kbn/reporting-public", "scope": "public", @@ -1578,7 +1578,7 @@ "section": "def-public.HttpSetup", "text": "HttpSetup" }, - "; }>>) => JSX.Element" + "; }>) => React.JSX.Element" ], "path": "packages/kbn-reporting/public/context.tsx", "deprecated": false, @@ -1592,7 +1592,7 @@ "label": "{ apiClient, http, children }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<{ apiClient: ", + "React.PropsWithChildren<{ apiClient: ", { "pluginId": "@kbn/reporting-public", "scope": "public", @@ -1608,7 +1608,7 @@ "section": "def-public.HttpSetup", "text": "HttpSetup" }, - "; }>>" + "; }>" ], "path": "packages/kbn-reporting/public/context.tsx", "deprecated": false, diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 538185e68f8d6..b384b8655fe91 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-01 +date: 2024-10-02 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 bdaa889ba6c4f..ee09755133c78 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.devdocs.json b/api_docs/kbn_resizable_layout.devdocs.json index c2cf3ccc8a98b..0e44d8bd2673d 100644 --- a/api_docs/kbn_resizable_layout.devdocs.json +++ b/api_docs/kbn_resizable_layout.devdocs.json @@ -44,7 +44,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index d7dfe2cdb88e1..13e5106ddd9ad 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-01 +date: 2024-10-02 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 97881df306f85..adc97ad5ffb54 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-01 +date: 2024-10-02 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_rison.mdx b/api_docs/kbn_rison.mdx index f1eceba31c1e4..bf67ff0888678 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.devdocs.json b/api_docs/kbn_rollup.devdocs.json index 0fe1e0a1d1a4a..508f97802119c 100644 --- a/api_docs/kbn_rollup.devdocs.json +++ b/api_docs/kbn_rollup.devdocs.json @@ -27,7 +27,7 @@ "label": "RollupDeprecationTooltip", "description": [], "signature": [ - "({ children }: RollupDeprecationTooltipProps) => JSX.Element" + "({ children }: RollupDeprecationTooltipProps) => React.JSX.Element" ], "path": "x-pack/packages/rollup/src/rollup_deprecation_tooltip/rollup_deprecation_tooltip.tsx", "deprecated": false, diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 676993b297271..4ae50435b4867 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-01 +date: 2024-10-02 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 3020ce64ffb07..e83df7b51355e 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-01 +date: 2024-10-02 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 65a1058e9daeb..cd1f81d5a0cb1 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-01 +date: 2024-10-02 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 b1aa26a7e951f..fc9e5740f99d4 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.devdocs.json b/api_docs/kbn_rule_data_utils.devdocs.json index 436eb1fe6cf2d..9a791805d926e 100644 --- a/api_docs/kbn_rule_data_utils.devdocs.json +++ b/api_docs/kbn_rule_data_utils.devdocs.json @@ -1894,7 +1894,7 @@ "label": "TechnicalRuleDataFieldName", "description": [], "signature": [ - "\"@timestamp\" | \"event.action\" | \"tags\" | \"kibana\" | \"kibana.alert.rule.rule_type_id\" | \"kibana.alert.rule.consumer\" | \"kibana.alert.rule.execution.uuid\" | \"kibana.alert.instance.id\" | \"kibana.alert.rule.category\" | \"kibana.alert.rule.name\" | \"kibana.alert.rule.producer\" | \"kibana.alert.rule.uuid\" | \"kibana.alert.status\" | \"kibana.alert.uuid\" | \"kibana.space_ids\" | \"event.kind\" | \"kibana.alert.action_group\" | \"kibana.alert.case_ids\" | \"kibana.alert.duration.us\" | \"kibana.alert.end\" | \"kibana.alert.flapping\" | \"kibana.alert.maintenance_window_ids\" | \"kibana.alert.reason\" | \"kibana.alert.rule.parameters\" | \"kibana.alert.rule.tags\" | \"kibana.alert.start\" | \"kibana.alert.time_range\" | \"kibana.alert.workflow_assignee_ids\" | \"kibana.alert.workflow_status\" | \"kibana.alert.workflow_tags\" | \"kibana.version\" | \"kibana.alert.context\" | \"kibana.alert.evaluation.threshold\" | \"kibana.alert.evaluation.value\" | \"kibana.alert.evaluation.values\" | \"kibana.alert.group\" | \"ecs.version\" | \"kibana.alert.risk_score\" | \"kibana.alert.rule.author\" | \"kibana.alert.rule.created_at\" | \"kibana.alert.rule.created_by\" | \"kibana.alert.rule.description\" | \"kibana.alert.rule.enabled\" | \"kibana.alert.rule.from\" | \"kibana.alert.rule.interval\" | \"kibana.alert.rule.license\" | \"kibana.alert.rule.note\" | \"kibana.alert.rule.references\" | \"kibana.alert.rule.rule_id\" | \"kibana.alert.rule.rule_name_override\" | \"kibana.alert.rule.to\" | \"kibana.alert.rule.type\" | \"kibana.alert.rule.updated_at\" | \"kibana.alert.rule.updated_by\" | \"kibana.alert.rule.version\" | \"kibana.alert.severity\" | \"kibana.alert.suppression.docs_count\" | \"kibana.alert.suppression.end\" | \"kibana.alert.suppression.start\" | \"kibana.alert.suppression.terms.field\" | \"kibana.alert.suppression.terms.value\" | \"kibana.alert.system_status\" | \"kibana.alert.workflow_reason\" | \"kibana.alert.workflow_user\" | \"event.module\" | \"kibana.alert.rule.threat.framework\" | \"kibana.alert.rule.threat.tactic.id\" | \"kibana.alert.rule.threat.tactic.name\" | \"kibana.alert.rule.threat.tactic.reference\" | \"kibana.alert.rule.threat.technique.id\" | \"kibana.alert.rule.threat.technique.name\" | \"kibana.alert.rule.threat.technique.reference\" | \"kibana.alert.rule.threat.technique.subtechnique.id\" | \"kibana.alert.rule.threat.technique.subtechnique.name\" | \"kibana.alert.rule.threat.technique.subtechnique.reference\" | \"kibana.alert.building_block_type\" | \"kibana.alert\" | \"kibana.alert.group.field\" | \"kibana.alert.group.value\" | \"kibana.alert.rule\" | \"kibana.alert.rule.exceptions_list\" | \"kibana.alert.rule.namespace\" | \"kibana.alert.suppression.terms\"" + "\"@timestamp\" | \"event.action\" | \"tags\" | \"kibana\" | \"kibana.alert.rule.rule_type_id\" | \"kibana.alert.rule.consumer\" | \"kibana.alert.rule.execution.uuid\" | \"kibana.alert.instance.id\" | \"kibana.alert.rule.category\" | \"kibana.alert.rule.name\" | \"kibana.alert.rule.producer\" | \"kibana.alert.rule.uuid\" | \"kibana.alert.status\" | \"kibana.alert.uuid\" | \"kibana.space_ids\" | \"event.kind\" | \"kibana.alert.action_group\" | \"kibana.alert.case_ids\" | \"kibana.alert.duration.us\" | \"kibana.alert.end\" | \"kibana.alert.flapping\" | \"kibana.alert.maintenance_window_ids\" | \"kibana.alert.reason\" | \"kibana.alert.rule.parameters\" | \"kibana.alert.rule.tags\" | \"kibana.alert.start\" | \"kibana.alert.time_range\" | \"kibana.alert.workflow_assignee_ids\" | \"kibana.alert.workflow_status\" | \"kibana.alert.workflow_tags\" | \"kibana.version\" | \"kibana.alert.context\" | \"kibana.alert.evaluation.threshold\" | \"kibana.alert.evaluation.value\" | \"kibana.alert.evaluation.values\" | \"kibana.alert.group\" | \"ecs.version\" | \"kibana.alert.risk_score\" | \"kibana.alert.rule.author\" | \"kibana.alert.rule.created_at\" | \"kibana.alert.rule.created_by\" | \"kibana.alert.rule.description\" | \"kibana.alert.rule.enabled\" | \"kibana.alert.rule.from\" | \"kibana.alert.rule.interval\" | \"kibana.alert.rule.license\" | \"kibana.alert.rule.note\" | \"kibana.alert.rule.references\" | \"kibana.alert.rule.rule_id\" | \"kibana.alert.rule.rule_name_override\" | \"kibana.alert.rule.to\" | \"kibana.alert.rule.type\" | \"kibana.alert.rule.updated_at\" | \"kibana.alert.rule.updated_by\" | \"kibana.alert.rule.version\" | \"kibana.alert.severity\" | \"kibana.alert.suppression.docs_count\" | \"kibana.alert.suppression.end\" | \"kibana.alert.suppression.start\" | \"kibana.alert.suppression.terms.field\" | \"kibana.alert.suppression.terms.value\" | \"kibana.alert.system_status\" | \"kibana.alert.workflow_reason\" | \"kibana.alert.workflow_user\" | \"event.module\" | \"kibana.alert.rule.threat.framework\" | \"kibana.alert.rule.threat.tactic.id\" | \"kibana.alert.rule.threat.tactic.name\" | \"kibana.alert.rule.threat.tactic.reference\" | \"kibana.alert.rule.threat.technique.id\" | \"kibana.alert.rule.threat.technique.name\" | \"kibana.alert.rule.threat.technique.reference\" | \"kibana.alert.rule.threat.technique.subtechnique.id\" | \"kibana.alert.rule.threat.technique.subtechnique.name\" | \"kibana.alert.rule.threat.technique.subtechnique.reference\" | \"kibana.alert.building_block_type\" | \"kibana.alert\" | \"kibana.alert.rule\" | \"kibana.alert.suppression.terms\" | \"kibana.alert.group.field\" | \"kibana.alert.group.value\" | \"kibana.alert.rule.exceptions_list\" | \"kibana.alert.rule.namespace\"" ], "path": "packages/kbn-rule-data-utils/src/technical_field_names.ts", "deprecated": false, diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 620239d122974..ffb673c9d051f 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-01 +date: 2024-10-02 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 fe6fe2a88f538..8cd4d09355895 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-01 +date: 2024-10-02 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 efc465e25225a..6cb85e6503473 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.devdocs.json b/api_docs/kbn_search_api_panels.devdocs.json index 0df592a7e0c6f..78824e760c8fc 100644 --- a/api_docs/kbn_search_api_panels.devdocs.json +++ b/api_docs/kbn_search_api_panels.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.CloudDetailsPanelProps", "text": "CloudDetailsPanelProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/cloud_details.tsx", "deprecated": false, @@ -74,7 +74,7 @@ "label": "CodeBox", "description": [], "signature": [ - "({ application, codeSnippet, consolePlugin, languageType, languages, assetBasePath, selectedLanguage, setSelectedLanguage, sharePlugin, consoleRequest, consoleTitle, showTopBar, }: React.PropsWithChildren<CodeBoxProps>) => JSX.Element" + "({ application, codeSnippet, consolePlugin, languageType, languages, assetBasePath, selectedLanguage, setSelectedLanguage, sharePlugin, consoleRequest, consoleTitle, showTopBar, }: CodeBoxProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/code_box.tsx", "deprecated": false, @@ -83,12 +83,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.CodeBox.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n application,\n codeSnippet,\n consolePlugin,\n languageType,\n languages,\n assetBasePath,\n selectedLanguage,\n setSelectedLanguage,\n sharePlugin,\n consoleRequest,\n consoleTitle,\n showTopBar = true,\n}", "description": [], "signature": [ - "React.PropsWithChildren<CodeBoxProps>" + "CodeBoxProps" ], "path": "packages/kbn-search-api-panels/components/code_box.tsx", "deprecated": false, @@ -293,7 +293,7 @@ "label": "GithubLink", "description": [], "signature": [ - "({ assetBasePath, label, href, \"aria-label\": ariaLabel }: React.PropsWithChildren<{ assetBasePath: string; label: string; href: string; 'aria-label'?: string | undefined; }>) => JSX.Element" + "({ assetBasePath, label, href, \"aria-label\": ariaLabel }: { assetBasePath: string; label: string; href: string; 'aria-label'?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/github_link.tsx", "deprecated": false, @@ -302,12 +302,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.GithubLink.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ assetBasePath, label, href, 'aria-label': ariaLabel }", "description": [], "signature": [ - "React.PropsWithChildren<{ assetBasePath: string; label: string; href: string; 'aria-label'?: string | undefined; }>" + "{ assetBasePath: string; label: string; href: string; 'aria-label'?: string | undefined; }" ], "path": "packages/kbn-search-api-panels/components/github_link.tsx", "deprecated": false, @@ -326,7 +326,7 @@ "label": "IngestData", "description": [], "signature": [ - "({ codeSnippet, selectedLanguage, selectedPipeline, setSelectedLanguage, docLinks, assetBasePath, application, consolePlugin, sharePlugin, languages, consoleRequest, additionalIngestionPanel, ingestPipelineData, setSelectedPipeline, defaultIngestPipeline, }: React.PropsWithChildren<IngestDataProps>) => JSX.Element" + "({ codeSnippet, selectedLanguage, selectedPipeline, setSelectedLanguage, docLinks, assetBasePath, application, consolePlugin, sharePlugin, languages, consoleRequest, additionalIngestionPanel, ingestPipelineData, setSelectedPipeline, defaultIngestPipeline, }: IngestDataProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/ingest_data.tsx", "deprecated": false, @@ -335,12 +335,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.IngestData.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n codeSnippet,\n selectedLanguage,\n selectedPipeline,\n setSelectedLanguage,\n docLinks,\n assetBasePath,\n application,\n consolePlugin,\n sharePlugin,\n languages,\n consoleRequest,\n additionalIngestionPanel,\n ingestPipelineData,\n setSelectedPipeline,\n defaultIngestPipeline,\n}", "description": [], "signature": [ - "React.PropsWithChildren<IngestDataProps>" + "IngestDataProps" ], "path": "packages/kbn-search-api-panels/components/ingest_data.tsx", "deprecated": false, @@ -359,7 +359,7 @@ "label": "IngestionsPanel", "description": [], "signature": [ - "({ additionalIngestionPanel, docLinks, assetBasePath, }: React.PropsWithChildren<IngestionPanelProps>) => JSX.Element" + "({ additionalIngestionPanel, docLinks, assetBasePath, }: IngestionPanelProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/ingestions_panel.tsx", "deprecated": false, @@ -368,12 +368,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.IngestionsPanel.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n additionalIngestionPanel,\n docLinks,\n assetBasePath,\n}", "description": [], "signature": [ - "React.PropsWithChildren<IngestionPanelProps>" + "IngestionPanelProps" ], "path": "packages/kbn-search-api-panels/components/ingestions_panel.tsx", "deprecated": false, @@ -392,7 +392,7 @@ "label": "IngestPipelinePanel", "description": [], "signature": [ - "({ selectedPipeline, setSelectedPipeline, ingestPipelinesData, defaultIngestPipeline, }: React.PropsWithChildren<IngestPipelinePanelProps>) => JSX.Element" + "({ selectedPipeline, setSelectedPipeline, ingestPipelinesData, defaultIngestPipeline, }: IngestPipelinePanelProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/ingest_pipelines/ingest_pipeline_panel.tsx", "deprecated": false, @@ -401,12 +401,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.IngestPipelinePanel.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n selectedPipeline,\n setSelectedPipeline,\n ingestPipelinesData,\n defaultIngestPipeline,\n}", "description": [], "signature": [ - "React.PropsWithChildren<IngestPipelinePanelProps>" + "IngestPipelinePanelProps" ], "path": "packages/kbn-search-api-panels/components/ingest_pipelines/ingest_pipeline_panel.tsx", "deprecated": false, @@ -425,7 +425,7 @@ "label": "InstallClientPanel", "description": [], "signature": [ - "({ codeSnippet, consoleRequest, language, languages, setSelectedLanguage, assetBasePath, application, sharePlugin, isPanelLeft, overviewPanelProps, }: React.PropsWithChildren<InstallClientProps>) => JSX.Element" + "({ codeSnippet, consoleRequest, language, languages, setSelectedLanguage, assetBasePath, application, sharePlugin, isPanelLeft, overviewPanelProps, }: InstallClientProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/install_client.tsx", "deprecated": false, @@ -434,12 +434,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.InstallClientPanel.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n codeSnippet,\n consoleRequest,\n language,\n languages,\n setSelectedLanguage,\n assetBasePath,\n application,\n sharePlugin,\n isPanelLeft = true,\n overviewPanelProps,\n}", "description": [], "signature": [ - "React.PropsWithChildren<InstallClientProps>" + "InstallClientProps" ], "path": "packages/kbn-search-api-panels/components/install_client.tsx", "deprecated": false, @@ -458,7 +458,7 @@ "label": "LanguageClientPanel", "description": [], "signature": [ - "({ language, setSelectedLanguage, isSelectedLanguage, assetBasePath, src, }: React.PropsWithChildren<SelectClientProps>) => JSX.Element" + "({ language, setSelectedLanguage, isSelectedLanguage, assetBasePath, src, }: SelectClientProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/language_client_panel.tsx", "deprecated": false, @@ -467,12 +467,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.LanguageClientPanel.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n language,\n setSelectedLanguage,\n isSelectedLanguage,\n assetBasePath,\n src,\n}", "description": [], "signature": [ - "React.PropsWithChildren<SelectClientProps>" + "SelectClientProps" ], "path": "packages/kbn-search-api-panels/components/language_client_panel.tsx", "deprecated": false, @@ -491,7 +491,7 @@ "label": "OverviewPanel", "description": [], "signature": [ - "({ children, description, leftPanelContent, links, rightPanelContent, title, overviewPanelProps, }: React.PropsWithChildren<React.PropsWithChildren<OverviewPanelProps>>) => JSX.Element" + "({ children, description, leftPanelContent, links, rightPanelContent, title, overviewPanelProps, }: React.PropsWithChildren<OverviewPanelProps>) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/overview_panel.tsx", "deprecated": false, @@ -505,7 +505,7 @@ "label": "{\n children,\n description,\n leftPanelContent,\n links,\n rightPanelContent,\n title,\n overviewPanelProps,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<OverviewPanelProps>>" + "React.PropsWithChildren<OverviewPanelProps>" ], "path": "packages/kbn-search-api-panels/components/overview_panel.tsx", "deprecated": false, @@ -524,7 +524,7 @@ "label": "PipelinePanel", "description": [], "signature": [ - "({ clusterImage, cutImage, reporterImage, }: React.PropsWithChildren<PipelinePanelProps>) => JSX.Element" + "({ clusterImage, cutImage, reporterImage, }: PipelinePanelProps) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/pipeline_panel.tsx", "deprecated": false, @@ -533,12 +533,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.PipelinePanel.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n clusterImage,\n cutImage,\n reporterImage,\n}", "description": [], "signature": [ - "React.PropsWithChildren<PipelinePanelProps>" + "PipelinePanelProps" ], "path": "packages/kbn-search-api-panels/components/pipeline_panel.tsx", "deprecated": false, @@ -557,7 +557,7 @@ "label": "PreprocessDataPanel", "description": [], "signature": [ - "({ docLinks, images }: React.PropsWithChildren<{ docLinks: { arrayOrJson: string; dataEnrichment: string; dataFiltering: string; dataTransformation: string; pipelineHandling: string; }; images: { dataEnrichment: string; dataTransformation: string; dataFiltering: string; pipelineHandling: string; arrayHandling: string; }; }>) => JSX.Element" + "({ docLinks, images }: { docLinks: { arrayOrJson: string; dataEnrichment: string; dataFiltering: string; dataTransformation: string; pipelineHandling: string; }; images: { dataEnrichment: string; dataTransformation: string; dataFiltering: string; pipelineHandling: string; arrayHandling: string; }; }) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/preprocess_data.tsx", "deprecated": false, @@ -566,12 +566,12 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.PreprocessDataPanel.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ docLinks, images }", "description": [], "signature": [ - "React.PropsWithChildren<{ docLinks: { arrayOrJson: string; dataEnrichment: string; dataFiltering: string; dataTransformation: string; pipelineHandling: string; }; images: { dataEnrichment: string; dataTransformation: string; dataFiltering: string; pipelineHandling: string; arrayHandling: string; }; }>" + "{ docLinks: { arrayOrJson: string; dataEnrichment: string; dataFiltering: string; dataTransformation: string; pipelineHandling: string; }; images: { dataEnrichment: string; dataTransformation: string; dataFiltering: string; pipelineHandling: string; arrayHandling: string; }; }" ], "path": "packages/kbn-search-api-panels/components/preprocess_data.tsx", "deprecated": false, @@ -590,7 +590,7 @@ "label": "SelectClientPanel", "description": [], "signature": [ - "({ docLinks, children, isPanelLeft, overviewPanelProps, callout, application, consolePlugin, sharePlugin, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ docLinks, children, isPanelLeft, overviewPanelProps, callout, application, consolePlugin, sharePlugin, }: React.PropsWithChildren<", { "pluginId": "@kbn/search-api-panels", "scope": "common", @@ -598,7 +598,7 @@ "section": "def-common.SelectClientPanelProps", "text": "SelectClientPanelProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/components/select_client.tsx", "deprecated": false, @@ -612,7 +612,7 @@ "label": "{\n docLinks,\n children,\n isPanelLeft = true,\n overviewPanelProps,\n callout,\n application,\n consolePlugin,\n sharePlugin,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/search-api-panels", "scope": "common", @@ -620,7 +620,7 @@ "section": "def-common.SelectClientPanelProps", "text": "SelectClientPanelProps" }, - ">>" + ">" ], "path": "packages/kbn-search-api-panels/components/select_client.tsx", "deprecated": false, @@ -639,7 +639,7 @@ "label": "WelcomeBanner", "description": [], "signature": [ - "({ user, assetBasePath, image, showDescription, }: React.PropsWithChildren<", + "({ user, assetBasePath, image, showDescription, }: ", { "pluginId": "@kbn/search-api-panels", "scope": "common", @@ -647,7 +647,7 @@ "section": "def-common.WelcomeBannerProps", "text": "WelcomeBannerProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-search-api-panels/index.tsx", "deprecated": false, @@ -656,20 +656,18 @@ { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.WelcomeBanner.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n user,\n assetBasePath,\n image,\n showDescription = true,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/search-api-panels", "scope": "common", "docId": "kibKbnSearchApiPanelsPluginApi", "section": "def-common.WelcomeBannerProps", "text": "WelcomeBannerProps" - }, - ">" + } ], "path": "packages/kbn-search-api-panels/index.tsx", "deprecated": false, @@ -1161,7 +1159,7 @@ "label": "callout", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-search-api-panels/components/select_client.tsx", "deprecated": false, @@ -1257,7 +1255,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-search-api-panels/components/select_client.tsx", "deprecated": false, diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 822b29919a2d2..28eb8f60431d8 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json index 64c4483afe159..8ba7cd585e60f 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -214,7 +214,7 @@ "label": "ConnectorConfigurationComponent", "description": [], "signature": [ - "({ children, connector, hasPlatinumLicense, isLoading, saveConfig, subscriptionLink, stackManagementLink, }: React.PropsWithChildren<React.PropsWithChildren<ConnectorConfigurationProps>>) => JSX.Element" + "({ children, connector, hasPlatinumLicense, isLoading, saveConfig, subscriptionLink, stackManagementLink, }: React.PropsWithChildren<ConnectorConfigurationProps>) => React.JSX.Element" ], "path": "packages/kbn-search-connectors/components/configuration/connector_configuration.tsx", "deprecated": false, @@ -228,7 +228,7 @@ "label": "{\n children,\n connector,\n hasPlatinumLicense,\n isLoading,\n saveConfig,\n subscriptionLink,\n stackManagementLink,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<ConnectorConfigurationProps>>" + "React.PropsWithChildren<ConnectorConfigurationProps>" ], "path": "packages/kbn-search-connectors/components/configuration/connector_configuration.tsx", "deprecated": false, @@ -1107,7 +1107,7 @@ "section": "def-server.ElasticsearchClient", "text": "ElasticsearchClient" }, - ", connectorId?: string | undefined, from?: number, size?: number, syncJobType?: \"all\" | \"content\" | \"access_control\", syncStatus?: ", + ", connectorId?: string | undefined, from?: number, size?: number, syncJobType?: \"content\" | \"all\" | \"access_control\", syncStatus?: ", { "pluginId": "@kbn/search-connectors", "scope": "common", @@ -1211,7 +1211,7 @@ "label": "syncJobType", "description": [], "signature": [ - "\"all\" | \"content\" | \"access_control\"" + "\"content\" | \"all\" | \"access_control\"" ], "path": "packages/kbn-search-connectors/lib/fetch_sync_jobs.ts", "deprecated": false, @@ -1764,7 +1764,7 @@ "label": "SyncJobsTable", "description": [], "signature": [ - "({ isLoading, onPaginate, pagination, syncJobs, type, cancelConfirmModalProps, }: React.PropsWithChildren<SyncJobHistoryTableProps>) => JSX.Element" + "({ isLoading, onPaginate, pagination, syncJobs, type, cancelConfirmModalProps, }: SyncJobHistoryTableProps) => React.JSX.Element" ], "path": "packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx", "deprecated": false, @@ -1773,12 +1773,12 @@ { "parentPluginId": "@kbn/search-connectors", "id": "def-common.SyncJobsTable.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n isLoading,\n onPaginate,\n pagination,\n syncJobs,\n type,\n cancelConfirmModalProps = {\n onConfirmCb: () => {},\n isLoading: false,\n setSyncJobIdToCancel: () => {},\n syncJobIdToCancel: undefined,\n },\n}", "description": [], "signature": [ - "React.PropsWithChildren<SyncJobHistoryTableProps>" + "SyncJobHistoryTableProps" ], "path": "packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx", "deprecated": false, @@ -6685,7 +6685,7 @@ "section": "def-common.SyncStatus", "text": "SyncStatus" }, - "; created_at: string; metadata: Record<string, unknown>; job_type: ", + "; metadata: Record<string, unknown>; created_at: string; job_type: ", { "pluginId": "@kbn/search-connectors", "scope": "common", diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index b357dd1a442e5..ef7b1b686c415 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.devdocs.json b/api_docs/kbn_search_errors.devdocs.json index 9721675c6333b..21ea7d8698f58 100644 --- a/api_docs/kbn_search_errors.devdocs.json +++ b/api_docs/kbn_search_errors.devdocs.json @@ -136,7 +136,7 @@ "label": "getErrorMessage", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/kbn-search-errors/src/es_error.tsx", "deprecated": false, @@ -152,7 +152,7 @@ "label": "getActions", "description": [], "signature": [ - "() => JSX.Element[]" + "() => React.JSX.Element[]" ], "path": "packages/kbn-search-errors/src/es_error.tsx", "deprecated": false, diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 6231fe929240f..e002ca5eb8e45 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_search_index_documents.devdocs.json index 31ad3500d1674..898afd3c6a698 100644 --- a/api_docs/kbn_search_index_documents.devdocs.json +++ b/api_docs/kbn_search_index_documents.devdocs.json @@ -27,7 +27,7 @@ "label": "DocumentList", "description": [], "signature": [ - "({ dataTelemetryIdPrefix, docs, docsPerPage, isLoading, mappings, meta, onPaginate, setDocsPerPage, }: React.PropsWithChildren<DocumentListProps>) => JSX.Element" + "({ dataTelemetryIdPrefix, docs, docsPerPage, isLoading, mappings, meta, onPaginate, setDocsPerPage, onDocumentClick, resultProps, }: DocumentListProps) => React.JSX.Element" ], "path": "packages/kbn-search-index-documents/components/document_list.tsx", "deprecated": false, @@ -36,12 +36,12 @@ { "parentPluginId": "@kbn/search-index-documents", "id": "def-common.DocumentList.$1", - "type": "CompoundType", + "type": "Object", "tags": [], - "label": "{\n dataTelemetryIdPrefix,\n docs,\n docsPerPage,\n isLoading,\n mappings,\n meta,\n onPaginate,\n setDocsPerPage,\n}", + "label": "{\n dataTelemetryIdPrefix,\n docs,\n docsPerPage,\n isLoading,\n mappings,\n meta,\n onPaginate,\n setDocsPerPage,\n onDocumentClick,\n resultProps = {},\n}", "description": [], "signature": [ - "React.PropsWithChildren<DocumentListProps>" + "DocumentListProps" ], "path": "packages/kbn-search-index-documents/components/document_list.tsx", "deprecated": false, @@ -60,7 +60,7 @@ "label": "DocumentsOverview", "description": [], "signature": [ - "({ accessControlSwitch, dataTelemetryIdPrefix, documentComponent, searchQueryCallback, }: React.PropsWithChildren<DocumentsProps>) => JSX.Element" + "({ accessControlSwitch, dataTelemetryIdPrefix, documentComponent, searchQueryCallback, }: DocumentsProps) => React.JSX.Element" ], "path": "packages/kbn-search-index-documents/components/documents_overview.tsx", "deprecated": false, @@ -69,12 +69,12 @@ { "parentPluginId": "@kbn/search-index-documents", "id": "def-common.DocumentsOverview.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n accessControlSwitch,\n dataTelemetryIdPrefix,\n documentComponent,\n searchQueryCallback,\n}", "description": [], "signature": [ - "React.PropsWithChildren<DocumentsProps>" + "DocumentsProps" ], "path": "packages/kbn-search-index-documents/components/documents_overview.tsx", "deprecated": false, @@ -274,7 +274,9 @@ "label": "Result", "description": [], "signature": [ - "({ metaData, fields }: React.PropsWithChildren<ResultProps>) => JSX.Element" + "({ metaData, fields, defaultVisibleFields, compactCard, showScore, onDocumentClick, }: ", + "ResultProps", + ") => React.JSX.Element" ], "path": "packages/kbn-search-index-documents/components/result/result.tsx", "deprecated": false, @@ -283,12 +285,12 @@ { "parentPluginId": "@kbn/search-index-documents", "id": "def-common.Result.$1", - "type": "CompoundType", + "type": "Object", "tags": [], - "label": "{ metaData, fields }", + "label": "{\n metaData,\n fields,\n defaultVisibleFields = DEFAULT_VISIBLE_FIELDS,\n compactCard = true,\n showScore = false,\n onDocumentClick,\n}", "description": [], "signature": [ - "React.PropsWithChildren<ResultProps>" + "ResultProps" ], "path": "packages/kbn-search-index-documents/components/result/result.tsx", "deprecated": false, @@ -338,10 +340,64 @@ }, { "parentPluginId": "@kbn/search-index-documents", - "id": "def-common.resultToField", + "id": "def-common.resultToFieldFromMappingResponse", + "type": "Function", + "tags": [], + "label": "resultToFieldFromMappingResponse", + "description": [], + "signature": [ + "(result: ", + "SearchHit", + "<unknown>, mappings?: ", + "IndicesGetMappingResponse", + " | undefined) => { fieldName: string; fieldType: \"boolean\" | \"object\" | \"wildcard\" | \"nested\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"search_as_you_type\" | \"date\" | \"date_nanos\" | \"completion\" | \"version\" | \"murmur3\" | \"token_count\" | \"percolator\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"scaled_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"alias\" | \"join\" | \"rank_feature\" | \"rank_features\" | \"flattened\" | \"shape\" | \"histogram\" | \"constant_keyword\" | \"aggregate_metric_double\" | \"dense_vector\" | \"semantic_text\" | \"sparse_vector\" | \"match_only_text\" | \"icu_collation_keyword\" | \"{dynamic_type}\" | \"point\" | \"unsigned_long\"; fieldValue: string; }[]" + ], + "path": "packages/kbn-search-index-documents/components/result/result_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-index-documents", + "id": "def-common.resultToFieldFromMappingResponse.$1", + "type": "Object", + "tags": [], + "label": "result", + "description": [], + "signature": [ + "SearchHit", + "<unknown>" + ], + "path": "packages/kbn-search-index-documents/components/result/result_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/search-index-documents", + "id": "def-common.resultToFieldFromMappingResponse.$2", + "type": "Object", + "tags": [], + "label": "mappings", + "description": [], + "signature": [ + "IndicesGetMappingResponse", + " | undefined" + ], + "path": "packages/kbn-search-index-documents/components/result/result_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-index-documents", + "id": "def-common.resultToFieldFromMappings", "type": "Function", "tags": [], - "label": "resultToField", + "label": "resultToFieldFromMappings", "description": [], "signature": [ "(result: ", @@ -356,7 +412,7 @@ "children": [ { "parentPluginId": "@kbn/search-index-documents", - "id": "def-common.resultToField.$1", + "id": "def-common.resultToFieldFromMappings.$1", "type": "Object", "tags": [], "label": "result", @@ -372,7 +428,7 @@ }, { "parentPluginId": "@kbn/search-index-documents", - "id": "def-common.resultToField.$2", + "id": "def-common.resultToFieldFromMappings.$2", "type": "Object", "tags": [], "label": "mappings", diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 305809b495e81..9701853421a15 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-ki | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 30 | 0 | 30 | 1 | +| 33 | 0 | 33 | 2 | ## Common diff --git a/api_docs/kbn_search_response_warnings.devdocs.json b/api_docs/kbn_search_response_warnings.devdocs.json index 209fb9c6d178e..2ec9854cc2d2a 100644 --- a/api_docs/kbn_search_response_warnings.devdocs.json +++ b/api_docs/kbn_search_response_warnings.devdocs.json @@ -118,7 +118,7 @@ "label": "SearchResponseWarningsBadge", "description": [], "signature": [ - "(props: Props) => JSX.Element | null" + "(props: Props) => React.JSX.Element | null" ], "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/badge.tsx", "deprecated": false, @@ -151,7 +151,7 @@ "label": "SearchResponseWarningsBadgePopoverContent", "description": [], "signature": [ - "(props: Props) => JSX.Element" + "(props: Props) => React.JSX.Element" ], "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/badge_popover_content.tsx", "deprecated": false, @@ -184,7 +184,7 @@ "label": "SearchResponseWarningsCallout", "description": [], "signature": [ - "(props: Props) => JSX.Element | null" + "(props: Props) => React.JSX.Element | null" ], "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/callout.tsx", "deprecated": false, @@ -217,7 +217,7 @@ "label": "SearchResponseWarningsEmptyPrompt", "description": [], "signature": [ - "(props: Props) => JSX.Element" + "(props: Props) => React.JSX.Element" ], "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/empty_prompt.tsx", "deprecated": false, @@ -250,7 +250,7 @@ "label": "ViewDetailsPopover", "description": [], "signature": [ - "(props: Props) => JSX.Element | null" + "(props: Props) => React.JSX.Element | null" ], "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx", "deprecated": false, diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 6864e29c4df30..0223db3d31a00 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-01 +date: 2024-10-02 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_types.mdx b/api_docs/kbn_search_types.mdx index 8c4b3768c88fb..b1b9ce8380b58 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_security_api_key_management.devdocs.json index 192cf945a9e1b..77d41316d5069 100644 --- a/api_docs/kbn_security_api_key_management.devdocs.json +++ b/api_docs/kbn_security_api_key_management.devdocs.json @@ -285,7 +285,7 @@ "label": "ApiKeyBadge", "description": [], "signature": [ - "({ type }: React.PropsWithChildren<", + "({ type }: ", { "pluginId": "@kbn/security-api-key-management", "scope": "public", @@ -293,7 +293,7 @@ "section": "def-public.ApiKeyBadgeProps", "text": "ApiKeyBadgeProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_badge.tsx", "deprecated": false, @@ -302,20 +302,18 @@ { "parentPluginId": "@kbn/security-api-key-management", "id": "def-public.ApiKeyBadge.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ type }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/security-api-key-management", "scope": "public", "docId": "kibKbnSecurityApiKeyManagementPluginApi", "section": "def-public.ApiKeyBadgeProps", "text": "ApiKeyBadgeProps" - }, - ">" + } ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_badge.tsx", "deprecated": false, @@ -334,7 +332,7 @@ "label": "ApiKeyCreatedCallout", "description": [], "signature": [ - "({ createdApiKey, }: React.PropsWithChildren<", + "({ createdApiKey, }: ", { "pluginId": "@kbn/security-api-key-management", "scope": "public", @@ -342,7 +340,7 @@ "section": "def-public.ApiKeyCreatedCalloutProps", "text": "ApiKeyCreatedCalloutProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", "deprecated": false, @@ -351,20 +349,18 @@ { "parentPluginId": "@kbn/security-api-key-management", "id": "def-public.ApiKeyCreatedCallout.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n createdApiKey,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/security-api-key-management", "scope": "public", "docId": "kibKbnSecurityApiKeyManagementPluginApi", "section": "def-public.ApiKeyCreatedCalloutProps", "text": "ApiKeyCreatedCalloutProps" - }, - ">" + } ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", "deprecated": false, @@ -383,11 +379,11 @@ "label": "ApiKeyFlyout", "description": [], "signature": [ - "({ onSuccess, onCancel, defaultExpiration, defaultMetadata, defaultRoleDescriptors, apiKey, canManageCrossClusterApiKeys, readOnly, currentUser, isLoadingCurrentUser, }: React.PropsWithChildren<(", + "({ onSuccess, onCancel, defaultExpiration, defaultMetadata, defaultRoleDescriptors, apiKey, canManageCrossClusterApiKeys, readOnly, currentUser, isLoadingCurrentUser, }: (", "DisambiguateSet", "<CreateApiKeyFlyoutProps, UpdateApiKeyFlyoutProps> & UpdateApiKeyFlyoutProps) | (", "DisambiguateSet", - "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)>) => JSX.Element" + "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)) => React.JSX.Element" ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", "deprecated": false, @@ -401,11 +397,11 @@ "label": "{\n onSuccess,\n onCancel,\n defaultExpiration,\n defaultMetadata,\n defaultRoleDescriptors,\n apiKey,\n canManageCrossClusterApiKeys = false,\n readOnly = false,\n currentUser,\n isLoadingCurrentUser,\n}", "description": [], "signature": [ - "React.PropsWithChildren<(", + "(", "DisambiguateSet", "<CreateApiKeyFlyoutProps, UpdateApiKeyFlyoutProps> & UpdateApiKeyFlyoutProps) | (", "DisambiguateSet", - "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)>" + "<UpdateApiKeyFlyoutProps, CreateApiKeyFlyoutProps> & CreateApiKeyFlyoutProps)" ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx", "deprecated": false, @@ -424,7 +420,7 @@ "label": "ApiKeySelectableTokenField", "description": [], "signature": [ - "({ createdApiKey, }: React.PropsWithChildren<", + "({ createdApiKey, }: ", { "pluginId": "@kbn/security-api-key-management", "scope": "public", @@ -432,7 +428,7 @@ "section": "def-public.ApiKeyCreatedCalloutProps", "text": "ApiKeyCreatedCalloutProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", "deprecated": false, @@ -441,20 +437,18 @@ { "parentPluginId": "@kbn/security-api-key-management", "id": "def-public.ApiKeySelectableTokenField.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n createdApiKey,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/security-api-key-management", "scope": "public", "docId": "kibKbnSecurityApiKeyManagementPluginApi", "section": "def-public.ApiKeyCreatedCalloutProps", "text": "ApiKeyCreatedCalloutProps" - }, - ">" + } ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_created_callout.tsx", "deprecated": false, @@ -473,7 +467,7 @@ "label": "ApiKeyStatus", "description": [], "signature": [ - "({ expiration }: React.PropsWithChildren<", + "({ expiration }: ", { "pluginId": "@kbn/security-api-key-management", "scope": "public", @@ -481,7 +475,7 @@ "section": "def-public.ApiKeyStatusProps", "text": "ApiKeyStatusProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_status.tsx", "deprecated": false, @@ -490,20 +484,18 @@ { "parentPluginId": "@kbn/security-api-key-management", "id": "def-public.ApiKeyStatus.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ expiration }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/security-api-key-management", "scope": "public", "docId": "kibKbnSecurityApiKeyManagementPluginApi", "section": "def-public.ApiKeyStatusProps", "text": "ApiKeyStatusProps" - }, - ">" + } ], "path": "x-pack/packages/security/api_key_management/src/components/api_key_status.tsx", "deprecated": false, @@ -660,7 +652,7 @@ "label": "TimeToolTip", "description": [], "signature": [ - "({ timestamp, children, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ timestamp, children, }: React.PropsWithChildren<", { "pluginId": "@kbn/security-api-key-management", "scope": "public", @@ -668,7 +660,7 @@ "section": "def-public.TimeToolTipProps", "text": "TimeToolTipProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "x-pack/packages/security/api_key_management/src/components/time_tool_tip.tsx", "deprecated": false, @@ -682,7 +674,7 @@ "label": "{\n timestamp,\n children,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/security-api-key-management", "scope": "public", @@ -690,7 +682,7 @@ "section": "def-public.TimeToolTipProps", "text": "TimeToolTipProps" }, - ">>" + ">" ], "path": "x-pack/packages/security/api_key_management/src/components/time_tool_tip.tsx", "deprecated": false, diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 0c3c20d753cb0..68cacd224893f 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-01 +date: 2024-10-02 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 bb3295a7e618c..77b8f50abb920 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-01 +date: 2024-10-02 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_form_components.devdocs.json b/api_docs/kbn_security_form_components.devdocs.json index e1ef10d6d68de..4fb983c29b46c 100644 --- a/api_docs/kbn_security_form_components.devdocs.json +++ b/api_docs/kbn_security_form_components.devdocs.json @@ -100,7 +100,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -135,7 +135,7 @@ "section": "def-common.FormFieldProps", "text": "FormFieldProps" }, - "<T>>) => JSX.Element" + "<T>>) => React.JSX.Element" ], "path": "x-pack/packages/security/form_components/src/form_field.tsx", "deprecated": false, @@ -188,7 +188,7 @@ "\nComponent that visually indicates whether a field value has changed.\n" ], "signature": [ - "(props: React.PropsWithChildren<React.PropsWithChildren<", + "(props: React.PropsWithChildren<", { "pluginId": "@kbn/security-form-components", "scope": "common", @@ -196,7 +196,7 @@ "section": "def-common.FormLabelProps", "text": "FormLabelProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "x-pack/packages/security/form_components/src/form_label.tsx", "deprecated": false, @@ -210,7 +210,7 @@ "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/security-form-components", "scope": "common", @@ -218,7 +218,7 @@ "section": "def-common.FormLabelProps", "text": "FormLabelProps" }, - ">>" + ">" ], "path": "x-pack/packages/security/form_components/src/form_label.tsx", "deprecated": false, @@ -242,7 +242,7 @@ "\nComponent that renders a form row with all error states for inline validation.\n" ], "signature": [ - "(props: React.PropsWithChildren<((", + "(props: ((", "DisambiguateSet", "<LabelProps, LegendProps> & { labelType?: \"legend\" | undefined; } & ", "CommonProps", @@ -258,7 +258,7 @@ "section": "def-common.FormRowProps", "text": "FormRowProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security/form_components/src/form_row.tsx", "deprecated": false, @@ -272,7 +272,7 @@ "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<((", + "((", "DisambiguateSet", "<LabelProps, LegendProps> & { labelType?: \"legend\" | undefined; } & ", "CommonProps", @@ -287,8 +287,7 @@ "docId": "kibKbnSecurityFormComponentsPluginApi", "section": "def-common.FormRowProps", "text": "FormRowProps" - }, - ">" + } ], "path": "x-pack/packages/security/form_components/src/form_row.tsx", "deprecated": false, @@ -307,7 +306,7 @@ "label": "OptionalText", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "x-pack/packages/security/form_components/src/form_row.tsx", "deprecated": false, diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index ead1434d5bcb1..9c4d004e7eb2b 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-01 +date: 2024-10-02 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 ee51dbd5ec0fc..9032f94ee5909 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-01 +date: 2024-10-02 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 e40ebc36b7bf7..772d1d8af96af 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_security_plugin_types_public.devdocs.json index 11553d5be630e..e325665dd9def 100644 --- a/api_docs/kbn_security_plugin_types_public.devdocs.json +++ b/api_docs/kbn_security_plugin_types_public.devdocs.json @@ -1131,7 +1131,7 @@ "Render a custom ReactNode instead of the default <EuiContextMenuItem />" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/packages/security/plugin_types_public/src/nav_control/nav_control_service.ts", "deprecated": false, diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 442aeeafae6b9..f5d11b1c7b065 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-01 +date: 2024-10-02 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 cf95f79f143d2..5f04238a2d4ce 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-01 +date: 2024-10-02 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 294fb6005b530..791f4d4dfdccf 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-01 +date: 2024-10-02 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 18ebfccd424ad..ec70d3e9c476e 100644 --- a/api_docs/kbn_security_solution_common.devdocs.json +++ b/api_docs/kbn_security_solution_common.devdocs.json @@ -277,9 +277,9 @@ "\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<React.PropsWithChildren<", + "{ ({ header: { title, link, iconType, headerContent }, content: { loading, error }, expand: { expandable, expandedOnFirstRender }, \"data-test-subj\": dataTestSubj, children, }: React.PropsWithChildren<", "ExpandablePanelPanelProps", - ">>): JSX.Element; displayName: string | undefined; }" + ">): React.JSX.Element; displayName: string | undefined; }" ], "path": "x-pack/packages/security-solution/common/src/flyout/common/components/expandable_panel.tsx", "deprecated": false, @@ -293,9 +293,9 @@ "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}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "ExpandablePanelPanelProps", - ">>" + ">" ], "path": "x-pack/packages/security-solution/common/src/flyout/common/components/expandable_panel.tsx", "deprecated": false, @@ -326,14 +326,14 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutBody.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -347,7 +347,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -364,7 +364,7 @@ "\nUse this when you need to show an error state in the flyout" ], "signature": [ - "{ (): JSX.Element; displayName: string | undefined; }" + "{ (): React.JSX.Element; displayName: string | undefined; }" ], "path": "x-pack/packages/security-solution/common/src/flyout/common/components/flyout_error.tsx", "deprecated": false, @@ -393,14 +393,14 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutFooter.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -414,7 +414,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -441,14 +441,14 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutHeader.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -462,7 +462,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -489,14 +489,14 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutHeaderTabs.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -510,7 +510,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -527,9 +527,9 @@ "\nUse this when you need to show a loading state in the flyout" ], "signature": [ - "({ \"data-test-subj\": dataTestSubj, }: React.PropsWithChildren<", + "({ \"data-test-subj\": dataTestSubj, }: ", "FlyoutLoadingProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security-solution/common/src/flyout/common/components/flyout_loading.tsx", "deprecated": false, @@ -538,14 +538,12 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutLoading.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n 'data-test-subj': dataTestSubj = FLYOUT_LOADING_TEST_ID,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "FlyoutLoadingProps", - ">" + "FlyoutLoadingProps" ], "path": "x-pack/packages/security-solution/common/src/flyout/common/components/flyout_loading.tsx", "deprecated": false, @@ -578,14 +576,14 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutNavigation.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -599,7 +597,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -628,14 +626,14 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.FlyoutTitle.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -649,7 +647,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -704,7 +702,7 @@ "label": "HostDetailsButton", "description": [], "signature": [ - "({ children, onClick, title, }: React.PropsWithChildren<HostDetailsButtonProps>) => JSX.Element" + "({ children, onClick, title, }: HostDetailsButtonProps) => React.JSX.Element" ], "path": "x-pack/packages/security-solution/common/src/cells/renderers/host/button.tsx", "deprecated": false, @@ -713,12 +711,12 @@ { "parentPluginId": "@kbn/security-solution-common", "id": "def-public.HostDetailsButton.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n children,\n onClick,\n title,\n}", "description": [], "signature": [ - "React.PropsWithChildren<HostDetailsButtonProps>" + "HostDetailsButtonProps" ], "path": "x-pack/packages/security-solution/common/src/cells/renderers/host/button.tsx", "deprecated": false, @@ -739,7 +737,7 @@ "signature": [ "(props: ", "HostRightPanelParamProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security-solution/common/src/flyout/panels/host/right/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 1696a47a296cc..36c9dbbefd4c8 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_security_solution_distribution_bar.devdocs.json index 3cf8141f6031f..0482e1027f214 100644 --- a/api_docs/kbn_security_solution_distribution_bar.devdocs.json +++ b/api_docs/kbn_security_solution_distribution_bar.devdocs.json @@ -31,14 +31,14 @@ { "parentPluginId": "@kbn/security-solution-distribution-bar", "id": "def-public.DistributionBar.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -52,7 +52,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 46045d49f3be8..2ec54b75d4b6e 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-01 +date: 2024-10-02 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 c297172d64c08..d7eef4e696f06 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_security_solution_navigation.devdocs.json index 50e4bf806e1b4..cfb6285eaefe7 100644 --- a/api_docs/kbn_security_solution_navigation.devdocs.json +++ b/api_docs/kbn_security_solution_navigation.devdocs.json @@ -230,7 +230,7 @@ "label": "NavigationProvider", "description": [], "signature": [ - "({ core, children, }: React.PropsWithChildren<React.PropsWithChildren<{ core: ", + "({ core, children, }: React.PropsWithChildren<{ core: ", { "pluginId": "@kbn/core-lifecycle-browser", "scope": "public", @@ -238,7 +238,7 @@ "section": "def-public.CoreStart", "text": "CoreStart" }, - "; }>>) => JSX.Element" + "; }>) => React.JSX.Element" ], "path": "x-pack/packages/security-solution/navigation/src/context.tsx", "deprecated": false, @@ -252,7 +252,7 @@ "label": "{\n core,\n children,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<{ core: ", + "React.PropsWithChildren<{ core: ", { "pluginId": "@kbn/core-lifecycle-browser", "scope": "public", @@ -260,7 +260,7 @@ "section": "def-public.CoreStart", "text": "CoreStart" }, - "; }>>" + "; }>" ], "path": "x-pack/packages/security-solution/navigation/src/context.tsx", "deprecated": false, diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 2d5366fc3fe86..758a24d45f0c0 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_security_solution_side_nav.devdocs.json index 56cf77078e4b4..dc0cf9c11e579 100644 --- a/api_docs/kbn_security_solution_side_nav.devdocs.json +++ b/api_docs/kbn_security_solution_side_nav.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.SolutionSideNavProps", "text": "SolutionSideNavProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/packages/security-solution/side_nav/src/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index c231f9d32e2e7..f138ebc5c5acc 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-01 +date: 2024-10-02 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 439eee1e67a49..d1010588469a2 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_security_ui_components.devdocs.json index 20238b9a4bcc4..56319c6bea165 100644 --- a/api_docs/kbn_security_ui_components.devdocs.json +++ b/api_docs/kbn_security_ui_components.devdocs.json @@ -125,7 +125,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx", "deprecated": false, @@ -857,7 +857,7 @@ "label": "FeatureTableCell", "description": [], "signature": [ - "({ feature, className }: Props) => JSX.Element" + "({ feature, className }: Props) => React.JSX.Element" ], "path": "x-pack/packages/security/ui_components/src/kibana_privilege_table/components/feature_table_cell.tsx", "deprecated": false, diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index fc1f03d35d65b..0a983fd7f4cb0 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_securitysolution_autocomplete.devdocs.json index 821f1ac19a8b0..c3846fad18e5e 100644 --- a/api_docs/kbn_securitysolution_autocomplete.devdocs.json +++ b/api_docs/kbn_securitysolution_autocomplete.devdocs.json @@ -27,7 +27,7 @@ "label": "AutocompleteFieldExistsComponent", "description": [], "signature": [ - "{ ({ placeholder, rowLabel, \"aria-label\": ariaLabel, }: React.PropsWithChildren<AutocompleteFieldExistsProps>): JSX.Element; displayName: string | undefined; }" + "{ ({ placeholder, rowLabel, \"aria-label\": ariaLabel, }: AutocompleteFieldExistsProps): JSX.Element; displayName: string | undefined; }" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_exists/index.tsx", "deprecated": false, @@ -36,12 +36,12 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.AutocompleteFieldExistsComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n placeholder,\n rowLabel,\n 'aria-label': ariaLabel,\n}", "description": [], "signature": [ - "React.PropsWithChildren<AutocompleteFieldExistsProps>" + "AutocompleteFieldExistsProps" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_exists/index.tsx", "deprecated": false, @@ -60,7 +60,7 @@ "label": "AutocompleteFieldListsComponent", "description": [], "signature": [ - "{ ({ httpService, isClearable, isDisabled, isLoading, onChange, placeholder, rowLabel, selectedField, selectedValue, allowLargeValueLists, \"aria-label\": ariaLabel, showValueListModal, }: React.PropsWithChildren<AutocompleteFieldListsProps>): JSX.Element; displayName: string | undefined; }" + "{ ({ httpService, isClearable, isDisabled, isLoading, onChange, placeholder, rowLabel, selectedField, selectedValue, allowLargeValueLists, \"aria-label\": ariaLabel, showValueListModal, }: AutocompleteFieldListsProps): JSX.Element; displayName: string | undefined; }" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx", "deprecated": false, @@ -69,12 +69,12 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.AutocompleteFieldListsComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n httpService,\n isClearable = false,\n isDisabled = false,\n isLoading = false,\n onChange,\n placeholder,\n rowLabel,\n selectedField,\n selectedValue,\n allowLargeValueLists = false,\n 'aria-label': ariaLabel,\n showValueListModal,\n}", "description": [], "signature": [ - "React.PropsWithChildren<AutocompleteFieldListsProps>" + "AutocompleteFieldListsProps" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx", "deprecated": false, @@ -93,7 +93,7 @@ "label": "AutocompleteFieldMatchAnyComponent", "description": [], "signature": [ - "{ ({ placeholder, rowLabel, selectedField, selectedValue, indexPattern, isLoading, isDisabled, isClearable, isRequired, onChange, onError, autocompleteService, \"aria-label\": ariaLabel, }: React.PropsWithChildren<AutocompleteFieldMatchAnyProps>): JSX.Element; displayName: string | undefined; }" + "{ ({ placeholder, rowLabel, selectedField, selectedValue, indexPattern, isLoading, isDisabled, isClearable, isRequired, onChange, onError, autocompleteService, \"aria-label\": ariaLabel, }: AutocompleteFieldMatchAnyProps): JSX.Element; displayName: string | undefined; }" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.tsx", "deprecated": false, @@ -102,12 +102,12 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.AutocompleteFieldMatchAnyComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n placeholder,\n rowLabel,\n selectedField,\n selectedValue,\n indexPattern,\n isLoading,\n isDisabled = false,\n isClearable = false,\n isRequired = false,\n onChange,\n onError,\n autocompleteService,\n 'aria-label': ariaLabel,\n}", "description": [], "signature": [ - "React.PropsWithChildren<AutocompleteFieldMatchAnyProps>" + "AutocompleteFieldMatchAnyProps" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.tsx", "deprecated": false, @@ -126,7 +126,7 @@ "label": "AutocompleteFieldMatchComponent", "description": [], "signature": [ - "{ ({ placeholder, rowLabel, selectedField, selectedValue, indexPattern, isLoading, isDisabled, isClearable, isRequired, fieldInputWidth, autocompleteService, onChange, onError, onWarning, warning, \"aria-label\": ariaLabel, }: React.PropsWithChildren<AutocompleteFieldMatchProps>): JSX.Element; displayName: string | undefined; }" + "{ ({ placeholder, rowLabel, selectedField, selectedValue, indexPattern, isLoading, isDisabled, isClearable, isRequired, fieldInputWidth, autocompleteService, onChange, onError, onWarning, warning, \"aria-label\": ariaLabel, }: AutocompleteFieldMatchProps): JSX.Element; displayName: string | undefined; }" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_match/index.tsx", "deprecated": false, @@ -135,12 +135,12 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.AutocompleteFieldMatchComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n placeholder,\n rowLabel,\n selectedField,\n selectedValue,\n indexPattern,\n isLoading,\n isDisabled = false,\n isClearable = false,\n isRequired = false,\n fieldInputWidth,\n autocompleteService,\n onChange,\n onError,\n onWarning,\n warning,\n 'aria-label': ariaLabel,\n}", "description": [], "signature": [ - "React.PropsWithChildren<AutocompleteFieldMatchProps>" + "AutocompleteFieldMatchProps" ], "path": "packages/kbn-securitysolution-autocomplete/src/field_value_match/index.tsx", "deprecated": false, @@ -169,14 +169,14 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.AutocompleteFieldWildcardComponent.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -190,7 +190,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -300,9 +300,9 @@ "label": "FieldComponent", "description": [], "signature": [ - "{ ({ fieldInputWidth, fieldTypeFilter, indexPattern, isClearable, isDisabled, isLoading, isRequired, onChange, placeholder, selectedField, acceptsCustomOptions, showMappingConflicts, \"aria-label\": ariaLabel, }: React.PropsWithChildren<", + "{ ({ fieldInputWidth, fieldTypeFilter, indexPattern, isClearable, isDisabled, isLoading, isRequired, onChange, placeholder, selectedField, acceptsCustomOptions, showMappingConflicts, \"aria-label\": ariaLabel, }: ", "FieldProps", - ">): JSX.Element; displayName: string | undefined; }" + "): JSX.Element; displayName: string | undefined; }" ], "path": "packages/kbn-securitysolution-autocomplete/src/field/index.tsx", "deprecated": false, @@ -311,14 +311,12 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.FieldComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n fieldInputWidth,\n fieldTypeFilter = [],\n indexPattern,\n isClearable = false,\n isDisabled = false,\n isLoading = false,\n isRequired = false,\n onChange,\n placeholder,\n selectedField,\n acceptsCustomOptions = false,\n showMappingConflicts = false,\n 'aria-label': ariaLabel,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "FieldProps", - ">" + "FieldProps" ], "path": "packages/kbn-securitysolution-autocomplete/src/field/index.tsx", "deprecated": false, @@ -602,7 +600,7 @@ "label": "OperatorComponent", "description": [], "signature": [ - "{ ({ isClearable, isDisabled, isLoading, onChange, operator, operatorOptions, operatorInputWidth, placeholder, selectedField, \"aria-label\": ariaLabel, }: React.PropsWithChildren<OperatorState>): JSX.Element; displayName: string | undefined; }" + "{ ({ isClearable, isDisabled, isLoading, onChange, operator, operatorOptions, operatorInputWidth, placeholder, selectedField, \"aria-label\": ariaLabel, }: OperatorState): JSX.Element; displayName: string | undefined; }" ], "path": "packages/kbn-securitysolution-autocomplete/src/operator/index.tsx", "deprecated": false, @@ -611,12 +609,12 @@ { "parentPluginId": "@kbn/securitysolution-autocomplete", "id": "def-common.OperatorComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n isClearable = false,\n isDisabled = false,\n isLoading = false,\n onChange,\n operator,\n operatorOptions,\n operatorInputWidth = 150,\n placeholder,\n selectedField,\n 'aria-label': ariaLabel,\n}", "description": [], "signature": [ - "React.PropsWithChildren<OperatorState>" + "OperatorState" ], "path": "packages/kbn-securitysolution-autocomplete/src/operator/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 7dbb5c002c8f7..078d476d84df5 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_securitysolution_data_table.devdocs.json index c074ff6dee2dc..4d412fe3060e5 100644 --- a/api_docs/kbn_securitysolution_data_table.devdocs.json +++ b/api_docs/kbn_securitysolution_data_table.devdocs.json @@ -141,7 +141,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 84ee327e93794..7aa0fb1404380 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-01 +date: 2024-10-02 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 f0823b5e1d707..94f054960f935 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-01 +date: 2024-10-02 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 ebec2fb015012..97f6e7da82f14 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index 57fab17b2e38c..f4eaf16acdc95 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -44,7 +44,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -84,7 +84,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -124,7 +124,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -158,7 +158,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -198,7 +198,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -238,7 +238,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -270,7 +270,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -302,7 +302,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -367,7 +367,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -407,7 +407,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -439,7 +439,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -454,7 +454,7 @@ "label": "ValueWithSpaceWarning", "description": [], "signature": [ - "({ value, tooltipIconType, tooltipIconText, }: React.PropsWithChildren<ValueWithSpaceWarningProps>) => JSX.Element | null" + "({ value, tooltipIconType, tooltipIconText, }: ValueWithSpaceWarningProps) => React.JSX.Element | null" ], "path": "packages/kbn-securitysolution-exception-list-components/src/value_with_space_warning/value_with_space_warning.tsx", "deprecated": false, @@ -463,12 +463,12 @@ { "parentPluginId": "@kbn/securitysolution-exception-list-components", "id": "def-common.ValueWithSpaceWarning.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n value,\n tooltipIconType = 'iInCircle',\n tooltipIconText,\n}", "description": [], "signature": [ - "React.PropsWithChildren<ValueWithSpaceWarningProps>" + "ValueWithSpaceWarningProps" ], "path": "packages/kbn-securitysolution-exception-list-components/src/value_with_space_warning/value_with_space_warning.tsx", "deprecated": false, @@ -487,7 +487,7 @@ "label": "WildCardWithWrongOperatorCallout", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/kbn-securitysolution-exception-list-components/src/wildcard_with_wrong_operator_callout/index.tsx", "deprecated": false, @@ -851,7 +851,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType<any> | \"line\" | \"rect\" | \"code\" | \"ruby\" | \"label\" | \"metadata\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"search\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"set\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"center\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"mark\" | \"menu\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"script\" | \"section\" | \"select\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\" | React.ComponentType<any>" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -865,7 +865,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType<any> | \"line\" | \"rect\" | \"code\" | \"ruby\" | \"label\" | \"metadata\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"search\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"set\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"center\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"mark\" | \"menu\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"script\" | \"section\" | \"select\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\" | React.ComponentType<any>" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -1004,7 +1004,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType<any> | \"line\" | \"rect\" | \"code\" | \"ruby\" | \"label\" | \"metadata\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"search\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"set\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"center\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"mark\" | \"menu\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"script\" | \"section\" | \"select\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\" | React.ComponentType<any>" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1018,7 +1018,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType<any> | \"line\" | \"rect\" | \"code\" | \"ruby\" | \"label\" | \"metadata\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"search\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"set\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"center\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"mark\" | \"menu\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"script\" | \"section\" | \"select\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\" | React.ComponentType<any>" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1144,7 +1144,7 @@ "label": "showValueListModal", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"path\" | \"form\" | React.ComponentType<any> | \"line\" | \"rect\" | \"code\" | \"ruby\" | \"label\" | \"metadata\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"linearGradient\" | \"marker\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"search\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"set\" | \"summary\" | \"template\" | \"span\" | \"q\" | \"body\" | \"html\" | \"stop\" | \"main\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"article\" | \"aside\" | \"audio\" | \"b\" | \"base\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"canvas\" | \"caption\" | \"center\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"form\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"header\" | \"hgroup\" | \"hr\" | \"i\" | \"iframe\" | \"img\" | \"input\" | \"ins\" | \"kbd\" | \"keygen\" | \"label\" | \"legend\" | \"li\" | \"mark\" | \"menu\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"output\" | \"p\" | \"param\" | \"picture\" | \"pre\" | \"progress\" | \"rp\" | \"rt\" | \"ruby\" | \"s\" | \"samp\" | \"script\" | \"section\" | \"select\" | \"strong\" | \"table\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"time\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"svg\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"image\" | \"line\" | \"linearGradient\" | \"marker\" | \"mask\" | \"metadata\" | \"mpath\" | \"path\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\" | React.ComponentType<any>" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 7b53f9a440395..09e6c427a9cb4 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-01 +date: 2024-10-02 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 cb67715b9d258..e3cf7f38de5fe 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-01 +date: 2024-10-02 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 f19904eeb6152..c3b071fb3a567 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-01 +date: 2024-10-02 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 052655a0d647e..bd3d954a963ad 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-01 +date: 2024-10-02 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 8f4681576361c..1c28478a596c2 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-01 +date: 2024-10-02 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 9408b6c7abc37..bd30023dd5f07 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-01 +date: 2024-10-02 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 a271dd803ec63..1f78432f5b1a1 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-01 +date: 2024-10-02 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 4627c050a4f32..595e29a4f8681 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-01 +date: 2024-10-02 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 2ee36434040e5..d90700bc2b030 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-01 +date: 2024-10-02 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 b41d807f98f55..1c2b9ece30575 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-01 +date: 2024-10-02 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 2bfd9e4418955..decb5f963966d 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-01 +date: 2024-10-02 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 f1698e12bedac..580891891f5fb 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-01 +date: 2024-10-02 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 6ed317a594a3c..f70d40ffe1424 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_server_http_tools.devdocs.json index 8a9b443038e43..47a04d6c396b6 100644 --- a/api_docs/kbn_server_http_tools.devdocs.json +++ b/api_docs/kbn_server_http_tools.devdocs.json @@ -232,7 +232,10 @@ "(serverOptions: ", "ServerOptions", ") => ", - "Server" + "Server", + "<", + "ServerApplicationState", + ">" ], "path": "packages/kbn-server-http-tools/src/create_server.ts", "deprecated": false, @@ -269,11 +272,15 @@ "signature": [ "(request: ", "Request", - ", h: ", + "<", + "ReqRefDefaults", + ">, h: ", "ResponseToolkit", ", err: Error | undefined) => ", "Lifecycle", - ".ReturnValue" + ".ReturnValue<", + "ReqRefDefaults", + ">" ], "path": "packages/kbn-server-http-tools/src/default_validation_error_handler.ts", "deprecated": false, @@ -287,7 +294,10 @@ "label": "request", "description": [], "signature": [ - "Request" + "Request", + "<", + "ReqRefDefaults", + ">" ], "path": "packages/kbn-server-http-tools/src/default_validation_error_handler.ts", "deprecated": false, @@ -338,7 +348,9 @@ "signature": [ "(request: ", "Request", - ", { allowFromAnyIp, ipAllowlist }: { allowFromAnyIp: boolean; ipAllowlist: string[]; }) => string" + "<", + "ReqRefDefaults", + ">, { allowFromAnyIp, ipAllowlist }: { allowFromAnyIp: boolean; ipAllowlist: string[]; }) => string" ], "path": "packages/kbn-server-http-tools/src/get_request_id.ts", "deprecated": false, @@ -352,7 +364,10 @@ "label": "request", "description": [], "signature": [ - "Request" + "Request", + "<", + "ReqRefDefaults", + ">" ], "path": "packages/kbn-server-http-tools/src/get_request_id.ts", "deprecated": false, @@ -600,7 +615,9 @@ "signature": [ "(hapiServer: ", "Server", - ", sslConfig: ", + "<", + "ServerApplicationState", + ">, sslConfig: ", { "pluginId": "@kbn/server-http-tools", "scope": "server", @@ -622,7 +639,10 @@ "label": "hapiServer", "description": [], "signature": [ - "Server" + "Server", + "<", + "ServerApplicationState", + ">" ], "path": "packages/kbn-server-http-tools/src/set_tls_config.ts", "deprecated": false, diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 5e6aab4076b37..bf56e6bc679b3 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-01 +date: 2024-10-02 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 0ac9b96ea0033..0a8167a6ad981 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-01 +date: 2024-10-02 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 da5b0c3861248..c003aedc55f03 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-01 +date: 2024-10-02 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 28c6f53f338ae..820678e838715 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-01 +date: 2024-10-02 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 66cc2dd71c445..b563b0325906f 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-01 +date: 2024-10-02 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 d1d24edfe1d8a..fe24a5f151f3a 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_serverless_project_switcher.devdocs.json index e9990727cf9e3..88a2c6c4e841e 100644 --- a/api_docs/kbn_serverless_project_switcher.devdocs.json +++ b/api_docs/kbn_serverless_project_switcher.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.ProjectSwitcherProps", "text": "ProjectSwitcherProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/serverless/project_switcher/src/switcher.tsx", "deprecated": false, @@ -76,7 +76,7 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, coreStart, projectChangeAPIUrl, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, coreStart, projectChangeAPIUrl, }: React.PropsWithChildren<", { "pluginId": "@kbn/serverless-project-switcher", "scope": "common", @@ -84,7 +84,7 @@ "section": "def-common.KibanaDependencies", "text": "KibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/serverless/project_switcher/src/services.tsx", "deprecated": false, @@ -98,7 +98,7 @@ "label": "{\n children,\n coreStart,\n projectChangeAPIUrl,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/serverless-project-switcher", "scope": "common", @@ -106,7 +106,7 @@ "section": "def-common.KibanaDependencies", "text": "KibanaDependencies" }, - ">>" + ">" ], "path": "packages/serverless/project_switcher/src/services.tsx", "deprecated": false, @@ -127,9 +127,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "Services", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/serverless/project_switcher/src/services.tsx", "deprecated": false, @@ -143,9 +143,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "Services", - ">>" + ">" ], "path": "packages/serverless/project_switcher/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 5c6600514349b..d15aa9f768a1d 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-01 +date: 2024-10-02 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 422b0718f072d..b56952a735b5e 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-01 +date: 2024-10-02 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 3df47ff49bbc6..d64fd1e60e742 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-01 +date: 2024-10-02 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 5af347070b05a..7dafc57736635 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-01 +date: 2024-10-02 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 45dd9e3652b88..6e5d8d80bf2cd 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_avatar_solution.devdocs.json index ff876f8b54549..0bddf2dd7defe 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.devdocs.json +++ b/api_docs/kbn_shared_ux_avatar_solution.devdocs.json @@ -37,7 +37,7 @@ "section": "def-common.KibanaSolutionAvatarProps", "text": "KibanaSolutionAvatarProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/avatar/solution/src/solution_avatar.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index a778b905e6398..72972d61b2768 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_button_exit_full_screen.devdocs.json index 2bca1dfcb1064..40c962e76ac54 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.devdocs.json +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.devdocs.json @@ -37,7 +37,7 @@ "section": "def-common.ExitFullScreenButtonProps", "text": "ExitFullScreenButtonProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/button/exit_full_screen/src/exit_full_screen_button.tsx", "deprecated": false, @@ -78,9 +78,9 @@ "\nKibana-specific Provider that maps to known dependency types." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "KibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/button/exit_full_screen/src/services.tsx", "deprecated": false, @@ -94,9 +94,9 @@ "label": "{ children, ...services }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "KibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/button/exit_full_screen/src/services.tsx", "deprecated": false, 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 2210afdc99e0d..af9f2cce96e1f 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_button_toolbar.devdocs.json index 3146768213d07..dfe36332e5efe 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.devdocs.json +++ b/api_docs/kbn_shared_ux_button_toolbar.devdocs.json @@ -37,7 +37,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/button_toolbar/src/buttons/add_from_library/add_from_library.tsx", "deprecated": false, @@ -86,7 +86,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/button_toolbar/src/buttons/icon_button_group/icon_button_group.tsx", "deprecated": false, @@ -135,7 +135,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/button_toolbar/src/toolbar/toolbar.tsx", "deprecated": false, @@ -184,7 +184,7 @@ "section": "def-common.Props", "text": "Props" }, - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/shared-ux/button_toolbar/src/buttons/toolbar_button/toolbar_button.tsx", "deprecated": false, @@ -234,7 +234,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/button_toolbar/src/popover/popover.tsx", "deprecated": false, @@ -535,7 +535,7 @@ "label": "Props", "description": [], "signature": [ - "{ fullWidth?: boolean | undefined; 'aria-label'?: string | undefined; onBlur?: React.FocusEventHandler<HTMLButtonElement> | undefined; onClick?: React.MouseEventHandler<HTMLButtonElement> | undefined; 'data-test-subj'?: string | undefined; isDisabled?: boolean | undefined; isLoading?: boolean | undefined; size?: \"m\" | \"s\" | undefined; as?: \"standard\" | undefined; fontWeight?: ToolbarButtonFontWeights | undefined; iconSide?: ", + "{ fullWidth?: boolean | undefined; \"aria-label\"?: string | undefined; onBlur?: React.FocusEventHandler<HTMLButtonElement> | undefined; onClick?: React.MouseEventHandler<HTMLButtonElement> | undefined; 'data-test-subj'?: string | undefined; isDisabled?: boolean | undefined; isLoading?: boolean | undefined; size?: \"m\" | \"s\" | undefined; as?: \"standard\" | undefined; fontWeight?: ToolbarButtonFontWeights | undefined; iconSide?: ", "ButtonContentIconSide", "; groupPosition?: ButtonPositions | undefined; hasArrow?: boolean | undefined; }" ], @@ -571,7 +571,7 @@ "\nProps for `ToolbarPopover`." ], "signature": [ - "AllowedButtonProps & Omit<AllowedPopoverProps, \"children\"> & { children: (arg: { closePopover: () => void; }) => React.ReactNode; label: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal; }" + "AllowedButtonProps & Omit<AllowedPopoverProps, \"children\"> & { children: (arg: { closePopover: () => void; }) => React.ReactNode; label: string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal; }" ], "path": "packages/shared-ux/button_toolbar/src/popover/popover.tsx", "deprecated": false, @@ -596,7 +596,7 @@ "section": "def-common.Props", "text": "Props" }, - "<T>) => JSX.Element) | (({ type, label, iconType, size, children, isDisabled, ...popover }: ", + "<T>) => React.JSX.Element) | (({ type, label, iconType, size, children, isDisabled, ...popover }: ", { "pluginId": "@kbn/shared-ux-button-toolbar", "scope": "common", @@ -604,7 +604,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element)" + ") => React.JSX.Element)" ], "path": "packages/shared-ux/button_toolbar/src/toolbar/toolbar.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 4f961f45fe04e..f91f31bdcd29e 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_card_no_data.devdocs.json index 379cc89588109..c76e26272c96d 100644 --- a/api_docs/kbn_shared_ux_card_no_data.devdocs.json +++ b/api_docs/kbn_shared_ux_card_no_data.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "({ href: srcHref, category, description, ...props }: ", "NoDataCardComponentProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/card/no_data/impl/src/no_data_card.tsx", "deprecated": false, @@ -48,9 +48,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/card/no_data/impl/src/services.tsx", "deprecated": false, @@ -64,9 +64,9 @@ "label": "{\n children,\n ...dependencies\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/card/no_data/impl/src/services.tsx", "deprecated": false, @@ -87,9 +87,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "NoDataCardServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/card/no_data/impl/src/services.tsx", "deprecated": false, @@ -103,9 +103,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardServices", - ">>" + ">" ], "path": "packages/shared-ux/card/no_data/impl/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index ca899d3281c0a..1b8c520bb15cb 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-01 +date: 2024-10-02 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 500d528d3acd5..d9b4705db10d1 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json index 08f97d756a027..33ac0729359c4 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json +++ b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json @@ -29,14 +29,14 @@ { "parentPluginId": "@kbn/shared-ux-chrome-navigation", "id": "def-public.Navigation.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -50,7 +50,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -67,7 +67,7 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", { "pluginId": "@kbn/shared-ux-chrome-navigation", "scope": "public", @@ -75,7 +75,7 @@ "section": "def-public.NavigationKibanaDependencies", "text": "NavigationKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/chrome/navigation/src/services.tsx", "deprecated": false, @@ -89,7 +89,7 @@ "label": "{\n children,\n ...dependencies\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/shared-ux-chrome-navigation", "scope": "public", @@ -97,7 +97,7 @@ "section": "def-public.NavigationKibanaDependencies", "text": "NavigationKibanaDependencies" }, - ">>" + ">" ], "path": "packages/shared-ux/chrome/navigation/src/services.tsx", "deprecated": false, @@ -118,7 +118,7 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", { "pluginId": "@kbn/shared-ux-chrome-navigation", "scope": "public", @@ -126,7 +126,7 @@ "section": "def-public.NavigationServices", "text": "NavigationServices" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/chrome/navigation/src/services.tsx", "deprecated": false, @@ -140,7 +140,7 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/shared-ux-chrome-navigation", "scope": "public", @@ -148,7 +148,7 @@ "section": "def-public.NavigationServices", "text": "NavigationServices" }, - ">>" + ">" ], "path": "packages/shared-ux/chrome/navigation/src/services.tsx", "deprecated": false, @@ -601,7 +601,7 @@ "label": "title", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/shared-ux/chrome/navigation/src/ui/components/panel/types.ts", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 4cd923b09f9df..ca7eb1ecc4740 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_error_boundary.devdocs.json index cb00d3c51e593..a18ef8bb5b9e7 100644 --- a/api_docs/kbn_shared_ux_error_boundary.devdocs.json +++ b/api_docs/kbn_shared_ux_error_boundary.devdocs.json @@ -29,7 +29,7 @@ "\nImplementation of Kibana Error Boundary" ], "signature": [ - "(props: ErrorBoundaryProps) => JSX.Element" + "(props: ErrorBoundaryProps) => React.JSX.Element" ], "path": "packages/shared-ux/error_boundary/src/ui/error_boundary.tsx", "deprecated": false, @@ -66,9 +66,9 @@ "\nProvider that uses dependencies to give context to the KibanaErrorBoundary component\nThis provider is aware if services were already created from a higher level of the component tree" ], "signature": [ - "({ children, analytics }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, analytics }: React.PropsWithChildren<", "KibanaErrorBoundaryProviderDeps", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx", "deprecated": false, @@ -82,9 +82,9 @@ "label": "{ children, analytics }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "KibanaErrorBoundaryProviderDeps", - ">>" + ">" ], "path": "packages/shared-ux/error_boundary/src/services/error_boundary_services.tsx", "deprecated": false, @@ -105,7 +105,7 @@ "\nThis component allows errors to be caught outside of a render tree, and re-thrown within a render tree\nwrapped by KibanaErrorBoundary. The purpose is to let KibanaErrorBoundary control the user experience when\nReact can not render due to an error.\n" ], "signature": [ - "({ error }: React.PropsWithChildren<{ error: Error | null; }>) => null" + "({ error }: { error: Error | null; }) => null" ], "path": "packages/shared-ux/error_boundary/src/ui/throw_if_error.ts", "deprecated": false, @@ -114,12 +114,12 @@ { "parentPluginId": "@kbn/shared-ux-error-boundary", "id": "def-common.ThrowIfError.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ error }", "description": [], "signature": [ - "React.PropsWithChildren<{ error: Error | null; }>" + "{ error: Error | null; }" ], "path": "packages/shared-ux/error_boundary/src/ui/throw_if_error.ts", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index cce4acd766b90..e69d1b671090c 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_file_context.devdocs.json index d8ae3d2661542..9111933b10457 100644 --- a/api_docs/kbn_shared_ux_file_context.devdocs.json +++ b/api_docs/kbn_shared_ux_file_context.devdocs.json @@ -27,7 +27,7 @@ "label": "FilesContext", "description": [], "signature": [ - "({ client, children }: React.PropsWithChildren<React.PropsWithChildren<ContextProps>>) => JSX.Element" + "({ client, children }: React.PropsWithChildren<ContextProps>) => React.JSX.Element" ], "path": "packages/shared-ux/file/context/src/index.tsx", "deprecated": false, @@ -41,7 +41,7 @@ "label": "{ client, children }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<ContextProps>>" + "React.PropsWithChildren<ContextProps>" ], "path": "packages/shared-ux/file/context/src/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index e7558cea68716..298e694f06b30 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_file_image.devdocs.json index 4dfade1406167..3b23cef427de4 100644 --- a/api_docs/kbn_shared_ux_file_image.devdocs.json +++ b/api_docs/kbn_shared_ux_file_image.devdocs.json @@ -39,7 +39,7 @@ "section": "def-common.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/file/image/impl/src/image.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 5a172df0d1ea7..52aca07ab4dc2 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-01 +date: 2024-10-02 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 560cc9bf1e252..3c51ddebeb452 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-01 +date: 2024-10-02 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 2efb7dbcb2036..f2d8f0f17e28c 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_file_picker.devdocs.json index 1ecf0fc909e4e..8afebe976c729 100644 --- a/api_docs/kbn_shared_ux_file_picker.devdocs.json +++ b/api_docs/kbn_shared_ux_file_picker.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.Props", "text": "Props" }, - "<string>) => JSX.Element" + "<string>) => React.JSX.Element" ], "path": "packages/shared-ux/file/file_picker/impl/src/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 4221f8b6f93e8..8b8a1f4bab114 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-01 +date: 2024-10-02 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 d14f83142105c..76f022d20ba65 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_file_upload.devdocs.json index 82ccfb8816f4f..a3ad0f3d41893 100644 --- a/api_docs/kbn_shared_ux_file_upload.devdocs.json +++ b/api_docs/kbn_shared_ux_file_upload.devdocs.json @@ -35,7 +35,7 @@ "section": "def-common.FileUploadProps", "text": "FileUploadProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/file/file_upload/impl/src/index.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 8fec769c8f044..ed05b184f2bc3 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-01 +date: 2024-10-02 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 7a0adf7dc9606..b8ce0253fd4df 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_link_redirect_app.devdocs.json index 5035b7c940dd1..f2ff63febaf62 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.devdocs.json +++ b/api_docs/kbn_shared_ux_link_redirect_app.devdocs.json @@ -13,9 +13,9 @@ "\nA service-enabled component that provides Kibana-specific functionality to the `RedirectAppLinks`\npure component.\n" ], "signature": [ - "({ children, ...props }: React.PropsWithChildren<Omit<", + "({ children, ...props }: Omit<", "RedirectAppLinksComponentProps", - ", \"navigateToUrl\">>) => JSX.Element" + ", \"navigateToUrl\">) => React.JSX.Element" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx", "deprecated": false, @@ -24,14 +24,14 @@ { "parentPluginId": "@kbn/shared-ux-link-redirect-app", "id": "def-public.RedirectAppLinks.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n children,\n ...props\n}", "description": [], "signature": [ - "React.PropsWithChildren<Omit<", + "Omit<", "RedirectAppLinksComponentProps", - ", \"navigateToUrl\">>" + ", \"navigateToUrl\">" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx", "deprecated": false, @@ -52,9 +52,9 @@ "\nUtility component that will intercept click events on children anchor (`<a>`) elements to call\n`navigateToUrl` with the link's href. This will trigger SPA friendly navigation when the link points\nto a valid Kibana app.\n" ], "signature": [ - "({ children, navigateToUrl, currentAppId, ...containerProps }: React.PropsWithChildren<", + "({ children, navigateToUrl, currentAppId, ...containerProps }: ", "RedirectAppLinksComponentProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.component.tsx", "deprecated": false, @@ -63,14 +63,12 @@ { "parentPluginId": "@kbn/shared-ux-link-redirect-app", "id": "def-public.RedirectAppLinks.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n children,\n navigateToUrl,\n currentAppId,\n ...containerProps\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "RedirectAppLinksComponentProps", - ">" + "RedirectAppLinksComponentProps" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.component.tsx", "deprecated": false, @@ -91,9 +89,9 @@ "\nThis component composes `RedirectAppLinksContainer` with either `RedirectAppLinksProvider` or\n`RedirectAppLinksKibanaProvider` based on the services provided, creating a single component\nwith which consumers can wrap their components or solutions." ], "signature": [ - "({ children, ...props }: React.PropsWithChildren<", + "({ children, ...props }: ", "RedirectAppLinksProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.tsx", "deprecated": false, @@ -107,9 +105,7 @@ "label": "{ children, ...props }", "description": [], "signature": [ - "React.PropsWithChildren<", - "RedirectAppLinksProps", - ">" + "RedirectAppLinksProps" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.tsx", "deprecated": false, @@ -130,9 +126,9 @@ "\nKibana-specific contextual services Provider." ], "signature": [ - "({ children, coreStart }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, coreStart }: React.PropsWithChildren<", "RedirectAppLinksKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/link/redirect_app/impl/src/services.tsx", "deprecated": false, @@ -146,9 +142,9 @@ "label": "{ children, coreStart }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "RedirectAppLinksKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/link/redirect_app/impl/src/services.tsx", "deprecated": false, @@ -169,9 +165,9 @@ "\nContextual services Provider." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "RedirectAppLinksServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/link/redirect_app/impl/src/services.tsx", "deprecated": false, @@ -185,9 +181,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "RedirectAppLinksServices", - ">>" + ">" ], "path": "packages/shared-ux/link/redirect_app/impl/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 3be5475b7c953..7542a20e57e1f 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-01 +date: 2024-10-02 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 d5100ba2c7b18..0281f69853c56 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_markdown.devdocs.json index 78a747e0ffc15..5fd9725ab3274 100644 --- a/api_docs/kbn_shared_ux_markdown.devdocs.json +++ b/api_docs/kbn_shared_ux_markdown.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({ ariaLabelContent, markdownContent, children, className, onRender, openLinksInNewTab, defaultValue, placeholder, height, readOnly, enableTooltipSupport, validateLinks, enableSoftLineBreaks, ...restProps }: ", "MarkdownProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/markdown/impl/markdown.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 9bb184ce62527..6b8ad1b808f13 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-01 +date: 2024-10-02 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 7aa4feefbc35c..b65d561937db5 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_page_analytics_no_data.devdocs.json index 1e47380117503..049109433f78c 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.devdocs.json +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.devdocs.json @@ -15,7 +15,7 @@ "signature": [ "({ onDataViewCreated, onESQLNavigationComplete, allowAdHocDataView, }: ", "AnalyticsNoDataPageProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/analytics_no_data_page.tsx", "deprecated": false, @@ -50,7 +50,7 @@ "\nA pure component of an entire page that can be displayed when Kibana \"has no data\", specifically for Analytics." ], "signature": [ - "({ onDataViewCreated, onESQLNavigationComplete, allowAdHocDataView, showPlainSpinner, ...services }: React.PropsWithChildren<AnalyticsNoDataPageProps>) => JSX.Element" + "({ onDataViewCreated, onESQLNavigationComplete, allowAdHocDataView, showPlainSpinner, ...services }: AnalyticsNoDataPageProps) => React.JSX.Element" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/analytics_no_data_page.component.tsx", "deprecated": false, @@ -64,7 +64,7 @@ "label": "{\n onDataViewCreated,\n onESQLNavigationComplete,\n allowAdHocDataView,\n showPlainSpinner,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<AnalyticsNoDataPageProps>" + "AnalyticsNoDataPageProps" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/analytics_no_data_page.component.tsx", "deprecated": false, @@ -85,9 +85,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "AnalyticsNoDataPageKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/services.tsx", "deprecated": false, @@ -101,9 +101,9 @@ "label": "{ children, ...dependencies }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "AnalyticsNoDataPageKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/services.tsx", "deprecated": false, @@ -124,9 +124,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "AnalyticsNoDataPageServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/services.tsx", "deprecated": false, @@ -140,9 +140,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "AnalyticsNoDataPageServices", - ">>" + ">" ], "path": "packages/shared-ux/page/analytics_no_data/impl/src/services.tsx", "deprecated": false, 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 848ddf4639299..c94cee68835ae 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-01 +date: 2024-10-02 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 d3e372e9bbc9c..1eaacfa963b74 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_page_kibana_no_data.devdocs.json index d68c5a49de1a3..9b84eac494267 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.devdocs.json +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.devdocs.json @@ -15,7 +15,7 @@ "signature": [ "({ onDataViewCreated, onESQLNavigationComplete, noDataConfig, allowAdHocDataView, showPlainSpinner, }: ", "KibanaNoDataPageProps", - ") => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "packages/shared-ux/page/kibana_no_data/impl/src/kibana_no_data_page.tsx", "deprecated": false, @@ -50,9 +50,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "KibanaNoDataPageKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/kibana_no_data/impl/src/services.tsx", "deprecated": false, @@ -66,9 +66,9 @@ "label": "{ children, ...dependencies }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "KibanaNoDataPageKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/page/kibana_no_data/impl/src/services.tsx", "deprecated": false, @@ -89,9 +89,9 @@ "\nA Context Provider that provides services to the component." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "KibanaNoDataPageServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/kibana_no_data/impl/src/services.tsx", "deprecated": false, @@ -105,9 +105,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "KibanaNoDataPageServices", - ">>" + ">" ], "path": "packages/shared-ux/page/kibana_no_data/impl/src/services.tsx", "deprecated": false, 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 7b78bdcfdd4ec..1521cf5e08416 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-01 +date: 2024-10-02 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 1528c4aa811ff..b4169a70f0f87 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_page_kibana_template.devdocs.json index 5ad856715e0b4..34245292dce46 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.devdocs.json +++ b/api_docs/kbn_shared_ux_page_kibana_template.devdocs.json @@ -35,14 +35,14 @@ { "parentPluginId": "@kbn/shared-ux-page-kibana-template", "id": "def-public.KibanaPageTemplate.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -56,7 +56,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -73,9 +73,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/kibana_template/impl/src/services.tsx", "deprecated": false, @@ -89,9 +89,9 @@ "label": "{ children, ...dependencies }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/page/kibana_template/impl/src/services.tsx", "deprecated": false, @@ -112,9 +112,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "NoDataCardServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/kibana_template/impl/src/services.tsx", "deprecated": false, @@ -128,9 +128,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardServices", - ">>" + ">" ], "path": "packages/shared-ux/page/kibana_template/impl/src/services.tsx", "deprecated": false, @@ -171,11 +171,13 @@ "description": [], "signature": [ "_EuiPageOuterProps", - " & Omit<any, \"border\" | \"component\"> & ", + " & Omit<", + "_EuiPageInnerProps", + "<\"main\">, \"border\" | \"component\"> & ", "_EuiPageRestrictWidth", " & ", "_EuiPageBottomBorder", - " & { contentBorder?: any; minHeight?: ", + " & { contentBorder?: boolean | undefined; minHeight?: ", "Property", ".MinHeight<string | number> | undefined; offset?: number | undefined; mainProps?: (", "CommonProps", diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 7c109660a386b..7362e5e485df5 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-01 +date: 2024-10-02 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 53c946aadc2cd..90671c5d71d66 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_page_no_data.devdocs.json index 4bf7f38b3dac8..4e4cec3565a0d 100644 --- a/api_docs/kbn_shared_ux_page_no_data.devdocs.json +++ b/api_docs/kbn_shared_ux_page_no_data.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "({ solution, logo, action, docsLink, pageTitle, pageDescription, className, }: ", "NoDataPageProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/page/no_data/impl/src/no_data_page.tsx", "deprecated": false, @@ -48,9 +48,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/no_data/impl/src/services.tsx", "deprecated": false, @@ -64,9 +64,9 @@ "label": "{\n children,\n ...dependencies\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/page/no_data/impl/src/services.tsx", "deprecated": false, @@ -87,9 +87,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "NoDataCardServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/no_data/impl/src/services.tsx", "deprecated": false, @@ -103,9 +103,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardServices", - ">>" + ">" ], "path": "packages/shared-ux/page/no_data/impl/src/services.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 9af60601567b4..c84a8a8c90326 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json index 5315317c438f2..e40c0c7eaf9d2 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json +++ b/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "(props: ", "NoDataConfigPageProps", - ") => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "packages/shared-ux/page/no_data_config/impl/src/no_data_config_page.tsx", "deprecated": false, @@ -48,9 +48,9 @@ "\nKibana-specific Provider that maps dependencies to services." ], "signature": [ - "({ children, ...dependencies }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...dependencies }: React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/no_data_config/impl/src/services.tsx", "deprecated": false, @@ -64,9 +64,9 @@ "label": "{ children, ...dependencies }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/page/no_data_config/impl/src/services.tsx", "deprecated": false, @@ -87,9 +87,9 @@ "\nA Context Provider that provides services to the component and its dependencies." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "NoDataCardServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/page/no_data_config/impl/src/services.tsx", "deprecated": false, @@ -103,9 +103,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataCardServices", - ">>" + ">" ], "path": "packages/shared-ux/page/no_data_config/impl/src/services.tsx", "deprecated": false, @@ -125,22 +125,8 @@ "description": [], "signature": [ "{ (props: Props<", - "_EuiPageOuterProps", - " & Omit<any, \"border\" | \"component\"> & ", - "_EuiPageRestrictWidth", - " & ", - "_EuiPageBottomBorder", - " & { contentBorder?: any; minHeight?: ", - "Property", - ".MinHeight<string | number> | undefined; offset?: number | undefined; mainProps?: (", - "CommonProps", - " & React.HTMLAttributes<HTMLElement>) | undefined; component?: ", - "ComponentTypes", - " | undefined; } & { noDataConfig?: ", - "NoDataPageProps", - " | undefined; pageSideBar?: React.ReactNode; pageSideBarProps?: ", - "EuiPageSidebarProps", - " | undefined; }>): JSX.Element; displayName: string; }" + "NoDataConfigPageProps", + ">): React.JSX.Element; displayName: string; }" ], "path": "packages/shared-ux/page/no_data_config/impl/src/no_data_config_page.tsx", "deprecated": false, @@ -204,11 +190,13 @@ "description": [], "signature": [ "_EuiPageOuterProps", - " & Omit<any, \"border\" | \"component\"> & ", + " & Omit<", + "_EuiPageInnerProps", + "<\"main\">, \"border\" | \"component\"> & ", "_EuiPageRestrictWidth", " & ", "_EuiPageBottomBorder", - " & { contentBorder?: any; minHeight?: ", + " & { contentBorder?: boolean | undefined; minHeight?: ", "Property", ".MinHeight<string | number> | undefined; offset?: number | undefined; mainProps?: (", "CommonProps", 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 c5ef3b0b9e465..12031b3964aa9 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-01 +date: 2024-10-02 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 47d4e3a9a48d0..6a8adacc32a99 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-01 +date: 2024-10-02 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 0862fd0c9fc7f..47e4fafe3a438 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json index d020b378dd093..71f4748d80c36 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json +++ b/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json @@ -29,7 +29,7 @@ "\nA wrapper around `EuiSideNav` that includes the appropriate title with optional solution logo." ], "signature": [ - "({ children, headingProps, icon, isOpenOnDesktop, items, mobileBreakpoints, closeFlyoutButtonPosition, name, onCollapse, canBeCollapsed, ...rest }: React.PropsWithChildren<", + "({ children, headingProps, icon, isOpenOnDesktop, items, mobileBreakpoints, closeFlyoutButtonPosition, name, onCollapse, canBeCollapsed, ...rest }: ", { "pluginId": "@kbn/shared-ux-page-solution-nav", "scope": "common", @@ -37,7 +37,7 @@ "section": "def-common.SolutionNavProps", "text": "SolutionNavProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/page/solution_nav/src/solution_nav.tsx", "deprecated": false, @@ -51,15 +51,13 @@ "label": "{\n children,\n headingProps,\n icon,\n isOpenOnDesktop = false,\n items,\n mobileBreakpoints = ['xs', 's'],\n closeFlyoutButtonPosition = 'outside',\n name,\n onCollapse,\n canBeCollapsed = true,\n ...rest\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/shared-ux-page-solution-nav", "scope": "common", "docId": "kibKbnSharedUxPageSolutionNavPluginApi", "section": "def-common.SolutionNavProps", "text": "SolutionNavProps" - }, - ">" + } ], "path": "packages/shared-ux/page/solution_nav/src/solution_nav.tsx", "deprecated": false, @@ -80,7 +78,7 @@ "signature": [ "<P extends ", "TemplateProps", - ">(WrappedComponent: React.ComponentType<P>) => { (props: Props<P>): JSX.Element; displayName: string; }" + ">(WrappedComponent: React.ComponentType<P>) => { (props: Props<P>): React.JSX.Element; displayName: string; }" ], "path": "packages/shared-ux/page/solution_nav/src/with_solution_nav.tsx", "deprecated": false, @@ -121,7 +119,7 @@ "signature": [ "Omit<", "EuiSideNavProps", - "<{}>, \"children\" | \"items\" | \"heading\"> & { name: string; icon?: ", + "<{}>, \"children\" | \"heading\" | \"items\"> & { name: string; icon?: ", "IconType", " | undefined; items?: ", "EuiSideNavItemType", diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 8053b43fc09df..a20ba74db26e1 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json index 335a8ce3c4eff..93fc5c36009f5 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json @@ -11,7 +11,7 @@ "label": "DataViewIllustration", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/data_view_illustration.tsx", "deprecated": false, @@ -32,7 +32,7 @@ "signature": [ "({ onDataViewCreated, onESQLNavigationComplete, allowAdHocDataView, }: ", "NoDataViewsPromptProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/no_data_views.tsx", "deprecated": false, @@ -69,7 +69,7 @@ "signature": [ "({ onClickCreate, canCreateNewDataView, dataViewsDocLink, onTryESQL, esqlDocLink, emptyPromptColor, }: ", "NoDataViewsPromptComponentProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/no_data_views.component.tsx", "deprecated": false, @@ -104,9 +104,9 @@ "\nKibana-specific Provider that maps to known dependency types." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "NoDataViewsPromptKibanaDependencies", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/services.tsx", "deprecated": false, @@ -120,9 +120,9 @@ "label": "{ children, ...services }", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataViewsPromptKibanaDependencies", - ">>" + ">" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/services.tsx", "deprecated": false, @@ -143,9 +143,9 @@ "\nAbstract external service Provider." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "NoDataViewsPromptServices", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/services.tsx", "deprecated": false, @@ -159,9 +159,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "NoDataViewsPromptServices", - ">>" + ">" ], "path": "packages/shared-ux/prompt/no_data_views/impl/src/services.tsx", "deprecated": false, 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 0662c54a524b1..da6d1e9800731 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-01 +date: 2024-10-02 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 d759f8d05819c..3e362a2cefddf 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_prompt_not_found.devdocs.json index 8b804e94e8b1d..5daa3985a6fe4 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.devdocs.json +++ b/api_docs/kbn_shared_ux_prompt_not_found.devdocs.json @@ -29,7 +29,7 @@ "\nPredefined `EuiEmptyPrompt` for 404 pages." ], "signature": [ - "({ actions, title, body }: NotFoundProps) => JSX.Element" + "({ actions, title, body }: NotFoundProps) => React.JSX.Element" ], "path": "packages/shared-ux/prompt/not_found/src/not_found_prompt.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index c3ead9fec01c0..c62a87638c1d7 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_router.devdocs.json index fd39faba97239..cb792df3ff261 100644 --- a/api_docs/kbn_shared_ux_router.devdocs.json +++ b/api_docs/kbn_shared_ux_router.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({ children, ...props }: ", "BrowserRouterProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/router/impl/router.tsx", "deprecated": false, @@ -64,7 +64,7 @@ "signature": [ "({ children, ...props }: ", "HashRouterProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/router/impl/router.tsx", "deprecated": false, @@ -99,7 +99,7 @@ "signature": [ "({ children, ...props }: ", "MemoryRouterProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/router/impl/router.tsx", "deprecated": false, @@ -136,7 +136,7 @@ "signature": [ "<T extends {}>({ children, component: Component, render, ...rest }: ", "RouteProps", - "<string, { [K: string]: string; } & T>) => JSX.Element" + "<string, { [K: string]: string; } & T>) => React.JSX.Element" ], "path": "packages/shared-ux/router/impl/route.tsx", "deprecated": false, @@ -172,7 +172,7 @@ "signature": [ "({ children, ...props }: ", "RouterProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/router/impl/router.tsx", "deprecated": false, @@ -205,7 +205,7 @@ "label": "Routes", "description": [], "signature": [ - "({ legacySwitch, children, }: { legacySwitch?: boolean | undefined; children: React.ReactNode; }) => JSX.Element" + "({ legacySwitch, children, }: { legacySwitch?: boolean | undefined; children: React.ReactNode; }) => React.JSX.Element" ], "path": "packages/shared-ux/router/impl/routes.tsx", "deprecated": false, @@ -244,7 +244,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/shared-ux/router/impl/routes.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index f79b2f00918ed..8b9edd3814fab 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-01 +date: 2024-10-02 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 cb84dfb3c2c62..7f726ecce675a 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-01 +date: 2024-10-02 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 d3bbc14a34747..76d925b307a1a 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-01 +date: 2024-10-02 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 a2cf7b918655f..96c88cf4018f3 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_tabbed_modal.devdocs.json index 7e71b0187a010..420990f6614fe 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.devdocs.json +++ b/api_docs/kbn_shared_ux_tabbed_modal.devdocs.json @@ -31,7 +31,7 @@ "IModalContextProviderProps", "<T>, \"children\"> & ", "ITabbedModalInner", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 1c9a562f19ff4..e316e3d324bf4 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-01 +date: 2024-10-02 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 ea9709d6dc3ce..d3e069ac15eb8 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_shared_ux_utility.devdocs.json index 3985e692831c6..2a5982327f50e 100644 --- a/api_docs/kbn_shared_ux_utility.devdocs.json +++ b/api_docs/kbn_shared_ux_utility.devdocs.json @@ -93,7 +93,7 @@ "\nA simple implementation of `React.Suspense.fallback` that renders a loading spinner." ], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/kbn-shared-ux-utility/src/fallback.tsx", "deprecated": false, @@ -272,7 +272,7 @@ "label": "fallback", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 1b3521b7c65f5..b602fe5b558da 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-01 +date: 2024-10-02 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 6b6c573157eb1..4887d968f6667 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-01 +date: 2024-10-02 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 925c595641dd5..e8154d43ba1e2 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-01 +date: 2024-10-02 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 ad256a5e303b5..b912cf2a76fb2 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-01 +date: 2024-10-02 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 eac1daf9c55af..4c7be3917a512 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-01 +date: 2024-10-02 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 0651e1a1cb4ff..54463fecdfbf9 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-01 +date: 2024-10-02 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 42871196889f3..69c09bc52695d 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-01 +date: 2024-10-02 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 9b0d29f9fda9a..6146662e9133f 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-01 +date: 2024-10-02 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 d7642b52b1144..6513ce7167b68 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-01 +date: 2024-10-02 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 383c8a6044521..c596562da1191 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-01 +date: 2024-10-02 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 26175e1340298..61f57f21a3cc3 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-01 +date: 2024-10-02 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 de114263110e5..f019ff8c60cd6 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-01 +date: 2024-10-02 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 1b93ed574344a..72f066aa0d4a6 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.devdocs.json b/api_docs/kbn_test.devdocs.json index 0d76ad2a80c02..3407196ddb81b 100644 --- a/api_docs/kbn_test.devdocs.json +++ b/api_docs/kbn_test.devdocs.json @@ -3351,7 +3351,7 @@ "signature": [ "Pick<", "ServerlessOptions", - ", \"host\" | \"tag\" | \"image\" | \"dataPath\" | \"kibanaUrl\" | \"resources\" | \"projectType\"> | undefined" + ", \"image\" | \"host\" | \"tag\" | \"dataPath\" | \"kibanaUrl\" | \"resources\" | \"projectType\"> | undefined" ], "path": "packages/kbn-test/src/es/test_es_cluster.ts", "deprecated": false, diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 67f338bd5e90c..0d2e6047804d6 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-01 +date: 2024-10-02 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 6f76ea922d9d3..cfb616c6464e2 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_test_jest_helpers.devdocs.json index 0f267c70b051a..a385640692703 100644 --- a/api_docs/kbn_test_jest_helpers.devdocs.json +++ b/api_docs/kbn_test_jest_helpers.devdocs.json @@ -1378,7 +1378,7 @@ "ComponentType", "<any> | undefined; }) | undefined) => ", "ShallowWrapper", - "<Readonly<{}> & Readonly<{ children?: React.ReactNode; }>, Readonly<{}>, React.Component<{}, {}, any>>" + "<Readonly<{}>, Readonly<{}>, React.Component<{}, {}, any>>" ], "path": "packages/kbn-test-jest-helpers/src/enzyme_helpers.tsx", "deprecated": false, @@ -1532,7 +1532,7 @@ "signature": [ "(initialEntries?: ", "LocationDescriptor", - "<unknown>[], initialIndex?: number) => (WrappedComponent: React.ComponentType<{}>) => (props: any) => JSX.Element" + "<unknown>[], initialIndex?: number) => (WrappedComponent: React.ComponentType<{}>) => (props: any) => React.JSX.Element" ], "path": "packages/kbn-test-jest-helpers/src/router_helpers.tsx", "deprecated": false, @@ -1585,7 +1585,7 @@ "LocationDescriptor", "<unknown> | ", "LocationDescriptor", - "<unknown>[], onRouter: (router: any) => void) => (WrappedComponent: React.ComponentType<T>) => (props: any) => JSX.Element" + "<unknown>[], onRouter: (router: any) => void) => (WrappedComponent: React.ComponentType<T>) => (props: any) => React.JSX.Element" ], "path": "packages/kbn-test-jest-helpers/src/router_helpers.tsx", "deprecated": false, @@ -1636,7 +1636,7 @@ "label": "WithStore", "description": [], "signature": [ - "(store: any) => (WrappedComponent: React.ComponentType<T>) => (props: any) => JSX.Element" + "(store: any) => (WrappedComponent: React.ComponentType<T>) => (props: any) => React.JSX.Element" ], "path": "packages/kbn-test-jest-helpers/src/redux_helpers.tsx", "deprecated": false, diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 0ee8f1f612ecf..5155cb32bc73f 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-01 +date: 2024-10-02 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 f12b118ea9c10..b078b76727989 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-01 +date: 2024-10-02 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 0e7ca2c0dd017..7f7b3ca25dc85 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-01 +date: 2024-10-02 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 aeb7b0bced041..6c30b310b2143 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index b8c1f6ffff12d..0fa817bd1b4ab 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_try_in_console.devdocs.json index a414e8b39ec76..3f96ba15ecb6f 100644 --- a/api_docs/kbn_try_in_console.devdocs.json +++ b/api_docs/kbn_try_in_console.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({ request, application, consolePlugin, sharePlugin, content, showIcon, type, }: ", "TryInConsoleButtonProps", - ") => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "packages/kbn-try-in-console/components/try_in_console_button.tsx", "deprecated": false, diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 431a49159089b..d9d3fc9e189b7 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-01 +date: 2024-10-02 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 b1299fc238a5d..30550a714a21c 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_typed_react_router_config.devdocs.json index 7094744ed6aa5..9bab557b023ff 100644 --- a/api_docs/kbn_typed_react_router_config.devdocs.json +++ b/api_docs/kbn_typed_react_router_config.devdocs.json @@ -141,7 +141,7 @@ "section": "def-common.Route", "text": "Route" }, - ">; element: React.ReactElement<any, string | React.JSXElementConstructor<any>>; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; }) => JSX.Element" + ">; element: React.ReactElement<any, string | React.JSXElementConstructor<any>>; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; }) => React.JSX.Element" ], "path": "packages/kbn-typed-react-router-config/src/use_current_route.tsx", "deprecated": false, @@ -246,7 +246,7 @@ "label": "OutletContextProvider", "description": [], "signature": [ - "({\n element,\n children,\n}: { element: React.ReactElement<any, string | React.JSXElementConstructor<any>>; children: React.ReactNode; }) => JSX.Element" + "({\n element,\n children,\n}: { element: React.ReactElement<any, string | React.JSXElementConstructor<any>>; children: React.ReactNode; }) => React.JSX.Element" ], "path": "packages/kbn-typed-react-router-config/src/outlet.tsx", "deprecated": false, @@ -285,7 +285,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-typed-react-router-config/src/outlet.tsx", "deprecated": false, @@ -321,7 +321,7 @@ "section": "def-common.RouteMap", "text": "RouteMap" }, - ">; children: React.ReactNode; }) => JSX.Element" + ">; children: React.ReactNode; }) => React.JSX.Element" ], "path": "packages/kbn-typed-react-router-config/src/use_router.tsx", "deprecated": false, @@ -375,7 +375,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-typed-react-router-config/src/use_router.tsx", "deprecated": false, @@ -395,7 +395,7 @@ "label": "RouteRenderer", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "packages/kbn-typed-react-router-config/src/route_renderer.tsx", "deprecated": false, @@ -430,7 +430,7 @@ }, ">; history: ", "History", - "<unknown>; children?: React.ReactNode; }) => JSX.Element" + "<unknown>; children?: React.ReactNode; }) => React.JSX.Element" ], "path": "packages/kbn-typed-react-router-config/src/router_provider.tsx", "deprecated": false, @@ -499,7 +499,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-typed-react-router-config/src/router_provider.tsx", "deprecated": false, diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index a97b8a95678cd..0fe2c4503df6b 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-01 +date: 2024-10-02 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 580a3c7e55af8..88d66b765105e 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-01 +date: 2024-10-02 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 5edf893f709b4..96327577c4965 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-01 +date: 2024-10-02 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 3699415f2ac01..d9831f9bd0e77 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_unified_data_table.devdocs.json index dcfb9d2f4cdb4..14e8c0fc8d959 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -328,7 +328,7 @@ "label": "JSONCodeEditorCommonMemoized", "description": [], "signature": [ - "React.NamedExoticComponent<JsonCodeEditorCommonProps> & { readonly type: (props: JsonCodeEditorCommonProps) => JSX.Element; }" + "React.NamedExoticComponent<JsonCodeEditorCommonProps> & { readonly type: (props: JsonCodeEditorCommonProps) => React.JSX.Element; }" ], "path": "packages/kbn-unified-data-table/src/components/json_code_editor/json_code_editor_common.tsx", "deprecated": false, @@ -345,7 +345,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -534,7 +534,7 @@ "section": "def-public.RowHeightSettingsProps", "text": "RowHeightSettingsProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-unified-data-table/src/components/row_height_settings.tsx", "deprecated": false, @@ -605,7 +605,7 @@ "section": "def-public.FieldFormatsStart", "text": "FieldFormatsStart" }, - "; dataTestSubj?: string | undefined; className?: string | undefined; isCompressed?: boolean | undefined; }) => JSX.Element" + "; dataTestSubj?: string | undefined; className?: string | undefined; isCompressed?: boolean | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-unified-data-table/src/components/source_document.tsx", "deprecated": false, @@ -831,7 +831,7 @@ "section": "def-public.UnifiedDataTableProps", "text": "UnifiedDataTableProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", "deprecated": false, @@ -2365,7 +2365,7 @@ "\nOptional value for providing the additional controls available in the UnifiedDataTable toolbar to manage it's records or state. UnifiedDataTable includes Columns, Sorting and Bulk Actions." ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", "deprecated": false, @@ -2766,9 +2766,7 @@ "label": "gridProps", "description": [], "signature": [ - "{ additionalControls?: React.ReactNode | ", - "EuiDataGridToolBarAdditionalControlsOptions", - "; }" + "{ additionalControls?: React.ReactNode; }" ], "path": "packages/kbn-unified-data-table/src/components/custom_toolbar/render_custom_toolbar.tsx", "deprecated": false, diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index a821f090448b9..f9a203989dd9e 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_unified_doc_viewer.devdocs.json index 784e80f8d5615..54a94acd8e5e3 100644 --- a/api_docs/kbn_unified_doc_viewer.devdocs.json +++ b/api_docs/kbn_unified_doc_viewer.devdocs.json @@ -262,7 +262,7 @@ "signature": [ "({ docViews, ...renderProps }: ", "DocViewerProps", - ") => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "packages/kbn-unified-doc-viewer/src/components/doc_viewer/doc_viewer.tsx", "deprecated": false, @@ -295,7 +295,7 @@ "label": "FieldName", "description": [], "signature": [ - "({\n fieldName,\n fieldMapping,\n fieldType,\n fieldIconProps,\n scripted = false,\n highlight = '',\n}: Props) => JSX.Element" + "({\n fieldName,\n fieldMapping,\n fieldType,\n fieldIconProps,\n scripted = false,\n highlight = '',\n}: Props) => React.JSX.Element" ], "path": "packages/kbn-unified-doc-viewer/src/components/field_name/field_name.tsx", "deprecated": false, diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 912f345ce45d2..19ca16ab64fae 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_unified_field_list.devdocs.json index ccbed1bcf4edb..2a95bf7a3e779 100644 --- a/api_docs/kbn_unified_field_list.devdocs.json +++ b/api_docs/kbn_unified_field_list.devdocs.json @@ -58,7 +58,7 @@ "section": "def-public.FieldItemButtonProps", "text": "FieldItemButtonProps" }, - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/kbn-unified-field-list/src/components/field_item_button/field_item_button.tsx", "deprecated": false, @@ -102,7 +102,7 @@ "\nA top level wrapper for field list components (filters and field list groups)" ], "signature": [ - "({ \"data-test-subj\": dataTestSubject, isProcessing, prepend, append, className, children, }: React.PropsWithChildren<React.PropsWithChildren<", + "({ \"data-test-subj\": dataTestSubject, isProcessing, prepend, append, className, children, }: React.PropsWithChildren<", { "pluginId": "@kbn/unified-field-list", "scope": "public", @@ -110,7 +110,7 @@ "section": "def-public.FieldListProps", "text": "FieldListProps" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-unified-field-list/src/components/field_list/field_list.tsx", "deprecated": false, @@ -124,7 +124,7 @@ "label": "{\n 'data-test-subj': dataTestSubject = 'fieldList',\n isProcessing,\n prepend,\n append,\n className,\n children,\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/unified-field-list", "scope": "public", @@ -132,7 +132,7 @@ "section": "def-public.FieldListProps", "text": "FieldListProps" }, - ">>" + ">" ], "path": "packages/kbn-unified-field-list/src/components/field_list/field_list.tsx", "deprecated": false, @@ -175,7 +175,7 @@ "section": "def-public.FieldListFiltersProps", "text": "FieldListFiltersProps" }, - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/kbn-unified-field-list/src/components/field_list_filters/index.tsx", "deprecated": false, @@ -238,7 +238,7 @@ "section": "def-public.FieldListGroupedProps", "text": "FieldListGroupedProps" }, - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/kbn-unified-field-list/src/components/field_list_grouped/index.tsx", "deprecated": false, @@ -277,7 +277,7 @@ "label": "FieldPopover", "description": [], "signature": [ - "({ isOpen, closePopover, renderHeader, renderContent, ...otherPopoverProps }: React.PropsWithChildren<", + "({ isOpen, closePopover, renderHeader, renderContent, ...otherPopoverProps }: ", { "pluginId": "@kbn/unified-field-list", "scope": "public", @@ -285,7 +285,7 @@ "section": "def-public.FieldPopoverProps", "text": "FieldPopoverProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover.tsx", "deprecated": false, @@ -294,20 +294,18 @@ { "parentPluginId": "@kbn/unified-field-list", "id": "def-public.FieldPopover.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n isOpen,\n closePopover,\n renderHeader,\n renderContent,\n ...otherPopoverProps\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/unified-field-list", "scope": "public", "docId": "kibKbnUnifiedFieldListPluginApi", "section": "def-public.FieldPopoverProps", "text": "FieldPopoverProps" - }, - ">" + } ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover.tsx", "deprecated": false, @@ -326,7 +324,7 @@ "label": "FieldPopoverFooter", "description": [], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "@kbn/unified-field-list", "scope": "public", @@ -334,7 +332,7 @@ "section": "def-public.FieldVisualizeButtonProps", "text": "FieldVisualizeButtonProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx", "deprecated": false, @@ -343,20 +341,18 @@ { "parentPluginId": "@kbn/unified-field-list", "id": "def-public.FieldPopoverFooter.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/unified-field-list", "scope": "public", "docId": "kibKbnUnifiedFieldListPluginApi", "section": "def-public.FieldVisualizeButtonProps", "text": "FieldVisualizeButtonProps" - }, - ">" + } ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx", "deprecated": false, @@ -375,7 +371,7 @@ "label": "FieldPopoverHeader", "description": [], "signature": [ - "({ field, closePopover, buttonAddFieldToWorkspaceProps, buttonAddFilterProps, buttonEditFieldProps, buttonDeleteFieldProps, onAddFieldToWorkspace, onAddFilter, onEditField, onDeleteField, services, }: React.PropsWithChildren<", + "({ field, closePopover, buttonAddFieldToWorkspaceProps, buttonAddFilterProps, buttonEditFieldProps, buttonDeleteFieldProps, onAddFieldToWorkspace, onAddFilter, onEditField, onDeleteField, services, }: ", { "pluginId": "@kbn/unified-field-list", "scope": "public", @@ -383,7 +379,7 @@ "section": "def-public.FieldPopoverHeaderProps", "text": "FieldPopoverHeaderProps" }, - ">) => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover_header.tsx", "deprecated": false, @@ -392,20 +388,18 @@ { "parentPluginId": "@kbn/unified-field-list", "id": "def-public.FieldPopoverHeader.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n field,\n closePopover,\n buttonAddFieldToWorkspaceProps,\n buttonAddFilterProps,\n buttonEditFieldProps,\n buttonDeleteFieldProps,\n onAddFieldToWorkspace,\n onAddFilter,\n onEditField,\n onDeleteField,\n services,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/unified-field-list", "scope": "public", "docId": "kibKbnUnifiedFieldListPluginApi", "section": "def-public.FieldPopoverHeaderProps", "text": "FieldPopoverHeaderProps" - }, - ">" + } ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover_header.tsx", "deprecated": false, @@ -442,14 +436,14 @@ { "parentPluginId": "@kbn/unified-field-list", "id": "def-public.FieldStats.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -463,7 +457,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -496,14 +490,14 @@ { "parentPluginId": "@kbn/unified-field-list", "id": "def-public.FieldTopValuesBucket.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -517,7 +511,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -550,14 +544,14 @@ { "parentPluginId": "@kbn/unified-field-list", "id": "def-public.FieldVisualizeButton.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -571,7 +565,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1244,7 +1238,7 @@ "label": "SmartFieldFallbackTooltip", "description": [], "signature": [ - "React.ForwardRefExoticComponent<{ associatedSmartFields: string; } & { children?: React.ReactNode; } & React.RefAttributes<{}>>" + "React.ForwardRefExoticComponent<{ associatedSmartFields: string; } & React.RefAttributes<{}>>" ], "path": "packages/kbn-unified-field-list/src/components/fallback_fields/index.tsx", "deprecated": false, @@ -1261,7 +1255,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1634,7 +1628,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2826,7 +2820,7 @@ "label": "infoIcon", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-unified-field-list/src/components/field_item_button/field_item_button.tsx", "deprecated": false, @@ -3549,7 +3543,7 @@ "label": "prepend", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-unified-field-list/src/components/field_list/field_list.tsx", "deprecated": false, @@ -3563,7 +3557,7 @@ "label": "append", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-unified-field-list/src/components/field_list/field_list.tsx", "deprecated": false, diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index a975d41e7910c..bf374dc7763dd 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_unsaved_changes_badge.devdocs.json index d8bc0bf79d1ec..597cf74a2c217 100644 --- a/api_docs/kbn_unsaved_changes_badge.devdocs.json +++ b/api_docs/kbn_unsaved_changes_badge.devdocs.json @@ -87,7 +87,7 @@ "\nBadge component. It opens a menu panel with actions once pressed." ], "signature": [ - "({ badgeText, onRevert, onSave, onSaveAs, }: React.PropsWithChildren<", + "({ badgeText, onRevert, onSave, onSaveAs, }: ", { "pluginId": "@kbn/unsaved-changes-badge", "scope": "common", @@ -95,7 +95,7 @@ "section": "def-common.UnsavedChangesBadgeProps", "text": "UnsavedChangesBadgeProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-unsaved-changes-badge/src/components/unsaved_changes_badge/unsaved_changes_badge.tsx", "deprecated": false, @@ -104,20 +104,18 @@ { "parentPluginId": "@kbn/unsaved-changes-badge", "id": "def-common.UnsavedChangesBadge.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n badgeText,\n onRevert,\n onSave,\n onSaveAs,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/unsaved-changes-badge", "scope": "common", "docId": "kibKbnUnsavedChangesBadgePluginApi", "section": "def-common.UnsavedChangesBadgeProps", "text": "UnsavedChangesBadgeProps" - }, - ">" + } ], "path": "packages/kbn-unsaved-changes-badge/src/components/unsaved_changes_badge/unsaved_changes_badge.tsx", "deprecated": false, diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 46f4b5323d4be..66933b4bed367 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-01 +date: 2024-10-02 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 b5c2bbf4d2952..6871f45f1f514 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-01 +date: 2024-10-02 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 b76ac9c1773f7..8eb8b818574ab 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_user_profile_components.devdocs.json index 36d3887f74e93..5703b75c43ce3 100644 --- a/api_docs/kbn_user_profile_components.devdocs.json +++ b/api_docs/kbn_user_profile_components.devdocs.json @@ -80,7 +80,7 @@ "\nRenders an avatar given a user profile" ], "signature": [ - "({ user, avatar, ...rest }: React.PropsWithChildren<", + "({ user, avatar, ...rest }: ", { "pluginId": "@kbn/user-profile-components", "scope": "common", @@ -88,7 +88,7 @@ "section": "def-common.UserAvatarProps", "text": "UserAvatarProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/user_avatar.tsx", "deprecated": false, @@ -97,20 +97,18 @@ { "parentPluginId": "@kbn/user-profile-components", "id": "def-common.UserAvatar.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ user, avatar, ...rest }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/user-profile-components", "scope": "common", "docId": "kibKbnUserProfileComponentsPluginApi", "section": "def-common.UserAvatarProps", "text": "UserAvatarProps" - }, - ">" + } ], "path": "packages/kbn-user-profile-components/src/user_avatar.tsx", "deprecated": false, @@ -131,7 +129,7 @@ "\nRenders a user avatar with tooltip" ], "signature": [ - "({ user, avatar, ...rest }: React.PropsWithChildren<", + "({ user, avatar, ...rest }: ", { "pluginId": "@kbn/user-profile-components", "scope": "common", @@ -139,7 +137,7 @@ "section": "def-common.UserAvatarProps", "text": "UserAvatarProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/user_avatar_tip.tsx", "deprecated": false, @@ -148,20 +146,18 @@ { "parentPluginId": "@kbn/user-profile-components", "id": "def-common.UserAvatarTip.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ user, avatar, ...rest }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/user-profile-components", "scope": "common", "docId": "kibKbnUserProfileComponentsPluginApi", "section": "def-common.UserAvatarProps", "text": "UserAvatarProps" - }, - ">" + } ], "path": "packages/kbn-user-profile-components/src/user_avatar_tip.tsx", "deprecated": false, @@ -182,7 +178,7 @@ "\nKibana-specific Provider that maps to known dependency types." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", { "pluginId": "@kbn/user-profile-components", "scope": "common", @@ -190,7 +186,7 @@ "section": "def-common.UserProfilesKibanaDependencies", "text": "UserProfilesKibanaDependencies" }, - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/services.tsx", "deprecated": false, @@ -204,7 +200,7 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", { "pluginId": "@kbn/user-profile-components", "scope": "common", @@ -212,7 +208,7 @@ "section": "def-common.UserProfilesKibanaDependencies", "text": "UserProfilesKibanaDependencies" }, - ">>" + ">" ], "path": "packages/kbn-user-profile-components/src/services.tsx", "deprecated": false, @@ -249,7 +245,7 @@ "section": "def-common.UserProfilesPopoverProps", "text": "UserProfilesPopoverProps" }, - "<Option>) => JSX.Element" + "<Option>) => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/user_profiles_popover.tsx", "deprecated": false, @@ -291,9 +287,9 @@ "\nAbstract external service Provider." ], "signature": [ - "({ children, ...services }: React.PropsWithChildren<React.PropsWithChildren<", + "({ children, ...services }: React.PropsWithChildren<", "Services", - ">>) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/services.tsx", "deprecated": false, @@ -307,9 +303,9 @@ "label": "{\n children,\n ...services\n}", "description": [], "signature": [ - "React.PropsWithChildren<React.PropsWithChildren<", + "React.PropsWithChildren<", "Services", - ">>" + ">" ], "path": "packages/kbn-user-profile-components/src/services.tsx", "deprecated": false, @@ -346,7 +342,7 @@ "section": "def-common.UserProfilesSelectableProps", "text": "UserProfilesSelectableProps" }, - "<Option>) => JSX.Element" + "<Option>) => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/user_profiles_selectable.tsx", "deprecated": false, @@ -388,7 +384,7 @@ "\nRenders a tooltip with user information" ], "signature": [ - "({ user, avatar, ...rest }: React.PropsWithChildren<", + "({ user, avatar, ...rest }: ", { "pluginId": "@kbn/user-profile-components", "scope": "common", @@ -396,7 +392,7 @@ "section": "def-common.UserToolTipProps", "text": "UserToolTipProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-user-profile-components/src/user_tooltip.tsx", "deprecated": false, @@ -405,20 +401,18 @@ { "parentPluginId": "@kbn/user-profile-components", "id": "def-common.UserToolTip.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ user, avatar, ...rest }", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "@kbn/user-profile-components", "scope": "common", "docId": "kibKbnUserProfileComponentsPluginApi", "section": "def-common.UserToolTipProps", "text": "UserToolTipProps" - }, - ">" + } ], "path": "packages/kbn-user-profile-components/src/user_tooltip.tsx", "deprecated": false, @@ -949,7 +943,7 @@ "label": "node", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/react/kibana_mount/to_mount_point.tsx", "deprecated": false, @@ -1025,7 +1019,7 @@ { "parentPluginId": "@kbn/user-profile-components", "id": "def-common.UserProfilesPopoverProps.title", - "type": "Any", + "type": "CompoundType", "tags": [ "see" ], @@ -1034,7 +1028,7 @@ "\nTitle of the popover" ], "signature": [ - "any" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-user-profile-components/src/user_profiles_popover.tsx", "deprecated": false, @@ -1359,7 +1353,7 @@ "\nLabel for clear button." ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-user-profile-components/src/user_profiles_selectable.tsx", "deprecated": false, @@ -1403,7 +1397,7 @@ "EuiTextTruncateProps", ", \"text\" | \"children\">> | undefined; toolTipContent?: React.ReactNode; toolTipProps?: Partial<Omit<", "EuiToolTipProps", - ", \"children\" | \"content\">> | undefined; } & React.HTMLAttributes<HTMLLIElement>) | (", + ", \"content\" | \"children\">> | undefined; } & React.HTMLAttributes<HTMLLIElement>) | (", "DisambiguateSet", "<", "EuiSelectableLIOption", diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index d464592521ec8..bd83dfbc4791a 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 81 | 1 | 21 | 2 | +| 81 | 0 | 21 | 2 | ## Common diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 68db096926513..1046b44b1927c 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-01 +date: 2024-10-02 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 791988c7dca21..b7d0d8dbc0c06 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-01 +date: 2024-10-02 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 5780f7f974402..88256628b4ccb 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.devdocs.json b/api_docs/kbn_visualization_ui_components.devdocs.json index 4a74375de3e56..7e6b84145768d 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "({ label, icon, onClick, dataTestSubj, }: { label: string; icon?: ", "IconType", - " | undefined; onClick: () => void; dataTestSubj?: string | undefined; }) => JSX.Element" + " | undefined; onClick: () => void; dataTestSubj?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/chart_switch_trigger.tsx", "deprecated": false, @@ -55,7 +55,7 @@ "section": "def-public.ColorPickerProps", "text": "ColorPickerProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/color_picker.tsx", "deprecated": false, @@ -96,7 +96,7 @@ "\nWhen testing this component, mock the \"debounce\" function in lodash (see this module test for an example)" ], "signature": [ - "(props: Props) => JSX.Element" + "(props: Props) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/debounced_input.tsx", "deprecated": false, @@ -133,7 +133,7 @@ "DimensionButtonProps", "> & { readonly type: ({ groupLabel, children, onClick, onRemoveClick, accessorConfig, label, message, ...otherProps }: ", "DimensionButtonProps", - ") => JSX.Element; }" + ") => React.JSX.Element; }" ], "path": "packages/kbn-visualization-ui-components/components/dimension_buttons/dimension_button.tsx", "deprecated": false, @@ -150,7 +150,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -165,7 +165,7 @@ "label": "DimensionEditorSection", "description": [], "signature": [ - "({ children, title, }: { title?: string | undefined; children?: React.ReactNode | React.ReactNode[]; }) => JSX.Element" + "({ children, title, }: { title?: string | undefined; children?: React.ReactNode | React.ReactNode[]; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/dimension_editor_section.tsx", "deprecated": false, @@ -226,7 +226,7 @@ "signature": [ "({ id, label, color, dataTestSubj, }: { label: React.ReactNode; id?: string | undefined; color?: \"default\" | \"warning\" | \"success\" | \"subdued\" | \"accent\" | \"danger\" | \"ghost\" | ", "Property", - ".Color | undefined; dataTestSubj?: string | undefined; }) => JSX.Element" + ".Color | undefined; dataTestSubj?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/dimension_buttons/trigger.tsx", "deprecated": false, @@ -251,7 +251,7 @@ "label": "label", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-visualization-ui-components/components/dimension_buttons/trigger.tsx", "deprecated": false, @@ -315,7 +315,7 @@ "label": "DragDropBuckets", "description": [], "signature": [ - "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined; }) => JSX.Element" + "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement<any, string | React.JSXElementConstructor<any>>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/buckets.tsx", "deprecated": false, @@ -471,7 +471,7 @@ "BucketContainerProps", "> | undefined; }, Omit<", "BucketContainerProps", - ", \"draggableProvided\">>>) => JSX.Element" + ", \"draggableProvided\">>>) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/buckets.tsx", "deprecated": false, @@ -527,7 +527,7 @@ "label": "EmptyDimensionButton", "description": [], "signature": [ - "({ label, ariaLabel, onClick, dataTestSubj, iconType, ...otherProps }: { label: React.ReactNode; ariaLabel: string; onClick: () => void; dataTestSubj?: string | undefined; iconType?: string | undefined; }) => JSX.Element" + "({ label, ariaLabel, onClick, dataTestSubj, iconType, ...otherProps }: { label: React.ReactNode; ariaLabel: string; onClick: () => void; dataTestSubj?: string | undefined; iconType?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/dimension_buttons/empty_button.tsx", "deprecated": false, @@ -552,7 +552,7 @@ "label": "label", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "packages/kbn-visualization-ui-components/components/dimension_buttons/empty_button.tsx", "deprecated": false, @@ -629,7 +629,7 @@ "signature": [ "(props: ", "FieldPickerProps", - "<T>) => JSX.Element" + "<T>) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/field_picker/field_picker.tsx", "deprecated": false, @@ -665,7 +665,7 @@ "signature": [ "({ idx, onRemoveClick, removeTitle, children, draggableProvided, isNotRemovable, isNotDraggable, isDragging, \"data-test-subj\": dataTestSubj, }: ", "BucketContainerProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/fields_bucket_container.tsx", "deprecated": false, @@ -700,7 +700,7 @@ "signature": [ "({\n inputFilter,\n onChange,\n dataView,\n helpMessage,\n label = filterByLabel,\n initiallyOpen,\n ['data-test-subj']: dataTestSubj,\n queryInputServices,\n appName,\n}: ", "FilterQueryInputProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/query_input/filter_query_input.tsx", "deprecated": false, @@ -776,7 +776,7 @@ "section": "def-public.IconSet", "text": "IconSet" }, - "<Icon>; defaultIcon?: string | undefined; }) => JSX.Element" + "<Icon>; defaultIcon?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/icon_select.tsx", "deprecated": false, @@ -891,7 +891,7 @@ "section": "def-public.IconSet", "text": "IconSet" }, - "<Icon>; defaultIcon?: string | undefined; }) => JSX.Element" + "<Icon>; defaultIcon?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/icon_select.tsx", "deprecated": false, @@ -1179,7 +1179,7 @@ "label": "LineStyleSettings", "description": [], "signature": [ - "({ currentConfig, setConfig, idPrefix, }: { currentConfig?: LineStyleConfig | undefined; setConfig: (config: LineStyleConfig) => void; idPrefix: string; }) => JSX.Element" + "({ currentConfig, setConfig, idPrefix, }: { currentConfig?: LineStyleConfig | undefined; setConfig: (config: LineStyleConfig) => void; idPrefix: string; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/line_style_settings.tsx", "deprecated": false, @@ -1267,7 +1267,7 @@ "label": "NameInput", "description": [], "signature": [ - "({ value, onChange, defaultValue, }: { value: string; onChange: (value: string) => void; defaultValue?: string | undefined; }) => JSX.Element" + "({ value, onChange, defaultValue, }: { value: string; onChange: (value: string) => void; defaultValue?: string | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/name_input.tsx", "deprecated": false, @@ -1355,7 +1355,7 @@ "label": "NewBucketButton", "description": [], "signature": [ - "({ label, onClick, isDisabled, className, \"data-test-subj\": dataTestSubj, }: NewBucketButtonProps) => JSX.Element" + "({ label, onClick, isDisabled, className, \"data-test-subj\": dataTestSubj, }: NewBucketButtonProps) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/new_bucket_button.tsx", "deprecated": false, @@ -1412,7 +1412,7 @@ "section": "def-public.QueryInputServices", "text": "QueryInputServices" }, - "; }) => JSX.Element" + "; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/query_input/query_input.tsx", "deprecated": false, @@ -1617,7 +1617,7 @@ "label": "TextDecorationSetting", "description": [], "signature": [ - "({\n idPrefix,\n currentConfig,\n setConfig,\n isQueryBased,\n children,\n}: { idPrefix: string; currentConfig?: TextDecorationConfig | undefined; setConfig: (config: TextDecorationConfig) => void; isQueryBased?: boolean | undefined; children?: ((textDecoration: \"none\" | \"name\" | \"field\") => JSX.Element | null) | undefined; }) => JSX.Element" + "({\n idPrefix,\n currentConfig,\n setConfig,\n isQueryBased,\n children,\n}: { idPrefix: string; currentConfig?: TextDecorationConfig | undefined; setConfig: (config: TextDecorationConfig) => void; isQueryBased?: boolean | undefined; children?: ((textDecoration: \"none\" | \"name\" | \"field\") => JSX.Element | null) | undefined; }) => React.JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/text_decoration_setting.tsx", "deprecated": false, diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 99fe2e17510d0..6ece7c4325116 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_visualization_utils.devdocs.json index 635704144c027..dabe2b8d4829e 100644 --- a/api_docs/kbn_visualization_utils.devdocs.json +++ b/api_docs/kbn_visualization_utils.devdocs.json @@ -250,7 +250,7 @@ "label": "TooltipWrapper", "description": [], "signature": [ - "({ children, condition, tooltipContent, ...tooltipProps }: React.PropsWithChildren<TooltipWrapperProps>) => JSX.Element" + "({ children, condition, tooltipContent, ...tooltipProps }: TooltipWrapperProps) => React.JSX.Element" ], "path": "packages/kbn-visualization-utils/src/tooltip_wrapper.tsx", "deprecated": false, @@ -264,7 +264,7 @@ "label": "{\n children,\n condition,\n tooltipContent,\n ...tooltipProps\n}", "description": [], "signature": [ - "React.PropsWithChildren<TooltipWrapperProps>" + "TooltipWrapperProps" ], "path": "packages/kbn-visualization-utils/src/tooltip_wrapper.tsx", "deprecated": false, diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 4300cba0cf59f..4b16f22a40208 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-01 +date: 2024-10-02 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 e93413eded9e2..4139561dc1a46 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-01 +date: 2024-10-02 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 7152ce3a26646..9751a867de91e 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-01 +date: 2024-10-02 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.devdocs.json b/api_docs/kbn_zod.devdocs.json index e8b5087a0bbb3..0c72ec9b6d902 100644 --- a/api_docs/kbn_zod.devdocs.json +++ b/api_docs/kbn_zod.devdocs.json @@ -16307,7 +16307,7 @@ "label": "validation", "description": [], "signature": [ - "\"ip\" | \"date\" | \"base64\" | \"uuid\" | \"duration\" | \"url\" | \"email\" | \"time\" | \"emoji\" | \"nanoid\" | \"cuid\" | \"cuid2\" | \"ulid\" | \"datetime\" | \"regex\" | { includes: string; position?: number | undefined; } | { startsWith: string; } | { endsWith: string; }" + "\"ip\" | \"date\" | \"base64\" | \"uuid\" | \"duration\" | \"time\" | \"url\" | \"email\" | \"emoji\" | \"nanoid\" | \"cuid\" | \"cuid2\" | \"ulid\" | \"datetime\" | \"regex\" | { includes: string; position?: number | undefined; } | { startsWith: string; } | { endsWith: string; }" ], "path": "node_modules/zod/lib/ZodError.d.ts", "deprecated": false, @@ -18911,7 +18911,7 @@ "label": "StringValidation", "description": [], "signature": [ - "\"ip\" | \"date\" | \"base64\" | \"uuid\" | \"duration\" | \"url\" | \"email\" | \"time\" | \"emoji\" | \"nanoid\" | \"cuid\" | \"cuid2\" | \"ulid\" | \"datetime\" | \"regex\" | { includes: string; position?: number | undefined; } | { startsWith: string; } | { endsWith: string; }" + "\"ip\" | \"date\" | \"base64\" | \"uuid\" | \"duration\" | \"time\" | \"url\" | \"email\" | \"emoji\" | \"nanoid\" | \"cuid\" | \"cuid2\" | \"ulid\" | \"datetime\" | \"regex\" | { includes: string; position?: number | undefined; } | { startsWith: string; } | { endsWith: string; }" ], "path": "node_modules/zod/lib/ZodError.d.ts", "deprecated": false, diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index edf27b9b76e7b..c2e44d5bd631a 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-01 +date: 2024-10-02 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 4f70c5dd1b9ff..18c5a70637365 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-01 +date: 2024-10-02 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 0e61c5edd946d..ce1f9eba09b6e 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 795667ebbec00..faca5278b8eba 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -177,7 +177,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx", "deprecated": false, @@ -361,7 +361,7 @@ "\nApplies extra styling to a typical EuiAvatar" ], "signature": [ - "({ solution, recommended, title, href, button, layout, category, ...cardRest }: React.PropsWithChildren<", + "({ solution, recommended, title, href, button, layout, category, ...cardRest }: ", { "pluginId": "kibanaReact", "scope": "public", @@ -369,7 +369,7 @@ "section": "def-public.ElasticAgentCardProps", "text": "ElasticAgentCardProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_agent_card.tsx", "deprecated": false, @@ -383,15 +383,13 @@ "label": "{\n solution,\n recommended,\n title,\n href,\n button,\n layout,\n category,\n ...cardRest\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "kibanaReact", "scope": "public", "docId": "kibKibanaReactPluginApi", "section": "def-public.ElasticAgentCardProps", "text": "ElasticAgentCardProps" - }, - ">" + } ], "path": "src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_agent_card.tsx", "deprecated": false, @@ -420,14 +418,14 @@ { "parentPluginId": "kibanaReact", "id": "def-public.KibanaContextProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -441,7 +439,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -458,9 +456,9 @@ "\nApplies extra styling to a typical EuiAvatar" ], "signature": [ - "({ className, size, ...rest }: React.PropsWithChildren<", + "({ className, size, ...rest }: ", "KibanaPageTemplateSolutionNavAvatarProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx", "deprecated": false, @@ -474,9 +472,7 @@ "label": "{ className, size, ...rest }", "description": [], "signature": [ - "React.PropsWithChildren<", - "KibanaPageTemplateSolutionNavAvatarProps", - ">" + "KibanaPageTemplateSolutionNavAvatarProps" ], "path": "src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx", "deprecated": false, @@ -505,7 +501,7 @@ "section": "def-public.KibanaThemeProviderProps", "text": "KibanaThemeProviderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/theme.tsx", "deprecated": true, @@ -547,7 +543,7 @@ "signature": [ "(props: ", "MarkdownProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/markdown/index.tsx", "deprecated": false, @@ -582,7 +578,7 @@ "signature": [ "(props: ", "MarkdownSimpleProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/markdown/index.tsx", "deprecated": false, @@ -615,7 +611,7 @@ "label": "NoDataCard", "description": [], "signature": [ - "({ recommended, title, button, layout, ...cardRest }: React.PropsWithChildren<", + "({ recommended, title, button, layout, ...cardRest }: ", { "pluginId": "kibanaReact", "scope": "public", @@ -623,7 +619,7 @@ "section": "def-public.NoDataPageActions", "text": "NoDataPageActions" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/no_data_card.tsx", "deprecated": false, @@ -637,15 +633,13 @@ "label": "{\n recommended,\n title,\n button,\n layout,\n ...cardRest\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "kibanaReact", "scope": "public", "docId": "kibKibanaReactPluginApi", "section": "def-public.NoDataPageActions", "text": "NoDataPageActions" - }, - ">" + } ], "path": "src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/no_data_card.tsx", "deprecated": false, @@ -664,7 +658,7 @@ "label": "NoDataPage", "description": [], "signature": [ - "({ solution, logo, actions, docsLink, pageTitle, ...rest }: React.PropsWithChildren<", + "({ solution, logo, actions, docsLink, pageTitle, ...rest }: ", { "pluginId": "kibanaReact", "scope": "public", @@ -672,7 +666,7 @@ "section": "def-public.NoDataPageProps", "text": "NoDataPageProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx", "deprecated": false, @@ -681,20 +675,18 @@ { "parentPluginId": "kibanaReact", "id": "def-public.NoDataPage.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n solution,\n logo,\n actions,\n docsLink,\n pageTitle,\n ...rest\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "kibanaReact", "scope": "public", "docId": "kibKibanaReactPluginApi", "section": "def-public.NoDataPageProps", "text": "NoDataPageProps" - }, - ">" + } ], "path": "src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx", "deprecated": false, @@ -713,7 +705,7 @@ "label": "overviewPageActions", "description": [], "signature": [ - "({ addDataHref, application, devToolsHref, hidden, managementHref, showDevToolsLink, showManagementLink, }: Props) => (JSX.Element | null)[]" + "({ addDataHref, application, devToolsHref, hidden, managementHref, showDevToolsLink, showManagementLink, }: Props) => (React.JSX.Element | null)[]" ], "path": "src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx", "deprecated": false, @@ -746,7 +738,7 @@ "label": "OverviewPageFooter", "description": [], "signature": [ - "({ addBasePath, path, onSetDefaultRoute, onChangeDefaultRoute, }: React.PropsWithChildren<Props>) => JSX.Element" + "({ addBasePath, path, onSetDefaultRoute, onChangeDefaultRoute, }: Props) => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/overview_page/overview_page_footer/overview_page_footer.tsx", "deprecated": false, @@ -755,12 +747,12 @@ { "parentPluginId": "kibanaReact", "id": "def-public.OverviewPageFooter.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n addBasePath,\n path,\n onSetDefaultRoute,\n onChangeDefaultRoute,\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "src/plugins/kibana_react/public/overview_page/overview_page_footer/overview_page_footer.tsx", "deprecated": false, @@ -1025,7 +1017,7 @@ "label": "UrlTemplateEditor", "description": [], "signature": [ - "({ height, fitToContent, value, variables, onChange, placeholder, onEditor, Editor, }: React.PropsWithChildren<", + "({ height, fitToContent, value, variables, onChange, placeholder, onEditor, Editor, }: ", { "pluginId": "kibanaReact", "scope": "public", @@ -1033,7 +1025,7 @@ "section": "def-public.UrlTemplateEditorProps", "text": "UrlTemplateEditorProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", "deprecated": false, @@ -1042,20 +1034,18 @@ { "parentPluginId": "kibanaReact", "id": "def-public.UrlTemplateEditor.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n height = 105,\n fitToContent,\n value,\n variables,\n onChange,\n placeholder,\n onEditor,\n Editor = CodeEditor,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", { "pluginId": "kibanaReact", "scope": "public", "docId": "kibKibanaReactPluginApi", "section": "def-public.UrlTemplateEditorProps", "text": "UrlTemplateEditorProps" - }, - ">" + } ], "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", "deprecated": false, @@ -1470,7 +1460,7 @@ "section": "def-public.KibanaTheme", "text": "KibanaTheme" }, - ">) => JSX.Element" + ">) => React.JSX.Element" ], "path": "src/plugins/kibana_react/public/theme.tsx", "deprecated": false, @@ -1581,14 +1571,14 @@ { "parentPluginId": "kibanaReact", "id": "def-public.KibanaReactContext.Provider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -1602,7 +1592,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1641,7 +1631,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2066,7 +2056,7 @@ "label": "title", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "src/plugins/kibana_react/public/notifications/types.ts", "deprecated": false, @@ -2080,7 +2070,7 @@ "label": "body", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "src/plugins/kibana_react/public/notifications/types.ts", "deprecated": false, @@ -3020,7 +3010,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ">, \"theme\"> & { darkMode?: boolean | undefined; }) => JSX.Element" + ">, \"theme\"> & { darkMode?: boolean | undefined; }) => React.JSX.Element" ], "path": "packages/react/kibana_context/styled/styled_provider.tsx", "deprecated": false, @@ -3079,7 +3069,7 @@ "StoryFnReactReturnType", ">, ", "Args", - ">) => JSX.Element" + ">) => React.JSX.Element" ], "path": "packages/react/kibana_context/styled/styled_provider.tsx", "deprecated": true, diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index ca8f5b2586435..1332342a267e5 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.devdocs.json b/api_docs/kibana_utils.devdocs.json index 3ec9064493723..2d16dd1f0fbfc 100644 --- a/api_docs/kibana_utils.devdocs.json +++ b/api_docs/kibana_utils.devdocs.json @@ -4565,14 +4565,14 @@ { "parentPluginId": "kibanaUtils", "id": "def-public.Configurable.CollectConfig.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -4586,7 +4586,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index ef714d3e61240..d0d826554486a 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-01 +date: 2024-10-02 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 e2bb6c1195229..ddd3098aff8fa 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-01 +date: 2024-10-02 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 766dc69bf8124..79acc2610b42d 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -508,7 +508,7 @@ "signature": [ "(startDependencies: ", "LensPluginStartDependencies", - ", isNewPanel?: boolean | undefined, deletePanel?: (() => void) | undefined) => Promise<JSX.Element | null>" + ", isNewPanel?: boolean | undefined, deletePanel?: (() => void) | undefined) => Promise<React.JSX.Element | null>" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, @@ -1545,7 +1545,7 @@ "label": "seriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\"" + "\"area\" | \"line\" | \"bar\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -3394,7 +3394,7 @@ "label": "autoScaleMetricAlignment", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, @@ -3525,7 +3525,7 @@ "label": "textAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, @@ -4469,7 +4469,7 @@ "label": "titlesTextAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", "deprecated": false, @@ -4483,7 +4483,7 @@ "label": "valuesTextAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", "deprecated": false, @@ -9881,7 +9881,7 @@ "RecursivePartial", "<Omit<", "AxisStyle", - ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -9903,7 +9903,7 @@ }, "<", "YDomainRange", - " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; maximumFractionDigits?: number | undefined; tickFormat?: \"ignore\" | undefined; integersOnly?: boolean | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; }>> & Partial<Record<\"settings\", { theme?: ", + " | undefined>; hide?: boolean | undefined; showOverlappingTicks?: boolean | undefined; showOverlappingLabels?: boolean | undefined; timeAxisLayerCount?: number | undefined; maximumFractionDigits?: number | undefined; tickFormat?: \"ignore\" | undefined; integersOnly?: boolean | undefined; labelFormat?: \"ignore\" | undefined; showDuplicatedTicks?: boolean | undefined; }>> & Partial<Record<\"settings\", { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -9939,7 +9939,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> & Partial<Record<\"chart\", { title?: string | undefined; description?: string | undefined; }>>) | undefined" ], @@ -10008,7 +10008,7 @@ "label": "seriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" + "\"area\" | \"line\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" ], "path": "x-pack/plugins/lens/public/visualizations/xy/types.ts", "deprecated": false, @@ -10335,7 +10335,7 @@ "label": "preferredSeriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" + "\"area\" | \"line\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" ], "path": "x-pack/plugins/lens/public/visualizations/xy/types.ts", "deprecated": false, @@ -11890,7 +11890,7 @@ "label": "SeriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" + "\"area\" | \"line\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" ], "path": "x-pack/plugins/lens/public/visualizations/xy/types.ts", "deprecated": false, @@ -12025,7 +12025,7 @@ "section": "def-public.MetricVisualizationState", "text": "MetricVisualizationState" }, - "> | LensAttributes<string, unknown>; overrides?: Partial<Record<\"settings\", { theme?: ", + "> | LensAttributes<string, unknown>; overrides?: Partial<Record<\"settings\", { onResize?: \"ignore\" | undefined; theme?: ", "MakeOverridesSerializable", "<", "RecursivePartial", @@ -12061,7 +12061,7 @@ "MakeOverridesSerializable", "<", "CustomXDomain", - " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onResize?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ReactChild | React.ComponentType<{}> | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", + " | undefined>; debugState?: boolean | undefined; onProjectionClick?: \"ignore\" | undefined; onElementClick?: \"ignore\" | undefined; onElementOver?: \"ignore\" | undefined; onElementOut?: \"ignore\" | undefined; onBrushEnd?: \"ignore\" | undefined; onWillRender?: \"ignore\" | undefined; onProjectionAreaChange?: \"ignore\" | undefined; onAnnotationClick?: \"ignore\" | undefined; resizeDebounce?: number | undefined; pointerUpdateDebounce?: number | undefined; roundHistogramBrushValues?: boolean | undefined; noResults?: React.ComponentType<{}> | React.ReactChild | undefined; ariaLabelledBy?: string | undefined; ariaDescribedBy?: string | undefined; ariaTableCaption?: string | undefined; legendStrategy?: ", "LegendStrategy", " | undefined; onLegendItemOver?: \"ignore\" | undefined; onLegendItemOut?: \"ignore\" | undefined; onLegendItemClick?: \"ignore\" | undefined; onLegendItemPlusClick?: \"ignore\" | undefined; onLegendItemMinusClick?: \"ignore\" | undefined; legendAction?: \"ignore\" | undefined; legendSort?: \"ignore\" | undefined; customLegend?: \"ignore\" | undefined; legendTitle?: string | undefined; }>> | Partial<Record<\"gauge\", { id: string; target?: number | undefined; subtype: ", "GoalSubtype", @@ -12113,7 +12113,7 @@ "RecursivePartial", "<Omit<", "AxisStyle", - ", \"gridLine\">> | undefined>; title?: string | undefined; children?: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | undefined; gridLine?: ", + ", \"gridLine\">> | undefined>; title?: string | undefined; gridLine?: ", { "pluginId": "@kbn/chart-expressions-common", "scope": "common", @@ -12566,7 +12566,7 @@ "label": "autoScaleMetricAlignment", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, @@ -12697,7 +12697,7 @@ "label": "textAlign", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "x-pack/plugins/lens/common/types.ts", "deprecated": false, diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index a29d1b1c2bf3a..b4a5600b06e2b 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-01 +date: 2024-10-02 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 921b8948c0dd5..d9a6eb890ae94 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-01 +date: 2024-10-02 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 82870639243a6..8060d22de9c56 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-01 +date: 2024-10-02 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 2da3bb498a5c6..c828bc32348da 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-01 +date: 2024-10-02 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 e18b4140315d5..fa49355879266 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-01 +date: 2024-10-02 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 3a93b1df649d2..19b1d9831c32a 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.devdocs.json b/api_docs/logs_data_access.devdocs.json index 95f2140d313b3..fcbe2a1ad9a45 100644 --- a/api_docs/logs_data_access.devdocs.json +++ b/api_docs/logs_data_access.devdocs.json @@ -23,14 +23,14 @@ { "parentPluginId": "logsDataAccess", "id": "def-public.LogSourcesProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -44,7 +44,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -59,7 +59,7 @@ "label": "LogSourcesSettingSynchronisationInfo", "description": [], "signature": [ - "({ isLoading, logSourcesValue, getUrlForApp, title }: React.PropsWithChildren<{ isLoading: boolean; logSourcesValue: string; getUrlForApp: (appId: string, options?: { path?: string | undefined; absolute?: boolean | undefined; deepLinkId?: string | undefined; } | undefined) => string; title?: string | undefined; }>) => JSX.Element" + "({ isLoading, logSourcesValue, getUrlForApp, title }: { isLoading: boolean; logSourcesValue: string; getUrlForApp: (appId: string, options?: { path?: string | undefined; absolute?: boolean | undefined; deepLinkId?: string | undefined; } | undefined) => string; title?: string | undefined; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/logs_data_access/public/components/logs_sources_setting.tsx", "deprecated": false, @@ -68,12 +68,12 @@ { "parentPluginId": "logsDataAccess", "id": "def-public.LogSourcesSettingSynchronisationInfo.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ isLoading, logSourcesValue, getUrlForApp, title }", "description": [], "signature": [ - "React.PropsWithChildren<{ isLoading: boolean; logSourcesValue: string; getUrlForApp: (appId: string, options?: { path?: string | undefined; absolute?: boolean | undefined; deepLinkId?: string | undefined; } | undefined) => string; title?: string | undefined; }>" + "{ isLoading: boolean; logSourcesValue: string; getUrlForApp: (appId: string, options?: { path?: string | undefined; absolute?: boolean | undefined; deepLinkId?: string | undefined; } | undefined) => string; title?: string | undefined; }" ], "path": "x-pack/plugins/observability_solution/logs_data_access/public/components/logs_sources_setting.tsx", "deprecated": false, diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index b790f91d184e6..5b6c0978909e1 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-01 +date: 2024-10-02 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 cc99d12aa0e2d..29477883375c2 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-01 +date: 2024-10-02 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 06fc8e9e00889..7e0d3626da268 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -295,7 +295,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -329,7 +329,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -344,7 +344,7 @@ "label": "LogColumnHeadersWrapper", "description": [], "signature": [ - "React.ForwardRefExoticComponent<(Pick<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", + "React.ForwardRefExoticComponent<(Omit<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -352,7 +352,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - " | undefined; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", + " | undefined; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, \"ref\"> | Omit<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -360,7 +360,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, \"ref\">) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, @@ -377,7 +377,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -392,7 +392,7 @@ "label": "LogEntryColumn", "description": [], "signature": [ - "React.ForwardRefExoticComponent<(Pick<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", + "React.ForwardRefExoticComponent<(Omit<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -400,7 +400,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - " | undefined; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", + " | undefined; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, \"ref\"> | Omit<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -408,7 +408,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, \"ref\">) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, @@ -425,7 +425,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -442,7 +442,7 @@ "signature": [ "React.ForwardRefExoticComponent<", "LogEntryContextMenuProps", - " & { children?: React.ReactNode; } & React.RefAttributes<{}>>" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, @@ -459,7 +459,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -476,7 +476,7 @@ "signature": [ "React.ForwardRefExoticComponent<", "LogEntryFieldColumnProps", - " & { children?: React.ReactNode; } & React.RefAttributes<{}>>" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, @@ -493,7 +493,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -527,7 +527,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -561,7 +561,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -576,7 +576,7 @@ "label": "LogEntryRowWrapper", "description": [], "signature": [ - "React.ForwardRefExoticComponent<(Pick<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", + "React.ForwardRefExoticComponent<(Omit<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -584,7 +584,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - " | undefined; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", + " | undefined; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, \"ref\"> | Omit<Omit<Omit<any, \"role\"> & Partial<Pick<any, \"role\">>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -592,7 +592,7 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType<any> | keyof JSX.IntrinsicElements | undefined; }, \"ref\">) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, @@ -609,7 +609,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -643,7 +643,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -668,14 +668,14 @@ { "parentPluginId": "logsShared", "id": "def-public.LogHighlightsStateProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -689,7 +689,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -718,14 +718,14 @@ { "parentPluginId": "logsShared", "id": "def-public.LogPositionStateProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -739,7 +739,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -779,7 +779,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -804,14 +804,14 @@ { "parentPluginId": "logsShared", "id": "def-public.LogStreamProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -825,7 +825,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1028,14 +1028,14 @@ { "parentPluginId": "logsShared", "id": "def-public.LogViewProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -1049,7 +1049,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1093,7 +1093,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1108,7 +1108,7 @@ "label": "ScrollableLogTextStreamView", "description": [], "signature": [ - "React.ForwardRefExoticComponent<Pick<", + "React.ForwardRefExoticComponent<Omit<", "ScrollableLogTextStreamViewProps", " & React.RefAttributes<", { @@ -1118,9 +1118,7 @@ "section": "def-public.ScrollableLogTextStreamView", "text": "ScrollableLogTextStreamView" }, - ">, \"key\" | \"css\" | keyof ", - "ScrollableLogTextStreamViewProps", - "> & React.RefAttributes<{}>>" + ">, \"ref\"> & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, @@ -1137,7 +1135,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1257,7 +1255,7 @@ "section": "def-public.LogEntryColumnWidths", "text": "LogEntryColumnWidths" }, - "; CharacterDimensionsProbe: () => JSX.Element; }" + "; CharacterDimensionsProbe: () => React.JSX.Element; }" ], "path": "x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_text_stream/log_entry_column.tsx", "deprecated": false, @@ -2585,7 +2583,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 52a9f480ef8d8..6e4fb7b16eb01 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-01 +date: 2024-10-02 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 ca36d6234e45e..421c8ad2ce77b 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index 7d1769c0a287a..88612499f04b8 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -3289,14 +3289,14 @@ { "parentPluginId": "maps", "id": "def-public.MapsStartApi.Map.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -3310,7 +3310,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -3336,14 +3336,14 @@ { "parentPluginId": "maps", "id": "def-public.MapsStartApi.PassiveMap.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -3357,7 +3357,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 51fe33fad784f..254d08fce2f6b 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-01 +date: 2024-10-02 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 f7b5c3ab1e769..a3c2bc5b78ba6 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.devdocs.json b/api_docs/metrics_data_access.devdocs.json index 73550be8b5698..591859e82ebd5 100644 --- a/api_docs/metrics_data_access.devdocs.json +++ b/api_docs/metrics_data_access.devdocs.json @@ -1143,7 +1143,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1161,7 +1161,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1179,7 +1179,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1197,7 +1197,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1207,11 +1207,11 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly cpuUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; readonly normalizedLoad1m: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly disk: { readonly xy: { readonly diskThroughputReadWrite: { title: string; dataset?: ", "LensDataset", @@ -1223,7 +1223,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1241,7 +1241,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1259,7 +1259,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1277,7 +1277,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1295,7 +1295,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1313,7 +1313,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1331,7 +1331,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1349,7 +1349,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1359,7 +1359,7 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly diskUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly memory: { xy: { memoryUsageBreakdown: { title: string; dataset?: ", "LensDataset", @@ -1371,7 +1371,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1389,7 +1389,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1407,7 +1407,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1417,7 +1417,7 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { memoryUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly network: { readonly xy: { readonly rxTx: { title: string; dataset?: ", "LensDataset", @@ -1429,7 +1429,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1447,7 +1447,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1465,7 +1465,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1483,7 +1483,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1501,7 +1501,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1519,7 +1519,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1537,7 +1537,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1555,7 +1555,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1597,7 +1597,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1615,7 +1615,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1625,11 +1625,11 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly dockerContainerCpuUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; readonly k8sContainerCpuUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly memory: { xy: { dockerContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", @@ -1641,7 +1641,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1659,7 +1659,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1669,11 +1669,11 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { dockerContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; k8sContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly network: { xy: { dockerContainerRxTx: { title: string; dataset?: ", "LensDataset", @@ -1685,7 +1685,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1703,7 +1703,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1798,7 +1798,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1816,7 +1816,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1834,7 +1834,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1852,7 +1852,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1862,11 +1862,11 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly cpuUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; readonly normalizedLoad1m: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly disk: { readonly xy: { readonly diskThroughputReadWrite: { title: string; dataset?: ", "LensDataset", @@ -1878,7 +1878,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1896,7 +1896,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1914,7 +1914,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1932,7 +1932,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1950,7 +1950,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1968,7 +1968,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -1986,7 +1986,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2004,7 +2004,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2014,7 +2014,7 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly diskUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly memory: { xy: { memoryUsageBreakdown: { title: string; dataset?: ", "LensDataset", @@ -2026,7 +2026,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2044,7 +2044,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2062,7 +2062,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2072,7 +2072,7 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { memoryUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly network: { readonly xy: { readonly rxTx: { title: string; dataset?: ", "LensDataset", @@ -2084,7 +2084,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2102,7 +2102,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2120,7 +2120,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2138,7 +2138,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2156,7 +2156,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2174,7 +2174,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2192,7 +2192,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2210,7 +2210,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2252,7 +2252,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2270,7 +2270,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2280,11 +2280,11 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly dockerContainerCpuUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; readonly k8sContainerCpuUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly memory: { xy: { dockerContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", @@ -2296,7 +2296,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2314,7 +2314,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2324,11 +2324,11 @@ "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { dockerContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; k8sContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", - " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", + " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"s\" | \"d\" | \"h\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly network: { xy: { dockerContainerRxTx: { title: string; dataset?: ", "LensDataset", @@ -2340,7 +2340,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2358,7 +2358,7 @@ "LensBreakdownConfig", " | undefined; xAxis: ", "LensBreakdownConfig", - "; seriesType: \"line\" | \"area\" | \"bar\"; } | { dataset?: ", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", "LensDataset", " | undefined; yAxis: ", "LensBaseLayer", @@ -2397,7 +2397,7 @@ "label": "InventoryVisType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\"" + "\"area\" | \"line\" | \"bar\"" ], "path": "x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/types.ts", "deprecated": false, diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index a9a02e2d30de6..21e646d5db9ef 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-01 +date: 2024-10-02 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 de92720a545f5..09673653cfd00 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -96,7 +96,7 @@ "label": "MLJobsAwaitingNodeWarning", "description": [], "signature": [ - "({ jobIds }: React.PropsWithChildren<Props>) => JSX.Element" + "({ jobIds }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/lazy_loader.tsx", "deprecated": false, @@ -105,12 +105,12 @@ { "parentPluginId": "ml", "id": "def-public.MLJobsAwaitingNodeWarning.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ jobIds }", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/lazy_loader.tsx", "deprecated": false, @@ -129,7 +129,7 @@ "label": "MlNodeAvailableWarningShared", "description": [], "signature": [ - "({ nodeAvailableCallback, size }: React.PropsWithChildren<Props>) => JSX.Element | null" + "({ nodeAvailableCallback, size }: Props) => React.JSX.Element | null" ], "path": "x-pack/plugins/ml/public/application/components/node_available_warning/node_available_warning_shared.tsx", "deprecated": false, @@ -138,12 +138,12 @@ { "parentPluginId": "ml", "id": "def-public.MlNodeAvailableWarningShared.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ nodeAvailableCallback, size }", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "x-pack/plugins/ml/public/application/components/node_available_warning/node_available_warning_shared.tsx", "deprecated": false, @@ -1733,7 +1733,7 @@ "GetSchemaDefinitionParams", "): Promise<object>; }; } | undefined; components: { AnomalySwimLane: React.ForwardRefExoticComponent<", "AnomalySwimLaneProps", - " & { children?: React.ReactNode; } & React.RefAttributes<{}>>; }; }" + " & React.RefAttributes<{}>>; }; }" ], "path": "x-pack/plugins/ml/public/plugin.ts", "deprecated": false, diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index a41f072fd2c09..5a79d8856e735 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-01 +date: 2024-10-02 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 c1a9f326dfe23..0b23223d8a6aa 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-01 +date: 2024-10-02 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 4159f0355bcb7..378d529d1d0cf 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-01 +date: 2024-10-02 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 4fdb21fd4a6dd..ea0591e51201b 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.devdocs.json b/api_docs/navigation.devdocs.json index 847c0acfbe791..86c9370c09d04 100644 --- a/api_docs/navigation.devdocs.json +++ b/api_docs/navigation.devdocs.json @@ -299,7 +299,7 @@ "section": "def-public.TopNavMenuBadgeProps", "text": "TopNavMenuBadgeProps" }, - "[] | undefined; }) => JSX.Element | null" + "[] | undefined; }) => React.JSX.Element | null" ], "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_badges.tsx", "deprecated": false, @@ -359,7 +359,7 @@ "section": "def-public.TopNavMenuData", "text": "TopNavMenuData" }, - "[] | undefined; className?: string | undefined; }) => JSX.Element | null" + "[] | undefined; className?: string | undefined; }) => React.JSX.Element | null" ], "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx", "deprecated": false, @@ -1109,7 +1109,7 @@ "section": "def-public.TopNavMenuProps", "text": "TopNavMenuProps" }, - "<QT>) => JSX.Element; }" + "<QT>) => React.JSX.Element; }" ], "path": "src/plugins/navigation/public/types.ts", "deprecated": false, diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 331434ec190e6..53cf877576a72 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-01 +date: 2024-10-02 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 f934c96161da6..0288f167815eb 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-01 +date: 2024-10-02 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 57f5e59ee54e1..3e33c21b60e49 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-01 +date: 2024-10-02 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 1eee3d99d5543..62d21ae617b23 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index f0c544c7902b2..f968d64e80814 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -13,7 +13,7 @@ "signature": [ "(props: ", "AlertSummaryProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/index.tsx", "deprecated": false, @@ -48,7 +48,7 @@ "signature": [ "(props: ", "AutocompleteFieldProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, @@ -352,7 +352,7 @@ "signature": [ "(props: ", "DatePickerProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/pages/overview/components/date_picker/index.tsx", "deprecated": false, @@ -385,7 +385,7 @@ "label": "DatePickerContextProvider", "description": [], "signature": [ - "({ children }: { children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; }) => JSX.Element" + "({ children }: { children: React.ReactElement<any, string | React.JSXElementConstructor<any>>; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/context/date_picker_context/date_picker_context.tsx", "deprecated": false, @@ -661,7 +661,7 @@ "signature": [ "(props: ", "CoreVitalProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/pages/overview/components/sections/ux/core_web_vitals/get_core_web_vitals_lazy.tsx", "deprecated": false, @@ -753,41 +753,7 @@ "label": "LazyAlertsFlyout", "description": [], "signature": [ - "React.ExoticComponent<Pick<{ alert?: ", - { - "pluginId": "observability", - "scope": "public", - "docId": "kibObservabilityPluginApi", - "section": "def-public.TopAlert", - "text": "TopAlert" - }, - "<{}> | undefined; rawAlert?: ", - { - "pluginId": "@kbn/alerting-types", - "scope": "common", - "docId": "kibKbnAlertingTypesPluginApi", - "section": "def-common.Alert", - "text": "Alert" - }, - " | undefined; alerts?: Record<string, unknown>[] | undefined; isInApp?: boolean | undefined; observabilityRuleTypeRegistry: { register: (type: ", - { - "pluginId": "observability", - "scope": "public", - "docId": "kibObservabilityPluginApi", - "section": "def-public.ObservabilityRuleTypeModel", - "text": "ObservabilityRuleTypeModel" - }, - "<any>) => void; getFormatter: (typeId: string) => ", - { - "pluginId": "observability", - "scope": "public", - "docId": "kibObservabilityPluginApi", - "section": "def-public.ObservabilityRuleTypeFormatter", - "text": "ObservabilityRuleTypeFormatter" - }, - " | undefined; list: () => string[]; }; selectedAlertId?: string | undefined; } & ", - "CommonProps", - " & { as?: \"div\" | undefined; } & _EuiFlyoutProps & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof _EuiFlyoutProps> & Omit<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, \"key\" | keyof React.HTMLAttributes<HTMLDivElement> | \"css\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined; }, \"id\" | \"key\" | \"prefix\" | \"type\" | \"onError\" | \"defaultValue\" | \"security\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"size\" | \"paddingSize\" | \"ref\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\">, \"id\" | \"key\" | \"prefix\" | \"type\" | \"onError\" | \"defaultValue\" | \"security\" | \"alert\" | \"onChange\" | \"defaultChecked\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"title\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"color\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"children\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClick\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"data-test-subj\" | \"css\" | \"alerts\" | \"size\" | \"paddingSize\" | \"onClose\" | \"maxWidth\" | \"ownFocus\" | \"hideCloseButton\" | \"closeButtonProps\" | \"closeButtonPosition\" | \"maskProps\" | \"outsideClickCloses\" | \"side\" | \"pushMinBreakpoint\" | \"pushAnimation\" | \"focusTrapProps\" | \"includeFixedHeadersInFocusTrap\" | \"as\" | \"rawAlert\" | \"isInApp\" | \"observabilityRuleTypeRegistry\" | \"selectedAlertId\"> & { ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined; }> & { readonly _result: ({ alert, rawAlert, alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => JSX.Element | null; }" + "React.LazyExoticComponent<({ alert, rawAlert, alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => React.JSX.Element | null>" ], "path": "x-pack/plugins/observability_solution/observability/public/index.ts", "deprecated": false, @@ -804,7 +770,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -821,7 +787,7 @@ "signature": [ "(props: ", "ObservabilityAlertSearchBarProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx", "deprecated": false, @@ -939,7 +905,7 @@ "signature": [ "(props: ", "RuleConditionChartProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/components/rule_condition_chart/index.tsx", "deprecated": false, @@ -974,7 +940,7 @@ "signature": [ "(props: ", "RuleFlyoutKueryBarProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, @@ -1050,11 +1016,11 @@ "BrushEvent", ") => void) => (event: ", "BrushEvent", - ") => void; createAnnotation: (start: string | number, end?: string | null | undefined) => void; AddAnnotationButton: () => JSX.Element; ObservabilityAnnotations: ({ tooltipSpecs, annotations, }: { tooltipSpecs?: Partial<", + ") => void; createAnnotation: (start: string | number, end?: string | null | undefined) => void; AddAnnotationButton: () => React.JSX.Element; ObservabilityAnnotations: ({ tooltipSpecs, annotations, }: { tooltipSpecs?: Partial<", "TooltipSpec", "<any, ", "SeriesIdentifier", - ">> | undefined; annotations?: ({ id: string; } & { annotation: { title?: string | undefined; type?: string | undefined; style?: { icon?: string | undefined; color?: string | undefined; line?: { width?: number | undefined; style?: \"dashed\" | \"solid\" | \"dotted\" | undefined; iconPosition?: \"top\" | \"bottom\" | undefined; textDecoration?: \"none\" | \"name\" | undefined; } | undefined; rect?: { fill?: \"inside\" | \"outside\" | undefined; } | undefined; } | undefined; }; '@timestamp': string; message: string; } & { event?: ({ start: string; } & { end?: string | undefined; }) | undefined; tags?: string[] | undefined; service?: { name?: string | undefined; environment?: string | undefined; version?: string | undefined; } | undefined; monitor?: { id?: string | undefined; } | undefined; slo?: ({ id: string; } & { instanceId?: string | undefined; }) | undefined; host?: { name?: string | undefined; } | undefined; })[] | undefined; }) => JSX.Element; }" + ">> | undefined; annotations?: ({ id: string; } & { annotation: { title?: string | undefined; type?: string | undefined; style?: { icon?: string | undefined; color?: string | undefined; line?: { width?: number | undefined; style?: \"dashed\" | \"solid\" | \"dotted\" | undefined; iconPosition?: \"top\" | \"bottom\" | undefined; textDecoration?: \"none\" | \"name\" | undefined; } | undefined; rect?: { fill?: \"inside\" | \"outside\" | undefined; } | undefined; } | undefined; }; '@timestamp': string; message: string; } & { event?: ({ start: string; } & { end?: string | undefined; }) | undefined; tags?: string[] | undefined; service?: { name?: string | undefined; environment?: string | undefined; version?: string | undefined; } | undefined; monitor?: { id?: string | undefined; } | undefined; slo?: ({ id: string; } & { instanceId?: string | undefined; }) | undefined; host?: { name?: string | undefined; } | undefined; })[] | undefined; }) => React.JSX.Element; }" ], "path": "x-pack/plugins/observability_solution/observability/public/components/annotations/use_annotations.tsx", "deprecated": false, @@ -1278,7 +1244,7 @@ "signature": [ "(props: ", "WithKueryAutocompletionLifecycleProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability/public/components/rule_kql_filter/index.tsx", "deprecated": false, @@ -1324,7 +1290,7 @@ "label": "label", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/alert_summary.tsx", "deprecated": false, @@ -1338,7 +1304,7 @@ "label": "value", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/alert_summary.tsx", "deprecated": false, @@ -3144,7 +3110,7 @@ "section": "def-public.ExploratoryEmbeddableProps", "text": "ExploratoryEmbeddableProps" }, - ") => JSX.Element | null; }" + ") => React.JSX.Element | null; }" ], "path": "x-pack/plugins/observability_solution/observability/public/plugin.ts", "deprecated": false, @@ -3292,7 +3258,7 @@ "signature": [ "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", - ") => JSX.Element; registerSections: (sections$: ", + ") => React.JSX.Element; registerSections: (sections$: ", "Observable", "<", { @@ -15044,7 +15010,7 @@ "label": "TimeUnitChar", "description": [], "signature": [ - "\"m\" | \"d\" | \"h\" | \"s\"" + "\"m\" | \"s\" | \"d\" | \"h\"" ], "path": "x-pack/plugins/observability_solution/observability/common/utils/formatters/duration.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 9ac1c5e2a497e..ab2b99de9fd6b 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-01 +date: 2024-10-02 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 d225d68eba652..31d55c6309907 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -108,7 +108,7 @@ "signature": [ "({ size = 's', css, className }: ", "AssistantAvatarProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/components/assistant_avatar.tsx", "deprecated": false, @@ -149,7 +149,7 @@ "section": "def-public.Feedback", "text": "Feedback" }, - ") => void; onRegenerateClick: () => void; onStopGeneratingClick: () => void; }) => JSX.Element | null" + ") => void; onRegenerateClick: () => void; onStopGeneratingClick: () => void; }) => React.JSX.Element | null" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/components/chat/chat_item_controls.tsx", "deprecated": false, @@ -338,7 +338,7 @@ "signature": [ "(props: ", "UseGenAIConnectorsResult", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/components/connector_selector/connector_selector_base.tsx", "deprecated": false, @@ -609,7 +609,7 @@ "label": "FailedToLoadResponse", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/failed_to_load_response.tsx", "deprecated": false, @@ -626,7 +626,7 @@ "label": "FeedbackButtons", "description": [], "signature": [ - "({ onClickFeedback }: FeedbackButtonsProps) => JSX.Element" + "({ onClickFeedback }: FeedbackButtonsProps) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/components/buttons/feedback_buttons.tsx", "deprecated": false, @@ -692,7 +692,7 @@ "label": "MessageText", "description": [], "signature": [ - "({ loading, content, onActionClick }: Props) => JSX.Element" + "({ loading, content, onActionClick }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/components/message_panel/message_text.tsx", "deprecated": false, diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index baae91ec81803..fe1e12ead0f23 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-01 +date: 2024-10-02 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 ce9f06dfa77b5..0a787773ae1f7 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-01 +date: 2024-10-02 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 716495409af36..7c535bd673b86 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-01 +date: 2024-10-02 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 d47057e2bbf12..327e6297908b7 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-01 +date: 2024-10-02 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 0b3a5b2e45690..31371544f6d4f 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-01 +date: 2024-10-02 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 b62196dbdd307..434a9184e17e1 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -141,7 +141,7 @@ "ObservabilitySharedStart", ") => { locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", - ") => JSX.Element; registerSections: (sections$: ", + ") => React.JSX.Element; registerSections: (sections$: ", "Observable", "<", { @@ -243,7 +243,7 @@ "label": "ActionMenu", "description": [], "signature": [ - "(props: Props) => JSX.Element" + "(props: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/action_menu/action_menu.tsx", "deprecated": false, @@ -276,7 +276,7 @@ "label": "ActionMenuDivider", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/action_menu/action_menu.tsx", "deprecated": false, @@ -310,7 +310,7 @@ "label": "BottomBarActions", "description": [], "signature": [ - "({ isLoading, onDiscardChanges, onSave, unsavedChangesCount, saveLabel, appTestSubj, areChangesInvalid, }: Props) => JSX.Element" + "({ isLoading, onDiscardChanges, onSave, unsavedChangesCount, saveLabel, appTestSubj, areChangesInvalid, }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/bottom_bar_actions/bottom_bar_actions.tsx", "deprecated": false, @@ -376,7 +376,7 @@ "label": "EmbeddableFlamegraph", "description": [], "signature": [ - "({ height, ...props }: Props) => JSX.Element" + "({ height, ...props }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/profiling/embeddables/embeddable_flamegraph.tsx", "deprecated": false, @@ -409,7 +409,7 @@ "label": "EmbeddableFunctions", "description": [], "signature": [ - "(props: Props) => JSX.Element" + "(props: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/profiling/embeddables/embeddable_functions.tsx", "deprecated": false, @@ -450,7 +450,7 @@ "section": "def-public.EmbeddableProfilingSearchBarProps", "text": "EmbeddableProfilingSearchBarProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", "deprecated": false, @@ -489,7 +489,7 @@ "label": "EmbeddableStackTraces", "description": [], "signature": [ - "(props: Props) => JSX.Element" + "(props: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/profiling/embeddables/embeddable_stack_traces.tsx", "deprecated": false, @@ -522,7 +522,7 @@ "label": "FeatureFeedbackButton", "description": [], "signature": [ - "({ formUrl, formConfig, \"data-test-subj\": dts, onClickCapture, defaultButton, kibanaVersion, isCloudEnv, isServerlessEnv, sanitizedPath, nodeType, surveyButtonText, }: FeatureFeedbackButtonProps) => JSX.Element" + "({ formUrl, formConfig, \"data-test-subj\": dts, onClickCapture, defaultButton, kibanaVersion, isCloudEnv, isServerlessEnv, sanitizedPath, nodeType, surveyButtonText, }: FeatureFeedbackButtonProps) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/feature_feedback_button/feature_feedback_button.tsx", "deprecated": false, @@ -557,7 +557,7 @@ "signature": [ "(props: ", "FieldValueSelectionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/index.tsx", "deprecated": false, @@ -592,7 +592,7 @@ "signature": [ "(props: ", "FieldValueSuggestionsProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/index.tsx", "deprecated": false, @@ -964,7 +964,7 @@ "signature": [ "(props: ", "HeaderMenuPortalProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/header_menu/index.tsx", "deprecated": false, @@ -997,7 +997,7 @@ "label": "InspectorContextProvider", "description": [], "signature": [ - "({ children }: { children: React.ReactNode; }) => JSX.Element" + "({ children }: { children: React.ReactNode; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/contexts/inspector/inspector_context.tsx", "deprecated": false, @@ -1022,7 +1022,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/contexts/inspector/inspector_context.tsx", "deprecated": false, @@ -1044,7 +1044,7 @@ "signature": [ "(props: ", "LoadWhenInViewProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/load_when_in_view/get_load_when_in_view_lazy.tsx", "deprecated": false, @@ -1077,7 +1077,7 @@ "label": "NavigationWarningPromptProvider", "description": [], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/navigation_warning_prompt/context.tsx", "deprecated": false, @@ -1127,7 +1127,7 @@ "label": "ProfilingEmptyState", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/profiling/profiling_empty_state.tsx", "deprecated": false, @@ -1144,7 +1144,7 @@ "label": "Prompt", "description": [], "signature": [ - "({ prompt }: React.PropsWithChildren<Props>) => null" + "({ prompt }: Props) => null" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/navigation_warning_prompt/prompt.tsx", "deprecated": false, @@ -1153,12 +1153,12 @@ { "parentPluginId": "observabilityShared", "id": "def-public.Prompt.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ prompt }", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/navigation_warning_prompt/prompt.tsx", "deprecated": false, @@ -1198,7 +1198,7 @@ "signature": [ "({ ...props }: ", "EuiListGroupItemProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1237,7 +1237,7 @@ "EuiListGroupItemProps", "[] | undefined; color?: \"text\" | \"subdued\" | \"primary\" | undefined; size?: \"m\" | \"s\" | \"l\" | \"xs\" | undefined; maxWidth?: boolean | ", "Property", - ".MaxWidth<string | number> | undefined; showToolTips?: boolean | undefined; wrapText?: boolean | undefined; ariaLabelledby?: string | undefined; }) => JSX.Element" + ".MaxWidth<string | number> | undefined; showToolTips?: boolean | undefined; wrapText?: boolean | undefined; ariaLabelledby?: string | undefined; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1276,7 +1276,7 @@ "label": "SectionSpacer", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1293,7 +1293,7 @@ "label": "SectionSubtitle", "description": [], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1318,7 +1318,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1338,7 +1338,7 @@ "label": "SectionTitle", "description": [], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1363,7 +1363,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/section/section.tsx", "deprecated": false, @@ -1424,7 +1424,7 @@ "section": "def-public.TagsListProps", "text": "TagsListProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/tags_list/tags_list_lazy.tsx", "deprecated": false, @@ -1463,7 +1463,7 @@ "label": "TechnicalPreviewBadge", "description": [], "signature": [ - "({ icon = 'beaker', size, style }: Props) => JSX.Element" + "({ icon = 'beaker', size, style }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/technical_preview_badge/technical_preview_badge.tsx", "deprecated": false, @@ -3400,13 +3400,11 @@ "signature": [ "Pick<", "KibanaPageTemplateProps", - ", \"children\" | \"data-test-subj\" | \"pageHeader\" | \"restrictWidth\" | \"isEmptyState\" | \"noDataConfig\"> & { showSolutionNav?: boolean | undefined; isPageDataLoaded?: boolean | undefined; pageSectionProps?: ", + ", \"children\" | \"data-test-subj\" | \"paddingSize\" | \"pageHeader\" | \"restrictWidth\" | \"isEmptyState\" | \"noDataConfig\"> & { showSolutionNav?: boolean | undefined; isPageDataLoaded?: boolean | undefined; pageSectionProps?: ", "EuiPageSectionProps", " | undefined; bottomBar?: React.ReactNode; bottomBarProps?: ", "_EuiPageBottomBarProps", - " | undefined; topSearchBar?: React.ReactNode; } & Pick<", - "EuiEmptyPromptProps", - ", \"paddingSize\">" + " | undefined; topSearchBar?: React.ReactNode; }" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/page_template/page_template.tsx", "deprecated": false, @@ -3471,13 +3469,11 @@ "ObservabilityPageTemplateDependencies", ", \"isSidebarEnabled$\"> & Pick<", "KibanaPageTemplateProps", - ", \"children\" | \"data-test-subj\" | \"pageHeader\" | \"restrictWidth\" | \"isEmptyState\" | \"noDataConfig\"> & { showSolutionNav?: boolean | undefined; isPageDataLoaded?: boolean | undefined; pageSectionProps?: ", + ", \"children\" | \"data-test-subj\" | \"paddingSize\" | \"pageHeader\" | \"restrictWidth\" | \"isEmptyState\" | \"noDataConfig\"> & { showSolutionNav?: boolean | undefined; isPageDataLoaded?: boolean | undefined; pageSectionProps?: ", "EuiPageSectionProps", " | undefined; bottomBar?: React.ReactNode; bottomBarProps?: ", "_EuiPageBottomBarProps", - " | undefined; topSearchBar?: React.ReactNode; } & Pick<", - "EuiEmptyPromptProps", - ", \"paddingSize\">" + " | undefined; topSearchBar?: React.ReactNode; }" ], "path": "x-pack/plugins/observability_solution/observability_shared/public/components/page_template/page_template.tsx", "deprecated": false, @@ -3519,7 +3515,7 @@ "signature": [ "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", - ") => JSX.Element; registerSections: (sections$: ", + ") => React.JSX.Element; registerSections: (sections$: ", "Observable", "<", { @@ -3633,7 +3629,7 @@ "DisambiguateSet", "<React.ButtonHTMLAttributes<HTMLButtonElement>, Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">> & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">) | (", "DisambiguateSet", - "<Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">, React.ButtonHTMLAttributes<HTMLButtonElement>> & React.ButtonHTMLAttributes<HTMLButtonElement>))), \"color\" | \"onClick\" | \"rel\" | \"target\"> & { size?: \"m\" | \"s\" | \"l\" | \"xs\" | undefined; color?: \"text\" | \"subdued\" | \"primary\" | undefined; label: React.ReactNode; isActive?: boolean | undefined; isDisabled?: boolean | undefined; href?: string | undefined; rel?: string | undefined; target?: string | undefined; external?: boolean | undefined; iconType?: ", + "<Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">, React.ButtonHTMLAttributes<HTMLButtonElement>> & React.ButtonHTMLAttributes<HTMLButtonElement>))), \"rel\" | \"color\" | \"onClick\" | \"target\"> & { size?: \"m\" | \"s\" | \"l\" | \"xs\" | undefined; color?: \"text\" | \"subdued\" | \"primary\" | undefined; label: React.ReactNode; isActive?: boolean | undefined; isDisabled?: boolean | undefined; href?: string | undefined; rel?: string | undefined; target?: string | undefined; external?: boolean | undefined; iconType?: ", "IconType", " | undefined; iconProps?: Omit<", "EuiIconProps", diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index d7869264cedd4..6cbf55a4dfe62 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.devdocs.json b/api_docs/osquery.devdocs.json index 05e3ab390e8a5..4cde122de5cd7 100644 --- a/api_docs/osquery.devdocs.json +++ b/api_docs/osquery.devdocs.json @@ -50,7 +50,7 @@ "section": "def-common.Ecs", "text": "Ecs" }, - " | undefined; }) => JSX.Element) | undefined" + " | undefined; }) => React.JSX.Element) | undefined" ], "path": "x-pack/plugins/osquery/public/types.ts", "deprecated": false, @@ -66,7 +66,7 @@ "signature": [ "(props: ", "OsqueryActionResultProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/osquery/public/types.ts", "deprecated": false, @@ -99,7 +99,7 @@ "signature": [ "(props: ", "OsqueryActionResultsProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/osquery/public/types.ts", "deprecated": false, @@ -134,7 +134,7 @@ "LiveQueryQueryFieldProps", " & { formMethods: ", "UseFormReturn", - "<{ label: string; query: string; ecs_mapping: Record<string, unknown>; }, any, undefined>; }) => JSX.Element) | undefined" + "<{ label: string; query: string; ecs_mapping: Record<string, unknown>; }, any, undefined>; }) => React.JSX.Element) | undefined" ], "path": "x-pack/plugins/osquery/public/types.ts", "deprecated": false, @@ -207,7 +207,7 @@ "signature": [ "(props: ", "OsqueryResponseActionsParamsFormProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/osquery/public/types.ts", "deprecated": false, diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 1258bfe614189..6ee8445992a00 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-01 +date: 2024-10-02 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 46896024dac86..4c81946ccb4b8 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-01 +date: 2024-10-02 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 144e1ad2111a3..6a46c50af0d44 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a <br /> public API | Number of teams | |--------------|----------|------------------------| -| 864 | 737 | 45 | +| 865 | 738 | 45 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53450 | 245 | 40062 | 1980 | +| 53457 | 244 | 40070 | 1982 | ## Plugin Directory @@ -49,7 +49,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibCloudSecurityPosturePluginApi" text="cloudSecurityPosture"/> | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 13 | 0 | 2 | 2 | | <DocLink id="kibConsolePluginApi" text="console"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 39 | 0 | 30 | 0 | | <DocLink id="kibContentManagementPluginApi" text="contentManagement"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 149 | 0 | 125 | 6 | -| <DocLink id="kibControlsPluginApi" text="controls"/> | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | 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 | 134 | 0 | 130 | 14 | +| <DocLink id="kibControlsPluginApi" text="controls"/> | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | 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 | 135 | 0 | 131 | 14 | | 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 | | <DocLink id="kibCustomIntegrationsPluginApi" text="customIntegrations"/> | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | @@ -187,7 +187,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibSearchPlaygroundPluginApi" text="searchPlayground"/> | [@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 | | <DocLink id="kibSecurityPluginApi" text="security"/> | [@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. | 448 | 0 | 231 | 0 | -| <DocLink id="kibSecuritySolutionPluginApi" text="securitySolution"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 193 | 0 | 124 | 33 | +| <DocLink id="kibSecuritySolutionPluginApi" text="securitySolution"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 190 | 0 | 122 | 33 | | <DocLink id="kibSecuritySolutionEssPluginApi" text="securitySolutionEss"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | <DocLink id="kibSecuritySolutionServerlessPluginApi" text="securitySolutionServerless"/> | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | | <DocLink id="kibServerlessPluginApi" text="serverless"/> | [@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 | @@ -214,7 +214,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibUiActionsPluginApi" text="uiActions"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 156 | 0 | 110 | 9 | | <DocLink id="kibUiActionsEnhancedPluginApi" text="uiActionsEnhanced"/> | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 212 | 0 | 145 | 11 | | <DocLink id="kibUnifiedDocViewerPluginApi" text="unifiedDocViewer"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 15 | 0 | 10 | 3 | -| <DocLink id="kibUnifiedHistogramPluginApi" text="unifiedHistogram"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display. | 71 | 0 | 36 | 6 | +| <DocLink id="kibUnifiedHistogramPluginApi" text="unifiedHistogram"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display. | 72 | 0 | 37 | 6 | | <DocLink id="kibUnifiedSearchPluginApi" text="unifiedSearch"/> | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 149 | 2 | 112 | 21 | | upgradeAssistant | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | <DocLink id="kibUptimePluginApi" text="uptime"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | This plugin visualizes data from Heartbeat, and integrates with other Observability solutions. | 1 | 0 | 1 | 0 | @@ -570,7 +570,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnManagementSettingsComponentsFieldRowPluginApi" text="@kbn/management-settings-components-field-row"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 23 | 0 | 7 | 0 | | <DocLink id="kibKbnManagementSettingsComponentsFormPluginApi" text="@kbn/management-settings-components-form"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 2 | 3 | | <DocLink id="kibKbnManagementSettingsFieldDefinitionPluginApi" text="@kbn/management-settings-field-definition"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 45 | 0 | 0 | 0 | -| <DocLink id="kibKbnManagementSettingsIdsPluginApi" text="@kbn/management-settings-ids"/> | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 142 | 0 | 140 | 0 | +| <DocLink id="kibKbnManagementSettingsIdsPluginApi" text="@kbn/management-settings-ids"/> | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 143 | 0 | 141 | 0 | | <DocLink id="kibKbnManagementSettingsSectionRegistryPluginApi" text="@kbn/management-settings-section-registry"/> | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | | <DocLink id="kibKbnManagementSettingsTypesPluginApi" text="@kbn/management-settings-types"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 88 | 0 | 10 | 0 | | <DocLink id="kibKbnManagementSettingsUtilitiesPluginApi" text="@kbn/management-settings-utilities"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 56 | 0 | 6 | 0 | @@ -614,6 +614,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnObservabilityAlertingRuleUtilsPluginApi" text="@kbn/observability-alerting-rule-utils"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 5 | 0 | 5 | 0 | | <DocLink id="kibKbnObservabilityAlertingTestDataPluginApi" text="@kbn/observability-alerting-test-data"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 99 | 1 | 99 | 0 | | <DocLink id="kibKbnObservabilityGetPaddedAlertTimeRangeUtilPluginApi" text="@kbn/observability-get-padded-alert-time-range-util"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 6 | 0 | 6 | 1 | +| <DocLink id="kibKbnObservabilitySyntheticsTestDataPluginApi" text="@kbn/observability-synthetics-test-data"/> | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 4 | 0 | 4 | 1 | | <DocLink id="kibKbnOpenapiBundlerPluginApi" text="@kbn/openapi-bundler"/> | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 12 | 0 | 12 | 0 | | <DocLink id="kibKbnOpenapiGeneratorPluginApi" text="@kbn/openapi-generator"/> | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 15 | 0 | 15 | 0 | | <DocLink id="kibKbnOptimizerPluginApi" text="@kbn/optimizer"/> | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 45 | 0 | 45 | 10 | @@ -665,7 +666,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnSearchApiPanelsPluginApi" text="@kbn/search-api-panels"/> | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 76 | 0 | 76 | 0 | | <DocLink id="kibKbnSearchConnectorsPluginApi" text="@kbn/search-connectors"/> | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 3929 | 0 | 3929 | 0 | | <DocLink id="kibKbnSearchErrorsPluginApi" text="@kbn/search-errors"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | -| <DocLink id="kibKbnSearchIndexDocumentsPluginApi" text="@kbn/search-index-documents"/> | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 30 | 0 | 30 | 1 | +| <DocLink id="kibKbnSearchIndexDocumentsPluginApi" text="@kbn/search-index-documents"/> | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 33 | 0 | 33 | 2 | | <DocLink id="kibKbnSearchResponseWarningsPluginApi" text="@kbn/search-response-warnings"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | <DocLink id="kibKbnSearchTypesPluginApi" text="@kbn/search-types"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 25 | 0 | | <DocLink id="kibKbnSecurityApiKeyManagementPluginApi" text="@kbn/security-api-key-management"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 66 | 0 | 63 | 0 | @@ -782,7 +783,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | <DocLink id="kibKbnUnsavedChangesBadgePluginApi" text="@kbn/unsaved-changes-badge"/> | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 0 | | <DocLink id="kibKbnUnsavedChangesPromptPluginApi" text="@kbn/unsaved-changes-prompt"/> | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | <DocLink id="kibKbnUseTrackedPromisePluginApi" text="@kbn/use-tracked-promise"/> | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 3 | 0 | 2 | 1 | -| <DocLink id="kibKbnUserProfileComponentsPluginApi" text="@kbn/user-profile-components"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 81 | 1 | 21 | 2 | +| <DocLink id="kibKbnUserProfileComponentsPluginApi" text="@kbn/user-profile-components"/> | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 81 | 0 | 21 | 2 | | <DocLink id="kibKbnUtilityTypesPluginApi" text="@kbn/utility-types"/> | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 16 | 1 | | <DocLink id="kibKbnUtilityTypesJestPluginApi" text="@kbn/utility-types-jest"/> | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | <DocLink id="kibKbnUtilsPluginApi" text="@kbn/utils"/> | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 26 | 0 | 15 | 0 | diff --git a/api_docs/presentation_panel.devdocs.json b/api_docs/presentation_panel.devdocs.json index 15ffab0f06b91..ed8d46e52734d 100644 --- a/api_docs/presentation_panel.devdocs.json +++ b/api_docs/presentation_panel.devdocs.json @@ -45,7 +45,7 @@ }, "<", "PanelCompatibleComponent", - "<ApiType, PropsType> | null>; } & { hidePanelChrome?: boolean | undefined; }) => JSX.Element | null" + "<ApiType, PropsType> | null>; } & { hidePanelChrome?: boolean | undefined; }) => React.JSX.Element | null" ], "path": "src/plugins/presentation_panel/public/panel_component/presentation_panel.tsx", "deprecated": false, @@ -100,7 +100,7 @@ }, "; api?: ", "DefaultPresentationPanelApi", - " | undefined; }) => JSX.Element" + " | undefined; }) => React.JSX.Element" ], "path": "src/plugins/presentation_panel/public/panel_component/presentation_panel_error.tsx", "deprecated": false, diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index d3e9e9952a269..909a47db430e3 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.devdocs.json b/api_docs/presentation_util.devdocs.json index 2055ed8ecbbdf..8a490eccd4225 100644 --- a/api_docs/presentation_util.devdocs.json +++ b/api_docs/presentation_util.devdocs.json @@ -33,7 +33,7 @@ "label": "Provider", "description": [], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children }: { children?: React.ReactNode; }) => React.JSX.Element" ], "path": "src/plugins/presentation_util/public/services/create/provider.tsx", "deprecated": false, @@ -651,7 +651,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -666,9 +666,9 @@ "label": "FloatingActions", "description": [], "signature": [ - "({ children, viewMode, isEnabled, api, className, disabledActions, }: React.PropsWithChildren<", + "({ children, viewMode, isEnabled, api, className, disabledActions, }: ", "FloatingActionsProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx", "deprecated": false, @@ -677,14 +677,12 @@ { "parentPluginId": "presentationUtil", "id": "def-public.FloatingActions.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n children,\n viewMode,\n isEnabled,\n api,\n className = '',\n disabledActions,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "FloatingActionsProps", - ">" + "FloatingActionsProps" ], "path": "src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx", "deprecated": false, @@ -720,11 +718,9 @@ "label": "LazyDashboardPicker", "description": [], "signature": [ - "React.ExoticComponent<", - "DashboardPickerProps", - "> & { readonly _result: ({ isDisabled, onChange, idsToOmit }: ", + "React.LazyExoticComponent<({ isDisabled, onChange, idsToOmit }: ", "DashboardPickerProps", - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -741,7 +737,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -756,19 +752,7 @@ "label": "LazyDataViewPicker", "description": [], "signature": [ - "React.ExoticComponent<{ dataViews: ", - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataViewListItem", - "text": "DataViewListItem" - }, - "[]; selectedDataViewId?: string | undefined; trigger: ", - "DataViewTriggerProps", - "; onChangeDataViewId: (newId: string) => void; selectableProps?: Partial<", - "EuiSelectableProps", - "<{}>> | undefined; }> & { readonly _result: ({ dataViews, selectedDataViewId, onChangeDataViewId, trigger, selectableProps, ...other }: { dataViews: ", + "React.LazyExoticComponent<({ dataViews, selectedDataViewId, onChangeDataViewId, trigger, selectableProps, ...other }: { dataViews: ", { "pluginId": "dataViews", "scope": "common", @@ -780,7 +764,7 @@ "DataViewTriggerProps", "; onChangeDataViewId: (newId: string) => void; selectableProps?: Partial<", "EuiSelectableProps", - "<{}>> | undefined; }) => JSX.Element; }" + "<{}>> | undefined; }) => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -797,7 +781,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -814,15 +798,7 @@ "\nA lazily-loaded ExpressionInput component." ], "signature": [ - "React.ExoticComponent<", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ExpressionInputProps", - "text": "ExpressionInputProps" - }, - "> & { readonly _result: (props: ", + "React.LazyExoticComponent<(props: ", { "pluginId": "presentationUtil", "scope": "public", @@ -830,7 +806,7 @@ "section": "def-public.ExpressionInputProps", "text": "ExpressionInputProps" }, - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -847,7 +823,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -862,11 +838,9 @@ "label": "LazyFieldPicker", "description": [], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<({ dataView, onSelectField, filterPredicate, selectedFieldName, selectableProps, ...other }: ", "FieldPickerProps", - "> & { readonly _result: ({ dataView, onSelectField, filterPredicate, selectedFieldName, selectableProps, ...other }: ", - "FieldPickerProps", - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -883,7 +857,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -898,13 +872,9 @@ "label": "LazyLabsBeakerButton", "description": [], "signature": [ - "React.ExoticComponent<", - "EuiButtonProps", - " & Pick<", - "Props", - ", \"solutions\">> & { readonly _result: ({ solutions, ...props }: ", + "React.LazyExoticComponent<({ solutions, ...props }: ", "Props", - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -921,7 +891,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -936,11 +906,9 @@ "label": "LazyLabsFlyout", "description": [], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<(props: ", "Props", - "> & { readonly _result: (props: ", - "Props", - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -957,7 +925,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -997,15 +965,7 @@ "label": "LazySavedObjectSaveModalDashboard", "description": [], "signature": [ - "React.ExoticComponent<", - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.SaveModalDashboardProps", - "text": "SaveModalDashboardProps" - }, - "> & { readonly _result: (props: ", + "React.LazyExoticComponent<(props: ", { "pluginId": "presentationUtil", "scope": "public", @@ -1013,7 +973,7 @@ "section": "def-public.SaveModalDashboardProps", "text": "SaveModalDashboardProps" }, - ") => JSX.Element; }" + ") => React.JSX.Element>" ], "path": "src/plugins/presentation_util/public/components/index.tsx", "deprecated": false, @@ -1030,7 +990,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1630,7 +1590,7 @@ "label": "getProjects", "description": [], "signature": [ - "(solutions?: (\"canvas\" | \"dashboard\" | \"presentation\")[] | undefined) => Record<\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\", ", + "(solutions?: (\"canvas\" | \"presentation\" | \"dashboard\")[] | undefined) => Record<\"labs:dashboard:deferBelowFold\" | \"labs:canvas:byValueEmbeddable\", ", { "pluginId": "presentationUtil", "scope": "common", @@ -1652,7 +1612,7 @@ "label": "solutions", "description": [], "signature": [ - "(\"canvas\" | \"dashboard\" | \"presentation\")[] | undefined" + "(\"canvas\" | \"presentation\" | \"dashboard\")[] | undefined" ], "path": "src/plugins/presentation_util/public/services/labs/types.ts", "deprecated": false, @@ -2874,14 +2834,14 @@ { "parentPluginId": "presentationUtil", "id": "def-public.PresentationUtilPluginStart.ContextProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -2895,7 +2855,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -3467,7 +3427,7 @@ "label": "solutions", "description": [], "signature": [ - "(\"canvas\" | \"dashboard\" | \"presentation\")[]" + "(\"canvas\" | \"presentation\" | \"dashboard\")[]" ], "path": "src/plugins/presentation_util/common/labs.ts", "deprecated": false, @@ -3646,7 +3606,7 @@ "label": "SolutionName", "description": [], "signature": [ - "\"canvas\" | \"dashboard\" | \"presentation\"" + "\"canvas\" | \"presentation\" | \"dashboard\"" ], "path": "src/plugins/presentation_util/common/labs.ts", "deprecated": false, diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index ea40b232504af..9a698cb393a60 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-01 +date: 2024-10-02 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 3f847ffa29d09..4f2accb5529c2 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-01 +date: 2024-10-02 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 05d2ff7481b3b..82735a71d8b8c 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-01 +date: 2024-10-02 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 cdbe5e0beba1d..f22015faaa70a 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-01 +date: 2024-10-02 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 6c8d6189823df..a18c75b9841e9 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-01 +date: 2024-10-02 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 e83018eca915d..09d502216cfef 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index 9bf91e441667f..e17e7cc999233 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -5450,7 +5450,7 @@ "section": "def-common.BasicFields", "text": "BasicFields" }, - " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; } & { [x: string]: unknown[]; }" + " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; } & { [x: string]: unknown[]; }" ], "path": "packages/kbn-alerting-types/alert_type.ts", "deprecated": false, diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 663f645639c31..e7876bace5741 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.devdocs.json b/api_docs/runtime_fields.devdocs.json index 381ba84141b51..90294a4540fc7 100644 --- a/api_docs/runtime_fields.devdocs.json +++ b/api_docs/runtime_fields.devdocs.json @@ -19,7 +19,7 @@ "section": "def-public.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/runtime_fields/public/components/runtime_field_editor/runtime_field_editor.tsx", "deprecated": false, @@ -66,7 +66,7 @@ "section": "def-public.Props", "text": "Props" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/runtime_fields/public/components/runtime_field_editor_flyout_content/runtime_field_editor_flyout_content.tsx", "deprecated": false, diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index e5ea93d8745bf..cf58e3305c627 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.devdocs.json b/api_docs/saved_objects.devdocs.json index 0e1d7fbd0262d..340a56e3620f2 100644 --- a/api_docs/saved_objects.devdocs.json +++ b/api_docs/saved_objects.devdocs.json @@ -214,7 +214,7 @@ "label": "render", "description": [], "signature": [ - "() => JSX.Element" + "() => React.JSX.Element" ], "path": "src/plugins/saved_objects/public/save_modal/saved_object_save_modal.tsx", "deprecated": false, @@ -420,7 +420,7 @@ "section": "def-public.OriginSaveModalProps", "text": "OriginSaveModalProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/saved_objects/public/save_modal/saved_object_save_modal_origin.tsx", "deprecated": false, diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 4bbc4276299f4..0060b12a29862 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.devdocs.json b/api_docs/saved_objects_finder.devdocs.json index db6089b00c4c6..d33b50de2badc 100644 --- a/api_docs/saved_objects_finder.devdocs.json +++ b/api_docs/saved_objects_finder.devdocs.json @@ -43,7 +43,7 @@ "section": "def-public.SavedObjectFinderProps", "text": "SavedObjectFinderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/saved_objects_finder/public/finder/index.tsx", "deprecated": false, @@ -133,7 +133,7 @@ "section": "def-public.SavedObjectFinderProps", "text": "SavedObjectFinderProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/saved_objects_finder/public/finder/index.tsx", "deprecated": false, diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 23db480af11d1..e24a085d3e985 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.devdocs.json b/api_docs/saved_objects_management.devdocs.json index 0718f97522474..bc7e6925f3b98 100644 --- a/api_docs/saved_objects_management.devdocs.json +++ b/api_docs/saved_objects_management.devdocs.json @@ -294,7 +294,7 @@ "label": "euiColumn", "description": [], "signature": [ - "{ id?: string | undefined; prefix?: string | undefined; onError?: React.ReactEventHandler<HTMLTableCellElement> | undefined; scope?: string | undefined; defaultValue?: string | number | readonly string[] | undefined; name: React.ReactNode; security?: string | undefined; onChange?: React.FormEventHandler<HTMLTableCellElement> | undefined; defaultChecked?: boolean | undefined; suppressContentEditableWarning?: boolean | undefined; suppressHydrationWarning?: boolean | undefined; accessKey?: string | undefined; className?: string | undefined; contentEditable?: Booleanish | \"inherit\" | undefined; contextMenu?: string | undefined; dir?: string | undefined; draggable?: Booleanish | undefined; hidden?: boolean | undefined; lang?: string | undefined; placeholder?: string | undefined; slot?: string | undefined; spellCheck?: Booleanish | undefined; style?: React.CSSProperties | undefined; tabIndex?: number | undefined; title?: string | undefined; translate?: \"yes\" | \"no\" | undefined; radioGroup?: string | undefined; role?: React.AriaRole | undefined; about?: string | undefined; datatype?: string | undefined; inlist?: any; property?: string | undefined; resource?: string | undefined; typeof?: string | undefined; vocab?: string | undefined; autoCapitalize?: string | undefined; autoCorrect?: string | undefined; autoSave?: string | undefined; color?: string | undefined; itemProp?: string | undefined; itemScope?: boolean | undefined; itemType?: string | undefined; itemID?: string | undefined; itemRef?: string | undefined; results?: number | undefined; unselectable?: \"on\" | \"off\" | undefined; inputMode?: \"search\" | \"none\" | \"text\" | \"url\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\" | undefined; is?: string | undefined; 'aria-activedescendant'?: string | undefined; 'aria-atomic'?: Booleanish | undefined; 'aria-autocomplete'?: \"none\" | \"list\" | \"both\" | \"inline\" | undefined; 'aria-busy'?: Booleanish | undefined; 'aria-checked'?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; 'aria-colcount'?: number | undefined; 'aria-colindex'?: number | undefined; 'aria-colspan'?: number | undefined; 'aria-controls'?: string | undefined; 'aria-current'?: boolean | \"page\" | \"date\" | \"location\" | \"true\" | \"false\" | \"time\" | \"step\" | undefined; 'aria-describedby'?: string | undefined; 'aria-details'?: string | undefined; 'aria-disabled'?: Booleanish | undefined; 'aria-dropeffect'?: \"execute\" | \"link\" | \"none\" | \"copy\" | \"move\" | \"popup\" | undefined; 'aria-errormessage'?: string | undefined; 'aria-expanded'?: Booleanish | undefined; 'aria-flowto'?: string | undefined; 'aria-grabbed'?: Booleanish | undefined; 'aria-haspopup'?: boolean | \"grid\" | \"true\" | \"false\" | \"menu\" | \"dialog\" | \"listbox\" | \"tree\" | undefined; 'aria-hidden'?: Booleanish | undefined; 'aria-invalid'?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\" | undefined; 'aria-keyshortcuts'?: string | undefined; 'aria-label'?: string | undefined; 'aria-labelledby'?: string | undefined; 'aria-level'?: number | undefined; 'aria-live'?: \"off\" | \"assertive\" | \"polite\" | undefined; 'aria-modal'?: Booleanish | undefined; 'aria-multiline'?: Booleanish | undefined; 'aria-multiselectable'?: Booleanish | undefined; 'aria-orientation'?: \"horizontal\" | \"vertical\" | undefined; 'aria-owns'?: string | undefined; 'aria-placeholder'?: string | undefined; 'aria-posinset'?: number | undefined; 'aria-pressed'?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; 'aria-readonly'?: Booleanish | undefined; 'aria-relevant'?: \"text\" | \"all\" | \"additions\" | \"additions removals\" | \"additions text\" | \"removals\" | \"removals additions\" | \"removals text\" | \"text additions\" | \"text removals\" | undefined; 'aria-required'?: Booleanish | undefined; 'aria-roledescription'?: string | undefined; 'aria-rowcount'?: number | undefined; 'aria-rowindex'?: number | undefined; 'aria-rowspan'?: number | undefined; 'aria-selected'?: Booleanish | undefined; 'aria-setsize'?: number | undefined; 'aria-sort'?: \"none\" | \"other\" | \"ascending\" | \"descending\" | undefined; 'aria-valuemax'?: number | undefined; 'aria-valuemin'?: number | undefined; 'aria-valuenow'?: number | undefined; 'aria-valuetext'?: string | undefined; children?: React.ReactNode; dangerouslySetInnerHTML?: { __html: string; } | undefined; onCopy?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCopyCapture?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCut?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCutCapture?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onPaste?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onPasteCapture?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCompositionEnd?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionEndCapture?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionStart?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionStartCapture?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionUpdate?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionUpdateCapture?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onFocus?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onFocusCapture?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onBlur?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onBlurCapture?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onChangeCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onBeforeInput?: React.FormEventHandler<HTMLTableCellElement> | undefined; onBeforeInputCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInput?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInputCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onReset?: React.FormEventHandler<HTMLTableCellElement> | undefined; onResetCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onSubmit?: React.FormEventHandler<HTMLTableCellElement> | undefined; onSubmitCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInvalid?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInvalidCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onLoad?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onErrorCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onKeyDown?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyDownCapture?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyPress?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyPressCapture?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyUp?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyUpCapture?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onAbort?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onAbortCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlay?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlayCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlayThrough?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlayThroughCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onDurationChange?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onDurationChangeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEmptied?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEmptiedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEncrypted?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEncryptedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEnded?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEndedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedData?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedDataCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedMetadata?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedMetadataCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadStart?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadStartCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPause?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPauseCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlay?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlayCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlaying?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlayingCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onProgress?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onProgressCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onRateChange?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onRateChangeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeeked?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeekedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeeking?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeekingCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onStalled?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onStalledCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSuspend?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSuspendCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onTimeUpdate?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onTimeUpdateCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onVolumeChange?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onVolumeChangeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onWaiting?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onWaitingCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onAuxClick?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onAuxClickCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onClick?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onClickCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onContextMenu?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onContextMenuCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onDoubleClick?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onDoubleClickCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onDrag?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEnd?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEndCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEnter?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEnterCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragExit?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragExitCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragLeave?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragLeaveCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragOver?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragOverCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragStart?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragStartCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDrop?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDropCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onMouseDown?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseDownCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseEnter?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseLeave?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseMove?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseMoveCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOut?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOutCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOver?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOverCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseUp?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseUpCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onSelect?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSelectCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onTouchCancel?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchCancelCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchEnd?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchEndCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchMove?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchMoveCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchStart?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchStartCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onPointerDown?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerDownCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerMove?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerMoveCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerUp?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerUpCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerCancel?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerCancelCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerEnter?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerEnterCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerLeave?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerLeaveCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOver?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOverCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOut?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOutCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onGotPointerCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onGotPointerCaptureCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onLostPointerCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onLostPointerCaptureCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onScroll?: React.UIEventHandler<HTMLTableCellElement> | undefined; onScrollCapture?: React.UIEventHandler<HTMLTableCellElement> | undefined; onWheel?: React.WheelEventHandler<HTMLTableCellElement> | undefined; onWheelCapture?: React.WheelEventHandler<HTMLTableCellElement> | undefined; onAnimationStart?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationStartCapture?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationEnd?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationEndCapture?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationIteration?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationIterationCapture?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onTransitionEnd?: React.TransitionEventHandler<HTMLTableCellElement> | undefined; onTransitionEndCapture?: React.TransitionEventHandler<HTMLTableCellElement> | undefined; 'data-test-subj'?: string | undefined; css?: ", + "{ id?: string | undefined; prefix?: string | undefined; onError?: React.ReactEventHandler<HTMLTableCellElement> | undefined; scope?: string | undefined; defaultValue?: string | number | readonly string[] | undefined; name: React.ReactNode; security?: string | undefined; onChange?: React.FormEventHandler<HTMLTableCellElement> | undefined; defaultChecked?: boolean | undefined; suppressContentEditableWarning?: boolean | undefined; suppressHydrationWarning?: boolean | undefined; accessKey?: string | undefined; autoFocus?: boolean | undefined; className?: string | undefined; contentEditable?: Booleanish | \"inherit\" | \"plaintext-only\" | undefined; contextMenu?: string | undefined; dir?: string | undefined; draggable?: Booleanish | undefined; hidden?: boolean | undefined; lang?: string | undefined; nonce?: string | undefined; slot?: string | undefined; spellCheck?: Booleanish | undefined; style?: React.CSSProperties | undefined; tabIndex?: number | undefined; title?: string | undefined; translate?: \"yes\" | \"no\" | undefined; radioGroup?: string | undefined; role?: React.AriaRole | undefined; about?: string | undefined; content?: string | undefined; datatype?: string | undefined; inlist?: any; property?: string | undefined; rel?: string | undefined; resource?: string | undefined; rev?: string | undefined; typeof?: string | undefined; vocab?: string | undefined; autoCapitalize?: string | undefined; autoCorrect?: string | undefined; autoSave?: string | undefined; color?: string | undefined; itemProp?: string | undefined; itemScope?: boolean | undefined; itemType?: string | undefined; itemID?: string | undefined; itemRef?: string | undefined; results?: number | undefined; unselectable?: \"on\" | \"off\" | undefined; inputMode?: \"search\" | \"none\" | \"text\" | \"tel\" | \"url\" | \"email\" | \"numeric\" | \"decimal\" | undefined; is?: string | undefined; \"aria-activedescendant\"?: string | undefined; \"aria-atomic\"?: Booleanish | undefined; \"aria-autocomplete\"?: \"none\" | \"list\" | \"inline\" | \"both\" | undefined; \"aria-braillelabel\"?: string | undefined; \"aria-brailleroledescription\"?: string | undefined; \"aria-busy\"?: Booleanish | undefined; \"aria-checked\"?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; \"aria-colcount\"?: number | undefined; \"aria-colindex\"?: number | undefined; \"aria-colindextext\"?: string | undefined; \"aria-colspan\"?: number | undefined; \"aria-controls\"?: string | undefined; \"aria-current\"?: boolean | \"page\" | \"date\" | \"location\" | \"true\" | \"false\" | \"time\" | \"step\" | undefined; \"aria-describedby\"?: string | undefined; \"aria-description\"?: string | undefined; \"aria-details\"?: string | undefined; \"aria-disabled\"?: Booleanish | undefined; \"aria-dropeffect\"?: \"execute\" | \"link\" | \"none\" | \"copy\" | \"move\" | \"popup\" | undefined; \"aria-errormessage\"?: string | undefined; \"aria-expanded\"?: Booleanish | undefined; \"aria-flowto\"?: string | undefined; \"aria-grabbed\"?: Booleanish | undefined; \"aria-haspopup\"?: boolean | \"grid\" | \"true\" | \"false\" | \"dialog\" | \"menu\" | \"listbox\" | \"tree\" | undefined; \"aria-hidden\"?: Booleanish | undefined; \"aria-invalid\"?: boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\" | undefined; \"aria-keyshortcuts\"?: string | undefined; 'aria-label'?: string | undefined; \"aria-labelledby\"?: string | undefined; \"aria-level\"?: number | undefined; \"aria-live\"?: \"off\" | \"assertive\" | \"polite\" | undefined; \"aria-modal\"?: Booleanish | undefined; \"aria-multiline\"?: Booleanish | undefined; \"aria-multiselectable\"?: Booleanish | undefined; \"aria-orientation\"?: \"horizontal\" | \"vertical\" | undefined; \"aria-owns\"?: string | undefined; \"aria-placeholder\"?: string | undefined; \"aria-posinset\"?: number | undefined; \"aria-pressed\"?: boolean | \"true\" | \"false\" | \"mixed\" | undefined; \"aria-readonly\"?: Booleanish | undefined; \"aria-relevant\"?: \"text\" | \"all\" | \"additions\" | \"additions removals\" | \"additions text\" | \"removals\" | \"removals additions\" | \"removals text\" | \"text additions\" | \"text removals\" | undefined; \"aria-required\"?: Booleanish | undefined; \"aria-roledescription\"?: string | undefined; \"aria-rowcount\"?: number | undefined; \"aria-rowindex\"?: number | undefined; \"aria-rowindextext\"?: string | undefined; \"aria-rowspan\"?: number | undefined; \"aria-selected\"?: Booleanish | undefined; \"aria-setsize\"?: number | undefined; \"aria-sort\"?: \"none\" | \"ascending\" | \"descending\" | \"other\" | undefined; \"aria-valuemax\"?: number | undefined; \"aria-valuemin\"?: number | undefined; \"aria-valuenow\"?: number | undefined; \"aria-valuetext\"?: string | undefined; children?: React.ReactNode; dangerouslySetInnerHTML?: { __html: string | TrustedHTML; } | undefined; onCopy?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCopyCapture?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCut?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCutCapture?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onPaste?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onPasteCapture?: React.ClipboardEventHandler<HTMLTableCellElement> | undefined; onCompositionEnd?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionEndCapture?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionStart?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionStartCapture?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionUpdate?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onCompositionUpdateCapture?: React.CompositionEventHandler<HTMLTableCellElement> | undefined; onFocus?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onFocusCapture?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onBlur?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onBlurCapture?: React.FocusEventHandler<HTMLTableCellElement> | undefined; onChangeCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onBeforeInput?: React.FormEventHandler<HTMLTableCellElement> | undefined; onBeforeInputCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInput?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInputCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onReset?: React.FormEventHandler<HTMLTableCellElement> | undefined; onResetCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onSubmit?: React.FormEventHandler<HTMLTableCellElement> | undefined; onSubmitCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInvalid?: React.FormEventHandler<HTMLTableCellElement> | undefined; onInvalidCapture?: React.FormEventHandler<HTMLTableCellElement> | undefined; onLoad?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onErrorCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onKeyDown?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyDownCapture?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyPress?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyPressCapture?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyUp?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onKeyUpCapture?: React.KeyboardEventHandler<HTMLTableCellElement> | undefined; onAbort?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onAbortCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlay?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlayCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlayThrough?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onCanPlayThroughCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onDurationChange?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onDurationChangeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEmptied?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEmptiedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEncrypted?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEncryptedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEnded?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onEndedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedData?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedDataCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedMetadata?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadedMetadataCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadStart?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onLoadStartCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPause?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPauseCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlay?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlayCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlaying?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onPlayingCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onProgress?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onProgressCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onRateChange?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onRateChangeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onResize?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onResizeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeeked?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeekedCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeeking?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSeekingCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onStalled?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onStalledCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSuspend?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSuspendCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onTimeUpdate?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onTimeUpdateCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onVolumeChange?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onVolumeChangeCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onWaiting?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onWaitingCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onAuxClick?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onAuxClickCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onClick?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onClickCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onContextMenu?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onContextMenuCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onDoubleClick?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onDoubleClickCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onDrag?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEnd?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEndCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEnter?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragEnterCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragExit?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragExitCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragLeave?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragLeaveCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragOver?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragOverCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragStart?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDragStartCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDrop?: React.DragEventHandler<HTMLTableCellElement> | undefined; onDropCapture?: React.DragEventHandler<HTMLTableCellElement> | undefined; onMouseDown?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseDownCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseEnter?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseLeave?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseMove?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseMoveCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOut?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOutCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOver?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseOverCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseUp?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onMouseUpCapture?: React.MouseEventHandler<HTMLTableCellElement> | undefined; onSelect?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onSelectCapture?: React.ReactEventHandler<HTMLTableCellElement> | undefined; onTouchCancel?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchCancelCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchEnd?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchEndCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchMove?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchMoveCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchStart?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onTouchStartCapture?: React.TouchEventHandler<HTMLTableCellElement> | undefined; onPointerDown?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerDownCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerMove?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerMoveCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerUp?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerUpCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerCancel?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerCancelCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerEnter?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerLeave?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOver?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOverCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOut?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onPointerOutCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onGotPointerCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onGotPointerCaptureCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onLostPointerCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onLostPointerCaptureCapture?: React.PointerEventHandler<HTMLTableCellElement> | undefined; onScroll?: React.UIEventHandler<HTMLTableCellElement> | undefined; onScrollCapture?: React.UIEventHandler<HTMLTableCellElement> | undefined; onWheel?: React.WheelEventHandler<HTMLTableCellElement> | undefined; onWheelCapture?: React.WheelEventHandler<HTMLTableCellElement> | undefined; onAnimationStart?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationStartCapture?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationEnd?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationEndCapture?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationIteration?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onAnimationIterationCapture?: React.AnimationEventHandler<HTMLTableCellElement> | undefined; onTransitionEnd?: React.TransitionEventHandler<HTMLTableCellElement> | undefined; onTransitionEndCapture?: React.TransitionEventHandler<HTMLTableCellElement> | undefined; 'data-test-subj'?: string | undefined; css?: ", "Interpolation", "<", "Theme", @@ -306,7 +306,7 @@ "section": "def-public.SavedObjectsManagementRecord", "text": "SavedObjectsManagementRecord" }, - "; width?: string | undefined; headers?: string | undefined; abbr?: string | undefined; footer?: string | React.ReactElement<any, string | React.JSXElementConstructor<any>> | ((props: ", + "; abbr?: string | undefined; footer?: string | React.ReactElement<any, string | React.JSXElementConstructor<any>> | ((props: ", "EuiTableFooterProps", "<", { @@ -316,7 +316,7 @@ "section": "def-public.SavedObjectsManagementRecord", "text": "SavedObjectsManagementRecord" }, - ">) => React.ReactNode) | undefined; dataType?: ", + ">) => React.ReactNode) | undefined; width?: string | undefined; headers?: string | undefined; dataType?: ", "EuiTableDataType", " | undefined; render?: ((value: any, record: ", { diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 819215de0acd7..11be8f6695971 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-01 +date: 2024-10-02 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 f642e3f2c1dac..c01386c769eba 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.devdocs.json b/api_docs/saved_objects_tagging_oss.devdocs.json index 64abacff50a11..0ee6e295f18b2 100644 --- a/api_docs/saved_objects_tagging_oss.devdocs.json +++ b/api_docs/saved_objects_tagging_oss.devdocs.json @@ -932,14 +932,14 @@ { "parentPluginId": "savedObjectsTaggingOss", "id": "def-public.SavedObjectsTaggingApiUiComponent.TagList.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -953,7 +953,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -987,14 +987,14 @@ { "parentPluginId": "savedObjectsTaggingOss", "id": "def-public.SavedObjectsTaggingApiUiComponent.TagSelector.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -1008,7 +1008,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1042,14 +1042,14 @@ { "parentPluginId": "savedObjectsTaggingOss", "id": "def-public.SavedObjectsTaggingApiUiComponent.SavedObjectSaveModalTagSelector.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -1063,7 +1063,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 16f2f9145dd5d..20e0d48d00c15 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-01 +date: 2024-10-02 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 e493bcbcb7dd7..49dbb65c0b412 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-01 +date: 2024-10-02 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 57eb7e8393826..34bb1fa46c211 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-01 +date: 2024-10-02 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 adff5413e8295..e35a67e2ab605 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-01 +date: 2024-10-02 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 a3ecda9535694..17895d1f51642 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-01 +date: 2024-10-02 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 ce4b5836f797d..a3d6892e5f03f 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.devdocs.json b/api_docs/search_homepage.devdocs.json index 38fef344fc7b4..120a1d1e08f93 100644 --- a/api_docs/search_homepage.devdocs.json +++ b/api_docs/search_homepage.devdocs.json @@ -175,7 +175,7 @@ "\nSearchHomepage shared component, used to render the search homepage in\nthe Stack search plugin" ], "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" + "React.FunctionComponent<{}>" ], "path": "x-pack/plugins/search_homepage/public/types.ts", "deprecated": false, @@ -185,14 +185,14 @@ { "parentPluginId": "searchHomepage", "id": "def-public.SearchHomepagePluginStart.SearchHomepage.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -206,7 +206,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 5fba961b47c57..13edf731fe5c0 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-01 +date: 2024-10-02 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 a99dec00d605c..76e13c31b687d 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.devdocs.json b/api_docs/search_inference_endpoints.devdocs.json index 41c4ee3197a75..d97ac75b18ce6 100644 --- a/api_docs/search_inference_endpoints.devdocs.json +++ b/api_docs/search_inference_endpoints.devdocs.json @@ -52,14 +52,14 @@ { "parentPluginId": "searchInferenceEndpoints", "id": "def-public.SearchInferenceEndpointsPluginStart.InferenceEdnpointsProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -73,7 +73,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -87,7 +87,7 @@ "label": "InferenceEndpoints", "description": [], "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" + "React.FunctionComponent<{}>" ], "path": "x-pack/plugins/search_inference_endpoints/public/types.ts", "deprecated": false, @@ -97,14 +97,14 @@ { "parentPluginId": "searchInferenceEndpoints", "id": "def-public.SearchInferenceEndpointsPluginStart.InferenceEndpoints.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -118,7 +118,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index e84158310a65e..9daf97e7b373b 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-01 +date: 2024-10-02 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 09d101c02590f..97fb2e68402e8 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.devdocs.json b/api_docs/search_playground.devdocs.json index d72547a8ff2d6..17d790c21d72f 100644 --- a/api_docs/search_playground.devdocs.json +++ b/api_docs/search_playground.devdocs.json @@ -50,14 +50,14 @@ { "parentPluginId": "searchPlayground", "id": "def-public.SearchPlaygroundPluginStart.PlaygroundProvider.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -71,7 +71,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -87,7 +87,7 @@ "signature": [ "React.FunctionComponent<", "AppProps", - " & { children?: React.ReactNode; }>" + ">" ], "path": "x-pack/plugins/search_playground/public/types.ts", "deprecated": false, @@ -97,14 +97,14 @@ { "parentPluginId": "searchPlayground", "id": "def-public.SearchPlaygroundPluginStart.Playground.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -118,7 +118,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -132,7 +132,7 @@ "label": "PlaygroundHeaderDocs", "description": [], "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" + "React.FunctionComponent<{}>" ], "path": "x-pack/plugins/search_playground/public/types.ts", "deprecated": false, @@ -142,14 +142,14 @@ { "parentPluginId": "searchPlayground", "id": "def-public.SearchPlaygroundPluginStart.PlaygroundHeaderDocs.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -163,7 +163,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 1ce786ee12787..37df0df3831a1 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-01 +date: 2024-10-02 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 5944ca9374215..633ceab84e178 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -944,7 +944,7 @@ "Render a custom ReactNode instead of the default <EuiContextMenuItem />" ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/packages/security/plugin_types_public/src/nav_control/nav_control_service.ts", "deprecated": false, diff --git a/api_docs/security.mdx b/api_docs/security.mdx index b40f78850375b..fac6d29bdaaac 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-01 +date: 2024-10-02 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 4e767c6b2256f..92a00d4b02fbd 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -266,71 +266,6 @@ "trackAdoption": false, "children": [], "returnComment": [] - }, - { - "parentPluginId": "securitySolution", - "id": "def-public.Plugin.registerAppLinks", - "type": "Function", - "tags": [], - "label": "registerAppLinks", - "description": [ - "\nRegisters deepLinks and appUpdater for appLinks using license." - ], - "signature": [ - "(core: ", - { - "pluginId": "@kbn/core-lifecycle-browser", - "scope": "public", - "docId": "kibKbnCoreLifecycleBrowserPluginApi", - "section": "def-public.CoreStart", - "text": "CoreStart" - }, - ", plugins: ", - "StartPlugins", - ") => Promise<void>" - ], - "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "securitySolution", - "id": "def-public.Plugin.registerAppLinks.$1", - "type": "Object", - "tags": [], - "label": "core", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-lifecycle-browser", - "scope": "public", - "docId": "kibKbnCoreLifecycleBrowserPluginApi", - "section": "def-public.CoreStart", - "text": "CoreStart" - } - ], - "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "securitySolution", - "id": "def-public.Plugin.registerAppLinks.$2", - "type": "Object", - "tags": [], - "label": "plugins", - "description": [], - "signature": [ - "StartPlugins" - ], - "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -390,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[]; 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; } | { 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; } | { 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; }; } | 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; } | { 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; })[]" + "({ 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; } | { 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; } | { 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; } | { 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; }[]; 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; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | 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; 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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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<Zod.ZodString>; value: Zod.ZodOptional<Zod.ZodUnion<[Zod.ZodString, Zod.ZodArray<Zod.ZodString, \"many\">]>>; }, \"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; })[]" ], "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management/logic/types.ts", "deprecated": false, @@ -485,7 +420,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"assistantNaturalLanguageESQLTool\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"loggingRequestsEnabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"visualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"assistantNaturalLanguageESQLTool\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"loggingRequestsEnabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +500,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"assistantNaturalLanguageESQLTool\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"loggingRequestsEnabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"visualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"assistantBedrockChat\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"assistantNaturalLanguageESQLTool\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"loggingRequestsEnabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1496,7 +1431,7 @@ "label": "footerText", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/security_solution/public/timelines/store/model.ts", "deprecated": false, @@ -1510,7 +1445,7 @@ "label": "loadingText", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/security_solution/public/timelines/store/model.ts", "deprecated": false, @@ -1929,7 +1864,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 assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly loggingRequestsEnabled: 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 visualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: 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 assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly loggingRequestsEnabled: 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 manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3097,7 +3032,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 assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly loggingRequestsEnabled: 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 visualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: 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 assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly loggingRequestsEnabled: 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 manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3273,7 +3208,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 assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly loggingRequestsEnabled: 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 visualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: 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 assistantBedrockChat: boolean; readonly assistantNaturalLanguageESQLTool: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly loggingRequestsEnabled: 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 manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3339,7 +3274,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 assistantBedrockChat: true; readonly assistantNaturalLanguageESQLTool: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly loggingRequestsEnabled: 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 visualizationInFlyoutEnabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreEnabled: 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 assistantBedrockChat: true; readonly assistantNaturalLanguageESQLTool: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly loggingRequestsEnabled: 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 manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreEnabled: 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 0d7c4e49d2a24..572bc97a70bd2 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-01 +date: 2024-10-02 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 | |-------------------|-----------|------------------------|-----------------| -| 193 | 0 | 124 | 33 | +| 190 | 0 | 122 | 33 | ## Client diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 890f79d18b7b5..ad1fcc5551817 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-01 +date: 2024-10-02 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 9e7193ae47373..51d9e1c1ad898 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-01 +date: 2024-10-02 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 2b06d2416ce05..8639a4de4048f 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-01 +date: 2024-10-02 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 a069838984e6e..38a341582bc2d 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-01 +date: 2024-10-02 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 8cc7095235cca..044dcd06fd94d 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-01 +date: 2024-10-02 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 0fc171cd65a01..ad79590bfdfb7 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-01 +date: 2024-10-02 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 95d3fb2db8d41..caf6d6688e1f0 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.devdocs.json b/api_docs/slo.devdocs.json index b8669843b1816..e811ff753c84c 100644 --- a/api_docs/slo.devdocs.json +++ b/api_docs/slo.devdocs.json @@ -588,7 +588,7 @@ "signature": [ "{ locators: ObservabilitySharedLocators; navigation: { PageTemplate: (pageTemplateProps: ", "WrappedPageTemplateProps", - ") => JSX.Element; registerSections: (sections$: ", + ") => React.JSX.Element; registerSections: (sections$: ", "Observable", "<", { @@ -1082,7 +1082,7 @@ }, "<", "CreateSLOForm", - "<{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }>> | undefined; }) => JSX.Element; }" + "<{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }>> | undefined; }) => React.JSX.Element; }" ], "path": "x-pack/plugins/observability_solution/slo/public/types.ts", "deprecated": false, diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 1b13dc2b1a51a..a49c9c31d5205 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-01 +date: 2024-10-02 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 9821976429955..a118647958195 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.devdocs.json b/api_docs/spaces.devdocs.json index 0673f18fb64fe..f55811efa2731 100644 --- a/api_docs/spaces.devdocs.json +++ b/api_docs/spaces.devdocs.json @@ -2629,7 +2629,7 @@ "label": "children", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "x-pack/plugins/spaces/public/spaces_context/types.ts", "deprecated": false, diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 09662fd4305f1..8f9830cc2d5e7 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.devdocs.json b/api_docs/stack_alerts.devdocs.json index 25e3f429ee4e5..ffa4f04113286 100644 --- a/api_docs/stack_alerts.devdocs.json +++ b/api_docs/stack_alerts.devdocs.json @@ -11,9 +11,9 @@ "label": "DataViewSelectPopover", "description": [], "signature": [ - "({ dependencies: { dataViews, dataViewEditor }, metadata, dataView, onSelectDataView, onChangeMetaData, }: React.PropsWithChildren<", + "({ dependencies: { dataViews, dataViewEditor }, metadata, dataView, onSelectDataView, onChangeMetaData, }: ", "DataViewSelectPopoverProps", - ">) => JSX.Element | null" + ") => React.JSX.Element | null" ], "path": "x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx", "deprecated": false, @@ -22,14 +22,12 @@ { "parentPluginId": "stackAlerts", "id": "def-public.DataViewSelectPopover.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n dependencies: { dataViews, dataViewEditor },\n metadata = { adHocDataViewList: [], isManagementPage: true },\n dataView,\n onSelectDataView,\n onChangeMetaData,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - "DataViewSelectPopoverProps", - ">" + "DataViewSelectPopoverProps" ], "path": "x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx", "deprecated": false, diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 789f8fd4dca20..035ed5fa534cc 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-01 +date: 2024-10-02 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 a03e152a73c8e..4e41fa64fafd5 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-01 +date: 2024-10-02 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 0e4bc42f5b3e2..36fd30d6bc735 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-01 +date: 2024-10-02 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 00378c1a14809..c64a68b1bf131 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-01 +date: 2024-10-02 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 3f4d31bafee30..3c15041f1919e 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-01 +date: 2024-10-02 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 8beb088b1f01e..b82c653408414 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.devdocs.json b/api_docs/telemetry_management_section.devdocs.json index 58464ca58aef7..26b60ddd49a9b 100644 --- a/api_docs/telemetry_management_section.devdocs.json +++ b/api_docs/telemetry_management_section.devdocs.json @@ -13,7 +13,7 @@ "\nLazy-loaded {@link OptInExampleFlyout}" ], "signature": [ - "React.ExoticComponent<(", + "React.LazyExoticComponent<React.ComponentType<", { "pluginId": "telemetryManagementSection", "scope": "public", @@ -21,31 +21,7 @@ "section": "def-public.Props", "text": "Props" }, - " & React.RefAttributes<React.Component<", - { - "pluginId": "telemetryManagementSection", - "scope": "public", - "docId": "kibTelemetryManagementSectionPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - ", any, any>>) | (", - { - "pluginId": "telemetryManagementSection", - "scope": "public", - "docId": "kibTelemetryManagementSectionPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - " & { children?: React.ReactNode; })> & { readonly _result: React.ComponentType<", - { - "pluginId": "telemetryManagementSection", - "scope": "public", - "docId": "kibTelemetryManagementSectionPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - ">; }" + ">>" ], "path": "src/plugins/telemetry_management_section/public/components/lazy_opt_in_example_flyout.tsx", "deprecated": false, @@ -62,7 +38,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 977d1f9dd93ab..086f26293308d 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.devdocs.json b/api_docs/threat_intelligence.devdocs.json index 6cb8ec5bda156..2257a85ac3bcb 100644 --- a/api_docs/threat_intelligence.devdocs.json +++ b/api_docs/threat_intelligence.devdocs.json @@ -275,7 +275,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -289,7 +289,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 17cf097f0e87d..1d4af35bb83f4 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-01 +date: 2024-10-02 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 6988125bc3dc9..446fca0dc401f 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -927,7 +927,7 @@ "EuiButtonIconPropsForAnchor", ", ", "EuiButtonIconPropsForButton", - "> & { type?: \"reset\" | \"button\" | \"submit\" | undefined; } & ", + "> & { type?: \"button\" | \"reset\" | \"submit\" | undefined; } & ", "EuiButtonIconProps", " & { onClick?: React.MouseEventHandler<HTMLButtonElement> | undefined; } & React.ButtonHTMLAttributes<HTMLButtonElement> & { buttonRef?: React.Ref<HTMLButtonElement> | undefined; }) | (", "DisambiguateSet", diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index a0fa177db0f15..049277c10343b 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-01 +date: 2024-10-02 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 2e01cb896ef68..2bba8b8cfcb99 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index b3135465de0ab..beae6adc29997 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -268,7 +268,7 @@ "signature": [ "(props: ", "ActionAccordionFormProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts", "deprecated": false, @@ -300,11 +300,9 @@ "label": "AlertConditions", "description": [], "signature": [ - "React.ExoticComponent<", + "React.LazyExoticComponent<(<ConditionProps extends unknown, ActionGroupIds extends string>({ headline, actionGroups, onInitializeConditionsFor, onResetConditionsFor, includeBuiltInActionGroups, children, }: React.PropsWithChildren<", "RuleConditionsProps", - "<unknown, string> & { children?: React.ReactNode; }> & { readonly _result: <ConditionProps extends unknown, ActionGroupIds extends string>({ headline, actionGroups, onInitializeConditionsFor, onResetConditionsFor, includeBuiltInActionGroups, children, }: React.PropsWithChildren<", - "RuleConditionsProps", - "<ConditionProps, ActionGroupIds>>) => JSX.Element; }" + "<ConditionProps, ActionGroupIds>>) => React.JSX.Element)>" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx", "deprecated": false, @@ -321,7 +319,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -336,19 +334,9 @@ "label": "AlertConditionsGroup", "description": [], "signature": [ - "React.ExoticComponent<{ actionGroup?: ", - { - "pluginId": "triggersActionsUi", - "scope": "public", - "docId": "kibTriggersActionsUiPluginApi", - "section": "def-public.ActionGroupWithCondition", - "text": "ActionGroupWithCondition" - }, - "<unknown, string> | undefined; } & Pick<", - "RuleConditionsProps", - "<unknown, string>, \"onResetConditionsFor\"> & { children?: React.ReactNode; }> & { readonly _result: <ConditionProps extends unknown>({ actionGroup, onResetConditionsFor, children, ...otherProps }: React.PropsWithChildren<", + "React.LazyExoticComponent<(<ConditionProps extends unknown>({ actionGroup, onResetConditionsFor, children, ...otherProps }: React.PropsWithChildren<", "RuleConditionsGroupProps", - "<ConditionProps>>) => JSX.Element | null; }" + "<ConditionProps>>) => React.JSX.Element | null)>" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/index.tsx", "deprecated": false, @@ -365,7 +353,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -437,7 +425,7 @@ "signature": [ "(props: ", "CreateConnectorFlyoutProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts", "deprecated": false, @@ -471,7 +459,7 @@ "signature": [ "(props: ", "EditConnectorFlyoutProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/index.ts", "deprecated": false, @@ -706,7 +694,7 @@ "signature": [ "(props: ", "ForLastExpressionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/common/expression_items/index.ts", "deprecated": false, @@ -1056,7 +1044,7 @@ "signature": [ "(props: ", "GroupByExpressionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/common/expression_items/index.ts", "deprecated": false, @@ -1121,7 +1109,7 @@ "label": "JsonEditorWithMessageVariables", "description": [], "signature": [ - "({ buttonTitle, messageVariables, paramsProperty, inputTargetValue, label, errors, ariaLabel, onDocumentsChange, helpText, onBlur, showButtonTitle, dataTestSubj, euiCodeEditorProps, }: React.PropsWithChildren<Props>) => JSX.Element" + "({ buttonTitle, messageVariables, paramsProperty, inputTargetValue, label, errors, ariaLabel, onDocumentsChange, helpText, onBlur, showButtonTitle, dataTestSubj, euiCodeEditorProps, }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx", "deprecated": false, @@ -1130,12 +1118,12 @@ { "parentPluginId": "triggersActionsUi", "id": "def-public.JsonEditorWithMessageVariables.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n buttonTitle,\n messageVariables,\n paramsProperty,\n inputTargetValue,\n label,\n errors,\n ariaLabel,\n onDocumentsChange,\n helpText,\n onBlur,\n showButtonTitle,\n dataTestSubj,\n euiCodeEditorProps = {},\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx", "deprecated": false, @@ -1154,7 +1142,7 @@ "label": "JsonFieldWrapper", "description": [], "signature": [ - "({ field, ...rest }: Props) => JSX.Element" + "({ field, ...rest }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/json_field_wrapper.tsx", "deprecated": false, @@ -1469,7 +1457,7 @@ "label": "MustacheTextFieldWrapper", "description": [], "signature": [ - "({ field, euiFieldProps, idAria, ...rest }: Props) => JSX.Element" + "({ field, euiFieldProps, idAria, ...rest }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/mustache_text_field_wrapper.tsx", "deprecated": false, @@ -1504,7 +1492,7 @@ "signature": [ "(props: ", "OfExpressionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/common/expression_items/index.ts", "deprecated": false, @@ -1536,7 +1524,7 @@ "label": "SectionLoading", "description": [], "signature": [ - "({ children }: React.PropsWithChildren<Props>) => JSX.Element" + "({ children }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/section_loading.tsx", "deprecated": false, @@ -1545,12 +1533,12 @@ { "parentPluginId": "triggersActionsUi", "id": "def-public.SectionLoading.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{ children }", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/section_loading.tsx", "deprecated": false, @@ -1586,7 +1574,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1601,7 +1589,7 @@ "label": "suspendedComponentWithProps", "description": [], "signature": [ - "(ComponentToSuspend: React.ComponentType<T>, size: \"m\" | \"s\" | \"l\" | \"xl\" | \"xxl\" | undefined) => (props: T) => JSX.Element" + "(ComponentToSuspend: React.ComponentType<T>, size: \"m\" | \"s\" | \"l\" | \"xl\" | \"xxl\" | undefined) => (props: T) => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/suspended_component_with_props.tsx", "deprecated": false, @@ -1729,7 +1717,7 @@ "label": "TextFieldWithMessageVariables", "description": [], "signature": [ - "({ buttonTitle, messageVariables, paramsProperty, index, inputTargetValue, editAction, errors, formRowProps, defaultValue, wrapField, showButtonTitle, }: React.PropsWithChildren<Props>) => JSX.Element" + "({ buttonTitle, messageVariables, paramsProperty, index, inputTargetValue, editAction, errors, formRowProps, defaultValue, wrapField, showButtonTitle, }: Props) => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/text_field_with_message_variables.tsx", "deprecated": false, @@ -1738,12 +1726,12 @@ { "parentPluginId": "triggersActionsUi", "id": "def-public.TextFieldWithMessageVariables.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "{\n buttonTitle,\n messageVariables,\n paramsProperty,\n index,\n inputTargetValue,\n editAction,\n errors,\n formRowProps,\n defaultValue,\n wrapField = false,\n showButtonTitle,\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "path": "x-pack/plugins/triggers_actions_ui/public/application/components/text_field_with_message_variables.tsx", "deprecated": false, @@ -1764,7 +1752,7 @@ "signature": [ "(props: ", "ThresholdExpressionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/common/expression_items/index.ts", "deprecated": false, @@ -2123,7 +2111,7 @@ "signature": [ "(props: ", "ValueExpressionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/common/expression_items/index.ts", "deprecated": false, @@ -2157,7 +2145,7 @@ "signature": [ "(props: ", "WhenExpressionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "x-pack/plugins/triggers_actions_ui/public/common/expression_items/index.ts", "deprecated": false, @@ -2880,31 +2868,7 @@ "label": "actionParamsFields", "description": [], "signature": [ - "React.ExoticComponent<(", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.ActionParamsProps", - "text": "ActionParamsProps" - }, - "<ActionParams> & React.RefAttributes<React.Component<", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.ActionParamsProps", - "text": "ActionParamsProps" - }, - "<ActionParams>, any, any>>) | (", - { - "pluginId": "@kbn/alerts-ui-shared", - "scope": "public", - "docId": "kibKbnAlertsUiSharedPluginApi", - "section": "def-public.ActionParamsProps", - "text": "ActionParamsProps" - }, - "<ActionParams> & { children?: React.ReactNode; })> & { readonly _result: React.ComponentType<", + "React.LazyExoticComponent<React.ComponentType<", { "pluginId": "@kbn/alerts-ui-shared", "scope": "public", @@ -2912,7 +2876,7 @@ "section": "def-public.ActionParamsProps", "text": "ActionParamsProps" }, - "<ActionParams>>; }" + "<ActionParams>>>" ], "path": "packages/kbn-alerts-ui-shared/src/common/types/action_types.ts", "deprecated": false, @@ -2929,7 +2893,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -3200,7 +3164,7 @@ "section": "def-common.BasicFields", "text": "BasicFields" }, - " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; } & { [x: string]: unknown[]; }" + " & { \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; tags?: string[] | undefined; kibana?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.name\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.kind\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.flapping\"?: string[] | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.time_range\"?: string[] | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"kibana.alert.context\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.evaluation.values\"?: string[] | undefined; \"kibana.alert.group\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.created_at\"?: string[] | undefined; \"kibana.alert.rule.created_by\"?: string[] | undefined; \"kibana.alert.rule.description\"?: string[] | undefined; \"kibana.alert.rule.enabled\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.note\"?: string[] | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string[] | undefined; \"kibana.alert.rule.rule_name_override\"?: string[] | undefined; \"kibana.alert.rule.to\"?: string[] | undefined; \"kibana.alert.rule.type\"?: string[] | undefined; \"kibana.alert.rule.updated_at\"?: string[] | undefined; \"kibana.alert.rule.updated_by\"?: string[] | undefined; \"kibana.alert.rule.version\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.suppression.docs_count\"?: string[] | undefined; \"kibana.alert.suppression.end\"?: string[] | undefined; \"kibana.alert.suppression.start\"?: string[] | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.rule.threat.framework\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.id\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.name\"?: string[] | undefined; \"kibana.alert.rule.threat.tactic.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.reference\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.id\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.name\"?: string[] | undefined; \"kibana.alert.rule.threat.technique.subtechnique.reference\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; \"kibana.alert.suppression.terms\"?: string[] | undefined; \"kibana.alert.group.field\"?: string[] | undefined; \"kibana.alert.group.value\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; } & { [x: string]: unknown[]; }" ], "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false, @@ -4863,7 +4827,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 52a3d3b74ba27..5dcf3a3d50aaf 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-01 +date: 2024-10-02 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 de6145d7f50e6..f144ac04161d2 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.devdocs.json b/api_docs/ui_actions_enhanced.devdocs.json index ab8be9e02fcf7..16230d3a4fce8 100644 --- a/api_docs/ui_actions_enhanced.devdocs.json +++ b/api_docs/ui_actions_enhanced.devdocs.json @@ -410,14 +410,14 @@ { "parentPluginId": "uiActionsEnhanced", "id": "def-public.ActionFactory.CollectConfig.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -431,7 +431,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -2204,9 +2204,9 @@ "label": "UrlDrilldownCollectConfig", "description": [], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", "UrlDrilldownCollectConfigProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/lazy.tsx", "deprecated": false, @@ -2215,14 +2215,12 @@ { "parentPluginId": "uiActionsEnhanced", "id": "def-public.UrlDrilldownCollectConfig.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<", - "UrlDrilldownCollectConfigProps", - ">" + "UrlDrilldownCollectConfigProps" ], "path": "src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/lazy.tsx", "deprecated": false, @@ -2241,9 +2239,9 @@ "label": "UrlDrilldownOptionsComponent", "description": [], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", "UrlDrilldownOptionsProps", - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/lazy.tsx", "deprecated": false, @@ -2252,14 +2250,12 @@ { "parentPluginId": "uiActionsEnhanced", "id": "def-public.UrlDrilldownOptionsComponent.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ - "React.PropsWithChildren<", - "UrlDrilldownOptionsProps", - ">" + "UrlDrilldownOptionsProps" ], "path": "src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/components/url_drilldown_collect_config/lazy.tsx", "deprecated": false, @@ -2768,14 +2764,14 @@ { "parentPluginId": "uiActionsEnhanced", "id": "def-public.DrilldownDefinition.CollectConfig.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -2789,7 +2785,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -3777,14 +3773,14 @@ { "parentPluginId": "uiActionsEnhanced", "id": "def-public.StartContract.DrilldownManager.$1", - "type": "CompoundType", + "type": "Uncategorized", "tags": [], "label": "props", "description": [], "signature": [ - "P & { children?: React.ReactNode; }" + "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -3798,7 +3794,7 @@ "signature": [ "any" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 11682517241ec..91bf88ddae8be 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.devdocs.json b/api_docs/unified_doc_viewer.devdocs.json index 5e80aa0311801..fc82efaa4e3d0 100644 --- a/api_docs/unified_doc_viewer.devdocs.json +++ b/api_docs/unified_doc_viewer.devdocs.json @@ -38,7 +38,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -80,7 +80,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -122,7 +122,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -164,7 +164,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 6d4f43f65e397..ee6a0c099be34 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.devdocs.json b/api_docs/unified_histogram.devdocs.json index 61df3075d8198..11a74ad455f79 100644 --- a/api_docs/unified_histogram.devdocs.json +++ b/api_docs/unified_histogram.devdocs.json @@ -555,7 +555,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -614,7 +614,7 @@ }, ") => void) | undefined; } & Pick<", "UnifiedHistogramLayoutProps", - ", \"className\" | \"children\" | \"columns\" | \"timeRange\" | \"query\" | \"filters\" | \"services\" | \"dataView\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"table\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"externalVisContext\" | \"withDefaultActions\" | \"abortController\"> & ", + ", \"className\" | \"children\" | \"columns\" | \"timeRange\" | \"query\" | \"filters\" | \"services\" | \"table\" | \"dataView\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"externalVisContext\" | \"withDefaultActions\" | \"abortController\"> & ", { "pluginId": "@kbn/shared-ux-utility", "scope": "common", @@ -647,7 +647,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -701,6 +701,27 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "unifiedHistogram", + "id": "def-public.BreakdownFieldSelectorProps.esqlColumns", + "type": "Array", + "tags": [], + "label": "esqlColumns", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[] | undefined" + ], + "path": "src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "unifiedHistogram", "id": "def-public.BreakdownFieldSelectorProps.onBreakdownFieldChange", @@ -1615,7 +1636,7 @@ }, ") => void) | undefined; } & Pick<", "UnifiedHistogramLayoutProps", - ", \"className\" | \"children\" | \"columns\" | \"timeRange\" | \"query\" | \"filters\" | \"services\" | \"dataView\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"table\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"externalVisContext\" | \"withDefaultActions\" | \"abortController\">" + ", \"className\" | \"children\" | \"columns\" | \"timeRange\" | \"query\" | \"filters\" | \"services\" | \"table\" | \"dataView\" | \"container\" | \"onBrushEnd\" | \"disabledActions\" | \"relativeTimeRange\" | \"renderCustomChartToggleActions\" | \"onFilter\" | \"externalVisContext\" | \"withDefaultActions\" | \"abortController\">" ], "path": "src/plugins/unified_histogram/public/container/container.tsx", "deprecated": false, diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 89ba7e2af7d99..41d53b55d74db 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 71 | 0 | 36 | 6 | +| 72 | 0 | 37 | 6 | ## Client diff --git a/api_docs/unified_search.devdocs.json b/api_docs/unified_search.devdocs.json index c21ed0c3a2868..06c806c1db927 100644 --- a/api_docs/unified_search.devdocs.json +++ b/api_docs/unified_search.devdocs.json @@ -197,7 +197,7 @@ "section": "def-public.StatefulSearchBarProps", "text": "StatefulSearchBarProps" }, - "<QT>) => JSX.Element" + "<QT>) => React.JSX.Element" ], "path": "src/plugins/unified_search/public/search_bar/create_search_bar.tsx", "deprecated": false, @@ -265,7 +265,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -309,7 +309,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -353,7 +353,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -397,7 +397,7 @@ "signature": [ "P" ], - "path": "node_modules/@types/react/index.d.ts", + "path": "node_modules/@types/react/ts5.0/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -418,7 +418,7 @@ "FilterItemProps", ", keyof ", "WithCloseFilterEditorConfirmModalProps", - ">) => JSX.Element" + ">) => React.JSX.Element" ], "path": "src/plugins/unified_search/public/filter_bar/index.tsx", "deprecated": false, @@ -465,7 +465,7 @@ "section": "def-public.FilterItemsProps", "text": "FilterItemsProps" }, - ", \"intl\"> & { forwardedRef?: React.Ref<any> | undefined; } & { children?: React.ReactNode; }) => JSX.Element" + ", \"intl\"> & { forwardedRef?: React.Ref<any> | undefined; }) => React.JSX.Element" ], "path": "src/plugins/unified_search/public/filter_bar/index.tsx", "deprecated": false, @@ -487,7 +487,7 @@ "section": "def-public.FilterItemsProps", "text": "FilterItemsProps" }, - ", \"intl\"> & { forwardedRef?: React.Ref<any> | undefined; } & { children?: React.ReactNode; }" + ", \"intl\"> & { forwardedRef?: React.Ref<any> | undefined; }" ], "path": "src/plugins/unified_search/public/filter_bar/index.tsx", "deprecated": false, @@ -514,7 +514,7 @@ "section": "def-public.QueryStringInputProps", "text": "QueryStringInputProps" }, - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/unified_search/public/query_string_input/index.tsx", "deprecated": false, @@ -585,7 +585,7 @@ "section": "def-public.SearchBarProps", "text": "SearchBarProps" }, - "<QT>, \"kibana\" | \"intl\">) => JSX.Element" + "<QT>, \"kibana\" | \"intl\">) => React.JSX.Element" ], "path": "src/plugins/unified_search/public/search_bar/index.tsx", "deprecated": false, @@ -600,7 +600,7 @@ "label": "props", "description": [], "signature": [ - "{ isClearable?: boolean | undefined; placeholder?: string | undefined; isDisabled?: boolean | undefined; isLoading?: boolean | undefined; refreshInterval?: number | undefined; query?: ", + "{ isClearable?: boolean | undefined; isDisabled?: boolean | undefined; isLoading?: boolean | undefined; placeholder?: string | undefined; refreshInterval?: number | undefined; query?: ", { "pluginId": "@kbn/es-query", "scope": "common", diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 964244828057d..1e45d27e7e482 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-01 +date: 2024-10-02 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 563b3f9c048ff..3b9fcbb2d781b 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-01 +date: 2024-10-02 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 dd325efea54b9..d9d23e443ff2e 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-01 +date: 2024-10-02 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 11e5a7b3e0528..413f4c872d733 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.devdocs.json b/api_docs/usage_collection.devdocs.json index 04dc99f0bda52..dee33928bad1f 100644 --- a/api_docs/usage_collection.devdocs.json +++ b/api_docs/usage_collection.devdocs.json @@ -15,7 +15,7 @@ "\nReact component to track the number of clicks and minutes on screen of the children components." ], "signature": [ - "(props: React.PropsWithChildren<", + "(props: ", { "pluginId": "usageCollection", "scope": "public", @@ -23,7 +23,7 @@ "section": "def-public.TrackApplicationViewProps", "text": "TrackApplicationViewProps" }, - ">) => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/usage_collection/public/components/track_application_view/track_application_view.tsx", "deprecated": false, @@ -32,22 +32,20 @@ { "parentPluginId": "usageCollection", "id": "def-public.TrackApplicationView.$1", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "props", "description": [ "{@link TrackApplicationViewProps }" ], "signature": [ - "React.PropsWithChildren<", { "pluginId": "usageCollection", "scope": "public", "docId": "kibUsageCollectionPluginApi", "section": "def-public.TrackApplicationViewProps", "text": "TrackApplicationViewProps" - }, - ">" + } ], "path": "src/plugins/usage_collection/public/components/track_application_view/track_application_view.tsx", "deprecated": false, @@ -96,7 +94,7 @@ "\nThe React component to be tracked." ], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "src/plugins/usage_collection/public/components/track_application_view/types.ts", "deprecated": false, diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 0233ce9784368..7241886187666 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-01 +date: 2024-10-02 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 00a5ec129e57c..5e01a26912261 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.devdocs.json b/api_docs/vis_default_editor.devdocs.json index 24aa865bbefc2..e676d31a1342e 100644 --- a/api_docs/vis_default_editor.devdocs.json +++ b/api_docs/vis_default_editor.devdocs.json @@ -211,7 +211,7 @@ "section": "def-public.VisEditorOptionsProps", "text": "VisEditorOptionsProps" }, - "<VisParams> & { legendPositions: LegendPositions; }) => JSX.Element" + "<VisParams> & { legendPositions: LegendPositions; }) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/basic_options.tsx", "deprecated": false, @@ -251,7 +251,7 @@ "label": "ColorRanges", "description": [], "signature": [ - "({\n 'data-test-subj': dataTestSubj,\n colorsRange,\n setValue,\n setValidity,\n setTouched,\n}: ColorRangesProps) => JSX.Element" + "({\n 'data-test-subj': dataTestSubj,\n colorsRange,\n setValue,\n setValidity,\n setTouched,\n}: ColorRangesProps) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/color_ranges.tsx", "deprecated": false, @@ -284,7 +284,7 @@ "label": "ColorSchemaOptions", "description": [], "signature": [ - "({\n disabled,\n colorSchema,\n colorSchemas,\n invertColors,\n uiState,\n setValue,\n showHelpText = true,\n}: ColorSchemaOptionsProps) => JSX.Element" + "({\n disabled,\n colorSchema,\n colorSchemas,\n invertColors,\n uiState,\n setValue,\n showHelpText = true,\n}: ColorSchemaOptionsProps) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/color_schema.tsx", "deprecated": false, @@ -407,7 +407,7 @@ "label": "LegendSizeSettings", "description": [], "signature": [ - "({ legendSize, onLegendSizeChange, isVerticalLegend, showAutoOption, }: LegendSizeSettingsProps) => JSX.Element" + "({ legendSize, onLegendSizeChange, isVerticalLegend, showAutoOption, }: LegendSizeSettingsProps) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/legend_size_settings.tsx", "deprecated": false, @@ -442,7 +442,7 @@ "signature": [ "({\n 'data-test-subj': dataTestSubj,\n setValue,\n truncateLegend,\n maxLegendLines,\n}: ", "LongLegendOptionsProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/long_legend_options.tsx", "deprecated": false, @@ -485,7 +485,7 @@ "section": "def-public.NumberInputOptionProps", "text": "NumberInputOptionProps" }, - "<ParamName>) => JSX.Element" + "<ParamName>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/number_input.tsx", "deprecated": false, @@ -527,7 +527,7 @@ "signature": [ "({\n activePalette,\n palettes,\n paramName,\n setPalette,\n}: ", "PalettePickerProps", - "<ParamName>) => JSX.Element" + "<ParamName>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/controls/palette_picker.tsx", "deprecated": false, @@ -563,7 +563,7 @@ "signature": [ "({\n 'data-test-subj': dataTestSubj,\n setValue,\n percentageMode,\n formatPattern,\n disabled,\n}: ", "PercentageModeOptionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/percentage_mode.tsx", "deprecated": false, @@ -596,7 +596,7 @@ "label": "RangeOption", "description": [], "signature": [ - "({\n label,\n max,\n min,\n showInput,\n showLabels,\n showValue = true,\n step,\n paramName,\n value,\n setValue,\n}: RangeOptionProps<ParamName>) => JSX.Element" + "({\n label,\n max,\n min,\n showInput,\n showLabels,\n showValue = true,\n step,\n paramName,\n value,\n setValue,\n}: RangeOptionProps<ParamName>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/range.tsx", "deprecated": false, @@ -629,7 +629,7 @@ "label": "RangesParamEditor", "description": [], "signature": [ - "({\n 'data-test-subj': dataTestSubj = 'range',\n addRangeValues,\n error,\n value = [],\n hidePlaceholders,\n setValue,\n setTouched,\n setValidity,\n validateRange,\n}: RangesParamEditorProps) => JSX.Element" + "({\n 'data-test-subj': dataTestSubj = 'range',\n addRangeValues,\n error,\n value = [],\n hidePlaceholders,\n setValue,\n setTouched,\n setValidity,\n validateRange,\n}: RangesParamEditorProps) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/controls/ranges.tsx", "deprecated": false, @@ -664,7 +664,7 @@ "\nUse only this component instead of NumberInputOption in 'number_input.tsx'.\nIt is required for compatibility with TS 3.7.0\n" ], "signature": [ - "({\n disabled,\n error,\n isInvalid,\n label,\n max,\n min,\n paramName,\n step,\n value,\n setValue,\n setValidity,\n 'data-test-subj': dataTestSubj,\n}: NumberInputOptionProps<ParamName>) => JSX.Element" + "({\n disabled,\n error,\n isInvalid,\n label,\n max,\n min,\n paramName,\n step,\n value,\n setValue,\n setValidity,\n 'data-test-subj': dataTestSubj,\n}: NumberInputOptionProps<ParamName>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/required_number_input.tsx", "deprecated": false, @@ -697,7 +697,7 @@ "label": "SelectOption", "description": [], "signature": [ - "({\n disabled,\n helpText,\n id,\n label,\n labelAppend,\n options,\n paramName,\n value,\n setValue,\n 'data-test-subj': dataTestSubj,\n}: SelectOptionProps<ParamName, ValidParamValues>) => JSX.Element" + "({\n disabled,\n helpText,\n id,\n label,\n labelAppend,\n options,\n paramName,\n value,\n setValue,\n 'data-test-subj': dataTestSubj,\n}: SelectOptionProps<ParamName, ValidParamValues>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/select.tsx", "deprecated": false, @@ -730,7 +730,7 @@ "label": "SwitchOption", "description": [], "signature": [ - "({\n 'data-test-subj': dataTestSubj,\n tooltip,\n label,\n disabled,\n paramName,\n value = false,\n setValue,\n}: SwitchOptionProps<ParamName>) => JSX.Element" + "({\n 'data-test-subj': dataTestSubj,\n tooltip,\n label,\n disabled,\n paramName,\n value = false,\n setValue,\n}: SwitchOptionProps<ParamName>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/switch.tsx", "deprecated": false, @@ -763,7 +763,7 @@ "label": "TextInputOption", "description": [], "signature": [ - "({\n 'data-test-subj': dataTestSubj,\n disabled,\n helpText,\n label,\n paramName,\n value = '',\n setValue,\n}: TextInputOptionProps<ParamName>) => JSX.Element" + "({\n 'data-test-subj': dataTestSubj,\n disabled,\n helpText,\n label,\n paramName,\n value = '',\n setValue,\n}: TextInputOptionProps<ParamName>) => React.JSX.Element" ], "path": "src/plugins/vis_default_editor/public/components/options/text_input.tsx", "deprecated": false, @@ -883,7 +883,7 @@ "label": "error", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "src/plugins/vis_default_editor/public/components/options/number_input.tsx", "deprecated": false, @@ -911,7 +911,7 @@ "label": "label", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "src/plugins/vis_default_editor/public/components/options/number_input.tsx", "deprecated": false, diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 787de382e04f2..458d392de5517 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-01 +date: 2024-10-02 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 180f8b70539c4..92e222477c6e3 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-01 +date: 2024-10-02 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 0528133d7d8b4..4920c3b1e11e0 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-01 +date: 2024-10-02 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 1b4210053ad15..49720ffe895e6 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-01 +date: 2024-10-02 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 5ab20118f42f7..c8d4bc25c394e 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-01 +date: 2024-10-02 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 40508cdf5a138..76b9878a65d40 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-01 +date: 2024-10-02 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 b7a84f83698a7..b36db0fc63c18 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-01 +date: 2024-10-02 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 55eb18e178f3e..8257794b12be3 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-01 +date: 2024-10-02 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 1b64be0e76bdb..adc5390742b31 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.devdocs.json b/api_docs/vis_type_xy.devdocs.json index 79032c18fe2ca..b390b71df5011 100644 --- a/api_docs/vis_type_xy.devdocs.json +++ b/api_docs/vis_type_xy.devdocs.json @@ -55,7 +55,7 @@ "signature": [ "({ disabled, value = null, setValue }: ", "TruncateLabelsOptionProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/vis_types/xy/public/editor/components/common/truncate_labels.tsx", "deprecated": false, diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 9f209eb1fd312..dd65b0e7bec4e 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-01 +date: 2024-10-02 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 649d328ac9978..23b3081eed071 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -2485,7 +2485,7 @@ "signature": [ "({ \"data-test-subj\": dataTestSubj, className, children, handlers, showNoResult, error, renderComplete, }: ", "VisualizationContainerProps", - ") => JSX.Element" + ") => React.JSX.Element" ], "path": "src/plugins/visualizations/public/components/visualization_container.tsx", "deprecated": false, @@ -3419,7 +3419,7 @@ "label": "tooltip", "description": [], "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + "string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined" ], "path": "src/plugins/visualizations/public/vis_types/types.ts", "deprecated": false, @@ -10054,7 +10054,7 @@ "label": "alignment", "description": [], "signature": [ - "\"right\" | \"left\" | \"center\" | undefined" + "\"right\" | \"center\" | \"left\" | undefined" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, @@ -14272,7 +14272,7 @@ "label": "seriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" + "\"area\" | \"line\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, @@ -16382,7 +16382,7 @@ "label": "SeriesType", "description": [], "signature": [ - "\"line\" | \"area\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" + "\"area\" | \"line\" | \"bar\" | \"bar_stacked\" | \"area_stacked\" | \"bar_horizontal\" | \"bar_percentage_stacked\" | \"bar_horizontal_stacked\" | \"area_percentage_stacked\" | \"bar_horizontal_percentage_stacked\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, @@ -16603,7 +16603,7 @@ "label": "TimeScaleUnit", "description": [], "signature": [ - "\"m\" | \"d\" | \"h\" | \"s\"" + "\"m\" | \"s\" | \"d\" | \"h\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/common.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 1b6b7804fe379..0b8e42b5c7392 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-01 +date: 2024-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 616c6e837fedeb5c15d62670c48072c1d6ea542b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georgiana-Andreea=20Onolea=C8=9B=C4=83?= <georgiana.onoleata@elastic.co> Date: Wed, 2 Oct 2024 09:48:15 +0300 Subject: [PATCH 092/107] [ResponseOps][Cases] Design Review changes PR 1 (#194560) Connected to https://github.com/elastic/kibana/issues/188187 ## Summary - Field names have been aligned on top to ensure consistency with the fields area on the right <img width="1495" alt="Screenshot 2024-10-01 at 14 30 38" src="https://github.com/user-attachments/assets/51578be1-6cd8-43e0-a800-61e562aa5d77"> - Custom field and template name text size has been reduced to align with the badge ![Screenshot 2024-10-01 at 14 34 15](https://github.com/user-attachments/assets/986f9426-640e-4158-8614-662672f4ca72) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../components/custom_fields/custom_fields_list/index.tsx | 2 +- x-pack/plugins/cases/public/components/custom_fields/index.tsx | 1 + x-pack/plugins/cases/public/components/templates/index.tsx | 1 + .../cases/public/components/templates/templates_list.tsx | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx b/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx index f8475a90b94ad..90f6687141eda 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx @@ -69,7 +69,7 @@ const CustomFieldsListComponent: React.FC<Props> = (props) => { <EuiFlexItem grow={true}> <EuiFlexGroup alignItems="center" gutterSize="s"> <EuiFlexItem grow={false}> - <EuiText> + <EuiText size="s"> <h4>{customField.label}</h4> </EuiText> </EuiFlexItem> diff --git a/x-pack/plugins/cases/public/components/custom_fields/index.tsx b/x-pack/plugins/cases/public/components/custom_fields/index.tsx index afe3a4ad04b32..3c754d39a63fb 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/index.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/index.tsx @@ -70,6 +70,7 @@ const CustomFieldsComponent: React.FC<Props> = ({ title={<h3>{i18n.TITLE}</h3>} description={<p>{i18n.DESCRIPTION}</p>} data-test-subj="custom-fields-form-group" + css={{ alignItems: 'flex-start' }} > <EuiPanel paddingSize="s" color="subdued" hasBorder={false} hasShadow={false}> {customFields.length ? ( diff --git a/x-pack/plugins/cases/public/components/templates/index.tsx b/x-pack/plugins/cases/public/components/templates/index.tsx index 9671b9aee8556..3be2bf92411a9 100644 --- a/x-pack/plugins/cases/public/components/templates/index.tsx +++ b/x-pack/plugins/cases/public/components/templates/index.tsx @@ -82,6 +82,7 @@ const TemplatesComponent: React.FC<Props> = ({ } description={<p>{i18n.TEMPLATE_DESCRIPTION}</p>} data-test-subj="templates-form-group" + css={{ alignItems: 'flex-start' }} > <EuiPanel paddingSize="s" color="subdued" hasBorder={false} hasShadow={false}> {templates.length ? ( diff --git a/x-pack/plugins/cases/public/components/templates/templates_list.tsx b/x-pack/plugins/cases/public/components/templates/templates_list.tsx index ceaac643ecab3..84009e34b5fdd 100644 --- a/x-pack/plugins/cases/public/components/templates/templates_list.tsx +++ b/x-pack/plugins/cases/public/components/templates/templates_list.tsx @@ -63,7 +63,7 @@ const TemplatesListComponent: React.FC<Props> = (props) => { <EuiFlexItem grow={true}> <EuiFlexGroup alignItems="center" gutterSize="s"> <EuiFlexItem grow={false}> - <EuiText> + <EuiText size="s"> <h4> <TruncatedText text={template.name} /> </h4> From d1f24b050b53cc7b13fbc47b6de3c5f69606e88e Mon Sep 17 00:00:00 2001 From: James Gowdy <jgowdy@elastic.co> Date: Wed, 2 Oct 2024 08:47:19 +0100 Subject: [PATCH 093/107] [ML] Various fixes for possible prototype pollution vulnerabilities (#194529) Fixes potential prototype pollution vulnerability in `setNestedProperty` function. Fixes incomplete string escaping issue in ML's saved object service. --- .../ml/nested_property/src/set_nested_property.test.ts | 10 ++++++++++ .../ml/nested_property/src/set_nested_property.ts | 6 ++++++ x-pack/plugins/ml/server/saved_objects/service.ts | 4 ++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/x-pack/packages/ml/nested_property/src/set_nested_property.test.ts b/x-pack/packages/ml/nested_property/src/set_nested_property.test.ts index 43996f603ffa0..963b0611197db 100644 --- a/x-pack/packages/ml/nested_property/src/set_nested_property.test.ts +++ b/x-pack/packages/ml/nested_property/src/set_nested_property.test.ts @@ -68,5 +68,15 @@ describe('object_utils', () => { const test11 = setNestedProperty(getFalseyObject(), 'the.other_nested.value', 'update'); expect(test11.the.other_nested.value).toBe('update'); + + expect(() => { + setNestedProperty(getTestObj(), 'the.__proto__', 'update'); + }).toThrow('Invalid accessor'); + expect(() => { + setNestedProperty(getTestObj(), 'the.prototype', 'update'); + }).toThrow('Invalid accessor'); + expect(() => { + setNestedProperty(getTestObj(), 'the.constructor', 'update'); + }).toThrow('Invalid accessor'); }); }); diff --git a/x-pack/packages/ml/nested_property/src/set_nested_property.ts b/x-pack/packages/ml/nested_property/src/set_nested_property.ts index b963983cb16ab..6c692cb3a0a08 100644 --- a/x-pack/packages/ml/nested_property/src/set_nested_property.ts +++ b/x-pack/packages/ml/nested_property/src/set_nested_property.ts @@ -5,9 +5,15 @@ * 2.0. */ +const INVALID_ACCESSORS = ['__proto__', 'prototype', 'constructor']; + export const setNestedProperty = (obj: Record<string, any>, accessor: string, value: any) => { let ref = obj; const accessors = accessor.split('.'); + if (accessors.some((a) => INVALID_ACCESSORS.includes(a))) { + throw new Error('Invalid accessor'); + } + const len = accessors.length; for (let i = 0; i < len - 1; i++) { const attribute = accessors[i]; diff --git a/x-pack/plugins/ml/server/saved_objects/service.ts b/x-pack/plugins/ml/server/saved_objects/service.ts index e6c32f2bc6531..3e0f81a8ba13b 100644 --- a/x-pack/plugins/ml/server/saved_objects/service.ts +++ b/x-pack/plugins/ml/server/saved_objects/service.ts @@ -328,7 +328,7 @@ export function mlSavedObjectServiceFactory( if (id.match('\\*') === null) { return jobIds.includes(id); } - const regex = new RegExp(id.replace('*', '.*')); + const regex = new RegExp(id.replaceAll('*', '.*')); return jobIds.some((jId) => typeof jId === 'string' && regex.exec(jId)); }); } @@ -640,7 +640,7 @@ export function mlSavedObjectServiceFactory( if (id.match('\\*') === null) { return modelIds.includes(id); } - const regex = new RegExp(id.replace('*', '.*')); + const regex = new RegExp(id.replaceAll('*', '.*')); return modelIds.some((jId) => typeof jId === 'string' && regex.exec(jId)); }); } From c5aa73991463dee50b036bb51645e03cc283bb8c Mon Sep 17 00:00:00 2001 From: Yan Savitski <yan.savitski@elastic.co> Date: Wed, 2 Oct 2024 10:45:20 +0200 Subject: [PATCH 094/107] [Search][Onboarding] api-key plugin (#191926) ## Summary Kibana plugin that helps manage the session for the api-key that provides two exports: - React custom hook to read the api-key stored in session. This hook should return the api-key if it exists, otherwise null. - Component to present either the api key in storage or action to create api key and store into sessionStorage after callback. <img width="1255" alt="Screenshot 2024-09-27 at 20 52 52" src="https://github.com/user-attachments/assets/dc5bcd39-7fe6-433c-8aaa-ad3578a68b62"> <img width="1248" alt="Screenshot 2024-09-27 at 20 52 39" src="https://github.com/user-attachments/assets/d760c163-9017-4f57-ba1a-38ee8ee21534"> <img width="676" alt="Screenshot 2024-09-27 at 20 52 28" src="https://github.com/user-attachments/assets/e908d20a-7e0c-4f3b-9ea2-8e2d1a74c9eb"> --- .github/CODEOWNERS | 3 + .i18nrc.json | 1 + package.json | 3 + .../kbn-search-api-keys-components/README.md | 3 + .../kbn-search-api-keys-components/index.ts | 13 ++ .../jest.config.js | 20 ++ .../kibana.jsonc | 5 + .../package.json | 6 + .../src/components/api_key_flyout_wrapper.tsx | 25 +++ .../src/components/api_key_form.tsx | 101 ++++++++++ .../src/constants.ts | 17 ++ .../src/hooks/use_search_api_key.ts | 19 ++ .../src/providers/search_api_key_provider.tsx | 182 ++++++++++++++++++ .../src/types.ts | 13 ++ .../tsconfig.json | 21 ++ packages/kbn-search-api-keys-server/README.md | 3 + packages/kbn-search-api-keys-server/index.ts | 10 + .../kbn-search-api-keys-server/jest.config.js | 17 ++ .../kbn-search-api-keys-server/kibana.jsonc | 5 + .../kbn-search-api-keys-server/package.json | 6 + .../src/lib/create_key.ts | 31 +++ .../src/lib/get_key_by_id.ts | 30 +++ .../src/lib/privileges.ts | 50 +++++ .../src/routes/routes.ts | 108 +++++++++++ .../kbn-search-api-keys-server/tsconfig.json | 20 ++ packages/kbn-search-api-keys-server/types.ts | 27 +++ tsconfig.base.json | 12 +- x-pack/.i18nrc.json | 1 + x-pack/packages/search/shared_ui/README.md | 3 + x-pack/packages/search/shared_ui/index.ts | 8 + .../packages/search/shared_ui/jest.config.js | 15 ++ x-pack/packages/search/shared_ui/kibana.jsonc | 5 + x-pack/packages/search/shared_ui/package.json | 6 + .../src/form_info_field/form_info_field.tsx | 88 +++++++++ .../packages/search/shared_ui/tsconfig.json | 22 +++ .../src/components/api_key_flyout.tsx | 8 + x-pack/plugins/search_indices/kibana.jsonc | 2 +- .../search_indices/public/application.tsx | 5 +- .../connection_details/connection_details.tsx | 63 +----- .../add_documents_code_example.tsx | 13 +- .../components/indices/details_page.tsx | 9 +- .../components/start/create_index_code.tsx | 36 +++- .../search_indices/server/routes/index.ts | 2 + x-pack/plugins/search_indices/tsconfig.json | 3 + .../search_playground/server/routes.ts | 38 ---- .../functional/page_objects/index.ts | 2 + .../functional/page_objects/svl_api_keys.ts | 108 +++++++++++ .../svl_search_elasticsearch_start_page.ts | 6 + .../svl_search_index_detail_page.ts | 7 + .../test_suites/search/elasticsearch_start.ts | 113 ++++++++--- .../test_suites/search/search_index_detail.ts | 8 + yarn.lock | 12 ++ 52 files changed, 1208 insertions(+), 126 deletions(-) create mode 100644 packages/kbn-search-api-keys-components/README.md create mode 100644 packages/kbn-search-api-keys-components/index.ts create mode 100644 packages/kbn-search-api-keys-components/jest.config.js create mode 100644 packages/kbn-search-api-keys-components/kibana.jsonc create mode 100644 packages/kbn-search-api-keys-components/package.json create mode 100644 packages/kbn-search-api-keys-components/src/components/api_key_flyout_wrapper.tsx create mode 100644 packages/kbn-search-api-keys-components/src/components/api_key_form.tsx create mode 100644 packages/kbn-search-api-keys-components/src/constants.ts create mode 100644 packages/kbn-search-api-keys-components/src/hooks/use_search_api_key.ts create mode 100644 packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx create mode 100644 packages/kbn-search-api-keys-components/src/types.ts create mode 100644 packages/kbn-search-api-keys-components/tsconfig.json create mode 100644 packages/kbn-search-api-keys-server/README.md create mode 100644 packages/kbn-search-api-keys-server/index.ts create mode 100644 packages/kbn-search-api-keys-server/jest.config.js create mode 100644 packages/kbn-search-api-keys-server/kibana.jsonc create mode 100644 packages/kbn-search-api-keys-server/package.json create mode 100644 packages/kbn-search-api-keys-server/src/lib/create_key.ts create mode 100644 packages/kbn-search-api-keys-server/src/lib/get_key_by_id.ts create mode 100644 packages/kbn-search-api-keys-server/src/lib/privileges.ts create mode 100644 packages/kbn-search-api-keys-server/src/routes/routes.ts create mode 100644 packages/kbn-search-api-keys-server/tsconfig.json create mode 100644 packages/kbn-search-api-keys-server/types.ts create mode 100644 x-pack/packages/search/shared_ui/README.md create mode 100644 x-pack/packages/search/shared_ui/index.ts create mode 100644 x-pack/packages/search/shared_ui/jest.config.js create mode 100644 x-pack/packages/search/shared_ui/kibana.jsonc create mode 100644 x-pack/packages/search/shared_ui/package.json create mode 100644 x-pack/packages/search/shared_ui/src/form_info_field/form_info_field.tsx create mode 100644 x-pack/packages/search/shared_ui/tsconfig.json create mode 100644 x-pack/test_serverless/functional/page_objects/svl_api_keys.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b3af3edce4585..4d42183c92991 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -753,6 +753,8 @@ src/plugins/screenshot_mode @elastic/appex-sharedux x-pack/examples/screenshotting_example @elastic/appex-sharedux x-pack/plugins/screenshotting @elastic/kibana-reporting-services packages/kbn-screenshotting-server @elastic/appex-sharedux +packages/kbn-search-api-keys-components @elastic/search-kibana +packages/kbn-search-api-keys-server @elastic/search-kibana packages/kbn-search-api-panels @elastic/search-kibana x-pack/plugins/search_assistant @elastic/search-kibana packages/kbn-search-connectors @elastic/search-kibana @@ -766,6 +768,7 @@ x-pack/plugins/search_inference_endpoints @elastic/search-kibana x-pack/plugins/search_notebooks @elastic/search-kibana x-pack/plugins/search_playground @elastic/search-kibana packages/kbn-search-response-warnings @elastic/kibana-data-discovery +x-pack/packages/search/shared_ui @elastic/search-kibana packages/kbn-search-types @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/kibana-management x-pack/test/security_api_integration/packages/helpers @elastic/kibana-security diff --git a/.i18nrc.json b/.i18nrc.json index e9500448b9a09..036be597ac969 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -109,6 +109,7 @@ "server": "src/legacy/server", "share": ["src/plugins/share", "packages/kbn-reporting-share"], "sharedUXPackages": "packages/shared-ux", + "searchApiKeysComponents": "packages/kbn-search-api-keys-components", "searchApiPanels": "packages/kbn-search-api-panels/", "searchErrors": "packages/kbn-search-errors", "searchIndexDocuments": "packages/kbn-search-index-documents", diff --git a/package.json b/package.json index 525bedcab5ef9..b765f5867f9c4 100644 --- a/package.json +++ b/package.json @@ -771,6 +771,8 @@ "@kbn/screenshotting-example-plugin": "link:x-pack/examples/screenshotting_example", "@kbn/screenshotting-plugin": "link:x-pack/plugins/screenshotting", "@kbn/screenshotting-server": "link:packages/kbn-screenshotting-server", + "@kbn/search-api-keys-components": "link:packages/kbn-search-api-keys-components", + "@kbn/search-api-keys-server": "link:packages/kbn-search-api-keys-server", "@kbn/search-api-panels": "link:packages/kbn-search-api-panels", "@kbn/search-assistant": "link:x-pack/plugins/search_assistant", "@kbn/search-connectors": "link:packages/kbn-search-connectors", @@ -784,6 +786,7 @@ "@kbn/search-notebooks": "link:x-pack/plugins/search_notebooks", "@kbn/search-playground": "link:x-pack/plugins/search_playground", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", + "@kbn/search-shared-ui": "link:x-pack/packages/search/shared_ui", "@kbn/search-types": "link:packages/kbn-search-types", "@kbn/searchprofiler-plugin": "link:x-pack/plugins/searchprofiler", "@kbn/security-api-key-management": "link:x-pack/packages/security/api_key_management", diff --git a/packages/kbn-search-api-keys-components/README.md b/packages/kbn-search-api-keys-components/README.md new file mode 100644 index 0000000000000..06815bf556f00 --- /dev/null +++ b/packages/kbn-search-api-keys-components/README.md @@ -0,0 +1,3 @@ +# Search API Key Components + +The Search API Keys components package is a shared components and utilities to simplify managing the API Keys experience for elasticsearch users across stack and serverless search solutions. \ No newline at end of file diff --git a/packages/kbn-search-api-keys-components/index.ts b/packages/kbn-search-api-keys-components/index.ts new file mode 100644 index 0000000000000..d188bdb956913 --- /dev/null +++ b/packages/kbn-search-api-keys-components/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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". + */ + +export * from './src/components/api_key_flyout_wrapper'; +export * from './src/components/api_key_form'; +export * from './src/hooks/use_search_api_key'; +export * from './src/providers/search_api_key_provider'; diff --git a/packages/kbn-search-api-keys-components/jest.config.js b/packages/kbn-search-api-keys-components/jest.config.js new file mode 100644 index 0000000000000..d1868067bb31c --- /dev/null +++ b/packages/kbn-search-api-keys-components/jest.config.js @@ -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", 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". + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['<rootDir>/packages/kbn-search-api-keys-components'], + coverageDirectory: + '<rootDir>/target/kibana-coverage/jest/packages/kbn-search-api-keys-components', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '<rootDir>/packages/kbn-search-api-keys-components/public/{components,hooks}/**/*.{ts,tsx}', + ], +}; diff --git a/packages/kbn-search-api-keys-components/kibana.jsonc b/packages/kbn-search-api-keys-components/kibana.jsonc new file mode 100644 index 0000000000000..bedd4c213760f --- /dev/null +++ b/packages/kbn-search-api-keys-components/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-browser", + "id": "@kbn/search-api-keys-components", + "owner": "@elastic/search-kibana" +} \ No newline at end of file diff --git a/packages/kbn-search-api-keys-components/package.json b/packages/kbn-search-api-keys-components/package.json new file mode 100644 index 0000000000000..1405cb6c27bed --- /dev/null +++ b/packages/kbn-search-api-keys-components/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/search-api-keys-components", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} \ No newline at end of file diff --git a/packages/kbn-search-api-keys-components/src/components/api_key_flyout_wrapper.tsx b/packages/kbn-search-api-keys-components/src/components/api_key_flyout_wrapper.tsx new file mode 100644 index 0000000000000..35db216df1ef3 --- /dev/null +++ b/packages/kbn-search-api-keys-components/src/components/api_key_flyout_wrapper.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 React from 'react'; +import { ApiKeyFlyout, ApiKeyFlyoutProps } from '@kbn/security-api-key-management'; +import type { SecurityCreateApiKeyResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +const API_KEY_NAME = 'Unrestricted API Key'; + +type ApiKeyFlyoutWrapperProps = Pick<ApiKeyFlyoutProps, 'onCancel'> & { + onSuccess?: (createApiKeyResponse: SecurityCreateApiKeyResponse) => void; +}; + +export const ApiKeyFlyoutWrapper: React.FC<ApiKeyFlyoutWrapperProps> = ({ + onCancel, + onSuccess, +}) => { + return <ApiKeyFlyout onCancel={onCancel} onSuccess={onSuccess} defaultName={API_KEY_NAME} />; +}; diff --git a/packages/kbn-search-api-keys-components/src/components/api_key_form.tsx b/packages/kbn-search-api-keys-components/src/components/api_key_form.tsx new file mode 100644 index 0000000000000..ccd169c413bb1 --- /dev/null +++ b/packages/kbn-search-api-keys-components/src/components/api_key_form.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", 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 React, { useState } from 'react'; +import { + EuiBadge, + EuiButton, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { FormInfoField } from '@kbn/search-shared-ui'; +import { ApiKeyFlyoutWrapper } from './api_key_flyout_wrapper'; +import { useSearchApiKey } from '../hooks/use_search_api_key'; +import { Status } from '../constants'; + +interface ApiKeyFormProps { + hasTitle?: boolean; +} + +export const ApiKeyForm: React.FC<ApiKeyFormProps> = ({ hasTitle = true }) => { + const [showFlyout, setShowFlyout] = useState(false); + const { apiKey, status, updateApiKey, toggleApiKeyVisibility, displayedApiKey, apiKeyIsVisible } = + useSearchApiKey(); + + const titleLocale = i18n.translate('searchApiKeysComponents.apiKeyForm.title', { + defaultMessage: 'API Key', + }); + + if (apiKey && displayedApiKey) { + return ( + <FormInfoField + label={hasTitle ? titleLocale : undefined} + value={displayedApiKey} + copyValue={apiKey} + dataTestSubj="apiKeyFormAPIKey" + actions={[ + <EuiButtonIcon + iconType={apiKeyIsVisible ? 'eyeClosed' : 'eye'} + color="success" + onClick={toggleApiKeyVisibility} + data-test-subj="showAPIKeyButton" + aria-label={i18n.translate('searchApiKeysComponents.apiKeyForm.showApiKey', { + defaultMessage: 'Show API Key', + })} + />, + ]} + /> + ); + } + + return ( + <EuiFlexGroup alignItems="center" gutterSize="s" justifyContent="flexStart" responsive={false}> + {hasTitle && ( + <EuiFlexItem grow={0}> + <EuiTitle size="xxxs" css={{ whiteSpace: 'nowrap' }}> + <h6>{titleLocale}</h6> + </EuiTitle> + </EuiFlexItem> + )} + {status === Status.showUserPrivilegesError && ( + <EuiFlexItem grow={0}> + <EuiBadge data-test-subj="apiKeyFormNoUserPrivileges"> + {i18n.translate('searchApiKeysComponents.apiKeyForm.noUserPrivileges', { + defaultMessage: "You don't have access to manage API keys", + })} + </EuiBadge> + </EuiFlexItem> + )} + {status === Status.showCreateButton && ( + <EuiFlexItem grow={0}> + <EuiButton + color="primary" + size="s" + iconSide="left" + iconType="key" + onClick={() => setShowFlyout(true)} + data-test-subj="createAPIKeyButton" + > + <FormattedMessage + id="searchApiKeysComponents.apiKeyForm.createButton" + defaultMessage="Create an API Key" + /> + </EuiButton> + {showFlyout && ( + <ApiKeyFlyoutWrapper onCancel={() => setShowFlyout(false)} onSuccess={updateApiKey} /> + )} + </EuiFlexItem> + )} + </EuiFlexGroup> + ); +}; diff --git a/packages/kbn-search-api-keys-components/src/constants.ts b/packages/kbn-search-api-keys-components/src/constants.ts new file mode 100644 index 0000000000000..b822ccb042a70 --- /dev/null +++ b/packages/kbn-search-api-keys-components/src/constants.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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". + */ + +export enum Status { + uninitialized = 'uninitialized', + loading = 'loading', + showCreateButton = 'showCreateButton', + showHiddenKey = 'showHiddenKey', + showPreviewKey = 'showPreviewKey', + showUserPrivilegesError = 'showUserPrivilegesError', +} diff --git a/packages/kbn-search-api-keys-components/src/hooks/use_search_api_key.ts b/packages/kbn-search-api-keys-components/src/hooks/use_search_api_key.ts new file mode 100644 index 0000000000000..9d0bd4826f9de --- /dev/null +++ b/packages/kbn-search-api-keys-components/src/hooks/use_search_api_key.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 { useContext, useEffect } from 'react'; +import { ApiKeyContext } from '../providers/search_api_key_provider'; + +export const useSearchApiKey = () => { + const { initialiseKey, ...context } = useContext(ApiKeyContext); + useEffect(() => { + initialiseKey(); + }, [initialiseKey]); + return context; +}; diff --git a/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx b/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx new file mode 100644 index 0000000000000..f3a81e72d3b2e --- /dev/null +++ b/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx @@ -0,0 +1,182 @@ +/* + * Copyright 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 React, { useCallback, useReducer, createContext, useEffect } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import type { APIKeyCreationResponse } from '@kbn/search-api-keys-server/types'; +import { APIRoutes } from '../types'; +import { Status } from '../constants'; + +const API_KEY_STORAGE_KEY = 'searchApiKey'; +const API_KEY_MASK = '•'.repeat(60); + +interface ApiKeyState { + status: Status; + apiKey: string | null; +} + +interface APIKeyContext { + displayedApiKey: string | null; + apiKey: string | null; + toggleApiKeyVisibility: () => void; + updateApiKey: ({ id, encoded }: { id: string; encoded: string }) => void; + status: Status; + apiKeyIsVisible: boolean; + initialiseKey: () => void; +} + +type Action = + | { type: 'SET_API_KEY'; apiKey: string; status: Status } + | { type: 'SET_STATUS'; status: Status } + | { type: 'CLEAR_API_KEY' } + | { type: 'TOGGLE_API_KEY_VISIBILITY' }; + +const initialState: ApiKeyState = { + apiKey: null, + status: Status.uninitialized, +}; + +const reducer = (state: ApiKeyState, action: Action): ApiKeyState => { + switch (action.type) { + case 'SET_API_KEY': + return { ...state, apiKey: action.apiKey, status: action.status }; + case 'SET_STATUS': + return { ...state, status: action.status }; + case 'TOGGLE_API_KEY_VISIBILITY': + return { + ...state, + status: + state.status === Status.showHiddenKey ? Status.showPreviewKey : Status.showHiddenKey, + }; + case 'CLEAR_API_KEY': + return { ...state, apiKey: null, status: Status.showCreateButton }; + default: + return state; + } +}; + +export const ApiKeyContext = createContext<APIKeyContext>({ + displayedApiKey: null, + apiKey: null, + toggleApiKeyVisibility: () => {}, + updateApiKey: () => {}, + status: Status.uninitialized, + apiKeyIsVisible: false, + initialiseKey: () => {}, +}); + +export const SearchApiKeyProvider: React.FC = ({ children }) => { + const { http } = useKibana().services; + const [state, dispatch] = useReducer(reducer, initialState); + + const updateApiKey = useCallback(({ id, encoded }: { id: string; encoded: string }) => { + sessionStorage.setItem(API_KEY_STORAGE_KEY, JSON.stringify({ id, encoded })); + dispatch({ type: 'SET_API_KEY', apiKey: encoded, status: Status.showHiddenKey }); + }, []); + const handleShowKeyVisibility = useCallback(() => { + dispatch({ type: 'TOGGLE_API_KEY_VISIBILITY' }); + }, []); + const initialiseKey = useCallback(() => { + dispatch({ type: 'SET_STATUS', status: Status.loading }); + }, []); + const { mutateAsync: validateApiKey } = useMutation(async (id: string) => { + try { + if (!http?.post) { + throw new Error('HTTP service is unavailable'); + } + + const response = await http.post<{ isValid: boolean }>(APIRoutes.API_KEY_VALIDITY, { + body: JSON.stringify({ id }), + }); + + return response.isValid; + } catch (err) { + return false; + } + }); + const { mutateAsync: createApiKey } = useMutation<APIKeyCreationResponse | undefined>({ + mutationFn: async () => { + try { + if (!http?.post) { + throw new Error('HTTP service is unavailable'); + } + + return await http.post<APIKeyCreationResponse>(APIRoutes.API_KEYS); + } catch (err) { + if (err.response?.status === 400) { + dispatch({ type: 'SET_STATUS', status: Status.showCreateButton }); + } else if (err.response?.status === 403) { + dispatch({ type: 'SET_STATUS', status: Status.showUserPrivilegesError }); + } else { + throw err; + } + } + }, + onSuccess: (receivedApiKey) => { + if (receivedApiKey) { + sessionStorage.setItem( + API_KEY_STORAGE_KEY, + JSON.stringify({ id: receivedApiKey.id, encoded: receivedApiKey.encoded }) + ); + dispatch({ + type: 'SET_API_KEY', + apiKey: receivedApiKey.encoded, + status: Status.showHiddenKey, + }); + } + }, + }); + + useEffect(() => { + const initialiseApiKey = async () => { + try { + if (state.status === Status.loading) { + const storedKey = sessionStorage.getItem(API_KEY_STORAGE_KEY); + + if (storedKey) { + const { id, encoded } = JSON.parse(storedKey); + + if (await validateApiKey(id)) { + dispatch({ + type: 'SET_API_KEY', + apiKey: encoded, + status: Status.showHiddenKey, + }); + } else { + sessionStorage.removeItem(API_KEY_STORAGE_KEY); + dispatch({ + type: 'CLEAR_API_KEY', + }); + await createApiKey(); + } + } else { + await createApiKey(); + } + } + } catch (e) { + dispatch({ type: 'CLEAR_API_KEY' }); + } + }; + + initialiseApiKey(); + }, [state.status, createApiKey, validateApiKey]); + + const value: APIKeyContext = { + displayedApiKey: state.status === Status.showHiddenKey ? API_KEY_MASK : state.apiKey, + apiKey: state.apiKey, + toggleApiKeyVisibility: handleShowKeyVisibility, + updateApiKey, + status: state.status, + apiKeyIsVisible: state.status === Status.showPreviewKey, + initialiseKey, + }; + + return <ApiKeyContext.Provider value={value}>{children}</ApiKeyContext.Provider>; +}; diff --git a/packages/kbn-search-api-keys-components/src/types.ts b/packages/kbn-search-api-keys-components/src/types.ts new file mode 100644 index 0000000000000..146b5fdd2faca --- /dev/null +++ b/packages/kbn-search-api-keys-components/src/types.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", 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". + */ + +export enum APIRoutes { + API_KEYS = '/internal/search_api_keys', + API_KEY_VALIDITY = '/internal/search_api_keys/validity', +} diff --git a/packages/kbn-search-api-keys-components/tsconfig.json b/packages/kbn-search-api-keys-components/tsconfig.json new file mode 100644 index 0000000000000..e81fb5bc36996 --- /dev/null +++ b/packages/kbn-search-api-keys-components/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + }, + "include": [ + "src/**/*", + "index.ts", + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/i18n-react", + "@kbn/kibana-react-plugin", + "@kbn/security-api-key-management", + "@kbn/search-shared-ui", + "@kbn/search-api-keys-server" + ], + "exclude": [ + "target/**/*", + ] +} diff --git a/packages/kbn-search-api-keys-server/README.md b/packages/kbn-search-api-keys-server/README.md new file mode 100644 index 0000000000000..82a42ad81b5b6 --- /dev/null +++ b/packages/kbn-search-api-keys-server/README.md @@ -0,0 +1,3 @@ +# Search API Keys + +The Search API Keys package is a shared components and utilities to simplify managing the API Keys experience for elasticsearch users across stack and serverless search solutions. \ No newline at end of file diff --git a/packages/kbn-search-api-keys-server/index.ts b/packages/kbn-search-api-keys-server/index.ts new file mode 100644 index 0000000000000..e9287e9debdd0 --- /dev/null +++ b/packages/kbn-search-api-keys-server/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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". + */ + +export * from './src/routes/routes'; diff --git a/packages/kbn-search-api-keys-server/jest.config.js b/packages/kbn-search-api-keys-server/jest.config.js new file mode 100644 index 0000000000000..af09324461569 --- /dev/null +++ b/packages/kbn-search-api-keys-server/jest.config.js @@ -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", 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". + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../..', + roots: ['<rootDir>/packages/kbn-search-api-keys-server'], + coverageDirectory: '<rootDir>/target/kibana-coverage/jest/packages/kbn-search-api-keys-server', + coverageReporters: ['text', 'html'], + collectCoverageFrom: ['<rootDir>/packages/kbn-search-api-keys-server/**/*.{ts,tsx}'], +}; diff --git a/packages/kbn-search-api-keys-server/kibana.jsonc b/packages/kbn-search-api-keys-server/kibana.jsonc new file mode 100644 index 0000000000000..52c6cd9653968 --- /dev/null +++ b/packages/kbn-search-api-keys-server/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-server", + "id": "@kbn/search-api-keys-server", + "owner": "@elastic/search-kibana" +} \ No newline at end of file diff --git a/packages/kbn-search-api-keys-server/package.json b/packages/kbn-search-api-keys-server/package.json new file mode 100644 index 0000000000000..6c891e7325a2e --- /dev/null +++ b/packages/kbn-search-api-keys-server/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/search-api-keys-server", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} \ No newline at end of file diff --git a/packages/kbn-search-api-keys-server/src/lib/create_key.ts b/packages/kbn-search-api-keys-server/src/lib/create_key.ts new file mode 100644 index 0000000000000..7bebe713810c8 --- /dev/null +++ b/packages/kbn-search-api-keys-server/src/lib/create_key.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", 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { Logger } from '@kbn/logging'; +import type { APIKeyCreationResponse } from '../../types'; + +export async function createAPIKey( + name: string, + client: ElasticsearchClient, + logger: Logger +): Promise<APIKeyCreationResponse> { + try { + const apiKey = await client.security.createApiKey({ + name, + role_descriptors: {}, + }); + + return apiKey; + } catch (e) { + logger.error(`Search API Keys: Error during creating API Key`); + logger.error(e); + throw e; + } +} diff --git a/packages/kbn-search-api-keys-server/src/lib/get_key_by_id.ts b/packages/kbn-search-api-keys-server/src/lib/get_key_by_id.ts new file mode 100644 index 0000000000000..94ae64f56c0da --- /dev/null +++ b/packages/kbn-search-api-keys-server/src/lib/get_key_by_id.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", 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { Logger } from '@kbn/logging'; +import type { GetApiKeyResponse } from '../../types'; + +export async function getAPIKeyById( + id: string, + client: ElasticsearchClient, + logger: Logger +): Promise<GetApiKeyResponse> { + try { + const apiKey = await client.security.getApiKey({ + id, + }); + + return apiKey.api_keys?.[0]; + } catch (e) { + logger.error(`Search API Keys: Error on getting API Key`); + logger.error(e); + throw e; + } +} diff --git a/packages/kbn-search-api-keys-server/src/lib/privileges.ts b/packages/kbn-search-api-keys-server/src/lib/privileges.ts new file mode 100644 index 0000000000000..fc5ad1f896746 --- /dev/null +++ b/packages/kbn-search-api-keys-server/src/lib/privileges.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { Logger } from '@kbn/logging'; + +export async function fetchUserStartPrivileges( + client: ElasticsearchClient, + logger: Logger +): Promise<boolean> { + try { + // relying on manage cluster privilege to check if user can create API keys + // and can also have permissions for index monitoring + const securityCheck = await client.security.hasPrivileges({ + cluster: ['manage'], + }); + + return securityCheck?.cluster?.manage ?? false; + } catch (e) { + logger.error(`Error checking user privileges for search API Keys`); + logger.error(e); + return false; + } +} + +export async function fetchClusterHasApiKeys( + client: ElasticsearchClient, + logger: Logger +): Promise<boolean> { + try { + const clusterApiKeys = await client.security.queryApiKeys({ + query: { + term: { + invalidated: false, + }, + }, + }); + return clusterApiKeys.api_keys.length > 0; + } catch (e) { + logger.error(`Error checking cluster for existing valid API keys`); + logger.error(e); + return true; + } +} diff --git a/packages/kbn-search-api-keys-server/src/routes/routes.ts b/packages/kbn-search-api-keys-server/src/routes/routes.ts new file mode 100644 index 0000000000000..77a08644f34a5 --- /dev/null +++ b/packages/kbn-search-api-keys-server/src/routes/routes.ts @@ -0,0 +1,108 @@ +/* + * Copyright 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 { IRouter } from '@kbn/core/server'; +import type { Logger } from '@kbn/logging'; + +import { schema } from '@kbn/config-schema'; +import { APIRoutes } from '../../types'; +import { getAPIKeyById } from '../lib/get_key_by_id'; +import { createAPIKey } from '../lib/create_key'; +import { fetchClusterHasApiKeys, fetchUserStartPrivileges } from '../lib/privileges'; + +const API_KEY_NAME = 'Unrestricted API Key'; + +export function registerSearchApiKeysRoutes(router: IRouter, logger: Logger) { + router.post( + { + path: APIRoutes.API_KEY_VALIDITY, + validate: { + body: schema.object({ + id: schema.string(), + }), + }, + options: { + access: 'internal', + }, + }, + async (context, request, response) => { + try { + const core = await context.core; + const client = core.elasticsearch.client.asCurrentUser; + const apiKey = await getAPIKeyById(request.body.id, client, logger); + + if (!apiKey) { + return response.customError({ + body: { message: 'API key is not found.' }, + statusCode: 404, + }); + } + + return response.ok({ + body: { isValid: !apiKey.invalidated }, + headers: { 'content-type': 'application/json' }, + }); + } catch (e) { + logger.error(`Error fetching API Key`); + logger.error(e); + return response.customError({ + body: { message: e.message }, + statusCode: 500, + }); + } + } + ); + + router.post( + { + path: APIRoutes.API_KEYS, + validate: {}, + options: { + access: 'internal', + }, + }, + async (context, _request, response) => { + try { + const core = await context.core; + const client = core.elasticsearch.client.asCurrentUser; + const clusterHasApiKeys = await fetchClusterHasApiKeys(client, logger); + + if (clusterHasApiKeys) { + return response.customError({ + body: { message: 'Project already has API keys' }, + statusCode: 400, + }); + } + + const canCreateApiKeys = await fetchUserStartPrivileges(client, logger); + + if (!canCreateApiKeys) { + return response.customError({ + body: { message: 'User does not have required privileges' }, + statusCode: 403, + }); + } + + const apiKey = await createAPIKey(API_KEY_NAME, client, logger); + + return response.ok({ + body: apiKey, + headers: { 'content-type': 'application/json' }, + }); + } catch (e) { + logger.error(`Error creating API Key`); + logger.error(e); + return response.customError({ + body: { message: e.message }, + statusCode: 500, + }); + } + } + ); +} diff --git a/packages/kbn-search-api-keys-server/tsconfig.json b/packages/kbn-search-api-keys-server/tsconfig.json new file mode 100644 index 0000000000000..9a82ed8904725 --- /dev/null +++ b/packages/kbn-search-api-keys-server/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + }, + "include": [ + "src/**/*", + "types.ts", + "index.ts" + ], + "kbn_references": [ + "@kbn/core-elasticsearch-server", + "@kbn/logging", + "@kbn/core", + "@kbn/config-schema", + ], + "exclude": [ + "target/**/*", + ] +} diff --git a/packages/kbn-search-api-keys-server/types.ts b/packages/kbn-search-api-keys-server/types.ts new file mode 100644 index 0000000000000..6f7ff29493ffd --- /dev/null +++ b/packages/kbn-search-api-keys-server/types.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". + */ + +export enum APIRoutes { + API_KEYS = '/internal/search_api_keys', + API_KEY_VALIDITY = '/internal/search_api_keys/validity', +} + +export interface APIKey { + id: string; + name: string; + expiration?: number; + invalidated?: boolean; +} + +export interface APIKeyCreationResponse extends Pick<APIKey, 'id' | 'name' | 'expiration'> { + api_key: string; + encoded: string; +} + +export type GetApiKeyResponse = APIKey; diff --git a/tsconfig.base.json b/tsconfig.base.json index c0a3aed9ff3ac..936c60930d262 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1500,6 +1500,10 @@ "@kbn/screenshotting-plugin/*": ["x-pack/plugins/screenshotting/*"], "@kbn/screenshotting-server": ["packages/kbn-screenshotting-server"], "@kbn/screenshotting-server/*": ["packages/kbn-screenshotting-server/*"], + "@kbn/search-api-keys-components": ["packages/kbn-search-api-keys-components"], + "@kbn/search-api-keys-components/*": ["packages/kbn-search-api-keys-components/*"], + "@kbn/search-api-keys-server": ["packages/kbn-search-api-keys-server"], + "@kbn/search-api-keys-server/*": ["packages/kbn-search-api-keys-server/*"], "@kbn/search-api-panels": ["packages/kbn-search-api-panels"], "@kbn/search-api-panels/*": ["packages/kbn-search-api-panels/*"], "@kbn/search-assistant": ["x-pack/plugins/search_assistant"], @@ -1526,6 +1530,8 @@ "@kbn/search-playground/*": ["x-pack/plugins/search_playground/*"], "@kbn/search-response-warnings": ["packages/kbn-search-response-warnings"], "@kbn/search-response-warnings/*": ["packages/kbn-search-response-warnings/*"], + "@kbn/search-shared-ui": ["x-pack/packages/search/shared_ui"], + "@kbn/search-shared-ui/*": ["x-pack/packages/search/shared_ui/*"], "@kbn/search-types": ["packages/kbn-search-types"], "@kbn/search-types/*": ["packages/kbn-search-types/*"], "@kbn/searchprofiler-plugin": ["x-pack/plugins/searchprofiler"], @@ -1996,7 +2002,9 @@ "@kbn/zod-helpers/*": ["packages/kbn-zod-helpers/*"], // END AUTOMATED PACKAGE LISTING // Allows for importing from `kibana` package for the exported types. - "@emotion/core": ["typings/@emotion"] + "@emotion/core": [ + "typings/@emotion" + ] }, // Support .tsx files and transform JSX into calls to React.createElement "jsx": "react", @@ -2070,4 +2078,4 @@ "@kbn/ambient-storybook-types" ] } -} +} \ No newline at end of file diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 97aa05deb4a42..72e35fb16de2f 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -104,6 +104,7 @@ "xpack.rollupJobs": ["packages/rollup", "plugins/rollup"], "xpack.runtimeFields": "plugins/runtime_fields", "xpack.screenshotting": "plugins/screenshotting", + "xpack.searchSharedUI": "packages/search/shared_ui", "xpack.searchHomepage": "plugins/search_homepage", "xpack.searchIndices": "plugins/search_indices", "xpack.searchNotebooks": "plugins/search_notebooks", diff --git a/x-pack/packages/search/shared_ui/README.md b/x-pack/packages/search/shared_ui/README.md new file mode 100644 index 0000000000000..d73336a303e6a --- /dev/null +++ b/x-pack/packages/search/shared_ui/README.md @@ -0,0 +1,3 @@ +# @kbn/search-shared-ui + +Contains form components used within search indices plugin. diff --git a/x-pack/packages/search/shared_ui/index.ts b/x-pack/packages/search/shared_ui/index.ts new file mode 100644 index 0000000000000..786fc67f4ea6d --- /dev/null +++ b/x-pack/packages/search/shared_ui/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 './src/form_info_field/form_info_field'; diff --git a/x-pack/packages/search/shared_ui/jest.config.js b/x-pack/packages/search/shared_ui/jest.config.js new file mode 100644 index 0000000000000..2b866207d6313 --- /dev/null +++ b/x-pack/packages/search/shared_ui/jest.config.js @@ -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. + */ + +module.exports = { + coverageDirectory: '<rootDir>/target/kibana-coverage/jest/x-pack/packages/search/shared_ui', + coverageReporters: ['text', 'html'], + collectCoverageFrom: ['<rootDir>/x-pack/packages/search/shared_ui/**/*.{ts,tsx}'], + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['<rootDir>/x-pack/packages/search/shared_ui'], +}; diff --git a/x-pack/packages/search/shared_ui/kibana.jsonc b/x-pack/packages/search/shared_ui/kibana.jsonc new file mode 100644 index 0000000000000..aedc015c1d6fa --- /dev/null +++ b/x-pack/packages/search/shared_ui/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-browser", + "id": "@kbn/search-shared-ui", + "owner": "@elastic/search-kibana" +} \ No newline at end of file diff --git a/x-pack/packages/search/shared_ui/package.json b/x-pack/packages/search/shared_ui/package.json new file mode 100644 index 0000000000000..d1456579cd050 --- /dev/null +++ b/x-pack/packages/search/shared_ui/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/search-shared-ui", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} diff --git a/x-pack/packages/search/shared_ui/src/form_info_field/form_info_field.tsx b/x-pack/packages/search/shared_ui/src/form_info_field/form_info_field.tsx new file mode 100644 index 0000000000000..89e14e72454c6 --- /dev/null +++ b/x-pack/packages/search/shared_ui/src/form_info_field/form_info_field.tsx @@ -0,0 +1,88 @@ +/* + * Copyright 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 { + EuiButtonIcon, + EuiCopy, + EuiFlexGroup, + EuiFlexItem, + EuiTitle, + useEuiTheme, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +interface FormInfoFieldProps { + actions?: React.ReactNode[]; + label?: string; + value: string; + copyValue?: string; + dataTestSubj?: string; +} + +export const FormInfoField: React.FC<FormInfoFieldProps> = ({ + actions = [], + label, + value, + copyValue, + dataTestSubj, +}) => { + const { euiTheme } = useEuiTheme(); + + return ( + <EuiFlexGroup gutterSize="s" alignItems="center"> + {label && ( + <EuiFlexItem grow={false}> + <EuiTitle size="xxxs"> + <h1>{label}</h1> + </EuiTitle> + </EuiFlexItem> + )} + <EuiFlexItem grow={0} css={{ whiteSpace: 'nowrap', overflow: 'hidden' }}> + <code + data-test-subj={dataTestSubj} + style={{ + color: euiTheme.colors.successText, + padding: `${euiTheme.size.s} ${euiTheme.size.m}`, + backgroundColor: euiTheme.colors.lightestShade, + textOverflow: 'ellipsis', + overflow: 'hidden', + borderRadius: euiTheme.border.radius.small, + fontWeight: euiTheme.font.weight.bold, + fontSize: euiTheme.size.m, + }} + > + {value} + </code> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiCopy + textToCopy={copyValue ?? value} + afterMessage={i18n.translate('xpack.searchSharedUI.formInfoField.copyMessage', { + defaultMessage: 'Copied', + })} + > + {(copy) => ( + <EuiButtonIcon + onClick={copy} + iconType="copy" + aria-label={i18n.translate('xpack.searchSharedUI.formInfoField.copyMessage', { + defaultMessage: 'Copy to clipboard', + })} + /> + )} + </EuiCopy> + </EuiFlexItem> + {actions.map((action, index) => ( + <EuiFlexItem key={index} grow={false}> + {action} + </EuiFlexItem> + ))} + </EuiFlexGroup> + ); +}; diff --git a/x-pack/packages/search/shared_ui/tsconfig.json b/x-pack/packages/search/shared_ui/tsconfig.json new file mode 100644 index 0000000000000..b4df7a5231281 --- /dev/null +++ b/x-pack/packages/search/shared_ui/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react", + ] + }, + "include": [ + "index.ts", + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + ], +} diff --git a/x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx b/x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx index 82c37b72dd41c..4a8fa74095957 100644 --- a/x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx +++ b/x-pack/packages/security/api_key_management/src/components/api_key_flyout.tsx @@ -96,6 +96,7 @@ interface CommonApiKeyFlyoutProps { http?: CoreStart['http']; currentUser?: AuthenticatedUser; isLoadingCurrentUser?: boolean; + defaultName?: string; defaultMetadata?: string; defaultRoleDescriptors?: string; defaultExpiration?: string; @@ -172,6 +173,7 @@ export const ApiKeyFlyout: FunctionComponent<ApiKeyFlyoutProps> = ({ defaultExpiration, defaultMetadata, defaultRoleDescriptors, + defaultName, apiKey, canManageCrossClusterApiKeys = false, readOnly = false, @@ -250,6 +252,12 @@ export const ApiKeyFlyout: FunctionComponent<ApiKeyFlyoutProps> = ({ } }, [defaultRoleDescriptors]); // eslint-disable-line react-hooks/exhaustive-deps + useEffect(() => { + if (defaultName && !apiKey) { + formik.setFieldValue('name', defaultName); + } + }, [defaultName]); // eslint-disable-line react-hooks/exhaustive-deps + useEffect(() => { if (defaultMetadata && !apiKey) { formik.setFieldValue('metadata', defaultMetadata); diff --git a/x-pack/plugins/search_indices/kibana.jsonc b/x-pack/plugins/search_indices/kibana.jsonc index 63fbf63609dff..13abaf63cbbe3 100644 --- a/x-pack/plugins/search_indices/kibana.jsonc +++ b/x-pack/plugins/search_indices/kibana.jsonc @@ -24,4 +24,4 @@ "esUiShared" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/search_indices/public/application.tsx b/x-pack/plugins/search_indices/public/application.tsx index c196020319589..e3f537998d5ea 100644 --- a/x-pack/plugins/search_indices/public/application.tsx +++ b/x-pack/plugins/search_indices/public/application.tsx @@ -13,6 +13,7 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { I18nProvider } from '@kbn/i18n-react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { SearchApiKeyProvider } from '@kbn/search-api-keys-components'; import { UsageTrackerContextProvider } from './contexts/usage_tracker_context'; import { SearchIndicesServicesContextDeps } from './types'; @@ -29,7 +30,9 @@ export const renderApp = async ( <UsageTrackerContextProvider usageCollection={services.usageCollection}> <I18nProvider> <QueryClientProvider client={queryClient}> - <App /> + <SearchApiKeyProvider> + <App /> + </SearchApiKeyProvider> </QueryClientProvider> </I18nProvider> </UsageTrackerContextProvider> diff --git a/x-pack/plugins/search_indices/public/components/connection_details/connection_details.tsx b/x-pack/plugins/search_indices/public/components/connection_details/connection_details.tsx index d7ce8f308b683..b79a0e1f16828 100644 --- a/x-pack/plugins/search_indices/public/components/connection_details/connection_details.tsx +++ b/x-pack/plugins/search_indices/public/components/connection_details/connection_details.tsx @@ -7,67 +7,22 @@ import React from 'react'; -import { - EuiButtonIcon, - EuiCopy, - EuiFlexGroup, - EuiFlexItem, - EuiTitle, - useEuiTheme, -} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; +import { FormInfoField } from '@kbn/search-shared-ui'; import { useElasticsearchUrl } from '../../hooks/use_elasticsearch_url'; export const ConnectionDetails: React.FC = () => { - const { euiTheme } = useEuiTheme(); const elasticsearchUrl = useElasticsearchUrl(); return ( - <EuiFlexGroup gutterSize="s" alignItems="center"> - <EuiFlexItem grow={false}> - <EuiTitle size="xxxs"> - <h1> - <FormattedMessage - id="xpack.searchIndices.connectionDetails.endpointTitle" - defaultMessage="Elasticsearch URL" - /> - </h1> - </EuiTitle> - </EuiFlexItem> - <EuiFlexItem css={{ whiteSpace: 'nowrap', overflow: 'hidden' }}> - <p - data-test-subj="connectionDetailsEndpoint" - css={{ - color: euiTheme.colors.successText, - padding: `${euiTheme.size.s} ${euiTheme.size.m}`, - backgroundColor: euiTheme.colors.lightestShade, - textOverflow: 'ellipsis', - overflow: 'hidden', - }} - > - {elasticsearchUrl} - </p> - </EuiFlexItem> - <EuiFlexItem grow={false}> - <EuiCopy - textToCopy={elasticsearchUrl} - afterMessage={i18n.translate('xpack.searchIndices.connectionDetails.copyMessage', { - defaultMessage: 'Copied', - })} - > - {(copy) => ( - <EuiButtonIcon - onClick={copy} - iconType="copy" - aria-label={i18n.translate('xpack.searchIndices.connectionDetails.copyMessage', { - defaultMessage: 'Copy Elasticsearch URL to clipboard', - })} - /> - )} - </EuiCopy> - </EuiFlexItem> - </EuiFlexGroup> + <FormInfoField + label={i18n.translate('xpack.searchIndices.connectionDetails.endpointTitle', { + defaultMessage: 'Elasticsearch URL', + })} + value={elasticsearchUrl} + copyValue={elasticsearchUrl} + dataTestSubj="connectionDetailsEndpoint" + /> ); }; diff --git a/x-pack/plugins/search_indices/public/components/index_documents/add_documents_code_example.tsx b/x-pack/plugins/search_indices/public/components/index_documents/add_documents_code_example.tsx index c629903b38444..aa8fd525c8a44 100644 --- a/x-pack/plugins/search_indices/public/components/index_documents/add_documents_code_example.tsx +++ b/x-pack/plugins/search_indices/public/components/index_documents/add_documents_code_example.tsx @@ -11,6 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { TryInConsoleButton } from '@kbn/try-in-console'; +import { useSearchApiKey } from '@kbn/search-api-keys-components'; import { useKibana } from '../../hooks/use_kibana'; import { IngestCodeSnippetParameters } from '../../types'; import { LanguageSelector } from '../shared/language_selector'; @@ -58,6 +59,7 @@ export const AddDocumentsCodeExample = ({ // TODO: implement smart document generation return generateSampleDocument(codeSampleMappings); }, [codeSampleMappings]); + const { apiKey, apiKeyIsVisible } = useSearchApiKey(); const codeParams: IngestCodeSnippetParameters = useMemo(() => { return { indexName, @@ -65,8 +67,17 @@ export const AddDocumentsCodeExample = ({ sampleDocument, indexHasMappings, mappingProperties: codeSampleMappings, + apiKey: apiKeyIsVisible && apiKey ? apiKey : undefined, }; - }, [indexName, elasticsearchUrl, sampleDocument, codeSampleMappings, indexHasMappings]); + }, [ + indexName, + elasticsearchUrl, + sampleDocument, + codeSampleMappings, + indexHasMappings, + apiKeyIsVisible, + apiKey, + ]); return ( <EuiPanel diff --git a/x-pack/plugins/search_indices/public/components/indices/details_page.tsx b/x-pack/plugins/search_indices/public/components/indices/details_page.tsx index d7a359f56a6f4..0a3de4f570551 100644 --- a/x-pack/plugins/search_indices/public/components/indices/details_page.tsx +++ b/x-pack/plugins/search_indices/public/components/indices/details_page.tsx @@ -26,6 +26,7 @@ import { useParams } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { SectionLoading } from '@kbn/es-ui-shared-plugin/public'; +import { ApiKeyForm } from '@kbn/search-api-keys-components'; import { useIndex } from '../../hooks/api/use_index'; import { useKibana } from '../../hooks/use_kibana'; import { ConnectionDetails } from '../connection_details/connection_details'; @@ -228,11 +229,13 @@ export const SearchIndexDetailsPage = () => { <EuiPageTemplate.Section grow={false}> <EuiFlexGroup direction="column"> <EuiFlexItem> - <EuiFlexGroup> - <EuiFlexItem> + <EuiFlexGroup css={{ overflow: 'auto' }}> + <EuiFlexItem css={{ flexShrink: 0 }}> <ConnectionDetails /> </EuiFlexItem> - <EuiFlexItem>{/* TODO: API KEY */}</EuiFlexItem> + <EuiFlexItem css={{ flexShrink: 0 }}> + <ApiKeyForm /> + </EuiFlexItem> </EuiFlexGroup> </EuiFlexItem> <EuiFlexItem> diff --git a/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx b/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx index e8efe1c3b7e66..401173fecc0da 100644 --- a/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx +++ b/x-pack/plugins/search_indices/public/components/start/create_index_code.tsx @@ -5,10 +5,11 @@ * 2.0. */ import React, { useCallback, useMemo } from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { TryInConsoleButton } from '@kbn/try-in-console'; +import { ApiKeyForm, useSearchApiKey } from '@kbn/search-api-keys-components'; import { AnalyticsEvents } from '../../analytics/constants'; import { Languages, AvailableLanguages, LanguageOptions } from '../../code_examples'; @@ -47,18 +48,48 @@ export const CreateIndexCodeView = ({ [usageTracker, changeCodingLanguage] ); const elasticsearchUrl = useElasticsearchUrl(); + const { apiKey, apiKeyIsVisible } = useSearchApiKey(); + const codeParams = useMemo(() => { return { indexName: createIndexForm.indexName || undefined, elasticsearchURL: elasticsearchUrl, + apiKey: apiKeyIsVisible && apiKey ? apiKey : undefined, }; - }, [createIndexForm.indexName, elasticsearchUrl]); + }, [createIndexForm.indexName, elasticsearchUrl, apiKeyIsVisible, apiKey]); const selectedCodeExample = useMemo(() => { return selectedCodeExamples[selectedLanguage]; }, [selectedLanguage, selectedCodeExamples]); return ( <EuiFlexGroup direction="column" data-test-subj="createIndexCodeView"> + <EuiFlexItem grow={true}> + <EuiPanel paddingSize="m" hasShadow={false} hasBorder={true} color="plain"> + <EuiFlexGroup direction="column" gutterSize="s"> + <EuiFlexItem> + <EuiText> + <h5> + {i18n.translate('xpack.searchIndices.startPage.codeView.apiKeyTitle', { + defaultMessage: 'Copy your API key', + })} + </h5> + </EuiText> + </EuiFlexItem> + <EuiFlexItem grow={false}> + <EuiText color="subdued"> + <p> + {i18n.translate('xpack.searchIndices.startPage.codeView.apiKeyDescription', { + defaultMessage: + 'Make sure you keep it somewhere safe. You won’t be able to retrieve it later.', + })} + </p> + </EuiText> + </EuiFlexItem> + </EuiFlexGroup> + <EuiSpacer size="m" /> + <ApiKeyForm hasTitle={false} /> + </EuiPanel> + </EuiFlexItem> <EuiFlexGroup justifyContent="spaceBetween" alignItems="center"> <EuiFlexItem css={{ maxWidth: '300px' }}> <LanguageSelector @@ -94,6 +125,7 @@ export const CreateIndexCodeView = ({ /> )} <CodeSample + id="createIndex" title={i18n.translate('xpack.searchIndices.startPage.codeView.createIndex.title', { defaultMessage: 'Connect and create an index', })} diff --git a/x-pack/plugins/search_indices/server/routes/index.ts b/x-pack/plugins/search_indices/server/routes/index.ts index 532ad1c3d5f3f..451647eb22774 100644 --- a/x-pack/plugins/search_indices/server/routes/index.ts +++ b/x-pack/plugins/search_indices/server/routes/index.ts @@ -8,10 +8,12 @@ import type { IRouter } from '@kbn/core/server'; import type { Logger } from '@kbn/logging'; +import { registerSearchApiKeysRoutes } from '@kbn/search-api-keys-server'; import { registerIndicesRoutes } from './indices'; import { registerStatusRoutes } from './status'; export function defineRoutes(router: IRouter, logger: Logger) { registerIndicesRoutes(router, logger); registerStatusRoutes(router, logger); + registerSearchApiKeysRoutes(router, logger); } diff --git a/x-pack/plugins/search_indices/tsconfig.json b/x-pack/plugins/search_indices/tsconfig.json index 56b67256e5b47..a564b87c7f6e6 100644 --- a/x-pack/plugins/search_indices/tsconfig.json +++ b/x-pack/plugins/search_indices/tsconfig.json @@ -34,6 +34,9 @@ "@kbn/cloud-plugin", "@kbn/search-index-documents", "@kbn/es-types", + "@kbn/search-api-keys-server", + "@kbn/search-api-keys-components", + "@kbn/search-shared-ui" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/search_playground/server/routes.ts b/x-pack/plugins/search_playground/server/routes.ts index cf6a139b1344b..c26a342aace49 100644 --- a/x-pack/plugins/search_playground/server/routes.ts +++ b/x-pack/plugins/search_playground/server/routes.ts @@ -172,44 +172,6 @@ export function defineRoutes({ }) ); - router.post( - { - path: APIRoutes.POST_API_KEY, - validate: { - body: schema.object({ - name: schema.string(), - expiresInDays: schema.number(), - indices: schema.arrayOf(schema.string()), - }), - }, - }, - errorHandler(logger)(async (context, request, response) => { - const { name, expiresInDays, indices } = request.body; - const { client } = (await context.core).elasticsearch; - - const apiKey = await client.asCurrentUser.security.createApiKey({ - name, - expiration: `${expiresInDays}d`, - role_descriptors: { - [`playground-${name}-role`]: { - cluster: [], - indices: [ - { - names: indices, - privileges: ['read'], - }, - ], - }, - }, - }); - - return response.ok({ - body: { apiKey }, - headers: { 'content-type': 'application/json' }, - }); - }) - ); - // SECURITY: We don't apply any authorization tags to this route because all actions performed // on behalf of the user making the request and governed by the user's own cluster privileges. router.get( diff --git a/x-pack/test_serverless/functional/page_objects/index.ts b/x-pack/test_serverless/functional/page_objects/index.ts index 6874f1e7aa621..0c6b776433b0c 100644 --- a/x-pack/test_serverless/functional/page_objects/index.ts +++ b/x-pack/test_serverless/functional/page_objects/index.ts @@ -23,6 +23,7 @@ import { SvlIngestPipelines } from './svl_ingest_pipelines'; import { SvlSearchHomePageProvider } from './svl_search_homepage'; import { SvlSearchIndexDetailPageProvider } from './svl_search_index_detail_page'; import { SvlSearchElasticsearchStartPageProvider } from './svl_search_elasticsearch_start_page'; +import { SvlApiKeysProvider } from './svl_api_keys'; export const pageObjects = { ...xpackFunctionalPageObjects, @@ -43,4 +44,5 @@ export const pageObjects = { svlSearchHomePage: SvlSearchHomePageProvider, svlSearchIndexDetailPage: SvlSearchIndexDetailPageProvider, svlSearchElasticsearchStartPage: SvlSearchElasticsearchStartPageProvider, + svlApiKeys: SvlApiKeysProvider, }; diff --git a/x-pack/test_serverless/functional/page_objects/svl_api_keys.ts b/x-pack/test_serverless/functional/page_objects/svl_api_keys.ts new file mode 100644 index 0000000000000..2dc65cc97cd3e --- /dev/null +++ b/x-pack/test_serverless/functional/page_objects/svl_api_keys.ts @@ -0,0 +1,108 @@ +/* + * Copyright 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'; + +const APIKEY_MASK = '•'.repeat(60); + +export function SvlApiKeysProvider({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const browser = getService('browser'); + const pageObjects = getPageObjects(['common', 'apiKeys']); + const retry = getService('retry'); + const es = getService('es'); + + const getAPIKeyFromSessionStorage = async () => { + const sessionStorageKey = await browser.getSessionStorageItem('searchApiKey'); + return sessionStorageKey && JSON.parse(sessionStorageKey); + }; + + return { + async clearAPIKeySessionStorage() { + await browser.clearSessionStorage(); + }, + + async expectAPIKeyAvailable() { + await testSubjects.existOrFail('apiKeyFormAPIKey'); + await retry.try(async () => { + expect(await testSubjects.getVisibleText('apiKeyFormAPIKey')).to.be(APIKEY_MASK); + }); + await testSubjects.click('showAPIKeyButton'); + let apiKey; + await retry.try(async () => { + apiKey = await testSubjects.getVisibleText('apiKeyFormAPIKey'); + expect(apiKey).to.be.a('string'); + expect(apiKey.length).to.be(60); + expect(apiKey).to.not.be(APIKEY_MASK); + }); + const sessionStorageKey = await getAPIKeyFromSessionStorage(); + expect(sessionStorageKey.encoded).to.eql(apiKey); + }, + + async getAPIKeyFromSessionStorage() { + return getAPIKeyFromSessionStorage(); + }, + + async getAPIKeyFromUI() { + let apiKey = ''; + await retry.try(async () => { + apiKey = await testSubjects.getVisibleText('apiKeyFormAPIKey'); + expect(apiKey).to.not.be(APIKEY_MASK); + }); + expect(apiKey).to.be.a('string'); + return apiKey; + }, + + async invalidateAPIKey(apiKeyId: string) { + await es.security.invalidateApiKey({ ids: [apiKeyId] }); + }, + + async createAPIKey() { + await es.security.createApiKey({ + name: 'test-api-key', + role_descriptors: {}, + }); + }, + + async expectAPIKeyCreate() { + await testSubjects.existOrFail('apiKeyFormAPIKey'); + await retry.try(async () => { + expect(await testSubjects.getVisibleText('apiKeyFormAPIKey')).to.be(APIKEY_MASK); + }); + await testSubjects.click('showAPIKeyButton'); + await retry.try(async () => { + const apiKey = await testSubjects.getVisibleText('apiKeyFormAPIKey'); + expect(apiKey).to.be.a('string'); + expect(apiKey.length).to.be(60); + expect(apiKey).to.not.be(APIKEY_MASK); + }); + }, + + async deleteAPIKeys() { + const { api_keys: apiKeys } = await es.security.getApiKey(); + await es.security.invalidateApiKey({ ids: apiKeys.map((key) => key.id) }); + }, + + async expectCreateApiKeyAction() { + await testSubjects.existOrFail('createAPIKeyButton'); + }, + + async createApiKeyFromFlyout() { + const apiKeyName = 'Happy API Key'; + await testSubjects.click('createAPIKeyButton'); + expect(await pageObjects.apiKeys.getFlyoutTitleText()).to.be('Create API key'); + + await pageObjects.apiKeys.setApiKeyName(apiKeyName); + await pageObjects.apiKeys.clickSubmitButtonOnApiKeyFlyout(); + }, + + async expectNoPermissionsMessage() { + await testSubjects.existOrFail('apiKeyFormNoUserPrivileges'); + }, + }; +} diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts b/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts index 798d396258e75..4c6822c420fdb 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts @@ -90,5 +90,11 @@ export function SvlSearchElasticsearchStartPageProvider({ getService }: FtrProvi ); expect(await testSubjects.getAttribute('startO11yTrialBtn', 'target')).equal('_blank'); }, + async expectAPIKeyVisibleInCodeBlock(apiKey: string) { + await testSubjects.existOrFail('createIndex-code-block'); + await retry.try(async () => { + expect(await testSubjects.getVisibleText('createIndex-code-block')).to.contain(apiKey); + }); + }, }; } diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts b/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts index 7101571036c4e..dabc8dffac09e 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts @@ -157,5 +157,12 @@ export function SvlSearchIndexDetailPageProvider({ getService }: FtrProviderCont await testSubjects.existOrFail('tryInConsoleButton'); await testSubjects.click('tryInConsoleButton'); }, + + async expectAPIKeyToBeVisibleInCodeBlock(apiKey: string) { + await testSubjects.existOrFail('ingestDataCodeExample-code-block'); + expect(await testSubjects.getVisibleText('ingestDataCodeExample-code-block')).to.contain( + apiKey + ); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts index f6362a409658e..9e83057544003 100644 --- a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts +++ b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts @@ -5,6 +5,7 @@ * 2.0. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; import { testHasEmbeddedConsole } from './embedded_console'; @@ -14,10 +15,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'svlCommonPage', 'embeddedConsole', 'svlSearchElasticsearchStartPage', + 'svlApiKeys', ]); const svlSearchNavigation = getService('svlSearchNavigation'); const esDeleteAllIndices = getService('esDeleteAllIndices'); const es = getService('es'); + const browser = getService('browser'); const deleteAllTestIndices = async () => { await esDeleteAllIndices(['search-*', 'test-*']); @@ -27,6 +30,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('developer', function () { before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); + await pageObjects.svlApiKeys.deleteAPIKeys(); }); after(async () => { await deleteAllTestIndices(); @@ -82,6 +86,58 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexUIView(); }); + it('should show the api key in code view', async () => { + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.clickCodeViewButton(); + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + const apiKeyUI = await pageObjects.svlApiKeys.getAPIKeyFromUI(); + const apiKeySession = await pageObjects.svlApiKeys.getAPIKeyFromSessionStorage(); + + expect(apiKeyUI).to.eql(apiKeySession.encoded); + + // check that when browser is refreshed, the api key is still available + await browser.refresh(); + await pageObjects.svlSearchElasticsearchStartPage.clickCodeViewButton(); + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + const refreshBrowserApiKeyUI = await pageObjects.svlApiKeys.getAPIKeyFromUI(); + expect(refreshBrowserApiKeyUI).to.eql(apiKeyUI); + + // check that when api key is invalidated, a new one is generated + await pageObjects.svlApiKeys.invalidateAPIKey(apiKeySession.id); + await browser.refresh(); + await pageObjects.svlSearchElasticsearchStartPage.clickCodeViewButton(); + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + const newApiKeyUI = await pageObjects.svlApiKeys.getAPIKeyFromUI(); + expect(newApiKeyUI).to.not.eql(apiKeyUI); + await pageObjects.svlSearchElasticsearchStartPage.expectAPIKeyVisibleInCodeBlock( + newApiKeyUI + ); + }); + + it('should explicitly ask to create api key when project already has an apikey', async () => { + await pageObjects.svlApiKeys.clearAPIKeySessionStorage(); + await pageObjects.svlApiKeys.createAPIKey(); + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.clickCodeViewButton(); + await pageObjects.svlApiKeys.createApiKeyFromFlyout(); + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + }); + + it('Same API Key should be present on start page and index detail view', async () => { + await pageObjects.svlSearchElasticsearchStartPage.clickCodeViewButton(); + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + const apiKeyUI = await pageObjects.svlApiKeys.getAPIKeyFromUI(); + + await pageObjects.svlSearchElasticsearchStartPage.clickUIViewButton(); + await pageObjects.svlSearchElasticsearchStartPage.clickCreateIndexButton(); + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnIndexDetailsPage(); + + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + const indexDetailsApiKey = await pageObjects.svlApiKeys.getAPIKeyFromUI(); + + expect(apiKeyUI).to.eql(indexDetailsApiKey); + }); + it('should have file upload link', async () => { await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); await pageObjects.svlSearchElasticsearchStartPage.clickFileUploadLink(); @@ -93,32 +149,41 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.svlSearchElasticsearchStartPage.expectAnalyzeLogsLink(); await pageObjects.svlSearchElasticsearchStartPage.expectO11yTrialLink(); }); - }); - describe('viewer', function () { - before(async () => { - await pageObjects.svlCommonPage.loginAsViewer(); - await deleteAllTestIndices(); - }); - beforeEach(async () => { - await svlSearchNavigation.navigateToElasticsearchStartPage(); - }); - after(async () => { - await deleteAllTestIndices(); - }); - it('should default to code view when lacking create index permissions', async () => { - await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); - await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexCodeView(); - await pageObjects.svlSearchElasticsearchStartPage.clickUIViewButton(); - await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexUIView(); - await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexButtonToBeDisabled(); - }); + describe('viewer', function () { + before(async () => { + await pageObjects.svlCommonPage.loginAsViewer(); + await deleteAllTestIndices(); + }); + beforeEach(async () => { + await svlSearchNavigation.navigateToElasticsearchStartPage(); + }); + after(async () => { + await deleteAllTestIndices(); + }); - it('should redirect to index details when index is created via API', async () => { - await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); - await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexCodeView(); - await es.indices.create({ index: 'test-my-api-index' }); - await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnIndexDetailsPage(); + it('should default to code view when lacking create index permissions', async () => { + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexCodeView(); + await pageObjects.svlSearchElasticsearchStartPage.clickUIViewButton(); + await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexUIView(); + await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexButtonToBeDisabled(); + }); + + it('should not create an API key if the user only has viewer permissions', async () => { + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.clickCodeViewButton(); + await pageObjects.svlApiKeys.expectNoPermissionsMessage(); + const apiKey = await pageObjects.svlApiKeys.getAPIKeyFromSessionStorage(); + expect(apiKey).to.be(null); + }); + + it('should redirect to index details when index is created via API', async () => { + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnStartPage(); + await pageObjects.svlSearchElasticsearchStartPage.expectCreateIndexCodeView(); + await es.indices.create({ index: 'test-my-api-index' }); + await pageObjects.svlSearchElasticsearchStartPage.expectToBeOnIndexDetailsPage(); + }); }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts index 7192eca9d13c3..b6247f90b37c5 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts @@ -12,6 +12,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'svlCommonPage', 'embeddedConsole', 'svlSearchIndexDetailPage', + 'svlApiKeys', ]); const svlSearchNavigation = getService('svlSearchNavigation'); const es = getService('es'); @@ -22,6 +23,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('Search index detail page', () => { before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); + await pageObjects.svlApiKeys.deleteAPIKeys(); }); after(async () => { await esDeleteAllIndices(indexName); @@ -82,6 +84,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.embeddedConsole.clickEmbeddedConsoleControlBar(); }); + it('should show api key', async () => { + await pageObjects.svlApiKeys.expectAPIKeyAvailable(); + const apiKey = await pageObjects.svlApiKeys.getAPIKeyFromUI(); + await pageObjects.svlSearchIndexDetailPage.expectAPIKeyToBeVisibleInCodeBlock(apiKey); + }); + it('back to indices button should redirect to list page', async () => { await pageObjects.svlSearchIndexDetailPage.expectBackToIndicesButtonExists(); await pageObjects.svlSearchIndexDetailPage.clickBackToIndicesButton(); diff --git a/yarn.lock b/yarn.lock index 8146185716b37..236319c030c55 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6283,6 +6283,14 @@ version "0.0.0" uid "" +"@kbn/search-api-keys-components@link:packages/kbn-search-api-keys-components": + version "0.0.0" + uid "" + +"@kbn/search-api-keys-server@link:packages/kbn-search-api-keys-server": + version "0.0.0" + uid "" + "@kbn/search-api-panels@link:packages/kbn-search-api-panels": version "0.0.0" uid "" @@ -6335,6 +6343,10 @@ version "0.0.0" uid "" +"@kbn/search-shared-ui@link:x-pack/packages/search/shared_ui": + version "0.0.0" + uid "" + "@kbn/search-types@link:packages/kbn-search-types": version "0.0.0" uid "" From 30ef0ecb3c9d91b8f111f96bf0e024d03c49304b Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:52:56 +0200 Subject: [PATCH 095/107] Update dependency @elastic/charts to v67 (main) (#193694) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@elastic/charts](https://togithub.com/elastic/elastic-charts) | dependencies | major | [`66.1.1` -> `67.0.0`](https://renovatebot.com/diffs/npm/@elastic%2fcharts/66.1.1/67.0.0) | --- ### Breaking changes Elastic-charts theme API for line and area charts has changed: - the `point.visible` type for line and area charts is now a union between `'always' | 'never' | 'auto'`. Always and Never will replace the previous boolean configuration, `auto` instead will provide a logic to show the points only of the distance between consecutive points is bigger than the `pointVisibilityMinDistance`. - the isolatedPoint style for line and area doesn't contain the `radius` parameter anymore. The radius is derived from the `line.strokeWidth` parameter. Co-authored-by: Marco Vettorello <marco.vettorello@elastic.co> --- package.json | 2 +- .../gauge_component.test.tsx.snap | 46 +- .../partition_vis_component.test.tsx.snap | 288 +++++------ .../__snapshots__/xy_chart.test.tsx.snap | 460 +++++++++--------- .../public/components/xy_chart.test.tsx | 4 +- .../public/helpers/data_layers.tsx | 14 +- .../charts/public/services/theme/mock.ts | 4 +- .../charts/public/services/theme/theme.ts | 4 +- .../public/components/series/area.tsx | 2 +- .../page_objects/visual_builder_page.ts | 2 +- .../page_objects/visualize_chart_page.ts | 8 +- .../hooks/use_data_viz_chart_theme.ts | 2 +- .../datafeed_chart_flyout.tsx | 2 +- .../components/charts/anomaly_chart/line.tsx | 6 +- .../charts/anomaly_chart/model_bounds.tsx | 13 +- .../charts/anomaly_chart/scatter.tsx | 13 +- .../components/charts/common/settings.ts | 13 +- .../duration_distribution_chart/index.tsx | 2 +- .../helper/get_chart_anomaly_timeseries.tsx | 5 +- .../get_comparison_chart_theme.ts | 2 +- .../public/hooks/use_chart_theme.ts | 4 +- .../public/hooks/use_chart_theme.tsx | 4 +- .../slo_details/components/wide_chart.tsx | 2 +- .../components/common/data_preview_chart.tsx | 11 +- .../pages/slos/components/slo_sparkline.tsx | 2 +- .../__snapshots__/donut_chart.test.tsx.snap | 46 +- .../common/components/charts/areachart.tsx | 2 +- .../rule_types/threshold/visualization.tsx | 2 +- .../alert_summary_widget_full_size.tsx | 2 +- .../components/execution_duration_chart.tsx | 2 +- .../watch_visualization.tsx | 2 +- yarn.lock | 8 +- 32 files changed, 496 insertions(+), 483 deletions(-) diff --git a/package.json b/package.json index b765f5867f9c4..6d15c14e25332 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "@elastic/apm-rum": "^5.16.1", "@elastic/apm-rum-core": "^5.21.1", "@elastic/apm-rum-react": "^2.0.3", - "@elastic/charts": "66.1.1", + "@elastic/charts": "67.0.0", "@elastic/datemath": "5.0.3", "@elastic/ebt": "^1.1.1", "@elastic/ecs": "^8.11.1", diff --git a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap index 00f2044dd9366..ae2eb489200ad 100644 --- a/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_gauge/public/components/__snapshots__/gauge_component.test.tsx.snap @@ -39,12 +39,11 @@ exports[`GaugeComponent renders the chart 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -52,13 +51,14 @@ exports[`GaugeComponent renders the chart 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -185,11 +185,11 @@ exports[`GaugeComponent renders the chart 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -392,11 +392,11 @@ exports[`GaugeComponent renders the chart 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -429,12 +429,11 @@ exports[`GaugeComponent renders the chart 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -442,13 +441,14 @@ exports[`GaugeComponent renders the chart 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap index e822610217971..35c1fc0e63213 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/__snapshots__/partition_vis_component.test.tsx.snap @@ -269,12 +269,11 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -282,13 +281,14 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -415,11 +415,11 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -622,11 +622,11 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -659,12 +659,11 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -672,13 +671,14 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -820,7 +820,7 @@ exports[`PartitionVisComponent should render correct structure for donut 1`] = ` "maxFontSize": 16, "minFontSize": 10, "outerSizeRatio": undefined, - "sectorLineStroke": "#FFF", + "sectorLineStroke": "__use__series__color__", "sectorLineWidth": 1.5, }, }, @@ -1203,12 +1203,11 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -1216,13 +1215,14 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -1349,11 +1349,11 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -1556,11 +1556,11 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -1593,12 +1593,11 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -1606,13 +1605,14 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -1752,7 +1752,7 @@ exports[`PartitionVisComponent should render correct structure for mosaic 1`] = "maxFontSize": 16, "minFontSize": 10, "outerSizeRatio": 1, - "sectorLineStroke": "#FFF", + "sectorLineStroke": "__use__series__color__", "sectorLineWidth": 1.5, }, }, @@ -2197,12 +2197,11 @@ exports[`PartitionVisComponent should render correct structure for multi-metric }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -2210,13 +2209,14 @@ exports[`PartitionVisComponent should render correct structure for multi-metric "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -2343,11 +2343,11 @@ exports[`PartitionVisComponent should render correct structure for multi-metric }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -2550,11 +2550,11 @@ exports[`PartitionVisComponent should render correct structure for multi-metric }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -2587,12 +2587,11 @@ exports[`PartitionVisComponent should render correct structure for multi-metric }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -2600,13 +2599,14 @@ exports[`PartitionVisComponent should render correct structure for multi-metric "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -2748,7 +2748,7 @@ exports[`PartitionVisComponent should render correct structure for multi-metric "maxFontSize": 16, "minFontSize": 10, "outerSizeRatio": undefined, - "sectorLineStroke": "#FFF", + "sectorLineStroke": "__use__series__color__", "sectorLineWidth": 1.5, }, }, @@ -3193,12 +3193,11 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -3206,13 +3205,14 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -3339,11 +3339,11 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -3546,11 +3546,11 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -3583,12 +3583,11 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -3596,13 +3595,14 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -3744,7 +3744,7 @@ exports[`PartitionVisComponent should render correct structure for pie 1`] = ` "maxFontSize": 16, "minFontSize": 10, "outerSizeRatio": undefined, - "sectorLineStroke": "#FFF", + "sectorLineStroke": "__use__series__color__", "sectorLineWidth": 1.5, }, }, @@ -4127,12 +4127,11 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -4140,13 +4139,14 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -4273,11 +4273,11 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -4480,11 +4480,11 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -4517,12 +4517,11 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -4530,13 +4529,14 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -4676,7 +4676,7 @@ exports[`PartitionVisComponent should render correct structure for treemap 1`] = "maxFontSize": 16, "minFontSize": 10, "outerSizeRatio": 1, - "sectorLineStroke": "#FFF", + "sectorLineStroke": "__use__series__color__", "sectorLineWidth": 1.5, }, }, @@ -5016,12 +5016,11 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -5029,13 +5028,14 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -5162,11 +5162,11 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -5369,11 +5369,11 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -5406,12 +5406,11 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -5419,13 +5418,14 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -5572,7 +5572,7 @@ exports[`PartitionVisComponent should render correct structure for waffle 1`] = "maxFontSize": 16, "minFontSize": 10, "outerSizeRatio": undefined, - "sectorLineStroke": "#FFF", + "sectorLineStroke": "__use__series__color__", "sectorLineWidth": 1.5, }, }, diff --git a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap index 789878ac673fa..5cfd34c6c8b5a 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap +++ b/src/plugins/chart_expressions/expression_xy/public/components/__snapshots__/xy_chart.test.tsx.snap @@ -611,12 +611,11 @@ exports[`XYChart component it renders area 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -624,13 +623,14 @@ exports[`XYChart component it renders area 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -757,11 +757,11 @@ exports[`XYChart component it renders area 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -964,11 +964,11 @@ exports[`XYChart component it renders area 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -1001,12 +1001,11 @@ exports[`XYChart component it renders area 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -1014,13 +1013,14 @@ exports[`XYChart component it renders area 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -2166,12 +2166,11 @@ exports[`XYChart component it renders bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -2179,13 +2178,14 @@ exports[`XYChart component it renders bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -2312,11 +2312,11 @@ exports[`XYChart component it renders bar 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -2519,11 +2519,11 @@ exports[`XYChart component it renders bar 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -2556,12 +2556,11 @@ exports[`XYChart component it renders bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -2569,13 +2568,14 @@ exports[`XYChart component it renders bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -3721,12 +3721,11 @@ exports[`XYChart component it renders horizontal bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -3734,13 +3733,14 @@ exports[`XYChart component it renders horizontal bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -3867,11 +3867,11 @@ exports[`XYChart component it renders horizontal bar 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -4074,11 +4074,11 @@ exports[`XYChart component it renders horizontal bar 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -4111,12 +4111,11 @@ exports[`XYChart component it renders horizontal bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -4124,13 +4123,14 @@ exports[`XYChart component it renders horizontal bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -5276,12 +5276,11 @@ exports[`XYChart component it renders line 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -5289,13 +5288,14 @@ exports[`XYChart component it renders line 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -5422,11 +5422,11 @@ exports[`XYChart component it renders line 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -5629,11 +5629,11 @@ exports[`XYChart component it renders line 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -5666,12 +5666,11 @@ exports[`XYChart component it renders line 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -5679,13 +5678,14 @@ exports[`XYChart component it renders line 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -6831,12 +6831,11 @@ exports[`XYChart component it renders stacked area 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -6844,13 +6843,14 @@ exports[`XYChart component it renders stacked area 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -6977,11 +6977,11 @@ exports[`XYChart component it renders stacked area 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -7184,11 +7184,11 @@ exports[`XYChart component it renders stacked area 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -7221,12 +7221,11 @@ exports[`XYChart component it renders stacked area 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -7234,13 +7233,14 @@ exports[`XYChart component it renders stacked area 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -8386,12 +8386,11 @@ exports[`XYChart component it renders stacked bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -8399,13 +8398,14 @@ exports[`XYChart component it renders stacked bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -8532,11 +8532,11 @@ exports[`XYChart component it renders stacked bar 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -8739,11 +8739,11 @@ exports[`XYChart component it renders stacked bar 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -8776,12 +8776,11 @@ exports[`XYChart component it renders stacked bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -8789,13 +8788,14 @@ exports[`XYChart component it renders stacked bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -9941,12 +9941,11 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -9954,13 +9953,14 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -10087,11 +10087,11 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -10294,11 +10294,11 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -10331,12 +10331,11 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -10344,13 +10343,14 @@ exports[`XYChart component it renders stacked horizontal bar 1`] = ` "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -11526,12 +11526,11 @@ exports[`XYChart component split chart should render split chart if both, splitR }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -11539,13 +11538,14 @@ exports[`XYChart component split chart should render split chart if both, splitR "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -11672,11 +11672,11 @@ exports[`XYChart component split chart should render split chart if both, splitR }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -11879,11 +11879,11 @@ exports[`XYChart component split chart should render split chart if both, splitR }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -11916,12 +11916,11 @@ exports[`XYChart component split chart should render split chart if both, splitR }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -11929,13 +11928,14 @@ exports[`XYChart component split chart should render split chart if both, splitR "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -13319,12 +13319,11 @@ exports[`XYChart component split chart should render split chart if splitColumnA }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -13332,13 +13331,14 @@ exports[`XYChart component split chart should render split chart if splitColumnA "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -13465,11 +13465,11 @@ exports[`XYChart component split chart should render split chart if splitColumnA }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -13672,11 +13672,11 @@ exports[`XYChart component split chart should render split chart if splitColumnA }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -13709,12 +13709,11 @@ exports[`XYChart component split chart should render split chart if splitColumnA }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -13722,13 +13721,14 @@ exports[`XYChart component split chart should render split chart if splitColumnA "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", @@ -15105,12 +15105,11 @@ exports[`XYChart component split chart should render split chart if splitRowAcce }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -15118,13 +15117,14 @@ exports[`XYChart component split chart should render split chart if splitRowAcce "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -15251,11 +15251,11 @@ exports[`XYChart component split chart should render split chart if splitRowAcce }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -15458,11 +15458,11 @@ exports[`XYChart component split chart should render split chart if splitRowAcce }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -15495,12 +15495,11 @@ exports[`XYChart component split chart should render split chart if splitRowAcce }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -15508,13 +15507,14 @@ exports[`XYChart component split chart should render split chart if splitRowAcce "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", 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 d5317379ee0e3..ae9c5a844dcc3 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 @@ -798,7 +798,7 @@ describe('XYChart component', () => { expect(lineArea.prop('markSizeAccessor')).toEqual(markSizeAccessorArg.markSizeAccessor); const expectedSeriesStyle = expect.objectContaining({ point: expect.objectContaining({ - visible: true, + visible: 'always', fill: ColorVariant.Series, }), }); @@ -842,7 +842,7 @@ describe('XYChart component', () => { const lineArea = dataLayers.find(LineSeries).at(0); const expectedSeriesStyle = expect.objectContaining({ point: expect.objectContaining({ - visible: showPoints, + visible: showPoints ? 'always' : 'never', }), }); 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 f9c07ab7b83a9..e45edccba2779 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 @@ -303,11 +303,15 @@ const getPointConfig: GetPointConfigFn = ({ emphasizeFitting, showPoints, pointsRadius, -}) => ({ - visible: showPoints !== undefined ? showPoints : !xAccessor || markSizeAccessor !== undefined, - radius: pointsRadius !== undefined ? pointsRadius : xAccessor && !emphasizeFitting ? 5 : 0, - fill: markSizeAccessor ? ColorVariant.Series : undefined, -}); +}) => { + return { + visible: (showPoints !== undefined ? showPoints : !xAccessor || markSizeAccessor !== undefined) + ? 'always' + : 'never', + radius: pointsRadius !== undefined ? pointsRadius : xAccessor && !emphasizeFitting ? 5 : 0, + fill: markSizeAccessor ? ColorVariant.Series : undefined, + }; +}; const getFitLineConfig = () => ({ visible: true, diff --git a/src/plugins/charts/public/services/theme/mock.ts b/src/plugins/charts/public/services/theme/mock.ts index c8aae8085d2d5..063c6fc196245 100644 --- a/src/plugins/charts/public/services/theme/mock.ts +++ b/src/plugins/charts/public/services/theme/mock.ts @@ -13,14 +13,14 @@ import { ThemeService } from './theme'; export const MOCK_SPARKLINE_THEME: PartialTheme = { lineSeriesStyle: { point: { - visible: false, + visible: 'never', strokeWidth: 1, radius: 1, }, }, areaSeriesStyle: { point: { - visible: false, + visible: 'never', strokeWidth: 1, radius: 1, }, diff --git a/src/plugins/charts/public/services/theme/theme.ts b/src/plugins/charts/public/services/theme/theme.ts index e3624042b75cd..d7ec8c03e506c 100644 --- a/src/plugins/charts/public/services/theme/theme.ts +++ b/src/plugins/charts/public/services/theme/theme.ts @@ -62,14 +62,14 @@ export class ThemeService { return { lineSeriesStyle: { point: { - visible: false, + visible: 'never', strokeWidth: 1, radius: 1, }, }, areaSeriesStyle: { point: { - visible: false, + visible: 'never', strokeWidth: 1, radius: 1, }, diff --git a/src/plugins/vis_types/timelion/public/components/series/area.tsx b/src/plugins/vis_types/timelion/public/components/series/area.tsx index aabc213713a3b..4bb2a08e91153 100644 --- a/src/plugins/vis_types/timelion/public/components/series/area.tsx +++ b/src/plugins/vis_types/timelion/public/components/series/area.tsx @@ -61,7 +61,7 @@ const getAreaSeriesStyle = ({ radius: points?.radius ?? 3, stroke: color, strokeWidth: points?.lineWidth ?? 2, - visible: points?.show ?? false, + visible: points?.show ? 'always' : 'never', shape: points?.symbol === 'cross' ? PointShape.X : points?.symbol, }, }); diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 48d920dee83ca..702c31a9b801b 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -1007,7 +1007,7 @@ export class VisualBuilderPageObject extends FtrService { public async getAreaChartData(chartData?: DebugState, nth: number = 0) { const areas = (await this.getChartItems(chartData)) as DebugState['areas']; - return areas?.[nth]?.lines.y1.points.map(({ x, y }) => [x, y]); + return areas?.[nth]?.lines.y1.points.sort((a, b) => a.x - b.x).map(({ x, y }) => [x, y]); } public async getAnnotationsData(chartData?: DebugState) { diff --git a/test/functional/page_objects/visualize_chart_page.ts b/test/functional/page_objects/visualize_chart_page.ts index 7640a30d07775..9fe9afb32d869 100644 --- a/test/functional/page_objects/visualize_chart_page.ts +++ b/test/functional/page_objects/visualize_chart_page.ts @@ -117,7 +117,9 @@ export class VisualizeChartPageObject extends FtrService { ) { const areas = (await this.getEsChartDebugState(selector))?.areas ?? []; const points = areas.find(({ name }) => name === dataLabel)?.lines.y1.points ?? []; - return shouldContainXAxisData ? points.map(({ x, y }) => [x, y]) : points.map(({ y }) => y); + return shouldContainXAxisData + ? points.sort((a, b) => a.x - b.x).map(({ x, y }) => [x, y]) + : points.sort((a, b) => a.x - b.x).map(({ y }) => y); } /** @@ -138,7 +140,7 @@ export class VisualizeChartPageObject extends FtrService { public async getLineChartData(selector: string, dataLabel = 'Count') { const lines = (await this.getEsChartDebugState(selector))?.lines ?? []; const points = lines.find(({ name }) => name === dataLabel)?.points ?? []; - return points.map(({ y }) => y); + return points.sort((a, b) => a.x - b.x).map(({ y }) => y); } /** @@ -148,7 +150,7 @@ export class VisualizeChartPageObject extends FtrService { public async getBarChartData(selector: string, dataLabel = 'Count') { const bars = (await this.getEsChartDebugState(selector))?.bars ?? []; const values = bars.find(({ name }) => name === dataLabel)?.bars ?? []; - return values.map(({ y }) => y); + return values.sort((a, b) => a.x - b.x).map(({ y }) => y); } private async toggleLegend(force = false) { diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/hooks/use_data_viz_chart_theme.ts b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/hooks/use_data_viz_chart_theme.ts index 9e21884b6cb4d..269c9b55fc3de 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/hooks/use_data_viz_chart_theme.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/hooks/use_data_viz_chart_theme.ts @@ -43,7 +43,7 @@ export const useDataVizChartTheme = (): PartialTheme => { visible: true, }, point: { - visible: false, + visible: 'never', radius: 0, opacity: 0, }, diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx index 055b297af893f..a2f271f243b1c 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx @@ -428,7 +428,7 @@ export const DatafeedChartFlyout: FC<DatafeedChartFlyoutProps> = ({ theme={{ lineSeriesStyle: { point: { - visible: false, + visible: 'never', }, }, }} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/line.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/line.tsx index 17898e4081895..461bd6feec609 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/line.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/line.tsx @@ -8,7 +8,7 @@ import type { FC } from 'react'; import React from 'react'; import { LineSeries, ScaleType, CurveType } from '@elastic/charts'; -import { seriesStyle, useChartColors } from '../common/settings'; +import { lineSeriesStyle, useChartColors } from '../common/settings'; interface Props { chartData: any[]; @@ -16,10 +16,6 @@ interface Props { const SPEC_ID = 'line'; -const lineSeriesStyle = { - ...seriesStyle, -}; - export const Line: FC<Props> = ({ chartData }) => { const { LINE_COLOR } = useChartColors(); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/model_bounds.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/model_bounds.tsx index aefefe4decada..51eb6f222215f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/model_bounds.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/model_bounds.tsx @@ -7,9 +7,10 @@ import type { FC } from 'react'; import React from 'react'; +import type { AreaSeriesStyle, RecursivePartial } from '@elastic/charts'; import { ScaleType, AreaSeries, CurveType } from '@elastic/charts'; import type { ModelItem } from '../../../../common/results_loader'; -import { seriesStyle, useChartColors } from '../common/settings'; +import { areaSeriesStyle, useChartColors } from '../common/settings'; interface Props { modelData?: ModelItem[]; @@ -17,14 +18,14 @@ interface Props { const SPEC_ID = 'model'; -const areaSeriesStyle = { - ...seriesStyle, +const style: RecursivePartial<AreaSeriesStyle> = { + ...areaSeriesStyle, area: { - ...seriesStyle.area, + ...areaSeriesStyle.area, visible: true, }, line: { - ...seriesStyle.line, + ...areaSeriesStyle.line, strokeWidth: 1, opacity: 0.4, }, @@ -43,7 +44,7 @@ export const ModelBounds: FC<Props> = ({ modelData }) => { y0Accessors={['modelLower']} data={model} curve={CurveType.CURVE_MONOTONE_X} - areaSeriesStyle={areaSeriesStyle} + areaSeriesStyle={style} color={MODEL_COLOR} /> ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/scatter.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/scatter.tsx index 555e9da3c1961..056b06c6233de 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/scatter.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/anomaly_chart/scatter.tsx @@ -7,8 +7,9 @@ import type { FC } from 'react'; import React from 'react'; +import type { LineSeriesStyle, RecursivePartial } from '@elastic/charts'; import { LineSeries, ScaleType, CurveType } from '@elastic/charts'; -import { seriesStyle, useChartColors } from '../common/settings'; +import { lineSeriesStyle, useChartColors } from '../common/settings'; interface Props { chartData: any[]; @@ -16,15 +17,15 @@ interface Props { const SPEC_ID = 'scatter'; -const scatterSeriesStyle = { - ...seriesStyle, +const scatterSeriesStyle: RecursivePartial<LineSeriesStyle> = { + ...lineSeriesStyle, line: { - ...seriesStyle.line, + ...lineSeriesStyle.line, visible: false, }, point: { - ...seriesStyle.point, - visible: true, + ...lineSeriesStyle.point, + visible: 'always', }, }; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/common/settings.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/common/settings.ts index d521573f646ce..6f46aabef8aa2 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/common/settings.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/charts/common/settings.ts @@ -7,6 +7,7 @@ import type { IUiSettingsClient } from '@kbn/core/public'; import type { TimeBuckets } from '@kbn/ml-time-buckets'; +import type { AreaSeriesStyle, LineSeriesStyle, RecursivePartial } from '@elastic/charts'; import { useCurrentThemeVars } from '../../../../../../contexts/kibana'; import type { JobCreatorType } from '../../../../common/job_creator'; import { isMultiMetricJobCreator, isPopulationJobCreator } from '../../../../common/job_creator'; @@ -36,22 +37,22 @@ export const defaultChartSettings: ChartSettings = { intervalMs: 0, }; -export const seriesStyle = { +export const lineSeriesStyle: RecursivePartial<LineSeriesStyle> = { line: { strokeWidth: 2, visible: true, opacity: 1, }, - border: { - visible: false, - strokeWidth: 0, - }, point: { - visible: false, + visible: 'never', radius: 2, strokeWidth: 4, opacity: 0.5, }, +}; + +export const areaSeriesStyle: RecursivePartial<AreaSeriesStyle> = { + ...lineSeriesStyle, area: { opacity: 0.25, visible: false, diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/duration_distribution_chart/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/duration_distribution_chart/index.tsx index 5a50e0b4e7abf..1a88bf8b48c0b 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/duration_distribution_chart/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/duration_distribution_chart/index.tsx @@ -176,7 +176,7 @@ export function DurationDistributionChart({ visible: true, }, point: { - visible: false, + visible: 'never', radius: 0, }, }, diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx index 5e116ed255982..56b61cb02d8b9 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx @@ -11,6 +11,7 @@ import { EuiTheme } from '@kbn/kibana-react-plugin/common'; import { getSeverity } from '@kbn/ml-anomaly-utils/get_severity'; import { ML_ANOMALY_SEVERITY } from '@kbn/ml-anomaly-utils/anomaly_severity'; import { ML_ANOMALY_THRESHOLD } from '@kbn/ml-anomaly-utils/anomaly_threshold'; +import type { AreaSeriesStyle, RecursivePartial } from '@elastic/charts'; import { getSeverityColor } from '../../../../../common/anomaly_detection'; import { ServiceAnomalyTimeseries } from '../../../../../common/anomaly_detection/service_anomaly_timeseries'; import { APMChartSpec } from '../../../../../typings/timeseries'; @@ -69,7 +70,7 @@ export function getChartAnomalyTimeseries({ const scores: APMChartSpec[] = severities.map(({ severity, threshold }) => { const color = getSeverityColor(threshold); - const style = { + const style: RecursivePartial<AreaSeriesStyle> = { line: { opacity: 0, }, @@ -77,7 +78,7 @@ export function getChartAnomalyTimeseries({ fill: color, }, point: { - visible: true, + visible: 'always', opacity: 0.75, radius: 3, strokeWidth: 1, diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/time_comparison/get_comparison_chart_theme.ts b/x-pack/plugins/observability_solution/apm/public/components/shared/time_comparison/get_comparison_chart_theme.ts index 91e8461f6d39c..c4684d6398c94 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/time_comparison/get_comparison_chart_theme.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/time_comparison/get_comparison_chart_theme.ts @@ -19,7 +19,7 @@ export function getComparisonChartTheme(): PartialTheme { visible: true, }, point: { - visible: false, + visible: 'never', }, }, }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_chart_theme.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_chart_theme.ts index 0e3ced91f8d51..65873a13de506 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_chart_theme.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_chart_theme.ts @@ -26,10 +26,10 @@ export function useChartTheme() { color: 'transparent', }, lineSeriesStyle: { - point: { visible: false }, + point: { visible: 'never' }, }, areaSeriesStyle: { - point: { visible: false }, + point: { visible: 'never' }, }, }; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_chart_theme.tsx b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_chart_theme.tsx index fc989e0026943..1a914e4abcd7e 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_chart_theme.tsx +++ b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_chart_theme.tsx @@ -25,10 +25,10 @@ export function useChartThemes(): { baseTheme: Theme; theme: PartialTheme[] } { color: 'transparent', }, lineSeriesStyle: { - point: { visible: false }, + point: { visible: 'never' }, }, areaSeriesStyle: { - point: { visible: false }, + point: { visible: 'never' }, }, }; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/wide_chart.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/wide_chart.tsx index d2cde516557c4..faff275ffbeac 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/wide_chart.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/components/wide_chart.tsx @@ -127,7 +127,7 @@ export function WideChart({ chart, data, id, isLoading, state, onBrushed, slo }: line: { strokeWidth: 1, }, - point: { visible: false }, + point: { visible: 'never' }, }} xAccessor="key" xScaleType={ScaleType.Time} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/data_preview_chart.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/data_preview_chart.tsx index 5241e6c78aebe..e797c4d5d3b3d 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/data_preview_chart.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/data_preview_chart.tsx @@ -289,12 +289,19 @@ export function DataPreviewChart({ theme={[ { lineSeriesStyle: { - point: { visible: false }, + point: { visible: 'never' }, }, }, ]} noResults={ - <EuiIcon type="visualizeApp" size="l" color="subdued" title="no results" /> + <EuiIcon + type="visualizeApp" + size="l" + color="subdued" + title={i18n.translate('xpack.slo.dataPreviewChart.noResultsLabel', { + defaultMessage: 'no results', + })} + /> } locale={i18n.getLocale()} /> diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.tsx index e220643bbc3b3..d00152e425dfd 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slo_sparkline.tsx @@ -82,7 +82,7 @@ export function SloSparkline({ chart, data, id, isLoading, size, state }: Props) fit={Fit.Nearest} id={id} lineSeriesStyle={{ - point: { visible: false }, + point: { visible: 'never' }, }} xAccessor={'key'} xScaleType={ScaleType.Time} diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap index bc77eccbb4c08..15f8ad666dced 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap @@ -52,12 +52,11 @@ exports[`DonutChart component passes correct props without errors for valid prop }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -65,13 +64,14 @@ exports[`DonutChart component passes correct props without errors for valid prop "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": false, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "never", }, + "pointVisibilityMinDistance": 20, }, "axes": Object { "axisLine": Object { @@ -198,11 +198,11 @@ exports[`DonutChart component passes correct props without errors for valid prop }, "bubbleSeriesStyle": Object { "point": Object { - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, "radius": 2, - "strokeWidth": 1, - "visible": true, + "strokeWidth": 0, + "visible": "always", }, }, "bulletGraph": Object { @@ -405,11 +405,11 @@ exports[`DonutChart component passes correct props without errors for valid prop }, "highlighter": Object { "point": Object { - "fill": "__use__empty__color__", - "opacity": 1, - "radius": 10, - "stroke": "__use__series__color__", - "strokeWidth": 4, + "fill": "__use__series__color__", + "opacity": 0.5, + "radius": 5, + "stroke": "__use__empty__color__", + "strokeWidth": 0, }, }, "legend": Object { @@ -442,12 +442,11 @@ exports[`DonutChart component passes correct props without errors for valid prop }, "isolatedPoint": Object { "enabled": true, - "fill": "white", + "fill": "__use__series__color__", "opacity": 1, - "radius": 2, "stroke": "__use__series__color__", "strokeWidth": 1, - "visible": true, + "visible": "auto", }, "line": Object { "opacity": 1, @@ -455,13 +454,14 @@ exports[`DonutChart component passes correct props without errors for valid prop "visible": true, }, "point": Object { - "fill": "#FFF", + "fill": "__use__series__color__", "opacity": 1, "radius": 3, - "stroke": "__use__series__color__", - "strokeWidth": 2, - "visible": true, + "stroke": "__use__empty__color__", + "strokeWidth": 0, + "visible": "auto", }, + "pointVisibilityMinDistance": 40, }, "metric": Object { "barBackground": "#EDF0F5", diff --git a/x-pack/plugins/security_solution/public/common/components/charts/areachart.tsx b/x-pack/plugins/security_solution/public/common/components/charts/areachart.tsx index ec3e6abd727dc..63bd1c38c8eb9 100644 --- a/x-pack/plugins/security_solution/public/common/components/charts/areachart.tsx +++ b/x-pack/plugins/security_solution/public/common/components/charts/areachart.tsx @@ -44,7 +44,7 @@ const getSeriesLineStyle = (): RecursivePartial<AreaSeriesStyle> => { visible: true, }, point: { - visible: false, + visible: 'never', radius: 0.2, strokeWidth: 1, opacity: 1, diff --git a/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx b/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx index a6af4a2ae48a4..dbf8e9bc476c5 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx @@ -50,7 +50,7 @@ const chartThemeOverrides = (): PartialTheme => { strokeWidth: 3, }, point: { - visible: false, + visible: 'never', }, }, }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx index cc695fe51aa68..a144969314f09 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_summary_widget/components/alert_summary_widget_full_size.tsx @@ -133,7 +133,7 @@ export const AlertSummaryWidgetFullSize = ({ line: { strokeWidth: 2, }, - point: { visible: false }, + point: { visible: 'never' }, }} curve={CurveType.CURVE_MONOTONE_X} timeZone={timeZone} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx index c8afbb76f5910..6ab5b96cade27 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/execution_duration_chart.tsx @@ -116,7 +116,7 @@ export const ExecutionDurationChart: React.FunctionComponent<ComponentOpts> = ({ <Settings theme={{ lineSeriesStyle: { - point: { visible: false }, + point: { visible: 'never' }, line: { stroke: lightEuiTheme.euiColorAccent }, }, }} diff --git a/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx index 7b009ec744f5a..6c796ed2c12af 100644 --- a/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/application/sections/watch_edit_page/components/threshold_watch_edit/watch_visualization.tsx @@ -42,7 +42,7 @@ const customTheme = (): PartialTheme => { strokeWidth: 3, }, point: { - visible: false, + visible: 'never', }, }, }; diff --git a/yarn.lock b/yarn.lock index 236319c030c55..7b27506c7e63e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1643,10 +1643,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@66.1.1": - version "66.1.1" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-66.1.1.tgz#94b931a2c070d92cc35574392a404435d2d37de9" - integrity sha512-CQQUBsU7VwnencHcnZ6Wh5mGjkX73ui6nSTjtwJuxtjXezflN6cPzbWKgwVKeduxHGoHcWUWoScLSgSCLkMdJQ== +"@elastic/charts@67.0.0": + version "67.0.0" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-67.0.0.tgz#840737195b79748b04bf7a0c9ddb0a00da5fdf43" + integrity sha512-ORiPySIe53vWyGZt5CHNm7q+UyStL0caqpdwqQWO5F22kRNLs14bsOnJdMzrdLpR1HEhX4e36kYyXfedbQA8AQ== dependencies: "@popperjs/core" "^2.11.8" bezier-easing "^2.1.0" From 574af418a2dd30ad19eee0a4c49b82b41c489470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Rica=20Pais=20da=20Silva?= <goncalo.rica@elastic.co> Date: Wed, 2 Oct 2024 11:19:44 +0200 Subject: [PATCH 096/107] [Inventory] Add Sharing button (#194535) ## Summary Adds a Share link button to the Inventory page, next to the Add Data button on the top right of the screen. This creates a short link and copies it to the user's clipboard so they can share it. https://github.com/user-attachments/assets/42c7b2f9-da19-4ced-8d28-211234bea4cf ## How to Test - Log in and go to Inventory page. Ensure there is data loaded and entities are showing. - Put a filter on the inventory to restrict the results to a given state, such as `entity.type : "service"`. - Click on the `Share` button and wait until you get a success toast message. - Open a new empty tab on the browser and paste the link into the url bar to navigate to the page. **Expected Result**: The page should navigate to the Inventory page and load into the same state as the page on the original browser tab. Closes #192325 --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- .../app_root/header_action_menu/index.tsx | 2 + .../header_action_menu/share_link.tsx | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/share_link.tsx diff --git a/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/index.tsx index 5ae0f4dd24574..ad139ba5100da 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/index.tsx @@ -8,10 +8,12 @@ import React from 'react'; import { EuiHeaderLinks } from '@elastic/eui'; import { AddDataContextMenu } from './add_data_action_menu'; +import { ShareLink } from './share_link'; export function HeaderActionMenuItems() { return ( <EuiHeaderLinks gutterSize="xs"> + <ShareLink /> <AddDataContextMenu /> </EuiHeaderLinks> ); diff --git a/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/share_link.tsx b/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/share_link.tsx new file mode 100644 index 0000000000000..54cceae2c4ad6 --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/components/app_root/header_action_menu/share_link.tsx @@ -0,0 +1,82 @@ +/* + * Copyright 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, useState } from 'react'; +import copy from 'copy-to-clipboard'; +import { i18n } from '@kbn/i18n'; +import { EuiButtonEmpty } from '@elastic/eui'; +import { useKibana } from '../../../hooks/use_kibana'; + +const SHARE_BUTTON_LABEL = i18n.translate('xpack.inventory.shareLink.shareButtonLabel', { + defaultMessage: 'Share', +}); + +const SHARE_TOAST_SUCCESS_LABEL = i18n.translate( + 'xpack.inventory.shareLink.shareToastSuccessLabel', + { defaultMessage: 'Short URL copied to clipboard!' } +); + +const SHARE_TOAST_FAILURE_LABEL = i18n.translate( + 'xpack.inventory.shareLink.shareToastFailureLabel', + { defaultMessage: 'Short URL unable to be copied.' } +); + +function useShortUrlService() { + const { + services: { share, notifications }, + } = useKibana(); + + const [isLoading, setIsLoading] = useState(false); + + const copyShortUrl = useCallback(async () => { + setIsLoading(true); + + try { + const shortUrls = share.url.shortUrls.get(null); + + const { url } = await shortUrls.createFromLongUrl(window.location.toString()); + + setIsLoading(false); + + if (copy(url)) { + notifications.toasts.addSuccess({ + title: SHARE_TOAST_SUCCESS_LABEL, + iconType: 'copyClipboard', + }); + } else { + throw new Error('Clipboard copy error'); + } + } catch (e) { + const err = e as Error; + notifications.toasts.addDanger({ + title: SHARE_TOAST_FAILURE_LABEL, + iconType: 'error', + text: err.message, + }); + } + }, [share, notifications.toasts]); + + return { + isLoading, + copyShortUrl, + }; +} + +export function ShareLink() { + const { isLoading, copyShortUrl } = useShortUrlService(); + + return ( + <EuiButtonEmpty + data-test-subj="inventoryShareLinkButton" + onClick={copyShortUrl} + iconType="share" + isLoading={isLoading} + > + {SHARE_BUTTON_LABEL} + </EuiButtonEmpty> + ); +} From 917458844b51b93d9a62f2e100099a70e1ea4842 Mon Sep 17 00:00:00 2001 From: Oyelola Victoria <123843734+VriaA@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:33:05 +0100 Subject: [PATCH 097/107] Refactor email input handling to format comma-separated addresses (#193128) ## Summary This pull request fixes #189968 - Introduced `getFormattedEmailOptions` to split and trim comma-separated email values - Updated `EuiComboBox` to handle email entries for `to`, `cc`, and `bcc` fields https://github.com/user-attachments/assets/45a70132-8fd7-426e-81cf-62a6bf216408 --------- Signed-off-by: Oyelola Victoria <oyelolaabimbola23@gmail.com> Co-authored-by: Julian Gernun <17549662+jcger@users.noreply.github.com> Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- .../email/email_params.test.tsx | 100 +++++++++++++++++- .../connector_types/email/email_params.tsx | 21 +++- 2 files changed, 117 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.test.tsx index 76cc3b136455a..3d772556e7262 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.test.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.test.tsx @@ -7,12 +7,13 @@ import React from 'react'; import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { render, fireEvent, screen } from '@testing-library/react'; +import { render, fireEvent, screen, within } from '@testing-library/react'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { triggersActionsUiMock } from '@kbn/triggers-actions-ui-plugin/public/mocks'; import EmailParamsFields from './email_params'; import { getIsExperimentalFeatureEnabled } from '../../common/get_experimental_features'; +import { getFormattedEmailOptions } from './email_params'; jest.mock('@kbn/kibana-react-plugin/public', () => ({ useKibana: jest.fn(), @@ -28,6 +29,24 @@ const mockKibana = () => { }); }; +const emailTestCases = [ + { + field: 'to', + fieldValue: 'new1@test.com, new2@test.com , new1@test.com, ', + expected: ['test@test.com', 'new1@test.com', 'new2@test.com'], + }, + { + field: 'cc', + fieldValue: 'newcc1@test.com, newcc2@test.com , newcc1@test.com, ', + expected: ['cc@test.com', 'newcc1@test.com', 'newcc2@test.com'], + }, + { + field: 'bcc', + fieldValue: 'newbcc1@test.com, newbcc2@test.com , newbcc1@test.com, ', + expected: ['bcc@test.com', 'newbcc1@test.com', 'newbcc2@test.com'], + }, +]; + describe('EmailParamsFields renders', () => { beforeEach(() => { jest.clearAllMocks(); @@ -62,6 +81,40 @@ describe('EmailParamsFields renders', () => { expect(await screen.findByTestId('messageTextArea')).toBeVisible(); }); + emailTestCases.forEach(({ field, fieldValue, expected }) => { + test(`"${field}" field value updates correctly when comma-separated emails are pasted`, async () => { + const actionParams = { + cc: ['cc@test.com'], + bcc: ['bcc@test.com'], + to: ['test@test.com'], + subject: 'test', + message: 'test message', + }; + + const editAction = jest.fn(); + + render( + <IntlProvider locale="en"> + <EmailParamsFields + actionParams={actionParams} + errors={{ to: [], cc: [], bcc: [], subject: [], message: [] }} + editAction={editAction} + defaultMessage={'Some default message'} + index={0} + /> + </IntlProvider> + ); + + const euiComboBox = screen.getByTestId(`${field}EmailAddressInput`); + const input = within(euiComboBox).getByTestId('comboBoxSearchInput'); + fireEvent.change(input, { target: { value: fieldValue } }); + expect(input).toHaveValue(fieldValue); + + fireEvent.keyDown(input, { key: 'Enter', code: 'Enter' }); + expect(editAction).toHaveBeenCalledWith(field, expected, 0); + }); + }); + test('message param field is rendered with default value if not set', () => { const actionParams = { cc: [], @@ -234,3 +287,48 @@ describe('EmailParamsFields renders', () => { expect(editAction).not.toHaveBeenCalled(); }); }); + +describe('getFormattedEmailOptions', () => { + test('should return new options added to previous options', () => { + const searchValue = 'test@test.com, other@test.com'; + const previousOptions = [{ label: 'existing@test.com' }]; + const newOptions = getFormattedEmailOptions(searchValue, previousOptions); + + expect(newOptions).toEqual([ + { label: 'existing@test.com' }, + { label: 'test@test.com' }, + { label: 'other@test.com' }, + ]); + }); + + test('should trim extra spaces in search value', () => { + const searchValue = ' test@test.com , other@test.com , '; + const previousOptions: Array<{ label: string }> = []; + const newOptions = getFormattedEmailOptions(searchValue, previousOptions); + + expect(newOptions).toEqual([{ label: 'test@test.com' }, { label: 'other@test.com' }]); + }); + + test('should prevent duplicate email addresses', () => { + const searchValue = 'duplicate@test.com, duplicate@test.com'; + const previousOptions = [{ label: 'existing@test.com' }, { label: 'duplicate@test.com' }]; + const newOptions = getFormattedEmailOptions(searchValue, previousOptions); + + expect(newOptions).toEqual([{ label: 'existing@test.com' }, { label: 'duplicate@test.com' }]); + }); + + test('should return previous options if search value is empty', () => { + const searchValue = ''; + const previousOptions = [{ label: 'existing@test.com' }]; + const newOptions = getFormattedEmailOptions(searchValue, previousOptions); + expect(newOptions).toEqual([{ label: 'existing@test.com' }]); + }); + + test('should handle single email without comma', () => { + const searchValue = 'single@test.com'; + const previousOptions = [{ label: 'existing@test.com' }]; + const newOptions = getFormattedEmailOptions(searchValue, previousOptions); + + expect(newOptions).toEqual([{ label: 'existing@test.com' }, { label: 'single@test.com' }]); + }); +}); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.tsx index d9a4750cb4564..745349ab5e872 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/email/email_params.tsx @@ -18,6 +18,21 @@ import { EmailActionParams } from '../types'; const noop = () => {}; +export const getFormattedEmailOptions = ( + searchValue: string, + previousOptions: Array<{ label: string }> +): Array<{ label: string }> => { + if (!searchValue.trim()) return previousOptions; + const previousEmails: string[] = previousOptions.map((option) => option.label); + const allUniqueEmails: Set<string> = new Set(previousEmails); + searchValue.split(',').forEach((email) => { + const trimmedEmail = email.trim(); + if (trimmedEmail) allUniqueEmails.add(trimmedEmail); + }); + const formattedOptions = Array.from(allUniqueEmails).map((email) => ({ label: email })); + return formattedOptions; +}; + export const EmailParamsFields = ({ actionParams, editAction, @@ -105,7 +120,7 @@ export const EmailParamsFields = ({ data-test-subj="toEmailAddressInput" selectedOptions={toOptions} onCreateOption={(searchValue: string) => { - const newOptions = [...toOptions, { label: searchValue }]; + const newOptions = getFormattedEmailOptions(searchValue, toOptions); editAction( 'to', newOptions.map((newOption) => newOption.label), @@ -148,7 +163,7 @@ export const EmailParamsFields = ({ data-test-subj="ccEmailAddressInput" selectedOptions={ccOptions} onCreateOption={(searchValue: string) => { - const newOptions = [...ccOptions, { label: searchValue }]; + const newOptions = getFormattedEmailOptions(searchValue, ccOptions); editAction( 'cc', newOptions.map((newOption) => newOption.label), @@ -192,7 +207,7 @@ export const EmailParamsFields = ({ data-test-subj="bccEmailAddressInput" selectedOptions={bccOptions} onCreateOption={(searchValue: string) => { - const newOptions = [...bccOptions, { label: searchValue }]; + const newOptions = getFormattedEmailOptions(searchValue, bccOptions); editAction( 'bcc', newOptions.map((newOption) => newOption.label), From c84ee4c5293718ce4b4f7c8b6e4f502449b5aa34 Mon Sep 17 00:00:00 2001 From: Robert Jaszczurek <92210485+rbrtj@users.noreply.github.com> Date: Wed, 2 Oct 2024 11:50:04 +0200 Subject: [PATCH 098/107] [ML] Anomaly swim lane: Fix disappearing rows per page button (#194531) ## Summary Fix for: [#194027](https://github.com/elastic/kibana/issues/194027). Fixed issue with disappearing `rows per page` button. Enhanced the logic to display only relevant pagination options, showing the first larger option, which works like 'show all'. * For example, if there are 23 results, the available `rows per page` options will be: `5,10,20,50`. https://github.com/user-attachments/assets/29c3f0db-84b8-4a0c-b4b5-a722cfc490c4 --- .../explorer/calculate_row_options.test.ts | 34 +++++++++++++++ .../explorer/calculate_row_options.ts | 17 ++++++++ .../explorer/swimlane_container.tsx | 8 ++-- .../explorer/swimlane_pagination.tsx | 42 ++++++++++--------- 4 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/explorer/calculate_row_options.test.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/calculate_row_options.ts diff --git a/x-pack/plugins/ml/public/application/explorer/calculate_row_options.test.ts b/x-pack/plugins/ml/public/application/explorer/calculate_row_options.test.ts new file mode 100644 index 0000000000000..5b378805ea058 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/calculate_row_options.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { calculateRowOptions } from './calculate_row_options'; + +describe('calculateRowOptions', () => { + it('should return all options when cardinality is greater than all row options', () => { + const rowOptions = [5, 10, 20, 50, 100]; + const cardinality = 150; + expect(calculateRowOptions(rowOptions, cardinality)).toEqual([5, 10, 20, 50, 100]); + }); + + it('should return options up to and including cardinality', () => { + const rowOptions = [5, 10, 20, 50, 100]; + const cardinality = 30; + expect(calculateRowOptions(rowOptions, cardinality)).toEqual([5, 10, 20, 50]); + }); + + it('should return at least one option even if cardinality is less than all options', () => { + const rowOptions = [5, 10, 20, 50, 100]; + const cardinality = 3; + expect(calculateRowOptions(rowOptions, cardinality)).toEqual([5]); + }); + + it('should handle cardinality of zero', () => { + const rowOptions = [5, 10, 20, 50, 100]; + const cardinality = 0; + expect(calculateRowOptions(rowOptions, cardinality)).toEqual([5]); + }); +}); diff --git a/x-pack/plugins/ml/public/application/explorer/calculate_row_options.ts b/x-pack/plugins/ml/public/application/explorer/calculate_row_options.ts new file mode 100644 index 0000000000000..e258c3d304d22 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/calculate_row_options.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const calculateRowOptions = (rowOptions: number[], cardinality: number): number[] => { + return rowOptions.reduce((acc, v) => { + if (v <= cardinality) { + acc.push(v); + } else if (acc.length === 0 || acc[acc.length - 1] < cardinality) { + acc.push(v); + } + return acc; + }, [] as number[]); +}; diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index e573e2572bed4..5dd1440d7d817 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -254,10 +254,10 @@ export const SwimlaneContainer: FC<SwimlaneProps> = ({ const isPaginationVisible = (showSwimlane || isLoading) && swimlaneLimit !== undefined && - swimlaneLimit > (perPage ?? 5) && - onPaginationChange && - fromPage && - perPage; + swimlaneLimit > 5 && + !!onPaginationChange && + !!fromPage && + !!perPage; const rowsCount = swimlaneData?.laneLabels?.length ?? 0; diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx index cdc823b264d3b..55623e5b55ffc 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx @@ -18,6 +18,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; +import { calculateRowOptions } from './calculate_row_options'; interface SwimLanePaginationProps { fromPage: number; @@ -51,25 +52,26 @@ export const SwimLanePagination: FC<SwimLanePaginationProps> = ({ const pageCount = Math.ceil(cardinality / perPage); - const items = [5, 10, 20, 50, 100].map((v) => { - return ( - <EuiContextMenuItem - key={`${v}_rows`} - icon={v === perPage ? 'check' : 'empty'} - onClick={() => { - closePopover(); - setPerPage(v); - }} - data-test-subj={`${v} rows`} - > - <FormattedMessage - id="xpack.ml.explorer.swimLaneSelectRowsPerPage" - defaultMessage="{rowsCount} rows" - values={{ rowsCount: v }} - /> - </EuiContextMenuItem> - ); - }); + const rowOptions = [5, 10, 20, 50, 100]; + const items = calculateRowOptions(rowOptions, cardinality); + + const menuItems = items.map((v) => ( + <EuiContextMenuItem + key={`${v}_rows`} + icon={v === perPage ? 'check' : 'empty'} + onClick={() => { + closePopover(); + setPerPage(v); + }} + data-test-subj={`${v} rows`} + > + <FormattedMessage + id="xpack.ml.explorer.swimLaneSelectRowsPerPage" + defaultMessage="{rowsCount} rows" + values={{ rowsCount: v }} + /> + </EuiContextMenuItem> + )); return ( <EuiFlexGroup justifyContent="spaceBetween" alignItems="center"> @@ -97,7 +99,7 @@ export const SwimLanePagination: FC<SwimLanePaginationProps> = ({ closePopover={closePopover} panelPaddingSize="none" > - <EuiContextMenuPanel items={items} data-test-subj="mlSwimLanePageSizePanel" /> + <EuiContextMenuPanel items={menuItems} data-test-subj="mlSwimLanePageSizePanel" /> </EuiPopover> </EuiFlexItem> From df059766731adf142bcc0c75d9db77e859b0b25f Mon Sep 17 00:00:00 2001 From: Alex Szabo <alex.szabo@elastic.co> Date: Wed, 2 Oct 2024 12:05:30 +0200 Subject: [PATCH 099/107] [fix] type issue from race condition on merge (#194676) ## Summary https://github.com/elastic/kibana/pull/191926 introduces something that's in contradiction with https://github.com/elastic/kibana/pull/194144 This PR adds a fix. --- .../src/providers/search_api_key_provider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx b/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx index f3a81e72d3b2e..d524280cfb613 100644 --- a/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx +++ b/packages/kbn-search-api-keys-components/src/providers/search_api_key_provider.tsx @@ -72,7 +72,7 @@ export const ApiKeyContext = createContext<APIKeyContext>({ initialiseKey: () => {}, }); -export const SearchApiKeyProvider: React.FC = ({ children }) => { +export const SearchApiKeyProvider: React.FC<React.PropsWithChildren> = ({ children }) => { const { http } = useKibana().services; const [state, dispatch] = useReducer(reducer, initialState); From 4e68c21feebcfa7bac83dddd700f46d517d0a60a Mon Sep 17 00:00:00 2001 From: Gerard Soldevila <gerard.soldevila@elastic.co> Date: Wed, 2 Oct 2024 12:16:10 +0200 Subject: [PATCH 100/107] Rollback to 3 parallel migrators (#194663) ## Summary Address https://github.com/elastic/kibana/issues/194490 This test used to have 3 parallel migrators. I updated it to 4 during the `9.0.0` migrations' tests upgrades. It seems that it could be a bit too much for CI. This PR sets the value back to 3. --- .../saved_objects/migrations/group2/multiple_kb_nodes.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kb_nodes.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kb_nodes.test.ts index 1ad78f5abb666..19100fad017d5 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kb_nodes.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kb_nodes.test.ts @@ -34,7 +34,7 @@ import { delay, parseLogFile } from '../test_utils'; import '../jest_matchers'; import { expectDocumentsMigratedToHighestVersion } from '../kibana_migrator_test_kit.expect'; -const PARALLEL_MIGRATORS = 4; +const PARALLEL_MIGRATORS = 3; type Job<T> = () => Promise<T>; const getLogFile = (node: number) => join(__dirname, `multiple_kb_nodes_${node}.log`); From d0d2032f18a37e4c458a26d92092665453b737b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= <mikecote@users.noreply.github.com> Date: Wed, 2 Oct 2024 07:19:06 -0400 Subject: [PATCH 101/107] Hook up discovery service to Task Manager health (#194113) Resolves https://github.com/elastic/kibana/issues/192568 In this PR, I'm solving the issue where the task manager health API is unable to determine how many Kibana nodes are running. I'm doing so by leveraging the Kibana discovery service to get a count instead of calculating it based on an aggregation on the `.kibana_task_manager` index where we count the unique number of `ownerId`, which requires tasks to be running and a sufficient distribution across the Kibana nodes to determine the number properly. Note: This will only work when mget is the task claim strategy ## To verify 1. Set `xpack.task_manager.claim_strategy: mget` in kibana.yml 2. Startup the PR locally with Elasticsearch and Kibana running 3. Navigate to the `/api/task_manager/_health` route and confirm `observed_kibana_instances` is `1` 4. Apply the following code and restart Kibana ``` diff --git a/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts b/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts index 090847032bf..69dfb6d1b36 100644 --- a/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts +++ b/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts @@ -59,6 +59,7 @@ export class KibanaDiscoveryService { const lastSeen = lastSeenDate.toISOString(); try { await this.upsertCurrentNode({ id: this.currentNode, lastSeen }); + await this.upsertCurrentNode({ id: `${this.currentNode}-2`, lastSeen }); if (!this.started) { this.logger.info('Kibana Discovery Service has been started'); this.started = true; ``` 5. Navigate to the `/api/task_manager/_health` route and confirm `observed_kibana_instances` is `2` --------- Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> --- .../kibana_discovery_service.test.ts | 3 + .../kibana_discovery_service.ts | 19 +++-- .../monitoring/capacity_estimation.test.ts | 42 +++++++---- .../server/monitoring/capacity_estimation.ts | 10 +-- .../monitoring/monitoring_stats_stream.ts | 75 ++++++++++--------- .../monitoring/workload_statistics.test.ts | 4 - .../server/monitoring/workload_statistics.ts | 24 +----- x-pack/plugins/task_manager/server/plugin.ts | 5 +- .../task_manager/server/routes/health.test.ts | 62 ++++++++++++++- .../task_manager/server/routes/health.ts | 15 +++- .../test_suites/task_manager/health_route.ts | 1 - .../test_suites/task_manager/health_route.ts | 1 - 12 files changed, 171 insertions(+), 90 deletions(-) diff --git a/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.test.ts b/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.test.ts index 4b9af1f77270b..3a4870b6a4763 100644 --- a/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.test.ts +++ b/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.test.ts @@ -246,6 +246,7 @@ describe('KibanaDiscoveryService', () => { savedObjectsRepository.find.mockResolvedValueOnce(createFindResponse(mockActiveNodes)); it('returns the active kibana nodes', async () => { + const onNodesCounted = jest.fn(); const kibanaDiscoveryService = new KibanaDiscoveryService({ savedObjectsRepository, logger, @@ -254,6 +255,7 @@ describe('KibanaDiscoveryService', () => { active_nodes_lookback: DEFAULT_ACTIVE_NODES_LOOK_BACK_DURATION, interval: DEFAULT_DISCOVERY_INTERVAL_MS, }, + onNodesCounted, }); const activeNodes = await kibanaDiscoveryService.getActiveKibanaNodes(); @@ -265,6 +267,7 @@ describe('KibanaDiscoveryService', () => { type: BACKGROUND_TASK_NODE_SO_NAME, }); expect(activeNodes).toEqual(mockActiveNodes); + expect(onNodesCounted).toHaveBeenCalledWith(mockActiveNodes.length); }); }); diff --git a/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts b/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts index 9318a09e3fbab..1c4fcb00981a0 100644 --- a/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts +++ b/x-pack/plugins/task_manager/server/kibana_discovery_service/kibana_discovery_service.ts @@ -16,6 +16,7 @@ interface DiscoveryServiceParams { currentNode: string; savedObjectsRepository: ISavedObjectsRepository; logger: Logger; + onNodesCounted?: (numOfNodes: number) => void; } interface DiscoveryServiceUpsertParams { @@ -34,13 +35,15 @@ export class KibanaDiscoveryService { private logger: Logger; private stopped = false; private timer: NodeJS.Timeout | undefined; + private onNodesCounted?: (numOfNodes: number) => void; - constructor({ config, currentNode, savedObjectsRepository, logger }: DiscoveryServiceParams) { - this.activeNodesLookBack = config.active_nodes_lookback; - this.discoveryInterval = config.interval; - this.savedObjectsRepository = savedObjectsRepository; - this.logger = logger; - this.currentNode = currentNode; + constructor(opts: DiscoveryServiceParams) { + this.activeNodesLookBack = opts.config.active_nodes_lookback; + this.discoveryInterval = opts.config.interval; + this.savedObjectsRepository = opts.savedObjectsRepository; + this.logger = opts.logger; + this.currentNode = opts.currentNode; + this.onNodesCounted = opts.onNodesCounted; } private async upsertCurrentNode({ id, lastSeen }: DiscoveryServiceUpsertParams) { @@ -106,6 +109,10 @@ export class KibanaDiscoveryService { filter: `${BACKGROUND_TASK_NODE_SO_NAME}.attributes.last_seen > now-${this.activeNodesLookBack}`, }); + if (this.onNodesCounted) { + this.onNodesCounted(activeNodes.length); + } + return activeNodes; } diff --git a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts index 94b11171f9e04..23ef344c197fc 100644 --- a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts +++ b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts @@ -63,7 +63,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ).value.observed ).toMatchObject({ observed_kibana_instances: 1, @@ -119,7 +120,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ).value.observed ).toMatchObject({ observed_kibana_instances: 1, @@ -158,7 +160,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ).value.observed ).toMatchObject({ observed_kibana_instances: 1, @@ -214,7 +217,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ).value.observed ).toMatchObject({ observed_kibana_instances: 1, @@ -271,7 +275,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ).value.observed ).toMatchObject({ observed_kibana_instances: 1, @@ -327,7 +332,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 3 ).value.observed ).toMatchObject({ observed_kibana_instances: 3, @@ -396,7 +402,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 2 ).value.observed ).toMatchObject({ observed_kibana_instances: provisionedKibanaInstances, @@ -477,7 +484,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 2 ).value ).toMatchObject({ observed: { @@ -561,7 +569,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ) ).toMatchObject({ status: 'OK', @@ -626,7 +635,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ) ).toMatchObject({ status: 'OK', @@ -691,7 +701,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ) ).toMatchObject({ status: 'OK', @@ -755,7 +766,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ) ).toMatchObject({ status: 'OK', @@ -831,7 +843,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ) ).toMatchObject({ status: 'OK', @@ -905,7 +918,8 @@ describe('estimateCapacity', () => { result_frequency_percent_as_number: {}, }, } - ) + ), + 1 ).value.observed ).toMatchObject({ observed_kibana_instances: 1, diff --git a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts index d1c2f3591ea22..acbf1284b21b7 100644 --- a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts +++ b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts @@ -46,11 +46,10 @@ function isCapacityEstimationParams( export function estimateCapacity( logger: Logger, - capacityStats: CapacityEstimationParams + capacityStats: CapacityEstimationParams, + assumedKibanaInstances: number ): RawMonitoredStat<CapacityEstimationStat> { const workload = capacityStats.workload.value; - // if there are no active owners right now, assume there's at least 1 - const assumedKibanaInstances = Math.max(workload.owner_ids, 1); const { load: { p90: averageLoadPercentage }, @@ -262,12 +261,13 @@ function getHealthStatus( export function withCapacityEstimate( logger: Logger, - monitoredStats: RawMonitoringStats['stats'] + monitoredStats: RawMonitoringStats['stats'], + assumedKibanaInstances: number ): RawMonitoringStats['stats'] { if (isCapacityEstimationParams(monitoredStats)) { return { ...monitoredStats, - capacity_estimation: estimateCapacity(logger, monitoredStats), + capacity_estimation: estimateCapacity(logger, monitoredStats, assumedKibanaInstances), }; } return monitoredStats; diff --git a/x-pack/plugins/task_manager/server/monitoring/monitoring_stats_stream.ts b/x-pack/plugins/task_manager/server/monitoring/monitoring_stats_stream.ts index e1bffb55d54fa..1237af9e68ebc 100644 --- a/x-pack/plugins/task_manager/server/monitoring/monitoring_stats_stream.ts +++ b/x-pack/plugins/task_manager/server/monitoring/monitoring_stats_stream.ts @@ -158,42 +158,47 @@ export function summarizeMonitoringStats( last_update, stats: { runtime, workload, configuration, ephemeral, utilization }, }: MonitoringStats, - config: TaskManagerConfig + config: TaskManagerConfig, + assumedKibanaInstances: number ): RawMonitoringStats { - const summarizedStats = withCapacityEstimate(logger, { - ...(configuration - ? { - configuration: { - ...configuration, - status: HealthStatus.OK, - }, - } - : {}), - ...(runtime - ? { - runtime: { - timestamp: runtime.timestamp, - ...summarizeTaskRunStat(logger, runtime.value, config), - }, - } - : {}), - ...(workload - ? { - workload: { - timestamp: workload.timestamp, - ...summarizeWorkloadStat(workload.value), - }, - } - : {}), - ...(ephemeral - ? { - ephemeral: { - timestamp: ephemeral.timestamp, - ...summarizeEphemeralStat(ephemeral.value), - }, - } - : {}), - }); + const summarizedStats = withCapacityEstimate( + logger, + { + ...(configuration + ? { + configuration: { + ...configuration, + status: HealthStatus.OK, + }, + } + : {}), + ...(runtime + ? { + runtime: { + timestamp: runtime.timestamp, + ...summarizeTaskRunStat(logger, runtime.value, config), + }, + } + : {}), + ...(workload + ? { + workload: { + timestamp: workload.timestamp, + ...summarizeWorkloadStat(workload.value), + }, + } + : {}), + ...(ephemeral + ? { + ephemeral: { + timestamp: ephemeral.timestamp, + ...summarizeEphemeralStat(ephemeral.value), + }, + } + : {}), + }, + assumedKibanaInstances + ); return { last_update, diff --git a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts index cd37c6661ec00..0326e07de6f48 100644 --- a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts +++ b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts @@ -169,10 +169,6 @@ describe('Workload Statistics Aggregator', () => { missing: { field: 'task.schedule.interval' }, aggs: { taskType: { terms: { size: 3, field: 'task.taskType' } } }, }, - ownerIds: { - filter: { range: { 'task.startedAt': { gte: 'now-1w/w' } } }, - aggs: { ownerIds: { cardinality: { field: 'task.ownerId' } } }, - }, idleTasks: { filter: { term: { 'task.status': 'idle' } }, aggs: { diff --git a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts index 92cca0bf9a4f9..37f1291132547 100644 --- a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts +++ b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts @@ -16,7 +16,6 @@ import { AggregatedStatProvider } from '../lib/runtime_statistics_aggregator'; import { parseIntervalAsSecond, asInterval, parseIntervalAsMillisecond } from '../lib/intervals'; import { HealthStatus } from './monitoring_stats_stream'; import { TaskStore } from '../task_store'; -import { createRunningAveragedStat } from './task_run_calculators'; import { TaskTypeDictionary } from '../task_type_dictionary'; import { TaskCost } from '../task'; @@ -45,12 +44,8 @@ interface RawWorkloadStat extends JsonObject { capacity_requirements: CapacityRequirements; } -export interface WorkloadStat extends RawWorkloadStat { - owner_ids: number[]; -} -export interface SummarizedWorkloadStat extends RawWorkloadStat { - owner_ids: number; -} +export type WorkloadStat = RawWorkloadStat; +export type SummarizedWorkloadStat = RawWorkloadStat; export interface CapacityRequirements extends JsonObject { per_minute: number; per_hour: number; @@ -143,7 +138,6 @@ export function createWorkloadAggregator({ const totalNumTaskDefinitions = taskDefinitions.getAllTypes().length; const taskTypeTermAggSize = Math.min(totalNumTaskDefinitions, 10000); - const ownerIdsQueue = createRunningAveragedStat<number>(scheduleDensityBuckets); return combineLatest([timer(0, refreshInterval), elasticsearchAndSOAvailability$]).pipe( filter(([, areElasticsearchAndSOAvailable]) => areElasticsearchAndSOAvailable), @@ -163,10 +157,6 @@ export function createWorkloadAggregator({ taskType: { terms: { size: taskTypeTermAggSize, field: 'task.taskType' } }, }, }, - ownerIds: { - filter: { range: { 'task.startedAt': { gte: 'now-1w/w' } } }, - aggs: { ownerIds: { cardinality: { field: 'task.ownerId' } } }, - }, idleTasks: { filter: { term: { 'task.status': 'idle' } }, aggs: { @@ -225,7 +215,6 @@ export function createWorkloadAggregator({ const taskTypes = aggregations.taskType.buckets; const nonRecurring = aggregations.nonRecurringTasks.doc_count; const nonRecurringTaskTypes = aggregations.nonRecurringTasks.taskType.buckets; - const ownerIds = aggregations.ownerIds.ownerIds.value; const { overdue: { @@ -297,7 +286,6 @@ export function createWorkloadAggregator({ task_types: taskTypeSummary, non_recurring: nonRecurring, non_recurring_cost: totalNonRecurringCost, - owner_ids: ownerIdsQueue(ownerIds), schedule: schedules .sort((scheduleLeft, scheduleRight) => scheduleLeft.asSeconds - scheduleRight.asSeconds) .map((schedule) => [schedule.interval, schedule.count]), @@ -452,12 +440,7 @@ export function summarizeWorkloadStat(workloadStats: WorkloadStat): { status: HealthStatus; } { return { - value: { - ...workloadStats, - // assume the largest number we've seen of active owner IDs - // matches the number of active Task Managers in the cluster - owner_ids: Math.max(...workloadStats.owner_ids), - }, + value: workloadStats, status: HealthStatus.OK, }; } @@ -477,7 +460,6 @@ export interface WorkloadAggregationResponse { schedule: ScheduleAggregation; idleTasks: IdleTasksAggregation; nonRecurringTasks: { doc_count: number; taskType: TaskTypeAggregation }; - ownerIds: { ownerIds: { value: number } }; [otherAggs: string]: estypes.AggregationsAggregate; } diff --git a/x-pack/plugins/task_manager/server/plugin.ts b/x-pack/plugins/task_manager/server/plugin.ts index d7c3cd7e941fc..87acf096d007c 100644 --- a/x-pack/plugins/task_manager/server/plugin.ts +++ b/x-pack/plugins/task_manager/server/plugin.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { combineLatest, Observable, Subject } from 'rxjs'; +import { combineLatest, Observable, Subject, BehaviorSubject } from 'rxjs'; import { map, distinctUntilChanged } from 'rxjs'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { UsageCollectionSetup, UsageCounter } from '@kbn/usage-collection-plugin/server'; @@ -106,6 +106,7 @@ export class TaskManagerPlugin private nodeRoles: PluginInitializerContext['node']['roles']; private kibanaDiscoveryService?: KibanaDiscoveryService; private heapSizeLimit: number = 0; + private numOfKibanaInstances$: Subject<number> = new BehaviorSubject(1); constructor(private readonly initContext: PluginInitializerContext) { this.initContext = initContext; @@ -169,6 +170,7 @@ export class TaskManagerPlugin startServicesPromise.then(({ elasticsearch }) => elasticsearch.client), shouldRunTasks: this.shouldRunBackgroundTasks, docLinks: core.docLinks, + numOfKibanaInstances$: this.numOfKibanaInstances$, }); const monitoredUtilization$ = backgroundTaskUtilizationRoute({ router, @@ -260,6 +262,7 @@ export class TaskManagerPlugin logger: this.logger, currentNode: this.taskManagerId!, config: this.config.discovery, + onNodesCounted: (numOfNodes: number) => this.numOfKibanaInstances$.next(numOfNodes), }); if (this.shouldRunBackgroundTasks) { diff --git a/x-pack/plugins/task_manager/server/routes/health.test.ts b/x-pack/plugins/task_manager/server/routes/health.test.ts index e76d218911dc1..e3a7eb278d225 100644 --- a/x-pack/plugins/task_manager/server/routes/health.test.ts +++ b/x-pack/plugins/task_manager/server/routes/health.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { firstValueFrom, of, Subject } from 'rxjs'; +import { firstValueFrom, of, Subject, BehaviorSubject } from 'rxjs'; import { merge } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; import { httpServiceMock, docLinksServiceMock } from '@kbn/core/server/mocks'; @@ -87,6 +87,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const [config] = router.get.mock.calls[0]; @@ -111,6 +112,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const [, handler] = router.get.mock.calls[0]; @@ -153,6 +155,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const [, handler] = router.get.mock.calls[0]; @@ -200,6 +203,7 @@ describe('healthRoute', () => { getClusterClient: () => Promise.resolve(mockClusterClient), shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const [, handler] = router.get.mock.calls[0]; @@ -242,6 +246,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); stats$.next(mockStat); @@ -319,6 +324,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const serviceStatus = firstValueFrom(serviceStatus$); @@ -421,6 +427,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const serviceStatus = firstValueFrom(serviceStatus$); @@ -509,6 +516,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const serviceStatus = firstValueFrom(serviceStatus$); @@ -602,6 +610,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const serviceStatus = firstValueFrom(serviceStatus$); @@ -683,6 +692,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: true, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const serviceStatus = firstValueFrom(serviceStatus$); await sleep(0); @@ -782,6 +792,7 @@ describe('healthRoute', () => { usageCounter: mockUsageCounter, shouldRunTasks: false, docLinks, + numOfKibanaInstances$: new BehaviorSubject(1), }); const serviceStatus = firstValueFrom(serviceStatus$); await sleep(0); @@ -809,6 +820,55 @@ describe('healthRoute', () => { }, }); }); + + it('calls summarizeMonitoringStats with the latest number of Kibana nodes', async () => { + const router = httpServiceMock.createRouter(); + const stats$ = new Subject<MonitoringStats>(); + const numOfKibanaInstances$ = new BehaviorSubject(1); + + const id = uuidv4(); + const config = getTaskManagerConfig({ + monitored_stats_required_freshness: 1000, + monitored_stats_health_verbose_log: { + enabled: true, + level: 'debug', + warn_delayed_task_start_in_seconds: 100, + }, + monitored_aggregated_stats_refresh_rate: 60000, + }); + healthRoute({ + router, + monitoringStats$: stats$, + logger, + taskManagerId: id, + config, + kibanaVersion: '8.0', + kibanaIndexName: '.kibana', + getClusterClient: () => Promise.resolve(elasticsearchServiceMock.createClusterClient()), + usageCounter: mockUsageCounter, + shouldRunTasks: true, + docLinks, + numOfKibanaInstances$, + }); + + stats$.next(mockHealthStats()); + expect(summarizeMonitoringStats).toHaveBeenCalledWith( + expect.anything(), + expect.anything(), + expect.anything(), + 1 + ); + + await sleep(1000); + numOfKibanaInstances$.next(2); + stats$.next(mockHealthStats()); + expect(summarizeMonitoringStats).toHaveBeenCalledWith( + expect.anything(), + expect.anything(), + expect.anything(), + 2 + ); + }); }); function ignoreCapacityEstimation(stats: RawMonitoringStats) { diff --git a/x-pack/plugins/task_manager/server/routes/health.ts b/x-pack/plugins/task_manager/server/routes/health.ts index 38fd2e3b675ca..7bcebfabdca60 100644 --- a/x-pack/plugins/task_manager/server/routes/health.ts +++ b/x-pack/plugins/task_manager/server/routes/health.ts @@ -62,6 +62,7 @@ export interface HealthRouteParams { getClusterClient: () => Promise<IClusterClient>; usageCounter?: UsageCounter; docLinks: DocLinksServiceSetup; + numOfKibanaInstances$: Observable<number>; } export function healthRoute(params: HealthRouteParams): { @@ -80,14 +81,26 @@ export function healthRoute(params: HealthRouteParams): { usageCounter, shouldRunTasks, docLinks, + numOfKibanaInstances$, } = params; + let numOfKibanaInstances = 1; + numOfKibanaInstances$.subscribe((updatedNumber) => { + // if there are no active nodes right now, assume there's at least 1 + numOfKibanaInstances = Math.max(updatedNumber, 1); + }); + // if "hot" health stats are any more stale than monitored_stats_required_freshness (pollInterval +1s buffer by default) // consider the system unhealthy const requiredHotStatsFreshness: number = config.monitored_stats_required_freshness; function getHealthStatus(monitoredStats: MonitoringStats) { - const summarizedStats = summarizeMonitoringStats(logger, monitoredStats, config); + const summarizedStats = summarizeMonitoringStats( + logger, + monitoredStats, + config, + numOfKibanaInstances + ); const { status, reason } = calculateHealthStatus( summarizedStats, config, 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 c4d9c4b720d61..d1f55918547f3 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 @@ -237,7 +237,6 @@ export default function ({ getService }: FtrProviderContext) { expect(typeof workload.overdue).to.eql('number'); expect(typeof workload.non_recurring).to.eql('number'); - expect(typeof workload.owner_ids).to.eql('number'); expect(typeof workload.capacity_requirements.per_minute).to.eql('number'); expect(typeof workload.capacity_requirements.per_hour).to.eql('number'); diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts index ea0de3e6db9a8..241bd8adcd40d 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts @@ -237,7 +237,6 @@ export default function ({ getService }: FtrProviderContext) { expect(typeof workload.overdue).to.eql('number'); expect(typeof workload.non_recurring).to.eql('number'); - expect(typeof workload.owner_ids).to.eql('number'); expect(typeof workload.capacity_requirements.per_minute).to.eql('number'); expect(typeof workload.capacity_requirements.per_hour).to.eql('number'); From 229b574aefa36370e889e0a080dfe79ff0c651d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 2 Oct 2024 12:51:40 +0100 Subject: [PATCH 102/107] [Inventory] Removes environment from Service type identity fields (#194451) When we started working with EEM, we were focusing on the APM UI pages, thus we added the service environment as an identifier field. Now that we are moving away from it, we no longer need it listed on the Service type definition. <img width="1579" alt="Screenshot 2024-09-30 at 16 29 02" src="https://github.com/user-attachments/assets/1b8f8835-f083-44fc-b7f8-2142c48ed8e3"> --- .../server/lib/entities/built_in/services_from_ecs_data.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/entity_manager/server/lib/entities/built_in/services_from_ecs_data.ts b/x-pack/plugins/entity_manager/server/lib/entities/built_in/services_from_ecs_data.ts index 96667fb4d0af4..59512c6cded9a 100644 --- a/x-pack/plugins/entity_manager/server/lib/entities/built_in/services_from_ecs_data.ts +++ b/x-pack/plugins/entity_manager/server/lib/entities/built_in/services_from_ecs_data.ts @@ -20,7 +20,7 @@ const serviceTransactionFilter = (additionalFilters: string[] = []) => { export const builtInServicesFromEcsEntityDefinition: EntityDefinition = entityDefinitionSchema.parse({ - version: '1.0.3', + version: '0.2.0', id: `${BUILT_IN_ID_PREFIX}services_from_ecs_data`, name: 'Services from ECS data', description: @@ -42,8 +42,8 @@ export const builtInServicesFromEcsEntityDefinition: EntityDefinition = syncDelay: '2m', }, }, - identityFields: ['service.name', { field: 'service.environment', optional: true }], - displayNameTemplate: '{{service.name}}{{#service.environment}}:{{.}}{{/service.environment}}', + identityFields: ['service.name'], + displayNameTemplate: '{{service.name}}', metadata: [ { source: '_index', destination: 'sourceIndex' }, { source: 'agent.name', aggregation: { type: 'terms', limit: 100 } }, From eb732085d3e48347a82d88c9e349777280307d02 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 2 Oct 2024 21:52:23 +1000 Subject: [PATCH 103/107] skip failing test suite (#194673) --- .../functional/test_suites/search/elasticsearch_start.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts index 9e83057544003..8c98dcabdedc1 100644 --- a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts +++ b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts @@ -26,7 +26,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esDeleteAllIndices(['search-*', 'test-*']); }; - describe('Elasticsearch Start [Onboarding Empty State]', function () { + // Failing: See https://github.com/elastic/kibana/issues/194673 + describe.skip('Elasticsearch Start [Onboarding Empty State]', function () { describe('developer', function () { before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); From 8e21442caa8e93ab85aed64c102f972985f96ab3 Mon Sep 17 00:00:00 2001 From: Larry Gregory <larry.gregory@elastic.co> Date: Wed, 2 Oct 2024 07:55:32 -0400 Subject: [PATCH 104/107] Add dependency docs (#194333) ## Summary Adds and re-organizes documentation for using third-party dependencies. --- dev_docs/contributing/dev_principles.mdx | 2 + dev_docs/contributing/standards.mdx | 41 +--------- .../contributing/third_party_dependencies.mdx | 74 +++++++++++++++++++ dev_docs/nav-kibana-dev.docnav.json | 5 +- 4 files changed, 81 insertions(+), 41 deletions(-) create mode 100644 dev_docs/contributing/third_party_dependencies.mdx diff --git a/dev_docs/contributing/dev_principles.mdx b/dev_docs/contributing/dev_principles.mdx index cbea79e658684..8633352863011 100644 --- a/dev_docs/contributing/dev_principles.mdx +++ b/dev_docs/contributing/dev_principles.mdx @@ -85,6 +85,8 @@ When the use of an external dependency is necessary, ensure there is sufficient Except in specific cases where widespread consensus was gained and clear ownership is established, third party dependencies should not be exposed directly as features of Kibana, whether it be through the UI, HTTP API, or programmatic interfaces. +See the <DocLink id="kibThirdPartyDependencies" text="third-party dependencies guide" /> for more information. + ## Don't share code prematurely There are many modules throughout Kibana's codebase where we have generic utilities that seem appropriate for use elsewhere in the codebase, but doing so is creating another public interface which has a cost in terms of maintenance, testing, documentation, and complexity that increases with each usage. Over the long term, shared utilities tend to accumulate additional complexity in order to be flexible enough for the various use cases of its consumers, particularly when they are shared across domain/plugin boundaries. diff --git a/dev_docs/contributing/standards.mdx b/dev_docs/contributing/standards.mdx index 80df5f4752131..bb63eda578451 100644 --- a/dev_docs/contributing/standards.mdx +++ b/dev_docs/contributing/standards.mdx @@ -17,46 +17,7 @@ Please read and abide by our <DocLink id="kibStyleGuide" text="Style guide" />. ## Adding dependencies -Looking for a dependency that isn't already available in Kibana? There are a few things to keep in mind before adding a new dependency. - -First, be sure you have read and are familiar with our <DocLink id="kibDevPrinciples" />. In particular, **Be wary of dependencies** -and **Prefer one way to do things** provide an overview of how we approach this question. - -In general, we have a bias toward **not** adding new dependencies unless there is a compelling reason to do so, as we want to -minimize Kibana's overall complexity. - -Should you find yourself evaluating a new dependency, here are some specific things to ask yourself: - -1. **Is there already another dependency that offers similar functionality?** If so, adding a new dependency may not be necessary. -Prefer one way to do things and use what's already there, unless there is an important reason not to do so. -2. **Does this dependency appear to be well-maintained?** A dependency that hasn't been updated in years is usually more of a -liability than an asset. Make sure the depedency has recent activity, that bugs and security vulnerabilities appear to be addressed -in a timely manner, and that there is active participation from the maintainers and community. -3. **How large is the dependency?** For client-side plugins, heavy dependencies can have a real impact on user experience, -especially if they are included in the initial page bundle and not loaded asynchronously. In some cases it might make more sense -to roll your own rather than include a bloated depedency, especially if you are only using a single piece of functionality. -4. **Does this dependency have a license that's compatible with Kibana's?** Most common open source licenses such as BSD, MIT, -and Apache 2.0/1.1 are okay to use with Kibana. Others may not be, or may require special attribution. -5. **Will this dependency need to be prebuilt?** Due to our build process, native module dependencies should include at least a prebuild -step so at install time it simply downloads instead of building from source. This allows us to optimize bootstrap times. -6. **Am I committed to maintaining this dependency?** Once you add a dependency to the `package.json`, someone else isn't going to -keep it updated for you. That means you will be responsible for updating it regularly, keeping an eye out for security vulnerabilities, -and dealing with any breaking changes that may arise during an upgrade. We recommend relying on the renovate bot to help keep the -dependency updated; be sure to mark your ownership of the package in the -[`renovate.json`](https://github.com/elastic/kibana/blob/main/renovate.json`) file. - -If you have any questions about whether adding a dependency is appropriate, feel free to reach out to one of the following teams -on Github: - -- **@elastic/kibana-tech-leads** -- **@elastic/kibana-core** -- **@elastic/kibana-operations** -- **@elastic/kibana-security** - -<DocCallOut title="Internal only"> - If you are unsure of which licenses are okay to use, refer to the - [Permitted Open Source Licenses list](https://github.com/elastic/open-source/blob/main/elastic-product-policy.md#permitted-licenses-list). -</DocCallOut> +Please read and abide by our <DocLink id="kibThirdPartyDependencies" text="third-party dependencies guide" />. ## RESTful HTTP APIs diff --git a/dev_docs/contributing/third_party_dependencies.mdx b/dev_docs/contributing/third_party_dependencies.mdx new file mode 100644 index 0000000000000..ea8eb9cd154a9 --- /dev/null +++ b/dev_docs/contributing/third_party_dependencies.mdx @@ -0,0 +1,74 @@ +--- +id: kibThirdPartyDependencies +slug: /kibana-dev-docs/third-party-dependencies +title: Managing third-party dependencies +description: Expectations for working with third-party dependencies +date: 2024-10-01 +tags: ['contributor', 'dev', 'kibana', 'npm', 'dependencies', 'third-party', 'dependency'] +--- + +## Third-party dependencies + +Third-party dependencies allow us to leverage the broader web development community to effeciently bring ideas to life, without having to re-invent the wheel. +This is an attractive proposition, but using someone else's code does not absolve us of responsibility. + +The Kibana project is not just the code we commit to the repo but rather the combined total of all of the source code from our own repo and all of the external dependencies we rely on. When a user encounters a deficiency in Kibana, it matters not whether the root cause is in code we've written or external code we depend on. Additionally, relying on a dependency is a considerable expense in terms of cognitive burden, maintenance overhead, and risk. + +Except for highly specialized functionality, dependencies often do more harm in the long term than their short term benefits justify. Always be critical of new external dependencies being added to the project, and frequently re-evaluate the use of existing dependencies. + +When the use of an external dependency is necessary, ensure there is sufficient integration testing in Kibana to ensure it continues to operate the way we'd expect when we change the consuming code in Kibana or upgrade the dependency code. + +Except in specific cases where widespread consensus was gained and clear ownership is established, third party dependencies should not be exposed directly as features of Kibana, whether it be through the UI, HTTP API, or programmatic interfaces. + + +<DocCallOut> +Treat third-party code as if it was your own. We share the responsibility for the efficacy, performance, and security of both the code we integrate and the code we develop. +</DocCallOut> + + +## Adding new dependencies + +Looking for a dependency that isn't already available in Kibana? There are a few things to keep in mind before adding a new dependency. + +First, be sure you have read and are familiar with our <DocLink id="kibDevPrinciples" />. In particular, **Be wary of dependencies** +and **Prefer one way to do things** provide an overview of how we approach this question. + +In general, we have a bias toward **not** adding new dependencies unless there is a compelling reason to do so, as we want to +minimize Kibana's overall complexity. + +Should you find yourself evaluating a new dependency, here are some specific things to ask yourself: + +1. **Is there already another dependency that offers similar functionality?** If so, adding a new dependency may not be necessary. +Prefer one way to do things and use what's already there, unless there is an important reason not to do so. +2. **Does this dependency appear to be well-maintained?** A dependency that hasn't been updated in years is usually more of a +liability than an asset. Make sure the depedency has recent activity, that bugs and security vulnerabilities appear to be addressed +in a timely manner, and that there is active participation from the maintainers and community. +3. **How large is the dependency?** For client-side plugins, heavy dependencies can have a real impact on user experience, +especially if they are included in the initial page bundle and not loaded asynchronously. In some cases it might make more sense +to roll your own rather than include a bloated depedency, especially if you are only using a single piece of functionality. +4. **Does this dependency have a license that's compatible with Kibana's?** Most common open source licenses such as BSD, MIT, +and Apache 2.0/1.1 are okay to use with Kibana. Others may not be, or may require special attribution. +5. **Will this dependency need to be prebuilt?** Due to our build process, native module dependencies are only supported for development (`devDependencies`), and are not supported for production (`dependencies`). +6. **Am I committed to maintaining this dependency?** Once you add a dependency to the `package.json`, someone else isn't going to +keep it updated for you. That means you will be responsible for updating it regularly, keeping an eye out for security vulnerabilities, +and dealing with any breaking changes that may arise during an upgrade. We recommend (and will soon require) relying on the renovate bot to help keep the +dependency updated; be sure to mark your ownership of the package in the +[`renovate.json`](https://github.com/elastic/kibana/blob/main/renovate.json`) file. + +If you have any questions about whether adding a dependency is appropriate, feel free to reach out to one of the following teams +on Github: + +- **@elastic/kibana-tech-leads** +- **@elastic/kibana-core** +- **@elastic/kibana-operations** +- **@elastic/kibana-security** + +<DocCallOut title="Internal only"> + If you are unsure of which licenses are okay to use, refer to the + [Permitted Open Source Licenses list](https://github.com/elastic/open-source/blob/main/elastic-product-policy.md#permitted-licenses-list). +</DocCallOut> + +## Using existing dependencies + +Using an existing dependency is typically preferred over adding a new one. +Please consult with the owning team before using an existing dependency, as they may have specific guidelines or concerns about its use. diff --git a/dev_docs/nav-kibana-dev.docnav.json b/dev_docs/nav-kibana-dev.docnav.json index 08c0fef042d34..8b8cd64a44664 100644 --- a/dev_docs/nav-kibana-dev.docnav.json +++ b/dev_docs/nav-kibana-dev.docnav.json @@ -51,6 +51,9 @@ }, { "id": "kibGitHub" + }, + { + "id": "kibThirdPartyDependencies" } ] }, @@ -646,4 +649,4 @@ ] } ] -} +} \ No newline at end of file From 4dca8f6f703bcaa5aba41c73d72457ede1c5d552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= <alejandro.haro@elastic.co> Date: Wed, 2 Oct 2024 14:21:54 +0200 Subject: [PATCH 105/107] chore(deps): Add `joi` to the hapi group in renovate (#194623) --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index fa304f97a0d6b..f963c75cd33e6 100644 --- a/renovate.json +++ b/renovate.json @@ -136,7 +136,7 @@ }, { "groupName": "HAPI ecosystem", - "matchDepNames": ["@hapi/**", "brok"], + "matchDepNames": ["@hapi/**", "brok", "joi"], "reviewers": ["team:kibana-core"], "matchBaseBranches": ["main"], "labels": ["release_note:skip", "Team:Core", "backport:prev-minor"], From 04fe43d4c2092732000a5d1c805315a74139c32f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= <alejandro.haro@elastic.co> Date: Wed, 2 Oct 2024 14:22:28 +0200 Subject: [PATCH 106/107] chore(deps): upgrade `rxjs` (#194610) --- package.json | 2 +- renovate.json | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d15c14e25332..9e75344e6e0a4 100644 --- a/package.json +++ b/package.json @@ -1241,7 +1241,7 @@ "reselect": "^4.1.8", "resize-observer-polyfill": "1.5.1", "rison-node": "1.0.2", - "rxjs": "^7.5.5", + "rxjs": "^7.8.1", "safe-squel": "^5.12.5", "seedrandom": "^3.0.5", "semver": "^7.6.3", diff --git a/renovate.json b/renovate.json index f963c75cd33e6..ba2b7bcb39d4d 100644 --- a/renovate.json +++ b/renovate.json @@ -108,6 +108,14 @@ "labels": ["release_note:skip", "Team:Core", "backport:skip"], "enabled": true }, + { + "groupName": "RxJS", + "matchDepNames": ["rxjs"], + "reviewers": ["team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Core", "backport:skip"], + "enabled": true + }, { "groupName": "@elastic/ebt", "matchDepNames": ["@elastic/ebt"], From 833a267419f1d9e2b8cb5e46d8c1ae72494c8ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= <alejandro.haro@elastic.co> Date: Wed, 2 Oct 2024 14:24:02 +0200 Subject: [PATCH 107/107] chore(deps): add `lodash` to renovate (#194613) --- renovate.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/renovate.json b/renovate.json index ba2b7bcb39d4d..029dab13f394f 100644 --- a/renovate.json +++ b/renovate.json @@ -124,6 +124,14 @@ "labels": ["release_note:skip", "Team:Core", "backport:skip"], "enabled": true }, + { + "groupName": "lodash", + "matchDepNames": ["lodash", "@types/lodash"], + "reviewers": ["team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Core", "backport:skip"], + "enabled": true + }, { "groupName": "ansi-regex", "matchDepNames": ["ansi-regex"],