From 45ff639c930528f1edb1039c6c09f3001b570b8f Mon Sep 17 00:00:00 2001 From: Jenny Date: Wed, 11 Sep 2024 18:17:52 +0200 Subject: [PATCH 001/168] WIP Replace _source in the APM queries --- .../waterfall_helpers/waterfall_helpers.ts | 15 ++++++- .../get_downstream_dependency_name.ts | 3 +- .../get_metadata_for_dependency.ts | 10 +++-- .../get_top_erroneous_transactions.ts | 3 +- .../get_error_group_main_statistics.ts | 25 ++++++++--- .../get_error_sample_details.ts | 12 +++-- .../services/get_service_metadata_details.ts | 9 ++-- .../routes/span_links/get_linked_parents.ts | 7 ++- .../server/routes/traces/get_trace_items.ts | 45 ++++++++++++++++++- .../routes/transactions/get_span/index.ts | 7 ++- .../transactions/get_transaction/index.ts | 30 ++++++++++++- .../get_transaction_by_name/index.ts | 6 ++- .../get_transaction_by_trace/index.ts | 10 +++-- .../transactions/trace_samples/index.ts | 7 +-- .../apm/server/utils/normalize_fields.ts | 22 +++++++++ 15 files changed, 178 insertions(+), 33 deletions(-) create mode 100644 x-pack/plugins/observability_solution/apm/server/utils/normalize_fields.ts diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts index b9a8f1d8cd15c..5c619bed61a46 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts @@ -171,10 +171,12 @@ function getErrorItem( | IWaterfallSpanOrTransaction | undefined; + console.log('error',error); const errorItem: IWaterfallError = { docType: 'error', doc: error, - id: error.error.id, + // TODO FIX ME + id: error?.error?.id ?? '', parent, parentId: parent?.id, offset: error.timestamp.us - entryTimestamp, @@ -441,6 +443,17 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { const errorCountByParentId = getErrorCountByParentId(traceItems.errorDocs); + console.log( + 'traceItems.traceDocs, traceItems.spanLinksCountById', + traceItems.traceDocs, + traceItems.spanLinksCountById + ); + console.log( + 'traceItems, traceItems.spanLinksCountById', + traceItems, + traceItems.spanLinksCountById + ); + const waterfallItems: IWaterfallSpanOrTransaction[] = getWaterfallItems( traceItems.traceDocs, traceItems.spanLinksCountById diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_downstream_dependency_name.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_downstream_dependency_name.ts index a5b75f76ff237..b3bb446d84419 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_downstream_dependency_name.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_observability_alert_details_context/get_downstream_dependency_name.ts @@ -50,9 +50,10 @@ export async function getDownstreamServiceResource({ ], }, }, + fields: ['span.destination.service'], }, }); const hit = response.hits.hits[0]; - return hit?._source?.span.destination?.service.resource; + return hit?.fields?.['span.destination?.service?.resource']?.[0]; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts index ebb3d3f57d18a..e8f03301dd904 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts @@ -10,6 +10,7 @@ import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { maybe } from '../../../common/utils/maybe'; import { SPAN_DESTINATION_SERVICE_RESOURCE } from '../../../common/es_fields/apm'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { normalizeFields } from '../../utils/normalize_fields'; export interface MetadataForDependencyResponse { spanType: string | undefined; @@ -46,16 +47,19 @@ export async function getMetadataForDependency({ ], }, }, + fields: ['*'], sort: { '@timestamp': 'desc', }, }, }); - const sample = maybe(sampleResponse.hits.hits[0])?._source; + const sample = maybe(sampleResponse.hits.hits[0])?.fields; + const sampleNorm = sample ? normalizeFields(sample) : null; + console.log('sampleNorm', sampleNorm); return { - spanType: sample?.span.type, - spanSubtype: sample?.span.subtype, + spanType: sampleNorm?.span.type, + spanSubtype: sampleNorm?.span.subtype, }; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts b/x-pack/plugins/observability_solution/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts index c5387ea5e7593..3065f1b0db23d 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts @@ -94,6 +94,7 @@ async function getTopErroneousTransactions({ top_hits: { size: 1, _source: [TRANSACTION_TYPE], + fields: [TRANSACTION_TYPE], }, }, timeseries: { @@ -117,7 +118,7 @@ async function getTopErroneousTransactions({ ({ key, doc_count: docCount, sample, timeseries }) => { return { transactionName: key as string, - transactionType: sample.hits.hits[0]._source.transaction?.type, + transactionType: sample.hits.hits[0].fields?.['transaction.type']?.[0], occurrences: docCount, timeseries: timeseries.buckets.map((timeseriesBucket) => { return { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts b/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts index 1e9576ea2f7e4..be1fc837dc82b 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts @@ -7,6 +7,7 @@ import { AggregationsAggregateOrder } from '@elastic/elasticsearch/lib/api/types'; import { kqlQuery, rangeQuery, termQuery, wildcardQuery } from '@kbn/observability-plugin/server'; +import { normalizeFields } from '../../../utils/normalize_fields'; import { ERROR_CULPRIT, ERROR_EXC_HANDLED, @@ -139,6 +140,16 @@ export async function getErrorGroupMainStatistics({ ERROR_GROUP_ID, '@timestamp', ], + fields: [ + TRACE_ID, + ERROR_LOG_MESSAGE, + ERROR_EXC_MESSAGE, + ERROR_EXC_HANDLED, + ERROR_EXC_TYPE, + ERROR_CULPRIT, + ERROR_GROUP_ID, + '@timestamp', + ], sort: { '@timestamp': 'desc', }, @@ -157,15 +168,17 @@ export async function getErrorGroupMainStatistics({ const errorGroups = response.aggregations?.error_groups.buckets.map((bucket) => { + const fields = bucket.sample.hits.hits[0]?.fields; + const fieldsNorm = normalizeFields(fields); return { groupId: bucket.key as string, - name: getErrorName(bucket.sample.hits.hits[0]._source), - lastSeen: new Date(bucket.sample.hits.hits[0]._source['@timestamp']).getTime(), + name: getErrorName(fieldsNorm), + lastSeen: new Date(fieldsNorm['@timestamp']).getTime(), occurrences: bucket.doc_count, - culprit: bucket.sample.hits.hits[0]._source.error.culprit, - handled: bucket.sample.hits.hits[0]._source.error.exception?.[0].handled, - type: bucket.sample.hits.hits[0]._source.error.exception?.[0].type, - traceId: bucket.sample.hits.hits[0]._source.trace?.id, + culprit: fieldsNorm.error.culprit, + handled: fieldsNorm.error.exception?.[0].handled, + type: fieldsNorm.error.exception?.[0].type, + traceId: fieldsNorm.trace?.id, }; }) ?? []; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts b/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts index 348949d3ecca5..c25a459d3257c 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts @@ -6,6 +6,7 @@ */ import { rangeQuery, kqlQuery } from '@kbn/observability-plugin/server'; +import { normalizeFields } from '../../../utils/normalize_fields'; import { ERROR_ID, SERVICE_NAME } from '../../../../common/es_fields/apm'; import { environmentQuery } from '../../../../common/utils/environment_query'; import { ApmDocumentType } from '../../../../common/document_type'; @@ -64,9 +65,12 @@ export async function getErrorSampleDetails({ }; const resp = await apmEventClient.search('get_error_sample_details', params); - const error = resp.hits.hits[0]?._source; - const transactionId = error?.transaction?.id; - const traceId = error?.trace?.id; + // const error = resp.hits.hits[0]?._source; + + const error = resp.hits.hits[0]?.fields; + const errorNorm = normalizeFields(error); + const transactionId = errorNorm?.transaction?.id; + const traceId = errorNorm?.trace?.id; let transaction; if (transactionId && traceId) { @@ -81,6 +85,6 @@ export async function getErrorSampleDetails({ return { transaction, - error, + error: errorNorm, }; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts index d7a81a7902efb..a2d36e20d8bfd 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/get_service_metadata_details.ts @@ -33,6 +33,7 @@ import { TransactionRaw } from '../../../typings/es_schemas/raw/transaction_raw' import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; import { should } from './get_service_metadata_icons'; import { isOpenTelemetryAgentName } from '../../../common/agent_name'; +import { normalizeFields } from '../../utils/normalize_fields'; type ServiceMetadataDetailsRaw = Pick< TransactionRaw, @@ -171,8 +172,10 @@ export async function getServiceMetadataDetails({ const response = await apmEventClient.search('get_service_metadata_details', params); - const hit = response.hits.hits[0]?._source as ServiceMetadataDetailsRaw | undefined; - if (!hit) { + const fields = response.hits.hits[0]?.fields; + const fieldsNorm = normalizeFields(fields) as ServiceMetadataDetailsRaw | undefined; + + if (!fieldsNorm) { return { service: undefined, container: undefined, @@ -180,7 +183,7 @@ export async function getServiceMetadataDetails({ }; } - const { service, agent, host, kubernetes, container, cloud, labels } = hit; + const { service, agent, host, kubernetes, container, cloud, labels } = fieldsNorm; const serviceMetadataDetails = { versions: response.aggregations?.serviceVersions.buckets.map((bucket) => bucket.key as string), diff --git a/x-pack/plugins/observability_solution/apm/server/routes/span_links/get_linked_parents.ts b/x-pack/plugins/observability_solution/apm/server/routes/span_links/get_linked_parents.ts index 2010cd5e86f2f..901e23f0a061b 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/span_links/get_linked_parents.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/span_links/get_linked_parents.ts @@ -16,6 +16,7 @@ import { import { SpanRaw } from '../../../typings/es_schemas/raw/span_raw'; import { TransactionRaw } from '../../../typings/es_schemas/raw/transaction_raw'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { normalizeFields } from '../../utils/normalize_fields'; export async function getLinkedParentsOfSpan({ apmEventClient, @@ -56,7 +57,9 @@ export async function getLinkedParentsOfSpan({ }, }); - const source = response.hits.hits?.[0]?._source as TransactionRaw | SpanRaw; + const fields = response.hits.hits[0]?.fields; + const fieldsNorm = normalizeFields(fields) as TransactionRaw | SpanRaw | undefined; + // const source = response.hits.hits?.[0]?._source as TransactionRaw | SpanRaw; - return source?.span?.links || []; + return fieldsNorm?.span?.links || []; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/traces/get_trace_items.ts b/x-pack/plugins/observability_solution/apm/server/routes/traces/get_trace_items.ts index d38a49745653a..f9bda920ba3f2 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/traces/get_trace_items.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/traces/get_trace_items.ts @@ -54,6 +54,7 @@ import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_ev import { getSpanLinksCountById } from '../span_links/get_linked_children'; import { ApmDocumentType } from '../../../common/document_type'; import { RollupInterval } from '../../../common/rollup'; +import { normalizeFields } from '../../utils/normalize_fields'; export interface TraceItems { exceedsMax: boolean; @@ -114,6 +115,17 @@ export async function getTraceItems({ }, }, }, + fields: [ + TIMESTAMP, + TRACE_ID, + TRANSACTION_ID, + PARENT_ID, + SERVICE_NAME, + ERROR_ID, + ERROR_LOG_MESSAGE, + ERROR_EXCEPTION, + ERROR_GROUP_ID, + ], }); const traceResponsePromise = getTraceDocsPaginated({ @@ -133,8 +145,9 @@ export async function getTraceItems({ const traceDocsTotal = traceResponse.total; const exceedsMax = traceDocsTotal > maxTraceItems; - const traceDocs = traceResponse.hits.map((hit) => hit._source); - const errorDocs = errorResponse.hits.hits.map((hit) => hit._source); + + const traceDocs = traceResponse.hits.map((hit) => normalizeFields(hit.fields)); + const errorDocs = errorResponse.hits.hits.map((hit) => normalizeFields(hit.fields)); return { exceedsMax, @@ -266,6 +279,34 @@ async function getTraceDocsPerPage({ }, }, }, + fields: [ + TIMESTAMP, + TRACE_ID, + PARENT_ID, + SERVICE_NAME, + SERVICE_ENVIRONMENT, + AGENT_NAME, + EVENT_OUTCOME, + PROCESSOR_EVENT, + TRANSACTION_DURATION, + TRANSACTION_ID, + TRANSACTION_NAME, + TRANSACTION_TYPE, + TRANSACTION_RESULT, + FAAS_COLDSTART, + SPAN_ID, + SPAN_TYPE, + SPAN_SUBTYPE, + SPAN_ACTION, + SPAN_NAME, + SPAN_DURATION, + SPAN_LINKS, + SPAN_COMPOSITE_COUNT, + SPAN_COMPOSITE_COMPRESSION_STRATEGY, + SPAN_COMPOSITE_SUM, + SPAN_SYNC, + CHILD_ID, + ], sort: [ { _score: 'asc' }, { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_span/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_span/index.ts index 4e1b7020a98a6..98c941921caa2 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_span/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_span/index.ts @@ -13,6 +13,7 @@ import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm import { getTransaction } from '../get_transaction'; import { Span } from '../../../../typings/es_schemas/ui/span'; import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; +import { normalizeFields } from '../../../utils/normalize_fields'; export async function getSpan({ spanId, @@ -48,6 +49,7 @@ export async function getSpan({ }, }, }, + fields: ['*'], }), parentTransactionId ? getTransaction({ @@ -60,5 +62,8 @@ export async function getSpan({ : undefined, ]); - return { span: spanResp.hits.hits[0]?._source, parentTransaction }; + const fields = spanResp.hits.hits[0]?.fields; + const fieldsNorm = normalizeFields(fields); + + return { span: fieldsNorm, parentTransaction }; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts index 8854f3075e59b..d7aded8ebedfc 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts @@ -6,7 +6,18 @@ */ import { rangeQuery, termQuery } from '@kbn/observability-plugin/server'; -import { TRACE_ID, TRANSACTION_ID } from '../../../../common/es_fields/apm'; +import { normalizeFields } from '../../../utils/normalize_fields'; +import { + AGENT_NAME, + EVENT_OUTCOME, + SERVICE_ENVIRONMENT, + SERVICE_NAME, + SPAN_DURATION, + SPAN_ID, + SPAN_NAME, + TRACE_ID, + TRANSACTION_ID, +} from '../../../../common/es_fields/apm'; import { asMutableArray } from '../../../../common/utils/as_mutable_array'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { ApmDocumentType } from '../../../../common/document_type'; @@ -48,7 +59,22 @@ export async function getTransaction({ }, }, }, + fields: ['*'], }); - return resp.hits.hits[0]?._source; + const fields = resp.hits.hits[0]?.fields; + const fieldsNorm = normalizeFields(fields); + + return fieldsNorm; } + +// function normalizeFields(fields: Partial>): Record { +// const normalizedFields: Record = {}; + +// for (const [key, value] of Object.entries(fields)) { +// const normalizedValue = Array.isArray(value) && value.length > 0 ? value[0] : value; + +// set(normalizedFields, key, normalizedValue); +// } +// return normalizedFields; +// } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts index 75b4655d70117..24733306b84f5 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts @@ -6,6 +6,7 @@ */ import { rangeQuery } from '@kbn/observability-plugin/server'; +import { normalizeFields } from '../../../utils/normalize_fields'; import { ApmDocumentType } from '../../../../common/document_type'; import { SERVICE_NAME, TRANSACTION_NAME } from '../../../../common/es_fields/apm'; import { RollupInterval } from '../../../../common/rollup'; @@ -50,5 +51,8 @@ export async function getTransactionByName({ }, }); - return resp.hits.hits[0]?._source; + const fields = resp.hits.hits[0]?.fields; + const fieldsNorm = normalizeFields(fields); + + return fieldsNorm; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts index d27be0489f8da..b7cb5528de692 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts @@ -7,6 +7,7 @@ import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { rangeQuery } from '@kbn/observability-plugin/server'; +import { normalizeFields } from '../../../utils/normalize_fields'; import { TRACE_ID, PARENT_ID } from '../../../../common/es_fields/apm'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; @@ -49,7 +50,10 @@ export async function getRootTransactionByTraceId({ }; const resp = await apmEventClient.search('get_root_transaction_by_trace_id', params); - return { - transaction: resp.hits.hits[0]?._source, - }; + const fields = resp.hits.hits[0]?.fields; + const fields_norm = normalizeFields(fields); + + console.log(fields_norm); + + return fields_norm; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/trace_samples/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/trace_samples/index.ts index 191250d3781ee..9b9bd75d16518 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/trace_samples/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/trace_samples/index.ts @@ -94,6 +94,7 @@ export async function getTraceSamples({ }, }, size: TRACE_SAMPLES_SIZE, + fields: [TRANSACTION_ID, TRACE_ID, '@timestamp'], sort: [ { _score: { @@ -111,9 +112,9 @@ export async function getTraceSamples({ const traceSamples = response.hits.hits.map((hit) => ({ score: hit._score, - timestamp: hit._source['@timestamp'], - transactionId: hit._source.transaction.id, - traceId: hit._source.trace.id, + timestamp: hit.fields['@timestamp']?.[0], + transactionId: hit.fields[TRANSACTION_ID]?.[0], + traceId: hit.fields[TRACE_ID]?.[0], })); return { traceSamples }; diff --git a/x-pack/plugins/observability_solution/apm/server/utils/normalize_fields.ts b/x-pack/plugins/observability_solution/apm/server/utils/normalize_fields.ts new file mode 100644 index 0000000000000..845176b64c561 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/utils/normalize_fields.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { set } from '@kbn/safer-lodash-set'; + +export const normalizeFields = ( + fields: Partial> +): Record => { + const normalizedFields: Record = {}; + + for (const [key, value] of Object.entries(fields)) { + const normalizedValue = Array.isArray(value) && value.length > 0 ? value[0] : value; + + set(normalizedFields, key, normalizedValue); + } + + return normalizedFields; +}; From b082ebdddb40182b5ab344c20cda6917a11dc86e Mon Sep 17 00:00:00 2001 From: Jenny Date: Wed, 11 Sep 2024 20:24:26 +0200 Subject: [PATCH 002/168] Add fields to some queries --- .../routes/transactions/get_transaction_by_name/index.ts | 1 + .../routes/transactions/get_transaction_by_trace/index.ts | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts index 24733306b84f5..63f4f2aef2ebb 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_name/index.ts @@ -49,6 +49,7 @@ export async function getTransactionByName({ }, }, }, + fields: ['*'], }); const fields = resp.hits.hits[0]?.fields; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts index b7cb5528de692..42f405297eeac 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction_by_trace/index.ts @@ -46,14 +46,13 @@ export async function getRootTransactionByTraceId({ filter: [{ term: { [TRACE_ID]: traceId } }, ...rangeQuery(start, end)], }, }, + fields: ['*'], }, }; const resp = await apmEventClient.search('get_root_transaction_by_trace_id', params); const fields = resp.hits.hits[0]?.fields; - const fields_norm = normalizeFields(fields); + const fieldsNorm = normalizeFields(fields); - console.log(fields_norm); - - return fields_norm; + return fieldsNorm; } From e3ca03ef2565743afca1ba3a5da6d88d3a7f393b Mon Sep 17 00:00:00 2001 From: Jenny Date: Wed, 11 Sep 2024 20:46:21 +0200 Subject: [PATCH 003/168] lint fixes --- .../waterfall_helpers/waterfall_helpers.ts | 14 ++--------- .../get_metadata_for_dependency.ts | 2 +- .../transactions/get_transaction/index.ts | 23 +------------------ 3 files changed, 4 insertions(+), 35 deletions(-) diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts index 5c619bed61a46..c4def24952830 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts @@ -171,7 +171,8 @@ function getErrorItem( | IWaterfallSpanOrTransaction | undefined; - console.log('error',error); + // console.log('error',error); + const errorItem: IWaterfallError = { docType: 'error', doc: error, @@ -443,17 +444,6 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { const errorCountByParentId = getErrorCountByParentId(traceItems.errorDocs); - console.log( - 'traceItems.traceDocs, traceItems.spanLinksCountById', - traceItems.traceDocs, - traceItems.spanLinksCountById - ); - console.log( - 'traceItems, traceItems.spanLinksCountById', - traceItems, - traceItems.spanLinksCountById - ); - const waterfallItems: IWaterfallSpanOrTransaction[] = getWaterfallItems( traceItems.traceDocs, traceItems.spanLinksCountById diff --git a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts index e8f03301dd904..a814fe086bc5e 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/dependencies/get_metadata_for_dependency.ts @@ -57,7 +57,7 @@ export async function getMetadataForDependency({ const sample = maybe(sampleResponse.hits.hits[0])?.fields; const sampleNorm = sample ? normalizeFields(sample) : null; - console.log('sampleNorm', sampleNorm); + // console.log('sampleNorm', sampleNorm); return { spanType: sampleNorm?.span.type, spanSubtype: sampleNorm?.span.subtype, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts index d7aded8ebedfc..3c92fec4b6f0d 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/transactions/get_transaction/index.ts @@ -7,17 +7,7 @@ import { rangeQuery, termQuery } from '@kbn/observability-plugin/server'; import { normalizeFields } from '../../../utils/normalize_fields'; -import { - AGENT_NAME, - EVENT_OUTCOME, - SERVICE_ENVIRONMENT, - SERVICE_NAME, - SPAN_DURATION, - SPAN_ID, - SPAN_NAME, - TRACE_ID, - TRANSACTION_ID, -} from '../../../../common/es_fields/apm'; +import { TRACE_ID, TRANSACTION_ID } from '../../../../common/es_fields/apm'; import { asMutableArray } from '../../../../common/utils/as_mutable_array'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { ApmDocumentType } from '../../../../common/document_type'; @@ -67,14 +57,3 @@ export async function getTransaction({ return fieldsNorm; } - -// function normalizeFields(fields: Partial>): Record { -// const normalizedFields: Record = {}; - -// for (const [key, value] of Object.entries(fields)) { -// const normalizedValue = Array.isArray(value) && value.length > 0 ? value[0] : value; - -// set(normalizedFields, key, normalizedValue); -// } -// return normalizedFields; -// } From 2dc1aca175f9fda7f5b2f7bf87b41b0dbf6d01fd Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 11 Sep 2024 15:56:00 -0600 Subject: [PATCH 004/168] [Security Solution] AI Assistant - System prompt move (#191847) --- .../assistant/assistant_body/empty_convo.tsx | 16 +- .../impl/assistant/assistant_body/index.tsx | 17 +- .../chat_send/use_chat_send.test.tsx | 17 - .../assistant/chat_send/use_chat_send.tsx | 11 +- .../conversation_settings.tsx | 1 - .../conversation_settings_editor.tsx | 16 +- .../index.tsx | 2 - .../impl/assistant/index.tsx | 23 +- .../impl/assistant/prompt/helpers.test.ts | 94 +---- .../impl/assistant/prompt/helpers.ts | 33 +- .../prompt}/translations.ts | 9 - .../system_prompt/helpers.test.tsx | 11 +- .../prompt_editor/system_prompt/helpers.tsx | 16 +- .../system_prompt/index.test.tsx | 371 ++---------------- .../prompt_editor/system_prompt/index.tsx | 49 +-- .../select_system_prompt/index.test.tsx | 2 +- .../select_system_prompt/index.tsx | 96 +---- .../system_prompt_editor.tsx | 11 +- .../system_prompt_settings.test.tsx | 4 +- .../assistant/settings/assistant_settings.tsx | 4 +- .../assistant/upgrade_license_cta/index.tsx | 2 +- .../upgrade_license_cta}/translations.ts | 0 .../use_conversation/helpers.test.ts | 4 +- .../assistant/use_conversation/helpers.ts | 28 +- .../use_current_conversation/index.test.tsx | 139 ++++++- .../use_current_conversation/index.tsx | 41 +- .../impl/assistant_context/index.tsx | 31 +- .../impl/assistant_context/types.tsx | 14 + .../read_only_context_viewer/index.test.tsx | 26 -- .../read_only_context_viewer/index.tsx | 3 +- .../packages/kbn-elastic-assistant/index.ts | 2 + .../conversations/helpers.ts | 4 + .../conversations/update_conversation.test.ts | 43 +- .../conversations/update_conversation.ts | 18 +- .../server/lib/langchain/executors/types.ts | 1 + .../graphs/default_assistant_graph/index.ts | 16 +- .../nodes/translations.ts | 17 + .../graphs/default_assistant_graph/prompts.ts | 156 +++++--- .../server/routes/helpers.ts | 39 ++ .../post_actions_connector_execute.test.ts | 3 + .../routes/post_actions_connector_execute.ts | 17 +- .../server/routes/prompts/find_route.ts | 6 +- .../content/prompts/system/index.tsx | 41 -- .../content/prompts/system/translations.ts | 60 --- .../public/assistant/get_comments/index.tsx | 47 ++- .../assistant/get_comments/translations.ts | 4 + .../public/assistant/provider.test.tsx | 98 +---- .../public/assistant/provider.tsx | 14 +- .../translations/translations/fr-FR.json | 7 - .../translations/translations/ja-JP.json | 7 - .../translations/translations/zh-CN.json | 7 - .../e2e/ai_assistant/conversations.cy.ts | 14 +- .../cypress/e2e/ai_assistant/prompts.cy.ts | 106 +++-- .../cypress/objects/assistant.ts | 9 + .../cypress/screens/ai_assistant.ts | 2 +- .../cypress/tasks/api_calls/assistant.ts | 25 +- .../cypress/tasks/assistant.ts | 27 +- 57 files changed, 686 insertions(+), 1195 deletions(-) rename x-pack/packages/kbn-elastic-assistant/impl/{content/prompts/system => assistant/prompt}/translations.ts (61%) rename x-pack/packages/kbn-elastic-assistant/impl/{content/prompts/welcome => assistant/upgrade_license_cta}/translations.ts (100%) delete mode 100644 x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.test.tsx create mode 100644 x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/assistant/content/prompts/system/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/empty_convo.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/empty_convo.tsx index 58d47a696225f..3aa0e2271beff 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/empty_convo.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/empty_convo.tsx @@ -9,31 +9,23 @@ import React, { Dispatch, SetStateAction } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiText } from '@elastic/eui'; import { css } from '@emotion/react'; import { PromptResponse } from '@kbn/elastic-assistant-common'; -import { QueryObserverResult } from '@tanstack/react-query'; -import { Conversation } from '../../..'; import { AssistantAnimatedIcon } from '../assistant_animated_icon'; import { SystemPrompt } from '../prompt_editor/system_prompt'; import { SetupKnowledgeBaseButton } from '../../knowledge_base/setup_knowledge_base_button'; import * as i18n from '../translations'; interface Props { - currentConversation: Conversation | undefined; currentSystemPromptId: string | undefined; isSettingsModalVisible: boolean; - refetchCurrentUserConversations: () => Promise< - QueryObserverResult, unknown> - >; setIsSettingsModalVisible: Dispatch>; - setCurrentSystemPromptId: Dispatch>; + setCurrentSystemPromptId: (promptId: string | undefined) => void; allSystemPrompts: PromptResponse[]; } export const EmptyConvo: React.FC = ({ allSystemPrompts, - currentConversation, currentSystemPromptId, isSettingsModalVisible, - refetchCurrentUserConversations, setCurrentSystemPromptId, setIsSettingsModalVisible, }) => { @@ -59,13 +51,11 @@ export const EmptyConvo: React.FC = ({ diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx index 362ab6e3e41ef..757f385db058c 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_body/index.tsx @@ -18,7 +18,6 @@ import { HttpSetup } from '@kbn/core-http-browser'; import { euiThemeVars } from '@kbn/ui-theme'; import { css } from '@emotion/react'; import { PromptResponse } from '@kbn/elastic-assistant-common'; -import { QueryObserverResult } from '@tanstack/react-query'; import { AssistantAnimatedIcon } from '../assistant_animated_icon'; import { EmptyConvo } from './empty_convo'; import { WelcomeSetup } from './welcome_setup'; @@ -35,11 +34,8 @@ interface Props { isSettingsModalVisible: boolean; isWelcomeSetup: boolean; isLoading: boolean; - refetchCurrentUserConversations: () => Promise< - QueryObserverResult, unknown> - >; http: HttpSetup; - setCurrentSystemPromptId: Dispatch>; + setCurrentSystemPromptId: (promptId: string | undefined) => void; setIsSettingsModalVisible: Dispatch>; } @@ -55,17 +51,16 @@ export const AssistantBody: FunctionComponent = ({ isLoading, isSettingsModalVisible, isWelcomeSetup, - refetchCurrentUserConversations, setIsSettingsModalVisible, }) => { - const isNewConversation = useMemo( + const isEmptyConversation = useMemo( () => currentConversation?.messages.length === 0, [currentConversation?.messages.length] ); const disclaimer = useMemo( () => - isNewConversation && ( + isEmptyConversation && ( = ({ {i18n.DISCLAIMER} ), - [isNewConversation] + [isEmptyConversation] ); // Start Scrolling @@ -113,13 +108,11 @@ export const AssistantBody: FunctionComponent = ({ currentConversation={currentConversation} handleOnConversationSelected={handleOnConversationSelected} /> - ) : currentConversation?.messages.length === 0 ? ( + ) : isEmptyConversation ? ( diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx index b2479b33fdb99..97d95f641e2b5 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.test.tsx @@ -9,7 +9,6 @@ import { HttpSetup } from '@kbn/core-http-browser'; import { useSendMessage } from '../use_send_message'; import { useConversation } from '../use_conversation'; import { emptyWelcomeConvo, welcomeConvo } from '../../mock/conversation'; -import { defaultSystemPrompt, mockSystemPrompt } from '../../mock/system_prompt'; import { useChatSend, UseChatSendProps } from './use_chat_send'; import { act, renderHook } from '@testing-library/react-hooks'; import { waitFor } from '@testing-library/react'; @@ -28,7 +27,6 @@ const setCurrentConversation = jest.fn(); export const testProps: UseChatSendProps = { selectedPromptContexts: {}, - allSystemPrompts: [defaultSystemPrompt, mockSystemPrompt], currentConversation: { ...emptyWelcomeConvo, id: 'an-id' }, http: { basePath: { @@ -38,7 +36,6 @@ export const testProps: UseChatSendProps = { anonymousPaths: {}, externalUrl: {}, } as unknown as HttpSetup, - currentSystemPromptId: defaultSystemPrompt.id, setSelectedPromptContexts, setCurrentConversation, refetchCurrentUserConversations: jest.fn(), @@ -78,21 +75,7 @@ describe('use chat send', () => { expect(setCurrentConversation).toHaveBeenCalled(); }); }); - it('handleChatSend sends message with context prompt when a valid prompt text is provided', async () => { - const promptText = 'prompt text'; - const { result } = renderHook(() => useChatSend(testProps), { - wrapper: TestProviders, - }); - result.current.handleChatSend(promptText); - await waitFor(() => { - expect(sendMessage).toHaveBeenCalled(); - const appendMessageSend = sendMessage.mock.calls[0][0].message; - expect(appendMessageSend).toEqual( - `You are a helpful, expert assistant who answers questions about Elastic Security. Do not answer questions unrelated to Elastic Security.\nIf you answer a question related to KQL or EQL, it should be immediately usable within an Elastic Security timeline; please always format the output correctly with back ticks. Any answer provided for Query DSL should also be usable in a security timeline. This means you should only ever include the "filter" portion of the query.\nUse the following context to answer questions:\n\n${promptText}` - ); - }); - }); it('handleChatSend sends message with only provided prompt text and context already exists in convo history', async () => { const promptText = 'prompt text'; const { result } = renderHook( diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.tsx index 905a4513a250f..9b671bca64a2e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/chat_send/use_chat_send.tsx @@ -8,7 +8,7 @@ import React, { useCallback, useState } from 'react'; import { HttpSetup } from '@kbn/core-http-browser'; import { i18n } from '@kbn/i18n'; -import { PromptResponse, Replacements } from '@kbn/elastic-assistant-common'; +import { Replacements } from '@kbn/elastic-assistant-common'; import { DataStreamApis } from '../use_data_stream_apis'; import { NEW_CHAT } from '../conversations/conversation_sidepanel/translations'; import type { ClientMessage } from '../../assistant_context/types'; @@ -20,9 +20,7 @@ import { Conversation, useAssistantContext } from '../../..'; import { getMessageFromRawResponse } from '../helpers'; export interface UseChatSendProps { - allSystemPrompts: PromptResponse[]; currentConversation?: Conversation; - currentSystemPromptId: string | undefined; http: HttpSetup; refetchCurrentUserConversations: DataStreamApis['refetchCurrentUserConversations']; selectedPromptContexts: Record; @@ -46,9 +44,7 @@ export interface UseChatSend { * Handles sending user messages to the API and updating the conversation state. */ export const useChatSend = ({ - allSystemPrompts, currentConversation, - currentSystemPromptId, http, refetchCurrentUserConversations, selectedPromptContexts, @@ -75,14 +71,11 @@ export const useChatSend = ({ ); return; } - const systemPrompt = allSystemPrompts.find((prompt) => prompt.id === currentSystemPromptId); const userMessage = getCombinedMessage({ - isNewChat: currentConversation.messages.length === 0, currentReplacements: currentConversation.replacements, promptText, selectedPromptContexts, - selectedSystemPrompt: systemPrompt, }); const baseReplacements: Replacements = @@ -141,10 +134,8 @@ export const useChatSend = ({ }); }, [ - allSystemPrompts, assistantTelemetry, currentConversation, - currentSystemPromptId, http, selectedPromptContexts, sendMessage, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings.tsx index d929c132baf43..852cd20882904 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings.tsx @@ -126,7 +126,6 @@ export const ConversationSettings: React.FC = React.m selectedConversation={selectedConversationWithApiConfig} setConversationSettings={setConversationSettings} setConversationsSettingsBulkActions={setConversationsSettingsBulkActions} - onSelectedConversationChange={onSelectedConversationChange} /> diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings_editor.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings_editor.tsx index f5c74cf77ee85..ba18594836792 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings_editor.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/conversation_settings_editor.tsx @@ -13,7 +13,6 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { OpenAiProviderType } from '@kbn/stack-connectors-plugin/public/common'; import { noop } from 'lodash/fp'; import { PromptResponse } from '@kbn/elastic-assistant-common'; -import { QueryObserverResult } from '@tanstack/react-query'; import { Conversation } from '../../../..'; import * as i18n from './translations'; import * as i18nModel from '../../../connectorland/models/model_selector/translations'; @@ -37,8 +36,6 @@ export interface ConversationSettingsEditorProps { setConversationsSettingsBulkActions: React.Dispatch< React.SetStateAction >; - onSelectedConversationChange: (conversation?: Conversation) => void; - refetchConversations?: () => Promise, unknown>>; } /** @@ -47,15 +44,13 @@ export interface ConversationSettingsEditorProps { export const ConversationSettingsEditor: React.FC = React.memo( ({ allSystemPrompts, - selectedConversation, conversationSettings, + conversationsSettingsBulkActions, http, isDisabled = false, + selectedConversation, setConversationSettings, - conversationsSettingsBulkActions, setConversationsSettingsBulkActions, - onSelectedConversationChange, - refetchConversations, }) => { const { data: connectors, isSuccess: areConnectorsFetched } = useLoadConnectors({ http, @@ -276,16 +271,11 @@ export const ConversationSettingsEditor: React.FC diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/index.tsx index 10c0867cafb38..f8818f5faab25 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings_management/index.tsx @@ -321,11 +321,9 @@ const ConversationSettingsManagementComponent: React.FC = ({ conversationsSettingsBulkActions={conversationsSettingsBulkActions} http={http} isDisabled={isDisabled} - refetchConversations={refetchConversations} selectedConversation={selectedConversation} setConversationSettings={setConversationSettings} setConversationsSettingsBulkActions={setConversationsSettingsBulkActions} - onSelectedConversationChange={onSelectedConversationChange} /> )} diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx index 3a8c47d90b3f1..43f637b1769f3 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -125,7 +125,7 @@ const AssistantComponent: React.FC = ({ const defaultConnector = useMemo(() => getDefaultConnector(connectors), [connectors]); const { currentConversation, - currentSystemPromptId, + currentSystemPrompt, handleCreateConversation, handleOnConversationDeleted, handleOnConversationSelected, @@ -272,16 +272,14 @@ const AssistantComponent: React.FC = ({ const { abortStream, - handleOnChatCleared: onChatCleared, + handleOnChatCleared, handleChatSend, handleRegenerateResponse, isLoading: isLoadingChatSend, setUserPrompt, userPrompt, } = useChatSend({ - allSystemPrompts, currentConversation, - currentSystemPromptId, http, refetchCurrentUserConversations, selectedPromptContexts, @@ -289,18 +287,6 @@ const AssistantComponent: React.FC = ({ setCurrentConversation, }); - const handleOnChatCleared = useCallback(() => { - onChatCleared(); - if (!currentSystemPromptId) { - setCurrentSystemPromptId(currentConversation?.apiConfig?.defaultSystemPromptId); - } - }, [ - currentConversation?.apiConfig?.defaultSystemPromptId, - currentSystemPromptId, - onChatCleared, - setCurrentSystemPromptId, - ]); - useEffect(() => { // Adding `conversationTitle !== selectedConversationTitle` to prevent auto-run still executing after changing selected conversation if (currentConversation?.messages.length || conversationTitle !== currentConversation?.title) { @@ -389,6 +375,7 @@ const AssistantComponent: React.FC = ({ isFetchingResponse: isLoadingChatSend, setIsStreaming, currentUserAvatar, + systemPromptContent: currentSystemPrompt?.content, })} // Avoid comments going off the flyout css={css` @@ -415,6 +402,7 @@ const AssistantComponent: React.FC = ({ isLoadingChatSend, setIsStreaming, currentUserAvatar, + currentSystemPrompt?.content, selectedPromptContextsCount, ] ); @@ -530,14 +518,13 @@ const AssistantComponent: React.FC = ({ allSystemPrompts={allSystemPrompts} comments={comments} currentConversation={currentConversation} - currentSystemPromptId={currentSystemPromptId} + currentSystemPromptId={currentSystemPrompt?.id} handleOnConversationSelected={handleOnConversationSelected} http={http} isAssistantEnabled={isAssistantEnabled} isLoading={isInitialLoad} isSettingsModalVisible={isSettingsModalVisible} isWelcomeSetup={isWelcomeSetup} - refetchCurrentUserConversations={refetchCurrentUserConversations} setCurrentSystemPromptId={setCurrentSystemPromptId} setIsSettingsModalVisible={setIsSettingsModalVisible} /> diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts index 33b33f83e6581..cd4dfe9219484 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.test.ts @@ -6,9 +6,8 @@ */ import type { ClientMessage } from '../../assistant_context/types'; -import { getCombinedMessage, getSystemMessages } from './helpers'; +import { getCombinedMessage } from './helpers'; import { mockGetAnonymizedValue } from '../../mock/get_anonymized_value'; -import { mockSystemPrompt } from '../../mock/system_prompt'; import { mockAlertPromptContext } from '../../mock/prompt_context'; import type { SelectedPromptContext } from '../prompt_context/types'; @@ -21,77 +20,14 @@ const mockSelectedAlertPromptContext: SelectedPromptContext = { describe('helpers', () => { beforeEach(() => jest.clearAllMocks()); - describe('getSystemMessages', () => { - it('should return an empty array if isNewChat is false', () => { - const result = getSystemMessages({ - isNewChat: false, - selectedSystemPrompt: mockSystemPrompt, - }); - - expect(result).toEqual([]); - }); - - it('should return an empty array if selectedSystemPrompt is undefined', () => { - const result = getSystemMessages({ isNewChat: true, selectedSystemPrompt: undefined }); - - expect(result).toEqual([]); - }); - - describe('when isNewChat is true and selectedSystemPrompt is defined', () => { - let result: ClientMessage[]; - - beforeEach(() => { - result = getSystemMessages({ isNewChat: true, selectedSystemPrompt: mockSystemPrompt }); - }); - - it('should return a message with the content of the selectedSystemPrompt', () => { - expect(result[0].content).toBe(mockSystemPrompt.content); - }); - - it('should return a message with the role "system"', () => { - expect(result[0].role).toBe('system'); - }); - - it('should return a message with a valid timestamp', () => { - const timestamp = new Date(result[0].timestamp); - - expect(timestamp instanceof Date && !isNaN(timestamp.valueOf())).toBe(true); - }); - }); - }); - describe('getCombinedMessage', () => { - it('returns correct content for a new chat with a system prompt', async () => { + it('returns correct content for a chat', async () => { const message: ClientMessage = await getCombinedMessage({ currentReplacements: {}, - isNewChat: true, promptText: 'User prompt text', selectedPromptContexts: { [mockSelectedAlertPromptContext.promptContextId]: mockSelectedAlertPromptContext, }, - selectedSystemPrompt: mockSystemPrompt, - }); - - expect(message.content) - .toEqual(`You are a helpful, expert assistant who answers questions about Elastic Security. - -CONTEXT: -""" -alert data -""" - -User prompt text`); - }); - - it('returns correct content for a new chat WITHOUT a system prompt', async () => { - const message: ClientMessage = await getCombinedMessage({ - currentReplacements: {}, - isNewChat: true, - promptText: 'User prompt text', - selectedPromptContexts: { - [mockSelectedAlertPromptContext.promptContextId]: mockSelectedAlertPromptContext, - }, - selectedSystemPrompt: undefined, // <-- no system prompt }); expect(message.content).toEqual(`CONTEXT: @@ -105,12 +41,10 @@ User prompt text`); it('returns the correct content for an existing chat', async () => { const message: ClientMessage = await getCombinedMessage({ currentReplacements: {}, - isNewChat: false, promptText: 'User prompt text', selectedPromptContexts: { [mockSelectedAlertPromptContext.promptContextId]: mockSelectedAlertPromptContext, }, - selectedSystemPrompt: mockSystemPrompt, }); expect(message.content).toEqual(`CONTEXT: @@ -124,12 +58,10 @@ User prompt text`); it('returns the expected role', async () => { const message: ClientMessage = await getCombinedMessage({ currentReplacements: {}, - isNewChat: true, promptText: 'User prompt text', selectedPromptContexts: { [mockSelectedAlertPromptContext.promptContextId]: mockSelectedAlertPromptContext, }, - selectedSystemPrompt: mockSystemPrompt, }); expect(message.role).toBe('user'); @@ -138,32 +70,25 @@ User prompt text`); it('returns a valid timestamp', async () => { const message: ClientMessage = await getCombinedMessage({ currentReplacements: {}, - isNewChat: true, promptText: 'User prompt text', selectedPromptContexts: {}, - selectedSystemPrompt: mockSystemPrompt, }); expect(Date.parse(message.timestamp)).not.toBeNaN(); }); - it('should return the correct combined message for a new chat without prompt context', () => { + it('should return the correct combined message for a chat without prompt context', () => { const result = getCombinedMessage({ currentReplacements: {}, - isNewChat: true, promptText: 'User prompt text', - selectedSystemPrompt: mockSystemPrompt, selectedPromptContexts: {}, }); - expect(result.content).toEqual( - `You are a helpful, expert assistant who answers questions about Elastic Security.\n\nUser prompt text` - ); + expect(result.content).toEqual(`User prompt text`); }); - it('should return the correct combined message for a new chat without system context and multiple selectedPromptContext', () => { + it('should return the correct combined message for a chat with multiple selectedPromptContext', () => { const result = getCombinedMessage({ currentReplacements: {}, - isNewChat: true, promptText: 'User prompt text', selectedPromptContexts: { context1: { @@ -177,7 +102,6 @@ User prompt text`); replacements: {}, }, }, - selectedSystemPrompt: { ...mockSystemPrompt, content: '' }, }); expect(result.content).toEqual( @@ -188,10 +112,8 @@ User prompt text`); it('should remove extra spaces when there is no prompt content or system prompt', () => { const result = getCombinedMessage({ currentReplacements: {}, - isNewChat: true, promptText: 'User prompt text', selectedPromptContexts: {}, - selectedSystemPrompt: { ...mockSystemPrompt, content: '' }, }); expect(result.content).toEqual(`User prompt text`); @@ -229,13 +151,11 @@ User prompt text`); const message = await getCombinedMessage({ currentReplacements: {}, getAnonymizedValue: mockGetAnonymizedValue, - isNewChat: true, promptText: 'User prompt text', selectedPromptContexts: { [mockPromptContextWithDataToAnonymize.promptContextId]: mockPromptContextWithDataToAnonymize, }, - selectedSystemPrompt: mockSystemPrompt, }); expect(message.replacements).toEqual({ @@ -247,15 +167,11 @@ User prompt text`); }); it('returns the expected content when `isNewChat` is false', async () => { - const isNewChat = false; // <-- not a new chat - const message: ClientMessage = await getCombinedMessage({ currentReplacements: {}, getAnonymizedValue: mockGetAnonymizedValue, - isNewChat, promptText: 'User prompt text', selectedPromptContexts: {}, - selectedSystemPrompt: mockSystemPrompt, }); expect(message.content).toEqual(`User prompt text`); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts index 4868eff04b4e7..0689ff6fd4ef6 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/helpers.ts @@ -5,41 +5,20 @@ * 2.0. */ -import { Replacements, transformRawData, PromptResponse } from '@kbn/elastic-assistant-common'; +import { Replacements, transformRawData } from '@kbn/elastic-assistant-common'; import type { ClientMessage } from '../../assistant_context/types'; import { getAnonymizedValue as defaultGetAnonymizedValue } from '../get_anonymized_value'; import type { SelectedPromptContext } from '../prompt_context/types'; -import { SYSTEM_PROMPT_CONTEXT_NON_I18N } from '../../content/prompts/system/translations'; +import { SYSTEM_PROMPT_CONTEXT_NON_I18N } from './translations'; -export const getSystemMessages = ({ - isNewChat, - selectedSystemPrompt, -}: { - isNewChat: boolean; - selectedSystemPrompt: PromptResponse | undefined; -}): ClientMessage[] => { - if (!isNewChat || selectedSystemPrompt == null) { - return []; - } - - const message: ClientMessage = { - content: selectedSystemPrompt.content, - role: 'system', - timestamp: new Date().toLocaleString(), - }; - - return [message]; -}; interface ClientMessageWithReplacements extends ClientMessage { replacements: Replacements; } export function getCombinedMessage({ currentReplacements, getAnonymizedValue = defaultGetAnonymizedValue, - isNewChat, promptText, selectedPromptContexts, - selectedSystemPrompt, }: { currentReplacements: Replacements | undefined; getAnonymizedValue?: ({ @@ -49,10 +28,8 @@ export function getCombinedMessage({ currentReplacements: Replacements | undefined; rawValue: string; }) => string; - isNewChat: boolean; promptText: string; selectedPromptContexts: Record; - selectedSystemPrompt: PromptResponse | undefined; }): ClientMessageWithReplacements { let replacements: Replacements = currentReplacements ?? {}; const onNewReplacements = (newReplacements: Replacements) => { @@ -74,10 +51,8 @@ export function getCombinedMessage({ }); const content = `${ - isNewChat && selectedSystemPrompt && selectedSystemPrompt.content.length > 0 - ? `${selectedSystemPrompt?.content ?? ''}\n\n` - : '' - }${promptContextsContent.length > 0 ? `${promptContextsContent}\n` : ''}${promptText}`; + promptContextsContent.length > 0 ? `${promptContextsContent}\n` : '' + }${promptText}`; return { // trim ensures any extra \n and other whitespace is removed diff --git a/x-pack/packages/kbn-elastic-assistant/impl/content/prompts/system/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/translations.ts similarity index 61% rename from x-pack/packages/kbn-elastic-assistant/impl/content/prompts/system/translations.ts rename to x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/translations.ts index 75cb6017cb1a3..7dfc07a77247c 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/content/prompts/system/translations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt/translations.ts @@ -5,15 +5,6 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; - -export const DEFAULT_SYSTEM_PROMPT_NAME = i18n.translate( - 'xpack.elasticAssistant.assistant.content.prompts.system.defaultSystemPromptName', - { - defaultMessage: 'Default system prompt', - } -); - export const SYSTEM_PROMPT_CONTEXT_NON_I18N = (context: string) => { return `CONTEXT:\n"""\n${context}\n"""`; }; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.test.tsx index 1d3105a64ac2d..a75c1fa838db5 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.test.tsx @@ -15,23 +15,18 @@ import { getOptions, getOptionFromPrompt } from './helpers'; describe('helpers', () => { describe('getOptionFromPrompt', () => { + const option = getOptionFromPrompt(mockSystemPrompt); it('returns an EuiSuperSelectOption with the correct value', () => { - const option = getOptionFromPrompt({ ...mockSystemPrompt, isCleared: false }); - expect(option.value).toBe(mockSystemPrompt.id); }); it('returns an EuiSuperSelectOption with the correct inputDisplay', () => { - const option = getOptionFromPrompt({ ...mockSystemPrompt, isCleared: false }); - render(<>{option.inputDisplay}); expect(screen.getByTestId('systemPromptText')).toHaveTextContent(mockSystemPrompt.name); }); it('shows the expected name in the dropdownDisplay', () => { - const option = getOptionFromPrompt({ ...mockSystemPrompt, isCleared: false }); - render({option.dropdownDisplay}); expect(screen.getByTestId(`systemPrompt-${mockSystemPrompt.name}`)).toHaveTextContent( @@ -40,8 +35,6 @@ describe('helpers', () => { }); it('shows the expected prompt content in the dropdownDisplay', () => { - const option = getOptionFromPrompt({ ...mockSystemPrompt, isCleared: false }); - render({option.dropdownDisplay}); expect(screen.getByTestId('content')).toHaveTextContent(mockSystemPrompt.content); @@ -53,7 +46,7 @@ describe('helpers', () => { const prompts = [mockSystemPrompt, mockSuperheroSystemPrompt]; const promptIds = prompts.map(({ id }) => id); - const options = getOptions({ prompts, isCleared: false }); + const options = getOptions(prompts); const optionValues = options.map(({ value }) => value); expect(optionValues).toEqual(promptIds); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.tsx index b28d13a91fcd2..7d54d347964e4 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/helpers.tsx @@ -23,13 +23,11 @@ interface GetOptionFromPromptProps extends PromptResponse { content: string; id: string; name: string; - isCleared: boolean; } export const getOptionFromPrompt = ({ content, id, - isCleared, name, }: GetOptionFromPromptProps): EuiSuperSelectOption => ({ value: id, @@ -38,7 +36,7 @@ export const getOptionFromPrompt = ({ data-test-subj="systemPromptText" // @ts-ignore css={css` - color: ${isCleared ? euiThemeVars.euiColorLightShade : euiThemeVars.euiColorDarkestShade}; + color: ${euiThemeVars.euiColorDarkestShade}; `} > {name} @@ -58,12 +56,6 @@ export const getOptionFromPrompt = ({ ), }); -interface GetOptionsProps { - prompts: PromptResponse[] | undefined; - isCleared: boolean; -} -export const getOptions = ({ - prompts, - isCleared, -}: GetOptionsProps): Array> => - prompts?.map((p) => getOptionFromPrompt({ ...p, isCleared })) ?? []; +export const getOptions = ( + prompts: PromptResponse[] | undefined +): Array> => prompts?.map((p) => getOptionFromPrompt(p)) ?? []; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/index.test.tsx index af68f1d83e6aa..e7ce435cf2556 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/index.test.tsx @@ -6,16 +6,13 @@ */ import React from 'react'; -import { render, screen, fireEvent, waitFor, within } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; +import { render, screen, fireEvent } from '@testing-library/react'; import { mockSystemPrompt } from '../../../mock/system_prompt'; import { SystemPrompt } from '.'; import { Conversation } from '../../../..'; import { DEFAULT_CONVERSATION_TITLE } from '../../use_conversation/translations'; import { TestProviders } from '../../../mock/test_providers/test_providers'; -import { TEST_IDS } from '../../constants'; -import { useAssistantContext } from '../../../assistant_context'; import { WELCOME_CONVERSATION } from '../../use_conversation/sample_conversations'; import { PromptResponse } from '@kbn/elastic-assistant-common'; @@ -62,7 +59,6 @@ jest.mock('../../use_conversation', () => { }); describe('SystemPrompt', () => { - const currentSystemPromptId = undefined; const isSettingsModalVisible = false; const onSystemPromptSelectionChange = jest.fn(); const setIsSettingsModalVisible = jest.fn(); @@ -79,14 +75,11 @@ describe('SystemPrompt', () => { }); }); - describe('when conversation is undefined', () => { - const conversation = undefined; - + describe('when currentSystemPromptId is undefined', () => { beforeEach(() => { render( { }); it('does NOT render the clear button', () => { - expect(screen.queryByTestId('clear')).not.toBeInTheDocument(); + expect(screen.queryByTestId('clearSystemPrompt')).not.toBeInTheDocument(); }); }); - describe('when conversation is NOT null', () => { + describe('when currentSystemPromptId does not exist', () => { beforeEach(() => { render( { ); }); - it('does render the system prompt select', () => { - expect(screen.queryByTestId('selectSystemPrompt')).toBeInTheDocument(); + it('renders the system prompt select', () => { + expect(screen.getByTestId('selectSystemPrompt')).toBeInTheDocument(); }); - it('renders the system prompt text', () => { - expect(screen.getByTestId('systemPromptText')).toHaveTextContent(mockSystemPrompt.name); + it('does NOT render the edit button', () => { + expect(screen.queryByTestId('edit')).not.toBeInTheDocument(); }); - it('renders the clear button', () => { - expect(screen.getByTestId('clearSystemPrompt')).toBeInTheDocument(); + it('does NOT render the clear button', () => { + expect(screen.queryByTestId('clearSystemPrompt')).not.toBeInTheDocument(); }); }); - // TODO: To be implemented as part of the global settings tests instead of within the SystemPrompt component - describe.skip('when a new prompt is saved', () => { - it('should save new prompt correctly', async () => { - const customPromptName = 'custom prompt'; - const customPromptText = 'custom prompt text'; - render( - - - - ); - await userEvent.click(screen.getByTestId('edit')); - await userEvent.click(screen.getByTestId(TEST_IDS.ADD_SYSTEM_PROMPT)); - - expect(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeVisible(); - - await userEvent.type( - within(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_SELECTOR)).getByTestId('comboBoxInput'), - `${customPromptName}[Enter]` - ); - - await userEvent.type( - screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.PROMPT_TEXT), - customPromptText - ); - - await userEvent.click(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.SAVE)); - - await waitFor(() => { - expect(mockUseAssistantContext.setAllSystemPrompts).toHaveBeenCalledTimes(1); - expect(mockUseAssistantContext.setAllSystemPrompts).toHaveBeenNthCalledWith(1, [ - mockSystemPrompt, - { - id: customPromptName, - content: customPromptText, - name: customPromptName, - promptType: 'system', - }, - ]); - expect(screen.queryByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).not.toBeInTheDocument(); - }); - }); - - it('should save new prompt as a default prompt', async () => { - const customPromptName = 'custom prompt'; - const customPromptText = 'custom prompt text'; + describe('when currentSystemPromptId exists', () => { + beforeEach(() => { render( - - - - ); - await userEvent.click(screen.getByTestId('edit')); - await userEvent.click(screen.getByTestId(TEST_IDS.ADD_SYSTEM_PROMPT)); - - expect(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeVisible(); - - await userEvent.type( - within(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_SELECTOR)).getByTestId('comboBoxInput'), - `${customPromptName}[Enter]` - ); - - await userEvent.type( - screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.PROMPT_TEXT), - customPromptText - ); - - await userEvent.click( - screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.TOGGLE_ALL_DEFAULT_CONVERSATIONS) + ); - - await waitFor(() => { - expect( - screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.TOGGLE_ALL_DEFAULT_CONVERSATIONS) - ).toBeChecked(); - }); - - await userEvent.click(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.SAVE)); - - await waitFor(() => { - expect(mockUseAssistantContext.setAllSystemPrompts).toHaveBeenCalledTimes(1); - expect(mockUseAssistantContext.setAllSystemPrompts).toHaveBeenNthCalledWith(1, [ - { - ...mockSystemPrompt, - isNewConversationDefault: false, - }, - { - id: customPromptName, - content: customPromptText, - name: customPromptName, - promptType: 'system', - isNewConversationDefault: true, - }, - ]); - expect(screen.queryByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).not.toBeInTheDocument(); - }); }); - it('should save new prompt as a default prompt for selected conversations', async () => { - const customPromptName = 'custom prompt'; - const customPromptText = 'custom prompt text'; - render( - - - - ); - await userEvent.click(screen.getByTestId('edit')); - await userEvent.click(screen.getByTestId(TEST_IDS.ADD_SYSTEM_PROMPT)); - - expect(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeVisible(); - - await userEvent.type( - within(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_SELECTOR)).getByTestId('comboBoxInput'), - `${customPromptName}[Enter]` - ); - - await userEvent.type( - screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.PROMPT_TEXT), - customPromptText - ); - - await userEvent.click( - within(screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR)).getByTestId( - 'comboBoxInput' - ) - ); - - await waitFor(() => { - expect( - screen.getByTestId( - TEST_IDS.CONVERSATIONS_MULTISELECTOR_OPTION(DEFAULT_CONVERSATION_TITLE) - ) - ).toBeVisible(); - }); - - // select Default Conversation - await userEvent.click( - screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR_OPTION(DEFAULT_CONVERSATION_TITLE)) - ); - - await userEvent.click(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.SAVE)); - - await waitFor(() => { - expect(screen.queryByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).not.toBeInTheDocument(); - }); - - expect(mockUseAssistantContext.setAllSystemPrompts).toHaveBeenCalledTimes(1); - expect(mockUseAssistantContext.setConversations).toHaveBeenCalledTimes(1); - expect(mockUseAssistantContext.setConversations).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - [DEFAULT_CONVERSATION_TITLE]: expect.objectContaining({ - id: DEFAULT_CONVERSATION_TITLE, - apiConfig: expect.objectContaining({ - defaultSystemPromptId: customPromptName, - }), - }), - }) - ); + it('does render the system prompt select', () => { + expect(screen.queryByTestId('selectSystemPrompt')).toBeInTheDocument(); }); - it('should save new prompt correctly when prompt is removed from selected conversation', async () => { - render( - - - - ); - await userEvent.click(screen.getByTestId('edit')); - await userEvent.click(screen.getByTestId(TEST_IDS.ADD_SYSTEM_PROMPT)); - - expect(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeVisible(); - - await userEvent.type( - within(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_SELECTOR)).getByTestId('comboBoxInput'), - `${mockSystemPrompt.name}[Enter]` - ); - - expect( - within(screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR)).getByText( - DEFAULT_CONVERSATION_TITLE - ) - ).toBeVisible(); - - await userEvent.click( - within(screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR)).getByTestId( - 'comboBoxClearButton' - ) - ); - - await userEvent.click(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.SAVE)); - - await waitFor(() => { - expect(screen.queryByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeFalsy(); - }); - expect(mockUseAssistantContext.setAllSystemPrompts).toHaveBeenCalledTimes(1); - expect(mockUseAssistantContext.setConversations).toHaveBeenCalledTimes(1); - expect(mockUseAssistantContext.setConversations).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ - [DEFAULT_CONVERSATION_TITLE]: expect.objectContaining({ - id: DEFAULT_CONVERSATION_TITLE, - apiConfig: expect.objectContaining({ - defaultSystemPromptId: undefined, - }), - }), - }) - ); + it('renders the system prompt text', () => { + expect(screen.getByTestId('systemPromptText')).toHaveTextContent(mockSystemPrompt.name); }); - it('should save new prompt correctly when prompt is removed from a conversation and linked to another conversation in a single transaction', async () => { - const secondMockConversation: Conversation = { - id: 'second', - category: 'assistant', - apiConfig: { - actionTypeId: '.gen-ai', - connectorId: '123', - defaultSystemPromptId: undefined, - }, - title: 'second', - messages: [], - replacements: {}, - }; - const localMockConversations: Record = { - [DEFAULT_CONVERSATION_TITLE]: BASE_CONVERSATION, - [secondMockConversation.title]: secondMockConversation, - }; - - const localMockUseAssistantContext = { - conversations: localMockConversations, - setConversations: jest.fn(), - setAllSystemPrompts: jest.fn(), - allSystemPrompts: mockSystemPrompts, - hero: 'abc', - }; - (useAssistantContext as jest.Mock).mockImplementation(() => ({ - ...localMockUseAssistantContext, - })); - - render( - - - - ); - await userEvent.click(screen.getByTestId('edit')); - await userEvent.click(screen.getByTestId(TEST_IDS.ADD_SYSTEM_PROMPT)); - - expect(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeVisible(); - - await userEvent.type( - within(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_SELECTOR)).getByTestId('comboBoxInput'), - `${mockSystemPrompt.name}[Enter]` - ); - - expect( - within(screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR)).getByText( - DEFAULT_CONVERSATION_TITLE - ) - ).toBeVisible(); - - // removed selected conversation - await userEvent.click( - within(screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR)).getByTestId( - 'comboBoxClearButton' - ) - ); - - // add `second` conversation - await userEvent.type( - within(screen.getByTestId(TEST_IDS.CONVERSATIONS_MULTISELECTOR)).getByTestId( - 'comboBoxInput' - ), - 'second[Enter]' - ); - - await userEvent.click(screen.getByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.SAVE)); - - await waitFor(() => { - expect(screen.queryByTestId(TEST_IDS.SYSTEM_PROMPT_MODAL.ID)).toBeFalsy(); - }); - - expect(localMockUseAssistantContext.setAllSystemPrompts).toHaveBeenCalledTimes(1); - expect(localMockUseAssistantContext.setConversations).toHaveBeenCalledTimes(1); - expect(localMockUseAssistantContext.setConversations).toHaveBeenNthCalledWith(1, { - [DEFAULT_CONVERSATION_TITLE]: expect.objectContaining({ - id: DEFAULT_CONVERSATION_TITLE, - apiConfig: expect.objectContaining({ - defaultSystemPromptId: undefined, - }), - }), - [secondMockConversation.title]: { - ...secondMockConversation, - apiConfig: { - connectorId: '123', - defaultSystemPromptId: mockSystemPrompt.id, - }, - }, - }); + it('renders the clear button', () => { + expect(screen.getByTestId('clearSystemPrompt')).toBeInTheDocument(); }); }); - it('shows the system prompt select when system prompt text is clicked', () => { render( void; setIsSettingsModalVisible: React.Dispatch>; - allSystemPrompts: PromptResponse[]; - refetchConversations?: () => Promise, unknown>>; } const SystemPromptComponent: React.FC = ({ - conversation, + allSystemPrompts, currentSystemPromptId, isSettingsModalVisible, onSystemPromptSelectionChange, setIsSettingsModalVisible, - allSystemPrompts, - refetchConversations, }) => { - const [isCleared, setIsCleared] = useState(false); - const selectedPrompt = useMemo(() => { - if (currentSystemPromptId !== undefined) { - setIsCleared(false); - return allSystemPrompts.find((p) => p.id === currentSystemPromptId); - } else { - return allSystemPrompts.find((p) => p.id === conversation?.apiConfig?.defaultSystemPromptId); - } - }, [allSystemPrompts, conversation?.apiConfig?.defaultSystemPromptId, currentSystemPromptId]); + const selectedPrompt = useMemo( + () => + currentSystemPromptId !== undefined + ? allSystemPrompts.find((p) => p.id === currentSystemPromptId) + : undefined, + [allSystemPrompts, currentSystemPromptId] + ); const handleClearSystemPrompt = useCallback(() => { - if (currentSystemPromptId === undefined) { - setIsCleared(false); - onSystemPromptSelectionChange( - allSystemPrompts.find((p) => p.id === conversation?.apiConfig?.defaultSystemPromptId)?.id - ); - } else { - setIsCleared(true); - onSystemPromptSelectionChange(undefined); - } - }, [ - allSystemPrompts, - conversation?.apiConfig?.defaultSystemPromptId, - currentSystemPromptId, - onSystemPromptSelectionChange, - ]); + onSystemPromptSelectionChange(undefined); + }, [onSystemPromptSelectionChange]); return ( diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.test.tsx index 30f3cd12d1c7c..68b305da90057 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.test.tsx @@ -46,9 +46,9 @@ const props: Props = { isNewConversationDefault: true, }, ], - conversation: undefined, isSettingsModalVisible: false, isClearable: true, + onSystemPromptSelectionChange: jest.fn(), selectedPrompt: { id: 'default-system-prompt', content: '', name: '', promptType: 'system' }, setIsSettingsModalVisible: jest.fn(), }; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.tsx index 2fa4f0d210055..c567e18a446f4 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/select_system_prompt/index.tsx @@ -22,12 +22,9 @@ import { PromptResponse, PromptTypeEnum, } from '@kbn/elastic-assistant-common/impl/schemas/prompts/bulk_crud_prompts_route.gen'; -import { QueryObserverResult } from '@tanstack/react-query'; -import { Conversation } from '../../../../..'; import { getOptions } from '../helpers'; import * as i18n from '../translations'; import { useAssistantContext } from '../../../../assistant_context'; -import { useConversation } from '../../../use_conversation'; import { TEST_IDS } from '../../../constants'; import { PROMPT_CONTEXT_SELECTOR_PREFIX } from '../../../quick_prompts/prompt_context_selector/translations'; import { SYSTEM_PROMPTS_TAB } from '../../../settings/const'; @@ -35,20 +32,14 @@ import { SYSTEM_PROMPTS_TAB } from '../../../settings/const'; export interface Props { allPrompts: PromptResponse[]; compressed?: boolean; - conversation?: Conversation; - selectedPrompt: PromptResponse | undefined; clearSelectedSystemPrompt?: () => void; isClearable?: boolean; - isCleared?: boolean; isDisabled?: boolean; isOpen?: boolean; isSettingsModalVisible: boolean; + selectedPrompt: PromptResponse | undefined; setIsSettingsModalVisible: React.Dispatch>; - onSystemPromptSelectionChange?: (promptId: string | undefined) => void; - onSelectedConversationChange?: (result: Conversation) => void; - setConversationSettings?: React.Dispatch>>; - setConversationsSettingsBulkActions?: React.Dispatch>; - refetchConversations?: () => Promise, unknown>>; + onSystemPromptSelectionChange: (promptId: string | undefined) => void; } const ADD_NEW_SYSTEM_PROMPT = 'ADD_NEW_SYSTEM_PROMPT'; @@ -56,24 +47,16 @@ const ADD_NEW_SYSTEM_PROMPT = 'ADD_NEW_SYSTEM_PROMPT'; const SelectSystemPromptComponent: React.FC = ({ allPrompts, compressed = false, - conversation, - selectedPrompt, clearSelectedSystemPrompt, isClearable = false, - isCleared = false, isDisabled = false, isOpen = false, - refetchConversations, isSettingsModalVisible, onSystemPromptSelectionChange, + selectedPrompt, setIsSettingsModalVisible, - onSelectedConversationChange, - setConversationSettings, - setConversationsSettingsBulkActions, }) => { const { setSelectedSettingsTab } = useAssistantContext(); - const { setApiConfig } = useConversation(); - const allSystemPrompts = useMemo( () => allPrompts.filter((p) => p.promptType === PromptTypeEnum.system), [allPrompts] @@ -83,26 +66,8 @@ const SelectSystemPromptComponent: React.FC = ({ const handleOnBlur = useCallback(() => setIsOpenLocal(false), []); const valueOfSelected = useMemo(() => selectedPrompt?.id, [selectedPrompt?.id]); - // Write the selected system prompt to the conversation config - const setSelectedSystemPrompt = useCallback( - async (promptId?: string) => { - if (conversation && conversation.apiConfig) { - const result = await setApiConfig({ - conversation, - apiConfig: { - ...conversation.apiConfig, - defaultSystemPromptId: promptId, - }, - }); - await refetchConversations?.(); - return result; - } - }, - [conversation, refetchConversations, setApiConfig] - ); - - const addNewSystemPrompt = useMemo(() => { - return { + const addNewSystemPrompt = useMemo( + () => ({ value: ADD_NEW_SYSTEM_PROMPT, inputDisplay: i18n.ADD_NEW_SYSTEM_PROMPT, dropdownDisplay: ( @@ -118,14 +83,12 @@ const SelectSystemPromptComponent: React.FC = ({ ), - }; - }, []); + }), + [] + ); // SuperSelect State/Actions - const options = useMemo( - () => getOptions({ prompts: allSystemPrompts, isCleared }), - [allSystemPrompts, isCleared] - ); + const options = useMemo(() => getOptions(allSystemPrompts), [allSystemPrompts]); const onChange = useCallback( async (selectedSystemPromptId: string) => { @@ -134,38 +97,9 @@ const SelectSystemPromptComponent: React.FC = ({ setSelectedSettingsTab(SYSTEM_PROMPTS_TAB); return; } - // Note: if callback is provided, this component does not persist. Extract to separate component - if (onSystemPromptSelectionChange != null) { - onSystemPromptSelectionChange(selectedSystemPromptId); - } - const result = await setSelectedSystemPrompt(selectedSystemPromptId); - if (result) { - setConversationSettings?.((prev: Record) => { - const newConversationsSettings = Object.entries(prev).reduce< - Record - >((acc, [key, convo]) => { - if (result.title === convo.title) { - acc[result.id] = result; - } else { - acc[key] = convo; - } - return acc; - }, {}); - return newConversationsSettings; - }); - onSelectedConversationChange?.(result); - setConversationsSettingsBulkActions?.({}); - } + onSystemPromptSelectionChange(selectedSystemPromptId); }, - [ - onSelectedConversationChange, - onSystemPromptSelectionChange, - setConversationSettings, - setConversationsSettingsBulkActions, - setIsSettingsModalVisible, - setSelectedSettingsTab, - setSelectedSystemPrompt, - ] + [onSystemPromptSelectionChange, setIsSettingsModalVisible, setSelectedSettingsTab] ); const clearSystemPrompt = useCallback(() => { @@ -234,14 +168,10 @@ const SelectSystemPromptComponent: React.FC = ({ inline-size: 16px; block-size: 16px; border-radius: 16px; - background: ${isCleared - ? euiThemeVars.euiColorLightShade - : euiThemeVars.euiColorMediumShade}; + background: ${euiThemeVars.euiColorMediumShade}; :hover:not(:disabled) { - background: ${isCleared - ? euiThemeVars.euiColorLightShade - : euiThemeVars.euiColorMediumShade}; + background: ${euiThemeVars.euiColorMediumShade}; transform: none; } diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_editor.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_editor.tsx index 5c0e7f8aa3e56..aa507ab2cf8ab 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_editor.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_editor.tsx @@ -32,10 +32,7 @@ import { TEST_IDS } from '../../../constants'; import { ConversationsBulkActions } from '../../../api'; import { getSelectedConversations } from '../system_prompt_settings_management/utils'; import { useSystemPromptEditor } from './use_system_prompt_editor'; -import { - getConversationApiConfig, - getFallbackDefaultSystemPrompt, -} from '../../../use_conversation/helpers'; +import { getConversationApiConfig } from '../../../use_conversation/helpers'; interface Props { connectors: AIConnector[] | undefined; @@ -186,7 +183,7 @@ export const SystemPromptEditorComponent: React.FC = ({ if (selectedSystemPrompt != null) { setConversationSettings((prev) => keyBy( - 'title', + 'id', /* * updatedConversationWithPrompts calculates the present of prompt for * each conversation. Based on the values of selected conversation, it goes @@ -228,9 +225,7 @@ export const SystemPromptEditorComponent: React.FC = ({ conversation: convo, defaultConnector, }).apiConfig, - defaultSystemPromptId: - getDefaultSystemPromptId(convo) ?? - getFallbackDefaultSystemPrompt({ allSystemPrompts: systemPromptSettings })?.id, + defaultSystemPromptId: getDefaultSystemPromptId(convo), }, }; } diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_settings.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_settings.test.tsx index 5116da2a56207..f203146e8728b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_settings.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_editor/system_prompt/system_prompt_modal/system_prompt_settings.test.tsx @@ -133,14 +133,14 @@ describe('SystemPromptSettings', () => { fireEvent.click(getByTestId('change-multi')); expect(setConversationSettings).toHaveReturnedWith({ - [welcomeConvo.title]: { + [welcomeConvo.id]: { ...welcomeConvo, apiConfig: { ...welcomeConvo.apiConfig, defaultSystemPromptId: 'mock-system-prompt-1', }, }, - [alertConvo.title]: { + [alertConvo.id]: { ...alertConvo, apiConfig: { ...alertConvo.apiConfig, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx index 753a941ef4f62..f92ca3fc3c763 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx @@ -172,7 +172,9 @@ export const AssistantSettings: React.FC = React.memo( // If the selected conversation is deleted, we need to select a new conversation to prevent a crash creating a conversation that already exists const isSelectedConversationDeleted = defaultSelectedConversationId && - conversationSettings[defaultSelectedConversationId] == null; + // sometimes the key is a title, so do not rely on conversationSettings[defaultSelectedConversationId] + !Object.values(conversationSettings).some(({ id }) => id === defaultSelectedConversationId); + const newSelectedConversation: Conversation | undefined = Object.values(conversationSettings)[0]; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/upgrade_license_cta/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/upgrade_license_cta/index.tsx index 4908b580552fb..e69b530beaf60 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/upgrade_license_cta/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/upgrade_license_cta/index.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { css } from '@emotion/react'; import { HttpSetup } from '@kbn/core-http-browser'; -import { ENTERPRISE } from '../../content/prompts/welcome/translations'; +import { ENTERPRISE } from './translations'; import { UpgradeButtons } from '../../upgrade/upgrade_buttons'; interface OwnProps { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/content/prompts/welcome/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/upgrade_license_cta/translations.ts similarity index 100% rename from x-pack/packages/kbn-elastic-assistant/impl/content/prompts/welcome/translations.ts rename to x-pack/packages/kbn-elastic-assistant/impl/assistant/upgrade_license_cta/translations.ts diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.test.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.test.ts index a5ae389a40353..3aa8215f0a090 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.test.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.test.ts @@ -120,10 +120,10 @@ describe('useConversation helpers', () => { expect(result).toEqual(systemPrompts[1]); }); - test('should return the fallback prompt if default new system prompt do not exist', () => { + test('should return undefined if default new system prompt do not exist', () => { const result = getDefaultNewSystemPrompt([systemPrompts[0]]); - expect(result).toEqual(systemPrompts[0]); + expect(result).toEqual(undefined); }); test('should return undefined if default (starred) isNewConversationDefault system prompt does not exist and there are no system prompts', () => { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts index dce5a1ab11388..85370e511dfc9 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_conversation/helpers.ts @@ -10,7 +10,6 @@ import { ApiConfig, PromptResponse } from '@kbn/elastic-assistant-common'; import { Conversation } from '../../assistant_context/types'; import { AIConnector } from '../../connectorland/connector_selector'; import { getGenAiConfig } from '../../connectorland/helpers'; -import { DEFAULT_SYSTEM_PROMPT_NAME } from '../../content/prompts/system/translations'; export interface CodeBlockDetails { type: QueryType; @@ -76,11 +75,10 @@ export const analyzeMarkdown = (markdown: string): CodeBlockDetails[] => { * * @param allSystemPrompts All available System Prompts */ -export const getDefaultNewSystemPrompt = (allSystemPrompts: PromptResponse[]) => { - const fallbackSystemPrompt = allSystemPrompts.find( - (prompt) => prompt.name === DEFAULT_SYSTEM_PROMPT_NAME - ); - return allSystemPrompts.find((prompt) => prompt.isNewConversationDefault) ?? fallbackSystemPrompt; +export const getDefaultNewSystemPrompt = ( + allSystemPrompts: PromptResponse[] +): PromptResponse | undefined => { + return allSystemPrompts.find((prompt) => prompt.isNewConversationDefault); }; /** @@ -103,24 +101,6 @@ export const getDefaultSystemPrompt = ({ return conversationSystemPrompt; }; -/** - * Returns the default system prompt - * - * @param allSystemPrompts All available System Prompts - * @param conversation Conversation to get the default system prompt for - */ -export const getFallbackDefaultSystemPrompt = ({ - allSystemPrompts, -}: { - allSystemPrompts: PromptResponse[]; -}): PromptResponse | undefined => { - const fallbackSystemPrompt = allSystemPrompts.find( - (prompt) => prompt.name === DEFAULT_SYSTEM_PROMPT_NAME - ); - - return fallbackSystemPrompt; -}; - /** * Returns the API config for a conversation * diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx index 36a6ed5a10a3a..0f04068a89ca2 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.test.tsx @@ -72,17 +72,31 @@ describe('useCurrentConversation', () => { const { result } = setupHook(); expect(result.current.currentConversation).toBeUndefined(); - expect(result.current.currentSystemPromptId).toBeUndefined(); + expect(result.current.currentSystemPrompt).toBeUndefined(); }); - it('should set the current system prompt ID when the prompt selection changes', () => { - const { result } = setupHook(); + it('should set the current system prompt ID when the prompt selection changes', async () => { + const conversationId = 'welcome_id'; + const conversation = mockData.welcome_id; + mockUseConversation.getConversation.mockResolvedValue(conversation); + + const { result } = setupHook({ + conversationId, + conversations: { [conversationId]: conversation }, + }); - act(() => { - result.current.setCurrentSystemPromptId('prompt-id'); + await act(async () => { + await result.current.setCurrentSystemPromptId('prompt-id'); }); - expect(result.current.currentSystemPromptId).toBe('prompt-id'); + expect(mockUseConversation.setApiConfig).toHaveBeenCalledWith({ + conversation, + apiConfig: { + ...conversation.apiConfig, + defaultSystemPromptId: 'prompt-id', + }, + }); + expect(defaultProps.refetchCurrentUserConversations).toHaveBeenCalled(); }); it('should fetch and set the current conversation', async () => { @@ -136,7 +150,7 @@ describe('useCurrentConversation', () => { }); expect(result.current.currentConversation).toEqual(conversation); - expect(result.current.currentSystemPromptId).toBe('something-crazy'); + expect(result.current.currentSystemPrompt?.id).toBe('something-crazy'); }); it('should non-existing handle conversation selection', async () => { @@ -169,7 +183,7 @@ describe('useCurrentConversation', () => { }); expect(result.current.currentConversation).toEqual(mockData.welcome_id); - expect(result.current.currentSystemPromptId).toBe('system-prompt-id'); + expect(result.current.currentSystemPrompt?.id).toBe('system-prompt-id'); }); it('should create a new conversation', async () => { @@ -210,6 +224,115 @@ describe('useCurrentConversation', () => { expect(mockUseConversation.createConversation).toHaveBeenCalled(); }); + it('should create a new conversation using the connector portion of the apiConfig of the current conversation', async () => { + const newConversation = { + ...mockData.welcome_id, + id: 'new-id', + title: 'NEW_CHAT', + messages: [], + } as Conversation; + mockUseConversation.createConversation.mockResolvedValue(newConversation); + + const { result } = setupHook({ + conversations: { + 'old-id': { + ...mockData.welcome_id, + id: 'old-id', + title: 'Old Chat', + messages: [], + } as Conversation, + }, + conversationId: 'old-id', + refetchCurrentUserConversations: jest.fn().mockResolvedValue({ + data: { + 'old-id': { + ...mockData.welcome_id, + id: 'old-id', + title: 'Old Chat', + messages: [], + } as Conversation, + [newConversation.id]: newConversation, + }, + }), + }); + + await act(async () => { + await result.current.handleCreateConversation(); + }); + const { defaultSystemPromptId: _, ...everythingExceptSystemPromptId } = + mockData.welcome_id.apiConfig; + + expect(mockUseConversation.createConversation).toHaveBeenCalledWith({ + apiConfig: everythingExceptSystemPromptId, + title: 'New chat', + }); + }); + + it('should create a new conversation with correct isNewConversationDefault: true system prompt', async () => { + const newConversation = { + ...mockData.welcome_id, + id: 'new-id', + title: 'NEW_CHAT', + messages: [], + } as Conversation; + mockUseConversation.createConversation.mockResolvedValue(newConversation); + + const { result } = setupHook({ + conversations: { + 'old-id': { + ...mockData.welcome_id, + id: 'old-id', + title: 'Old Chat', + messages: [], + } as Conversation, + }, + allSystemPrompts: [ + { + timestamp: '2024-09-10T15:52:24.761Z', + users: [ + { + id: 'u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0', + name: 'elastic', + }, + ], + content: 'Address the user as Mr Orange in each response', + isNewConversationDefault: true, + updatedAt: '2024-09-10T22:07:44.915Z', + id: 'LBOi3JEBy3uD9EGi1d_G', + name: 'Call me Orange', + promptType: 'system', + consumer: 'securitySolutionUI', + }, + ], + conversationId: 'old-id', + refetchCurrentUserConversations: jest.fn().mockResolvedValue({ + data: { + 'old-id': { + ...mockData.welcome_id, + id: 'old-id', + title: 'Old Chat', + messages: [], + } as Conversation, + [newConversation.id]: newConversation, + }, + }), + }); + + await act(async () => { + await result.current.handleCreateConversation(); + }); + const { defaultSystemPromptId: _, ...everythingExceptSystemPromptId } = + mockData.welcome_id.apiConfig; + + expect(mockUseConversation.createConversation).toHaveBeenCalledWith({ + apiConfig: { + ...everythingExceptSystemPromptId, + defaultSystemPromptId: 'LBOi3JEBy3uD9EGi1d_G', + }, + title: 'New chat', + }); + }); + it('should delete a conversation', async () => { const conversationTitle = 'Test Conversation'; const conversation = { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx index 3f08b0a332ad6..d599190ca5623 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/use_current_conversation/index.tsx @@ -13,7 +13,7 @@ import deepEqual from 'fast-deep-equal'; import { AIConnector } from '../../connectorland/connector_selector'; import { getGenAiConfig } from '../../connectorland/helpers'; import { NEW_CHAT } from '../conversations/conversation_sidepanel/translations'; -import { getDefaultSystemPrompt } from '../use_conversation/helpers'; +import { getDefaultNewSystemPrompt, getDefaultSystemPrompt } from '../use_conversation/helpers'; import { useConversation } from '../use_conversation'; import { sleep } from '../helpers'; import { Conversation, WELCOME_CONVERSATION_TITLE } from '../../..'; @@ -31,7 +31,7 @@ export interface Props { interface UseCurrentConversation { currentConversation: Conversation | undefined; - currentSystemPromptId: string | undefined; + currentSystemPrompt: PromptResponse | undefined; handleCreateConversation: () => Promise; handleOnConversationDeleted: (cTitle: string) => Promise; handleOnConversationSelected: ({ cId, cTitle }: { cId: string; cTitle: string }) => Promise; @@ -41,7 +41,7 @@ interface UseCurrentConversation { isStreamRefetch?: boolean; }) => Promise; setCurrentConversation: Dispatch>; - setCurrentSystemPromptId: Dispatch>; + setCurrentSystemPromptId: (promptId: string | undefined) => void; } /** @@ -83,12 +83,22 @@ export const useCurrentConversation = ({ [allSystemPrompts, currentConversation] ); - const [currentSystemPromptId, setCurrentSystemPromptId] = useState( - currentSystemPrompt?.id + // Write the selected system prompt to the conversation config + const setCurrentSystemPromptId = useCallback( + async (promptId?: string) => { + if (currentConversation && currentConversation.apiConfig) { + await setApiConfig({ + conversation: currentConversation, + apiConfig: { + ...currentConversation.apiConfig, + defaultSystemPromptId: promptId, + }, + }); + await refetchCurrentUserConversations(); + } + }, + [currentConversation, refetchCurrentUserConversations, setApiConfig] ); - useEffect(() => { - setCurrentSystemPromptId(currentSystemPrompt?.id); - }, [currentSystemPrompt?.id]); /** * END SYSTEM PROMPT @@ -248,10 +258,20 @@ export const useCurrentConversation = ({ }); return; } + const newSystemPrompt = getDefaultNewSystemPrompt(allSystemPrompts); const newConversation = await createConversation({ title: NEW_CHAT, - apiConfig: currentConversation?.apiConfig, + ...(currentConversation?.apiConfig != null && + currentConversation?.apiConfig?.actionTypeId != null + ? { + apiConfig: { + connectorId: currentConversation.apiConfig.connectorId, + actionTypeId: currentConversation.apiConfig.actionTypeId, + ...(newSystemPrompt?.id != null ? { defaultSystemPromptId: newSystemPrompt.id } : {}), + }, + } + : {}), }); if (newConversation) { @@ -263,6 +283,7 @@ export const useCurrentConversation = ({ await refetchCurrentUserConversations(); } }, [ + allSystemPrompts, conversations, createConversation, currentConversation?.apiConfig, @@ -272,7 +293,7 @@ export const useCurrentConversation = ({ return { currentConversation, - currentSystemPromptId, + currentSystemPrompt, handleCreateConversation, handleOnConversationDeleted, handleOnConversationSelected, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx index b9f2f789f1df8..4217a3d9dc2b8 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/index.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import { EuiCommentProps } from '@elastic/eui'; import type { HttpSetup } from '@kbn/core-http-browser'; import { omit } from 'lodash/fp'; import React, { useCallback, useMemo, useState, useRef } from 'react'; @@ -21,7 +20,12 @@ import type { RegisterPromptContext, UnRegisterPromptContext, } from '../assistant/prompt_context/types'; -import type { Conversation } from './types'; +import { + AssistantAvailability, + AssistantTelemetry, + Conversation, + GetAssistantMessages, +} from './types'; import { DEFAULT_ASSISTANT_TITLE } from '../assistant/translations'; import { CodeBlockDetails } from '../assistant/use_conversation/helpers'; import { PromptContextTemplate } from '../assistant/prompt_context/types'; @@ -34,7 +38,6 @@ import { STREAMING_LOCAL_STORAGE_KEY, TRACE_OPTIONS_SESSION_STORAGE_KEY, } from './constants'; -import { AssistantAvailability, AssistantTelemetry } from './types'; import { useCapabilities } from '../assistant/api/capabilities/use_capabilities'; import { WELCOME_CONVERSATION_TITLE } from '../assistant/use_conversation/translations'; import { SettingsTabs } from '../assistant/settings/types'; @@ -63,16 +66,7 @@ export interface AssistantProviderProps { basePromptContexts?: PromptContextTemplate[]; docLinks: Omit; children: React.ReactNode; - getComments: (commentArgs: { - abortStream: () => void; - currentConversation?: Conversation; - isFetchingResponse: boolean; - refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean }) => void; - regenerateMessage: (conversationId: string) => void; - showAnonymizedValues: boolean; - setIsStreaming: (isStreaming: boolean) => void; - currentUserAvatar?: UserAvatar; - }) => EuiCommentProps[]; + getComments: GetAssistantMessages; http: HttpSetup; baseConversations: Record; nameSpace?: string; @@ -102,16 +96,7 @@ export interface UseAssistantContext { docLinks: Omit; basePath: string; baseConversations: Record; - getComments: (commentArgs: { - abortStream: () => void; - currentConversation?: Conversation; - isFetchingResponse: boolean; - refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean }) => void; - regenerateMessage: () => void; - showAnonymizedValues: boolean; - currentUserAvatar?: UserAvatar; - setIsStreaming: (isStreaming: boolean) => void; - }) => EuiCommentProps[]; + getComments: GetAssistantMessages; http: HttpSetup; knowledgeBase: KnowledgeBaseConfig; getLastConversationId: (conversationTitle?: string) => string; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/types.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/types.tsx index 790087158102e..c49ab38452dc0 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/types.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant_context/types.tsx @@ -6,6 +6,8 @@ */ import { ApiConfig, Message, Replacements } from '@kbn/elastic-assistant-common'; +import { EuiCommentProps } from '@elastic/eui'; +import { UserAvatar } from '.'; export interface MessagePresentation { delay?: number; @@ -67,3 +69,15 @@ export interface AssistantAvailability { // When true, user has `Edit` privilege for `AnonymizationFields` hasUpdateAIAssistantAnonymization: boolean; } + +export type GetAssistantMessages = (commentArgs: { + abortStream: () => void; + currentConversation?: Conversation; + isFetchingResponse: boolean; + refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean }) => void; + regenerateMessage: (conversationId: string) => void; + showAnonymizedValues: boolean; + currentUserAvatar?: UserAvatar; + setIsStreaming: (isStreaming: boolean) => void; + systemPromptContent?: string; +}) => EuiCommentProps[]; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.test.tsx deleted file mode 100644 index 101b5058b5481..0000000000000 --- a/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.test.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { render, screen } from '@testing-library/react'; - -import { SYSTEM_PROMPT_CONTEXT_NON_I18N } from '../../content/prompts/system/translations'; -import { ReadOnlyContextViewer, Props } from '.'; - -const defaultProps: Props = { - rawData: 'this content is NOT anonymized', -}; - -describe('ReadOnlyContextViewer', () => { - it('renders the context with the correct formatting', () => { - render(); - - const contextBlock = screen.getByTestId('readOnlyContextViewer'); - - expect(contextBlock.textContent).toBe(SYSTEM_PROMPT_CONTEXT_NON_I18N(defaultProps.rawData)); - }); -}); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.tsx index 0fd2da1942bc5..5c4cd6e06f1cc 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/data_anonymization_editor/read_only_context_viewer/index.tsx @@ -7,8 +7,7 @@ import { EuiCodeBlock } from '@elastic/eui'; import React from 'react'; - -import { SYSTEM_PROMPT_CONTEXT_NON_I18N } from '../../content/prompts/system/translations'; +import { SYSTEM_PROMPT_CONTEXT_NON_I18N } from '../../assistant/prompt/translations'; export interface Props { rawData: string; diff --git a/x-pack/packages/kbn-elastic-assistant/index.ts b/x-pack/packages/kbn-elastic-assistant/index.ts index 7cd882cd633b8..0baff57648cc8 100644 --- a/x-pack/packages/kbn-elastic-assistant/index.ts +++ b/x-pack/packages/kbn-elastic-assistant/index.ts @@ -106,6 +106,8 @@ export type { Conversation, /** Message interface on the client */ ClientMessage, + /** Function type to return messages UI */ + GetAssistantMessages, } from './impl/assistant_context/types'; /** diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/helpers.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/helpers.ts index 9e0bf457d528e..9e52b4a7414a6 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/helpers.ts @@ -23,6 +23,10 @@ export const getUpdateScript = ({ ctx._source.api_config.remove('model'); ctx._source.api_config.remove('provider'); } + // an update to apiConfig that does not contain defaultSystemPromptId should remove it + if (params.assignEmpty == true || (params.containsKey('api_config') && !params.api_config.containsKey('default_system_prompt_id'))) { + ctx._source.api_config.remove('default_system_prompt_id'); + } if (params.assignEmpty == true || params.api_config.containsKey('action_type_id')) { ctx._source.api_config.action_type_id = params.api_config.action_type_id; } diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.test.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.test.ts index d3e4fff018abb..c44329c28db48 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.test.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.test.ts @@ -134,10 +134,6 @@ describe('transformToUpdateScheme', () => { jest.clearAllMocks(); }); - afterEach(() => { - jest.clearAllMocks(); - }); - test('it returns a transformed conversation with converted string datetime to ISO from the client', async () => { const conversation: ConversationUpdateProps = getUpdateConversationOptionsMock(); const existingConversation = getConversationResponseMock(); @@ -199,4 +195,43 @@ describe('transformToUpdateScheme', () => { }; expect(transformed).toEqual(expected); }); + test('it does not pass api_config if apiConfig is not updated', async () => { + const conversation: ConversationUpdateProps = getUpdateConversationOptionsMock(); + const existingConversation = getConversationResponseMock(); + (getConversation as unknown as jest.Mock).mockResolvedValueOnce(existingConversation); + + const updateAt = new Date().toISOString(); + const transformed = transformToUpdateScheme(updateAt, { + id: conversation.id, + messages: [ + { + content: 'Message 3', + role: 'user', + timestamp: '2011-10-05T14:48:00.000Z', + traceData: { + traceId: 'something', + transactionId: 'something', + }, + }, + ], + }); + const expected: UpdateConversationSchema = { + id: conversation.id, + updated_at: updateAt, + messages: [ + { + '@timestamp': '2011-10-05T14:48:00.000Z', + content: 'Message 3', + is_error: undefined, + reader: undefined, + role: 'user', + trace_data: { + trace_id: 'something', + transaction_id: 'something', + }, + }, + ], + }; + expect(transformed).toEqual(expected); + }); }); diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.ts index 47a9594f42cab..807fea2decd99 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/conversations/update_conversation.ts @@ -115,13 +115,17 @@ export const transformToUpdateScheme = ( id, updated_at: updatedAt, title, - api_config: { - action_type_id: apiConfig?.actionTypeId, - connector_id: apiConfig?.connectorId, - default_system_prompt_id: apiConfig?.defaultSystemPromptId, - model: apiConfig?.model, - provider: apiConfig?.provider, - }, + ...(apiConfig + ? { + api_config: { + action_type_id: apiConfig?.actionTypeId, + connector_id: apiConfig?.connectorId, + default_system_prompt_id: apiConfig?.defaultSystemPromptId, + model: apiConfig?.model, + provider: apiConfig?.provider, + }, + } + : {}), exclude_from_last_conversation_storage: excludeFromLastConversationStorage, replacements: replacements ? Object.keys(replacements).map((key) => ({ diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts index 9eae749bfa58b..060616d280efe 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts @@ -54,6 +54,7 @@ export interface AgentExecutorParams { request: KibanaRequest; response?: KibanaResponseFactory; size?: number; + systemPrompt?: string; traceOptions?: TraceOptions; responseLanguage?: string; } diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts index d0fe4f5097dfe..0222720d95e37 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/index.ts @@ -18,12 +18,7 @@ import { getLlmClass } from '../../../../routes/utils'; import { EsAnonymizationFieldsSchema } from '../../../../ai_assistant_data_clients/anonymization_fields/types'; import { AssistantToolParams } from '../../../../types'; import { AgentExecutor } from '../../executors/types'; -import { - bedrockToolCallingAgentPrompt, - geminiToolCallingAgentPrompt, - openAIFunctionAgentPrompt, - structuredChatAgentPrompt, -} from './prompts'; +import { formatPrompt, formatPromptStructured, systemPrompts } from './prompts'; import { GraphInputs } from './types'; import { getDefaultAssistantGraph } from './graph'; import { invokeGraph, streamGraph } from './helpers'; @@ -52,6 +47,7 @@ export const callAssistantGraph: AgentExecutor = async ({ replacements, request, size, + systemPrompt, traceOptions, responseLanguage = 'English', }) => { @@ -141,7 +137,7 @@ export const callAssistantGraph: AgentExecutor = async ({ ? await createOpenAIFunctionsAgent({ llm: createLlmInstance(), tools, - prompt: openAIFunctionAgentPrompt, + prompt: formatPrompt(systemPrompts.openai, systemPrompt), streamRunnable: isStream, }) : llmType && ['bedrock', 'gemini'].includes(llmType) && bedrockChatEnabled @@ -149,13 +145,15 @@ export const callAssistantGraph: AgentExecutor = async ({ llm: createLlmInstance(), tools, prompt: - llmType === 'bedrock' ? bedrockToolCallingAgentPrompt : geminiToolCallingAgentPrompt, + llmType === 'bedrock' + ? formatPrompt(systemPrompts.bedrock, systemPrompt) + : formatPrompt(systemPrompts.gemini, systemPrompt), streamRunnable: isStream, }) : await createStructuredChatAgent({ llm: createLlmInstance(), tools, - prompt: structuredChatAgentPrompt, + prompt: formatPromptStructured(systemPrompts.structuredChat, systemPrompt), streamRunnable: isStream, }); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.ts new file mode 100644 index 0000000000000..ae8e3c18c2217 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/translations.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. + */ +// TODO determine whether or not system prompts should be i18n'd +const YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT = + 'You are a security analyst and expert in resolving security incidents. Your role is to assist by answering questions about Elastic Security.'; +const IF_YOU_DONT_KNOW_THE_ANSWER = 'Do not answer questions unrelated to Elastic Security.'; + +export const DEFAULT_SYSTEM_PROMPT = `${YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT} ${IF_YOU_DONT_KNOW_THE_ANSWER}`; + +export const GEMINI_SYSTEM_PROMPT = + `ALWAYS use the provided tools, as they have access to the latest data and syntax.` + + "The final response is the only output the user sees and should be a complete answer to the user's question. Do not leave out important tool output. The final response should never be empty. Don't forget to use tools."; +export const BEDROCK_SYSTEM_PROMPT = `Use tools as often as possible, as they have access to the latest data and syntax. Always return value from ESQLKnowledgeBaseTool as is. Never return tags in the response, but make sure to include tags content in the response. Do not reflect on the quality of the returned search results in your response.`; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/prompts.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/prompts.ts index 9f0ff1b7a51f8..eb52c227421fc 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/prompts.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/prompts.ts @@ -6,69 +6,95 @@ */ import { ChatPromptTemplate } from '@langchain/core/prompts'; +import { + BEDROCK_SYSTEM_PROMPT, + DEFAULT_SYSTEM_PROMPT, + GEMINI_SYSTEM_PROMPT, +} from './nodes/translations'; -export const openAIFunctionAgentPrompt = ChatPromptTemplate.fromMessages([ - ['system', 'You are a helpful assistant'], - ['placeholder', '{chat_history}'], - ['human', '{input}'], - ['placeholder', '{agent_scratchpad}'], -]); - -export const bedrockToolCallingAgentPrompt = ChatPromptTemplate.fromMessages([ - [ - 'system', - 'You are a helpful assistant. ALWAYS use the provided tools. Use tools as often as possible, as they have access to the latest data and syntax. Always return value from ESQLKnowledgeBaseTool as is. Never return tags in the response, but make sure to include tags content in the response. Do not reflect on the quality of the returned search results in your response.', - ], - ['placeholder', '{chat_history}'], - ['human', '{input}'], - ['placeholder', '{agent_scratchpad}'], -]); - -export const geminiToolCallingAgentPrompt = ChatPromptTemplate.fromMessages([ - [ - 'system', - 'You are a helpful assistant. ALWAYS use the provided tools. Use tools as often as possible, as they have access to the latest data and syntax.\n\n' + - "The final response will be the only output the user sees and should be a complete answer to the user's question, as if you were responding to the user's initial question. The final response should never be empty.", - ], - ['placeholder', '{chat_history}'], - ['human', '{input}'], - ['placeholder', '{agent_scratchpad}'], -]); - -export const structuredChatAgentPrompt = ChatPromptTemplate.fromMessages([ - [ - 'system', - 'Respond to the human as helpfully and accurately as possible. You have access to the following tools:\n\n' + - '{tools}\n\n' + - `The tool action_input should ALWAYS follow the tool JSON schema args.\n\n` + - 'Valid "action" values: "Final Answer" or {tool_names}\n\n' + - 'Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input strictly adhering to the tool JSON schema args).\n\n' + - 'Provide only ONE action per $JSON_BLOB, as shown:\n\n' + - '```\n\n' + - '{{\n\n' + - ' "action": $TOOL_NAME,\n\n' + - ' "action_input": $TOOL_INPUT\n\n' + - '}}\n\n' + - '```\n\n' + - 'Follow this format:\n\n' + - 'Question: input question to answer\n\n' + - 'Thought: consider previous and subsequent steps\n\n' + - 'Action:\n\n' + - '```\n\n' + - '$JSON_BLOB\n\n' + - '```\n\n' + - 'Observation: action result\n\n' + - '... (repeat Thought/Action/Observation N times)\n\n' + - 'Thought: I know what to respond\n\n' + - 'Action:\n\n' + - '```\n\n' + - '{{\n\n' + - ' "action": "Final Answer",\n\n' + - // important, no new line here - ' "action_input": "Final response to human"' + - '}}\n\n' + - 'Begin! Reminder to ALWAYS respond with a valid json blob of a single action with no additional output. When using tools, ALWAYS input the expected JSON schema args. Your answer will be parsed as JSON, so never use double quotes within the output and instead use backticks. Single quotes may be used, such as apostrophes. Response format is Action:```$JSON_BLOB```then Observation', - ], - ['placeholder', '{chat_history}'], - ['human', '{input}\n\n{agent_scratchpad}\n\n(reminder to respond in a JSON blob no matter what)'], -]); +export const formatPrompt = (prompt: string, additionalPrompt?: string) => + ChatPromptTemplate.fromMessages([ + ['system', additionalPrompt ? `${prompt}\n\n${additionalPrompt}` : prompt], + ['placeholder', '{chat_history}'], + ['human', '{input}'], + ['placeholder', '{agent_scratchpad}'], + ]); + +export const systemPrompts = { + openai: DEFAULT_SYSTEM_PROMPT, + bedrock: `${DEFAULT_SYSTEM_PROMPT} ${BEDROCK_SYSTEM_PROMPT}`, + gemini: `${DEFAULT_SYSTEM_PROMPT} ${GEMINI_SYSTEM_PROMPT}`, + structuredChat: `Respond to the human as helpfully and accurately as possible. You have access to the following tools: + +{tools} + +The tool action_input should ALWAYS follow the tool JSON schema args. + +Valid "action" values: "Final Answer" or {tool_names} + +Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input strictly adhering to the tool JSON schema args). + +Provide only ONE action per $JSON_BLOB, as shown: + +\`\`\` + +{{ + + "action": $TOOL_NAME, + + "action_input": $TOOL_INPUT + +}} + +\`\`\` + +Follow this format: + +Question: input question to answer + +Thought: consider previous and subsequent steps + +Action: + +\`\`\` + +$JSON_BLOB + +\`\`\` + +Observation: action result + +... (repeat Thought/Action/Observation N times) + +Thought: I know what to respond + +Action: + +\`\`\` + +{{ + + "action": "Final Answer", + + "action_input": "Final response to human"}} + +Begin! Reminder to ALWAYS respond with a valid json blob of a single action with no additional output. When using tools, ALWAYS input the expected JSON schema args. Your answer will be parsed as JSON, so never use double quotes within the output and instead use backticks. Single quotes may be used, such as apostrophes. Response format is Action:\`\`\`$JSON_BLOB\`\`\`then Observation`, +}; + +export const openAIFunctionAgentPrompt = formatPrompt(systemPrompts.openai); + +export const bedrockToolCallingAgentPrompt = formatPrompt(systemPrompts.bedrock); + +export const geminiToolCallingAgentPrompt = formatPrompt(systemPrompts.gemini); + +export const formatPromptStructured = (prompt: string, additionalPrompt?: string) => + ChatPromptTemplate.fromMessages([ + ['system', additionalPrompt ? `${prompt}\n\n${additionalPrompt}` : prompt], + ['placeholder', '{chat_history}'], + [ + 'human', + '{input}\n\n{agent_scratchpad}\n\n(reminder to respond in a JSON blob no matter what)', + ], + ]); + +export const structuredChatAgentPrompt = formatPromptStructured(systemPrompts.structuredChat); diff --git a/x-pack/plugins/elastic_assistant/server/routes/helpers.ts b/x-pack/plugins/elastic_assistant/server/routes/helpers.ts index fba788df5cc2e..cdfa3ad26293f 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/helpers.ts @@ -28,6 +28,9 @@ import { AwaitedProperties, PublicMethodsOf } from '@kbn/utility-types'; import { ActionsClient } from '@kbn/actions-plugin/server'; import { AssistantFeatureKey } from '@kbn/elastic-assistant-common/impl/capabilities'; import { getLangSmithTracer } from '@kbn/langchain/server/tracers/langsmith'; +import { FindResponse } from '../ai_assistant_data_clients/find'; +import { EsPromptsSchema } from '../ai_assistant_data_clients/prompts/types'; +import { AIAssistantDataClient } from '../ai_assistant_data_clients'; import { MINIMUM_AI_ASSISTANT_LICENSE } from '../../common/constants'; import { ESQL_RESOURCE } from './knowledge_base/constants'; import { buildResponse, getLlmType } from './utils'; @@ -214,6 +217,39 @@ export const appendMessageToConversation = async ({ return updatedConversation; }; +export interface GetSystemPromptFromUserConversationParams { + conversationsDataClient: AIAssistantConversationsDataClient; + conversationId: string; + promptsDataClient: AIAssistantDataClient; +} +const extractPromptFromESResult = (result: FindResponse): string | undefined => { + if (result.total > 0 && result.data.hits.hits.length > 0) { + return result.data.hits.hits[0]._source?.content; + } + return undefined; +}; + +export const getSystemPromptFromUserConversation = async ({ + conversationsDataClient, + conversationId, + promptsDataClient, +}: GetSystemPromptFromUserConversationParams): Promise => { + const conversation = await conversationsDataClient.getConversation({ id: conversationId }); + if (!conversation) { + return undefined; + } + const currentSystemPromptId = conversation.apiConfig?.defaultSystemPromptId; + if (!currentSystemPromptId) { + return undefined; + } + const result = await promptsDataClient.findDocuments({ + perPage: 1, + page: 1, + filter: `_id: "${currentSystemPromptId}"`, + }); + return extractPromptFromESResult(result); +}; + export interface AppendAssistantMessageToConversationParams { conversationsDataClient: AIAssistantConversationsDataClient; messageContent: string; @@ -300,6 +336,7 @@ export interface LangChainExecuteParams { getElser: GetElser; response: KibanaResponseFactory; responseLanguage?: string; + systemPrompt?: string; } export const langChainExecute = async ({ messages, @@ -319,6 +356,7 @@ export const langChainExecute = async ({ response, responseLanguage, isStream = true, + systemPrompt, }: LangChainExecuteParams) => { // Fetch any tools registered by the request's originating plugin const pluginName = getPluginNameFromRequest({ @@ -389,6 +427,7 @@ export const langChainExecute = async ({ replacements, responseLanguage, size: request.body.size, + systemPrompt, traceOptions: { projectName: request.body.langSmithProject, tracers: getLangSmithTracer({ diff --git a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts index 12e854d5d0bf3..d19127be0d7e8 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.test.ts @@ -79,6 +79,9 @@ const mockContext = { appendConversationMessages: appendConversationMessages.mockResolvedValue(existingConversation), }), + getAIAssistantPromptsDataClient: jest.fn().mockResolvedValue({ + findDocuments: jest.fn(), + }), getAIAssistantAnonymizationFieldsDataClient: jest.fn().mockResolvedValue({ findDocuments: jest.fn().mockResolvedValue(getFindAnonymizationFieldsResultWithSingleHit()), }), diff --git a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts index c8099e6e7f2fe..38df73b7d25b6 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts @@ -21,7 +21,11 @@ import { INVOKE_ASSISTANT_ERROR_EVENT } from '../lib/telemetry/event_based_telem import { POST_ACTIONS_CONNECTOR_EXECUTE } from '../../common/constants'; import { buildResponse } from '../lib/build_response'; import { ElasticAssistantRequestHandlerContext, GetElser } from '../types'; -import { appendAssistantMessageToConversation, langChainExecute } from './helpers'; +import { + appendAssistantMessageToConversation, + getSystemPromptFromUserConversation, + langChainExecute, +} from './helpers'; export const postActionsConnectorExecuteRoute = ( router: IRouter, @@ -89,6 +93,7 @@ export const postActionsConnectorExecuteRoute = ( const conversationsDataClient = await assistantContext.getAIAssistantConversationsDataClient(); + const promptsDataClient = await assistantContext.getAIAssistantPromptsDataClient(); onLlmResponse = async ( content: string, @@ -106,7 +111,14 @@ export const postActionsConnectorExecuteRoute = ( }); } }; - + let systemPrompt; + if (conversationsDataClient && promptsDataClient && conversationId) { + systemPrompt = await getSystemPromptFromUserConversation({ + conversationsDataClient, + conversationId, + promptsDataClient, + }); + } return await langChainExecute({ abortSignal, isStream: request.body.subAction !== 'invokeAI', @@ -124,6 +136,7 @@ export const postActionsConnectorExecuteRoute = ( request, response, telemetry, + systemPrompt, }); } catch (err) { logger.error(err); diff --git a/x-pack/plugins/elastic_assistant/server/routes/prompts/find_route.ts b/x-pack/plugins/elastic_assistant/server/routes/prompts/find_route.ts index 142b63a7d04b5..848680be662a3 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/prompts/find_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/prompts/find_route.ts @@ -59,7 +59,11 @@ export const findPromptsRoute = (router: ElasticAssistantPluginRouter, logger: L page: query.page, sortField: query.sort_field, sortOrder: query.sort_order, - filter: query.filter ? decodeURIComponent(query.filter) : undefined, + filter: query.filter + ? `${decodeURIComponent( + query.filter + )} and not (prompt_type: "system" and is_default: true)` + : 'not (prompt_type: "system" and is_default: true)', fields: query.fields, }); diff --git a/x-pack/plugins/security_solution/public/assistant/content/prompts/system/index.tsx b/x-pack/plugins/security_solution/public/assistant/content/prompts/system/index.tsx deleted file mode 100644 index ee9d4018365c5..0000000000000 --- a/x-pack/plugins/security_solution/public/assistant/content/prompts/system/index.tsx +++ /dev/null @@ -1,41 +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 { - PromptTypeEnum, - type PromptResponse, -} from '@kbn/elastic-assistant-common/impl/schemas/prompts/bulk_crud_prompts_route.gen'; -import { APP_UI_ID } from '../../../../../common'; -import { - DEFAULT_SYSTEM_PROMPT_NAME, - DEFAULT_SYSTEM_PROMPT_NON_I18N, - SUPERHERO_SYSTEM_PROMPT_NAME, - SUPERHERO_SYSTEM_PROMPT_NON_I18N, -} from './translations'; - -/** - * Base System Prompts for Security Solution. - */ -export const BASE_SECURITY_SYSTEM_PROMPTS: PromptResponse[] = [ - { - id: 'default-system-prompt', - content: DEFAULT_SYSTEM_PROMPT_NON_I18N, - name: DEFAULT_SYSTEM_PROMPT_NAME, - promptType: PromptTypeEnum.system, - isDefault: true, - isNewConversationDefault: true, - consumer: APP_UI_ID, - }, - { - id: 'CB9FA555-B59F-4F71-AFF9-8A891AC5BC28', - content: SUPERHERO_SYSTEM_PROMPT_NON_I18N, - name: SUPERHERO_SYSTEM_PROMPT_NAME, - promptType: PromptTypeEnum.system, - consumer: APP_UI_ID, - isDefault: true, - }, -]; diff --git a/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts b/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts deleted file mode 100644 index b132a8e83770a..0000000000000 --- a/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.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 { i18n } from '@kbn/i18n'; - -export const YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant', - { - defaultMessage: - 'You are a helpful, expert assistant who answers questions about Elastic Security.', - } -); - -export const IF_YOU_DONT_KNOW_THE_ANSWER = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.ifYouDontKnowTheAnswer', - { - defaultMessage: 'Do not answer questions unrelated to Elastic Security.', - } -); - -export const SUPERHERO_PERSONALITY = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.superheroPersonality', - { - defaultMessage: - 'Provide the most detailed and relevant answer possible, as if you were relaying this information back to a cyber security expert.', - } -); - -export const FORMAT_OUTPUT_CORRECTLY = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.outputFormatting', - { - defaultMessage: - 'If you answer a question related to KQL, EQL, or ES|QL, it should be immediately usable within an Elastic Security timeline; please always format the output correctly with back ticks. Any answer provided for Query DSL should also be usable in a security timeline. This means you should only ever include the "filter" portion of the query.', - } -); - -export const DEFAULT_SYSTEM_PROMPT_NON_I18N = `${YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT} ${IF_YOU_DONT_KNOW_THE_ANSWER} -${FORMAT_OUTPUT_CORRECTLY}`; - -export const DEFAULT_SYSTEM_PROMPT_NAME = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.defaultSystemPromptName', - { - defaultMessage: 'Default system prompt', - } -); - -export const SUPERHERO_SYSTEM_PROMPT_NON_I18N = `${YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT} ${IF_YOU_DONT_KNOW_THE_ANSWER} -${SUPERHERO_PERSONALITY} -${FORMAT_OUTPUT_CORRECTLY}`; - -export const SUPERHERO_SYSTEM_PROMPT_NAME = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName', - { - defaultMessage: 'Enhanced system prompt', - } -); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx index efbb56ebcf540..b3be6370e905d 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx @@ -5,8 +5,7 @@ * 2.0. */ -import type { EuiCommentProps } from '@elastic/eui'; -import type { Conversation, ClientMessage } from '@kbn/elastic-assistant'; +import type { ClientMessage, GetAssistantMessages } from '@kbn/elastic-assistant'; import { EuiAvatar, EuiLoadingSpinner } from '@elastic/eui'; import React from 'react'; @@ -14,7 +13,7 @@ import { AssistantAvatar } from '@kbn/elastic-assistant'; import type { Replacements } from '@kbn/elastic-assistant-common'; import { replaceAnonymizedValuesWithOriginalValues } from '@kbn/elastic-assistant-common'; import styled from '@emotion/styled'; -import type { UserAvatar } from '@kbn/elastic-assistant/impl/assistant_context'; +import type { EuiPanelProps } from '@elastic/eui/src/components/panel'; import { StreamComment } from './stream'; import { CommentActions } from '../comment_actions'; import * as i18n from './translations'; @@ -52,7 +51,7 @@ const transformMessageWithReplacements = ({ }; }; -export const getComments = ({ +export const getComments: GetAssistantMessages = ({ abortStream, currentConversation, isFetchingResponse, @@ -61,16 +60,8 @@ export const getComments = ({ showAnonymizedValues, currentUserAvatar, setIsStreaming, -}: { - abortStream: () => void; - currentConversation?: Conversation; - isFetchingResponse: boolean; - refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean }) => void; - regenerateMessage: (conversationId: string) => void; - showAnonymizedValues: boolean; - currentUserAvatar?: UserAvatar; - setIsStreaming: (isStreaming: boolean) => void; -}): EuiCommentProps[] => { + systemPromptContent, +}) => { if (!currentConversation) return []; const regenerateMessageOfConversation = () => { @@ -122,6 +113,32 @@ export const getComments = ({ }; return [ + ...(systemPromptContent && currentConversation.messages.length + ? [ + { + username: i18n.SYSTEM, + timelineAvatar: ( + + ), + timestamp: + currentConversation.messages[0].timestamp.length === 0 + ? new Date().toLocaleString() + : new Date(currentConversation.messages[0].timestamp).toLocaleString(), + children: ( + ({ content: '' } as unknown as ContentMessage)} + // we never need to append to a code block in the system comment, which is what this index is used for + index={999} + /> + ), + }, + ] + : []), ...currentConversation.messages.map((message, index) => { const isLastComment = index === currentConversation.messages.length - 1; const isUser = message.role === 'user'; @@ -139,7 +156,7 @@ export const getComments = ({ : new Date(message.timestamp).toLocaleString() ), username: isUser ? i18n.YOU : i18n.ASSISTANT, - eventColor: message.isError ? 'danger' : undefined, + eventColor: message.isError ? ('danger' as EuiPanelProps['color']) : undefined, }; const isControlsEnabled = isLastComment && !isUser; diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts b/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts index fbccef68f7398..62614dbfaf77d 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/translations.ts @@ -7,6 +7,10 @@ import { i18n } from '@kbn/i18n'; +export const SYSTEM = i18n.translate('xpack.securitySolution.assistant.getComments.system', { + defaultMessage: 'System', +}); + export const ASSISTANT = i18n.translate('xpack.securitySolution.assistant.getComments.assistant', { defaultMessage: 'Assistant', }); diff --git a/x-pack/plugins/security_solution/public/assistant/provider.test.tsx b/x-pack/plugins/security_solution/public/assistant/provider.test.tsx index 0534df76aaf6e..a96623b8567a8 100644 --- a/x-pack/plugins/security_solution/public/assistant/provider.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/provider.test.tsx @@ -5,28 +5,14 @@ * 2.0. */ -import React from 'react'; import { act, renderHook } from '@testing-library/react-hooks'; import { httpServiceMock, type HttpSetupMock } from '@kbn/core-http-browser-mocks'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; -import { AssistantProvider, createConversations } from './provider'; +import { createConversations } from './provider'; import { coreMock } from '@kbn/core/public/mocks'; -import { useKibana as mockUseKibana } from '../common/lib/kibana/__mocks__'; import { loadAllActions as loadConnectors } from '@kbn/triggers-actions-ui-plugin/public/common/constants'; -import { useKibana } from '../common/lib/kibana'; -import { render, waitFor } from '@testing-library/react'; -import { TestProviders } from '../common/mock'; -import { useAssistantAvailability } from './use_assistant_availability'; -import { - bulkUpdatePrompts, - getPrompts, - getUserConversations, -} from '@kbn/elastic-assistant/impl/assistant/api'; -import { BASE_SECURITY_SYSTEM_PROMPTS } from './content/prompts/system'; -const mockedUseKibana = mockUseKibana(); jest.mock('./use_assistant_availability'); -jest.mock('../common/lib/kibana'); jest.mock('@kbn/elastic-assistant/impl/assistant/api'); jest.mock('../common/hooks/use_license', () => ({ @@ -224,85 +210,3 @@ describe('createConversations', () => { }); }); }); -describe('AssistantProvider', () => { - beforeEach(() => { - jest.clearAllMocks(); - (useKibana as jest.Mock).mockReturnValue({ - ...mockedUseKibana, - services: { - ...mockedUseKibana.services, - }, - }); - jest.mocked(useAssistantAvailability).mockReturnValue({ - hasAssistantPrivilege: true, - hasConnectorsAllPrivilege: true, - hasConnectorsReadPrivilege: true, - hasUpdateAIAssistantAnonymization: true, - isAssistantEnabled: true, - }); - - (getUserConversations as jest.Mock).mockResolvedValue({ - page: 1, - perPage: 5, - total: 5, - data: [], - }); - (getPrompts as jest.Mock).mockResolvedValue({ - page: 1, - perPage: 5, - total: 0, - data: [], - }); - }); - it('should not render the assistant when no prompts have been returned', async () => { - const { queryByTestId } = render( - - - , - { - wrapper: TestProviders, - } - ); - expect(queryByTestId('ourAssistant')).toBeNull(); - }); - it('should render the assistant when prompts are returned', async () => { - (getPrompts as jest.Mock).mockResolvedValue({ - page: 1, - perPage: 5, - total: 2, - data: BASE_SECURITY_SYSTEM_PROMPTS, - }); - const { getByTestId } = render( - - - , - { - wrapper: TestProviders, - } - ); - await waitFor(() => { - expect(getByTestId('ourAssistant')).not.toBeNull(); - }); - }); - it('should render the assistant once prompts have been created', async () => { - (bulkUpdatePrompts as jest.Mock).mockResolvedValue({ - success: true, - attributes: { - results: { - created: BASE_SECURITY_SYSTEM_PROMPTS, - }, - }, - }); - const { getByTestId } = render( - - - , - { - wrapper: TestProviders, - } - ); - await waitFor(() => { - expect(getByTestId('ourAssistant')).not.toBeNull(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/assistant/provider.tsx b/x-pack/plugins/security_solution/public/assistant/provider.tsx index dbfbb026ab2d3..54d4e47edb684 100644 --- a/x-pack/plugins/security_solution/public/assistant/provider.tsx +++ b/x-pack/plugins/security_solution/public/assistant/provider.tsx @@ -5,7 +5,7 @@ * 2.0. */ import type { FC, PropsWithChildren } from 'react'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import { parse } from '@kbn/datemath'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { i18n } from '@kbn/i18n'; @@ -30,7 +30,6 @@ import { useAssistantTelemetry } from './use_assistant_telemetry'; import { getComments } from './get_comments'; import { LOCAL_STORAGE_KEY, augmentMessageCodeBlocks } from './helpers'; import { BASE_SECURITY_QUICK_PROMPTS } from './content/quick_prompts'; -import { BASE_SECURITY_SYSTEM_PROMPTS } from './content/prompts/system'; import { useBaseConversations } from './use_conversation_store'; import { PROMPT_CONTEXTS } from './content/prompt_contexts'; import { useAssistantAvailability } from './use_assistant_availability'; @@ -117,7 +116,7 @@ export const createConversations = async ( }; export const createBasePrompts = async (notifications: NotificationsStart, http: HttpSetup) => { - const promptsToCreate = [...BASE_SECURITY_QUICK_PROMPTS, ...BASE_SECURITY_SYSTEM_PROMPTS]; + const promptsToCreate = [...BASE_SECURITY_QUICK_PROMPTS]; // post bulk create const bulkResult = await bulkUpdatePrompts( @@ -176,8 +175,6 @@ export const AssistantProvider: FC> = ({ children }) storage, ]); - const [basePromptsLoaded, setBasePromptsLoaded] = useState(false); - useEffect(() => { const createSecurityPrompts = once(async () => { if ( @@ -197,8 +194,6 @@ export const AssistantProvider: FC> = ({ children }) // eslint-disable-next-line no-empty } catch (e) {} } - - setBasePromptsLoaded(true); }); createSecurityPrompts(); }, [ @@ -212,9 +207,6 @@ export const AssistantProvider: FC> = ({ children }) const { signalIndexName } = useSignalIndex(); const alertsIndexPattern = signalIndexName ?? undefined; const toasts = useAppToasts() as unknown as IToasts; // useAppToasts is the current, non-deprecated method of getting the toasts service in the Security Solution, but it doesn't return the IToasts interface (defined by core) - // Because our conversations need an assigned system prompt at create time, - // we want to make sure the prompts are there before creating the first conversation - // however if there is an error fetching the prompts, we don't want to block the app return ( > = ({ children }) toasts={toasts} currentAppId={currentAppId ?? 'securitySolutionUI'} > - {basePromptsLoaded ? children : null} + {children} ); }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 583b571bbc73f..5e08ebf2f10f2 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -15026,7 +15026,6 @@ "xpack.elasticAssistant.assistant.connectors.connectorSelector.newConnectorOptions": "Ajouter un nouveau connecteur...", "xpack.elasticAssistant.assistant.connectors.connectorSelectorInline.connectorPlaceholder": "Sélectionner un connecteur", "xpack.elasticAssistant.assistant.connectors.preconfiguredTitle": "Préconfiguré", - "xpack.elasticAssistant.assistant.content.prompts.system.defaultSystemPromptName": "Invite de système par défaut", "xpack.elasticAssistant.assistant.conversations.settings.connectorTitle": "Connecteur", "xpack.elasticAssistant.assistant.conversations.settings.promptHelpTextTitle": "Contexte fourni dans le cadre de chaque conversation.", "xpack.elasticAssistant.assistant.conversations.settings.promptTitle": "Invite système", @@ -35521,12 +35520,6 @@ "xpack.securitySolution.assistant.commentActions.viewAPMTraceLabel": "Voir la trace APM pour ce message", "xpack.securitySolution.assistant.content.promptContexts.indexTitle": "index", "xpack.securitySolution.assistant.content.promptContexts.viewTitle": "vue", - "xpack.securitySolution.assistant.content.prompts.system.defaultSystemPromptName": "Invite de système par défaut", - "xpack.securitySolution.assistant.content.prompts.system.ifYouDontKnowTheAnswer": "Ne répondez pas aux questions qui ne sont pas liées à Elastic Security.", - "xpack.securitySolution.assistant.content.prompts.system.outputFormatting": "Si vous répondez à une question liée à KQL, à EQL, ou à ES|QL, la réponse doit être immédiatement utilisable dans une chronologie d'Elastic Security ; veuillez toujours formater correctement la sortie avec des accents graves. Toute réponse à une requête DSL doit aussi être utilisable dans une chronologie de sécurité. Cela signifie que vous ne devez inclure que la portion \"filtre\" de la requête.", - "xpack.securitySolution.assistant.content.prompts.system.superheroPersonality": "Donnez la réponse la plus pertinente et détaillée possible, comme si vous deviez communiquer ces informations à un expert en cybersécurité.", - "xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName": "Invite système améliorée", - "xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "Vous êtes un assistant expert et serviable qui répond à des questions au sujet d’Elastic Security.", "xpack.securitySolution.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "Ajoutez votre description, les actions que vous recommandez ainsi que les étapes de triage à puces. Utilisez les données \"MITRE ATT&CK\" fournies pour ajouter du contexte et des recommandations de MITRE ainsi que des liens hypertexte vers les pages pertinentes sur le site web de MITRE. Assurez-vous d’inclure les scores de risque de l’utilisateur et de l’hôte du contexte. Votre réponse doit inclure des étapes qui pointent vers les fonctionnalités spécifiques d’Elastic Security, y compris les actions de réponse du terminal, l’intégration OSQuery Manager d’Elastic Agent (avec des exemples de requêtes OSQuery), des analyses de timeline et d’entités, ainsi qu’un lien pour toute la documentation Elastic Security pertinente.", "xpack.securitySolution.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "Évaluer l’événement depuis le contexte ci-dessus et formater soigneusement la sortie en syntaxe Markdown pour mon cas Elastic Security.", "xpack.securitySolution.assistant.conversationMigrationStatus.title": "Les conversations de stockage local ont été persistées avec succès.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 70d5a3b861b99..76b479846efa4 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -15013,7 +15013,6 @@ "xpack.elasticAssistant.assistant.connectors.connectorSelector.newConnectorOptions": "新しいコネクターを追加...", "xpack.elasticAssistant.assistant.connectors.connectorSelectorInline.connectorPlaceholder": "コネクターを選択", "xpack.elasticAssistant.assistant.connectors.preconfiguredTitle": "構成済み", - "xpack.elasticAssistant.assistant.content.prompts.system.defaultSystemPromptName": "デフォルトシステムプロンプト", "xpack.elasticAssistant.assistant.conversations.settings.connectorTitle": "コネクター", "xpack.elasticAssistant.assistant.conversations.settings.promptHelpTextTitle": "すべての会話の一部として提供されたコンテキスト。", "xpack.elasticAssistant.assistant.conversations.settings.promptTitle": "システムプロンプト", @@ -35506,12 +35505,6 @@ "xpack.securitySolution.assistant.commentActions.viewAPMTraceLabel": "このメッセージのAPMトレースを表示", "xpack.securitySolution.assistant.content.promptContexts.indexTitle": "インデックス", "xpack.securitySolution.assistant.content.promptContexts.viewTitle": "表示", - "xpack.securitySolution.assistant.content.prompts.system.defaultSystemPromptName": "デフォルトシステムプロンプト", - "xpack.securitySolution.assistant.content.prompts.system.ifYouDontKnowTheAnswer": "Elasticセキュリティに関連していない質問には回答しないでください。", - "xpack.securitySolution.assistant.content.prompts.system.outputFormatting": "KQL、EQL、ES|QLに関連する質問に回答した場合、Elastic Securityのタイムライン内ですぐに使用できるようにする必要があります。出力は常にバックティックで正しい形式にしてください。クエリDSLで提供されるすべての回答は、セキュリティタイムラインでも使用可能でなければなりません。つまり、クエリの\"フィルター\"部分のみを含める必要があります。", - "xpack.securitySolution.assistant.content.prompts.system.superheroPersonality": "サイバーセキュリティの専門家に情報を伝えるつもりで、できるだけ詳細で関連性のある回答を入力してください。", - "xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName": "拡張システムプロンプト", - "xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "あなたはElasticセキュリティに関する質問に答える、親切で専門的なアシスタントです。", "xpack.securitySolution.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "説明、推奨されるアクション、箇条書きのトリアージステップを追加します。提供された MITRE ATT&CKデータを使用して、MITREからのコンテキストや推奨事項を追加し、MITREのWebサイトの関連ページにハイパーリンクを貼ります。コンテキストのユーザーとホストのリスクスコアデータを必ず含めてください。回答には、エンドポイント対応アクション、ElasticエージェントOSQueryマネージャー統合(osqueryクエリーの例を付けて)、タイムライン、エンティティ分析など、Elasticセキュリティ固有の機能を指す手順を含め、関連するElasticセキュリティのドキュメントすべてにリンクしてください。", "xpack.securitySolution.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "上記のコンテキストからイベントを評価し、Elasticセキュリティのケース用に、出力をマークダウン構文で正しく書式設定してください。", "xpack.securitySolution.assistant.conversationMigrationStatus.title": "ローカルストレージ会話は正常に永続しました。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5ba58da581710..a17ef39b025e3 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -15038,7 +15038,6 @@ "xpack.elasticAssistant.assistant.connectors.connectorSelector.newConnectorOptions": "添加新连接器……", "xpack.elasticAssistant.assistant.connectors.connectorSelectorInline.connectorPlaceholder": "选择连接器", "xpack.elasticAssistant.assistant.connectors.preconfiguredTitle": "预配置", - "xpack.elasticAssistant.assistant.content.prompts.system.defaultSystemPromptName": "默认系统提示", "xpack.elasticAssistant.assistant.conversations.settings.connectorTitle": "连接器", "xpack.elasticAssistant.assistant.conversations.settings.promptHelpTextTitle": "已作为每个对话的一部分提供上下文。", "xpack.elasticAssistant.assistant.conversations.settings.promptTitle": "系统提示", @@ -35547,12 +35546,6 @@ "xpack.securitySolution.assistant.commentActions.viewAPMTraceLabel": "查看此消息的 APM 跟踪", "xpack.securitySolution.assistant.content.promptContexts.indexTitle": "索引", "xpack.securitySolution.assistant.content.promptContexts.viewTitle": "视图", - "xpack.securitySolution.assistant.content.prompts.system.defaultSystemPromptName": "默认系统提示", - "xpack.securitySolution.assistant.content.prompts.system.ifYouDontKnowTheAnswer": "不回答与 Elastic Security 无关的问题。", - "xpack.securitySolution.assistant.content.prompts.system.outputFormatting": "如果您回答与 KQL、EQL 或 ES|QL 相关的问题,它应在 Elastic Security 时间线中立即可用;请始终用反勾号对输出进行正确格式化。为查询 DSL 提供的任何答案也应在安全时间线中可用。这意味着您只应包括查询的“筛选”部分。", - "xpack.securitySolution.assistant.content.prompts.system.superheroPersonality": "提供可能的最详细、最相关的答案,就好像您正将此信息转发给网络安全专家一样。", - "xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName": "已增强系统提示", - "xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "您是一位可帮助回答 Elastic Security 相关问题的专家助手。", "xpack.securitySolution.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "添加描述、建议操作和带项目符号的分类步骤。使用提供的 MITRE ATT&CK 数据以从 MITRE 添加更多上下文和建议,以及指向 MITRE 网站上的相关页面的超链接。确保包括上下文中的用户和主机风险分数数据。您的响应应包含指向 Elastic Security 特定功能的步骤,包括终端响应操作、Elastic 代理 OSQuery 管理器集成(带示例 osquery 查询)、时间线和实体分析,以及所有相关 Elastic Security 文档的链接。", "xpack.securitySolution.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "评估来自上述上下文的事件,并以用于我的 Elastic Security 案例的 Markdown 语法对您的输出进行全面格式化。", "xpack.securitySolution.assistant.conversationMigrationStatus.title": "已成功保持本地存储对话。", diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/conversations.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/conversations.cy.ts index 286627367c46e..2b277e73cf24a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/conversations.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/conversations.cy.ts @@ -24,7 +24,6 @@ import { selectRule, assertErrorToastShown, updateConversationTitle, - assertSystemPrompt, } from '../../tasks/assistant'; import { deleteConversations } from '../../tasks/api_calls/assistant'; import { @@ -71,7 +70,6 @@ describe('AI Assistant Conversations', { tags: ['@ess', '@serverless'] }, () => openAssistant(); assertNewConversation(false, 'Welcome'); assertConnectorSelected(azureConnectorAPIPayload.name); - assertSystemPrompt('Default system prompt'); cy.get(USER_PROMPT).should('not.have.text'); }); it('When invoked from rules page', () => { @@ -81,7 +79,6 @@ describe('AI Assistant Conversations', { tags: ['@ess', '@serverless'] }, () => openAssistant('rule'); assertNewConversation(false, 'Detection Rules'); assertConnectorSelected(azureConnectorAPIPayload.name); - assertSystemPrompt('Default system prompt'); cy.get(USER_PROMPT).should('have.text', EXPLAIN_THEN_SUMMARIZE_RULE_DETAILS); cy.get(PROMPT_CONTEXT_BUTTON(0)).should('have.text', RULE_MANAGEMENT_CONTEXT_DESCRIPTION); }); @@ -94,7 +91,6 @@ describe('AI Assistant Conversations', { tags: ['@ess', '@serverless'] }, () => openAssistant('alert'); assertNewConversation(false, 'Alert summary'); assertConnectorSelected(azureConnectorAPIPayload.name); - assertSystemPrompt('Default system prompt'); cy.get(USER_PROMPT).should( 'have.text', EXPLAIN_THEN_SUMMARIZE_SUGGEST_INVESTIGATION_GUIDE_NON_I18N @@ -135,19 +131,19 @@ describe('AI Assistant Conversations', { tags: ['@ess', '@serverless'] }, () => assertNewConversation(false, 'Welcome'); assertConnectorSelected(azureConnectorAPIPayload.name); typeAndSendMessage('hello'); - assertMessageSent('hello', true); + assertMessageSent('hello'); assertErrorResponse(); selectConversation('Alert summary'); selectConnector(bedrockConnectorAPIPayload.name); typeAndSendMessage('goodbye'); - assertMessageSent('goodbye', true); + assertMessageSent('goodbye'); assertErrorResponse(); selectConversation('Welcome'); assertConnectorSelected(azureConnectorAPIPayload.name); - assertMessageSent('hello', true); + assertMessageSent('hello'); selectConversation('Alert summary'); assertConnectorSelected(bedrockConnectorAPIPayload.name); - assertMessageSent('goodbye', true); + assertMessageSent('goodbye'); }); // This test is flakey due to the issue linked below and will be skipped until it is fixed it.skip('Only allows one conversation called "New chat" at a time', () => { @@ -159,7 +155,7 @@ describe('AI Assistant Conversations', { tags: ['@ess', '@serverless'] }, () => typeAndSendMessage('hello'); // TODO fix bug with new chat and error message // https://github.com/elastic/kibana/issues/191025 - // assertMessageSent('hello', true); + // assertMessageSent('hello'); assertErrorResponse(); selectConversation('Welcome'); createNewChat(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts index ff8e137a874ce..b1bcf5a74d1b1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/ai_assistant/prompts.cy.ts @@ -5,14 +5,16 @@ * 2.0. */ -import { SUPERHERO_SYSTEM_PROMPT_NON_I18N } from '@kbn/security-solution-plugin/public/assistant/content/prompts/system/translations'; import { EXPLAIN_THEN_SUMMARIZE_SUGGEST_INVESTIGATION_GUIDE_NON_I18N } from '@kbn/security-solution-plugin/public/assistant/content/prompts/user/translations'; +import { PromptCreateProps } from '@kbn/elastic-assistant-common/impl/schemas/prompts/bulk_crud_prompts_route.gen'; import { QUICK_PROMPT_BADGE, USER_PROMPT } from '../../screens/ai_assistant'; import { createRule } from '../../tasks/api_calls/rules'; import { + assertEmptySystemPrompt, assertErrorResponse, assertMessageSent, - assertSystemPrompt, + assertSystemPromptSelected, + assertSystemPromptSent, clearSystemPrompt, createQuickPrompt, createSystemPrompt, @@ -23,7 +25,11 @@ import { sendQuickPrompt, typeAndSendMessage, } from '../../tasks/assistant'; -import { deleteConversations, deletePrompts } from '../../tasks/api_calls/assistant'; +import { + deleteConversations, + deletePrompts, + waitForCreatePrompts, +} from '../../tasks/api_calls/assistant'; import { createAzureConnector } from '../../tasks/api_calls/connectors'; import { deleteConnectors } from '../../tasks/api_calls/common'; import { login } from '../../tasks/login'; @@ -33,10 +39,23 @@ import { ALERTS_URL } from '../../urls/navigation'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { expandFirstAlert } from '../../tasks/alerts'; +const promptType: PromptCreateProps['promptType'] = 'system'; const testPrompt = { - title: 'Cool prompt', - prompt: 'This is a super cool prompt.', + name: 'Cool prompt', + content: 'This is a super cool prompt.', +}; + +const customPrompt1 = { + name: 'Custom system prompt', + content: 'This is a custom system prompt.', + promptType, }; +const customPrompt2 = { + name: 'Enhanced system prompt', + content: 'This is an enhanced system prompt.', + promptType, +}; + describe('AI Assistant Prompts', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteConnectors(); @@ -47,88 +66,103 @@ describe('AI Assistant Prompts', { tags: ['@ess', '@serverless'] }, () => { }); describe('System Prompts', () => { - it('Deselecting default system prompt prevents prompt from being sent. When conversation is then cleared, the prompt is reset.', () => { + beforeEach(() => { + waitForCreatePrompts([customPrompt2, customPrompt1]); + }); + it('No prompt is selected by default, custom prompts can be selected and deselected', () => { + visitGetStartedPage(); + openAssistant(); + assertEmptySystemPrompt(); + selectSystemPrompt(customPrompt2.name); + selectSystemPrompt(customPrompt1.name); + clearSystemPrompt(); + }); + it('Deselecting a system prompt prevents prompt from being sent. When conversation is then cleared, the prompt remains cleared.', () => { visitGetStartedPage(); openAssistant(); + selectSystemPrompt(customPrompt2.name); clearSystemPrompt(); typeAndSendMessage('hello'); assertMessageSent('hello'); // ensure response before clearing convo assertErrorResponse(); resetConversation(); + assertEmptySystemPrompt(); typeAndSendMessage('hello'); - assertMessageSent('hello', true); + assertMessageSent('hello'); }); it('Last selected system prompt persists in conversation', () => { visitGetStartedPage(); openAssistant(); - selectSystemPrompt('Enhanced system prompt'); + selectSystemPrompt(customPrompt2.name); typeAndSendMessage('hello'); - assertMessageSent('hello', true, SUPERHERO_SYSTEM_PROMPT_NON_I18N); + assertSystemPromptSent(customPrompt2.content); + assertMessageSent('hello', true); resetConversation(); - assertSystemPrompt('Enhanced system prompt'); - selectConversation('Alert summary'); - assertSystemPrompt('Default system prompt'); + assertSystemPromptSelected(customPrompt2.name); + selectConversation('Timeline'); + assertEmptySystemPrompt(); selectConversation('Welcome'); - assertSystemPrompt('Enhanced system prompt'); + assertSystemPromptSelected(customPrompt2.name); }); it('Add prompt from system prompt selector without setting a default conversation', () => { visitGetStartedPage(); openAssistant(); - createSystemPrompt(testPrompt.title, testPrompt.prompt); + createSystemPrompt(testPrompt.name, testPrompt.content); // we did not set a default conversation, so the prompt should not be set - assertSystemPrompt('Default system prompt'); - selectSystemPrompt(testPrompt.title); + assertEmptySystemPrompt(); + selectSystemPrompt(testPrompt.name); typeAndSendMessage('hello'); - assertMessageSent('hello', true, testPrompt.prompt); + assertSystemPromptSent(testPrompt.content); + assertMessageSent('hello', true); }); it('Add prompt from system prompt selector and set multiple conversations (including current) as default conversation', () => { visitGetStartedPage(); openAssistant(); - createSystemPrompt(testPrompt.title, testPrompt.prompt, [ - 'Welcome', - 'Alert summary', - 'Data Quality Dashboard', - ]); - assertSystemPrompt(testPrompt.title); + createSystemPrompt(testPrompt.name, testPrompt.content, ['Welcome', 'Timeline']); + assertSystemPromptSelected(testPrompt.name); typeAndSendMessage('hello'); - assertMessageSent('hello', true, testPrompt.prompt); + + assertSystemPromptSent(testPrompt.content); + assertMessageSent('hello', true); // ensure response before changing convo assertErrorResponse(); - selectConversation('Alert summary'); - assertSystemPrompt(testPrompt.title); + selectConversation('Timeline'); + assertSystemPromptSelected(testPrompt.name); typeAndSendMessage('hello'); - assertMessageSent('hello', true, testPrompt.prompt); + + assertSystemPromptSent(testPrompt.content); + assertMessageSent('hello', true); }); }); - describe('User Prompts', () => { + describe('Quick Prompts', () => { it('Add a quick prompt and send it in the conversation', () => { visitGetStartedPage(); openAssistant(); - createQuickPrompt(testPrompt.title, testPrompt.prompt); - sendQuickPrompt(testPrompt.title); - assertMessageSent(testPrompt.prompt, true); + createQuickPrompt(testPrompt.name, testPrompt.content); + sendQuickPrompt(testPrompt.name); + assertMessageSent(testPrompt.content); }); it('Add a quick prompt with context and it is only available in the selected context', () => { visitGetStartedPage(); openAssistant(); - createQuickPrompt(testPrompt.title, testPrompt.prompt, ['Alert (from view)']); - cy.get(QUICK_PROMPT_BADGE(testPrompt.title)).should('not.exist'); + createQuickPrompt(testPrompt.name, testPrompt.content, ['Alert (from view)']); + cy.get(QUICK_PROMPT_BADGE(testPrompt.name)).should('not.exist'); createRule(getNewRule()); visit(ALERTS_URL); waitForAlertsToPopulate(); expandFirstAlert(); openAssistant('alert'); - cy.get(QUICK_PROMPT_BADGE(testPrompt.title)).should('be.visible'); + cy.get(QUICK_PROMPT_BADGE(testPrompt.name)).should('be.visible'); cy.get(USER_PROMPT).should( 'have.text', EXPLAIN_THEN_SUMMARIZE_SUGGEST_INVESTIGATION_GUIDE_NON_I18N ); - cy.get(QUICK_PROMPT_BADGE(testPrompt.title)).click(); - cy.get(USER_PROMPT).should('have.text', testPrompt.prompt); + cy.get(QUICK_PROMPT_BADGE(testPrompt.name)).click(); + cy.get(USER_PROMPT).should('have.text', testPrompt.content); }); // TODO delete quick prompt // I struggled to do this since the element is hidden with css and I cannot get it to show diff --git a/x-pack/test/security_solution_cypress/cypress/objects/assistant.ts b/x-pack/test/security_solution_cypress/cypress/objects/assistant.ts index 7401a0ced2a49..23ab68f1e91d8 100644 --- a/x-pack/test/security_solution_cypress/cypress/objects/assistant.ts +++ b/x-pack/test/security_solution_cypress/cypress/objects/assistant.ts @@ -11,6 +11,7 @@ import { ConversationResponse, Provider, } from '@kbn/elastic-assistant-common'; +import { PromptCreateProps } from '@kbn/elastic-assistant-common/impl/schemas/prompts/bulk_crud_prompts_route.gen'; export const getMockConversation = (body?: Partial) => ({ title: 'Test Conversation', @@ -38,3 +39,11 @@ export const getMockConversationResponse = ( namespace: 'default', ...getMockConversation(body), }); + +export const getMockCreatePrompt = (body?: Partial): PromptCreateProps => ({ + name: 'Mock Prompt Name', + promptType: 'quick', + content: 'Mock Prompt Content', + consumer: 'securitySolutionUI', + ...body, +}); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/ai_assistant.ts b/x-pack/test/security_solution_cypress/cypress/screens/ai_assistant.ts index 341b65bf722e0..fcdd9b42304a6 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/ai_assistant.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/ai_assistant.ts @@ -43,7 +43,7 @@ export const QUICK_PROMPT_BODY_INPUT = '[data-test-subj="quick-prompt-prompt"]'; export const SEND_TO_TIMELINE_BUTTON = '[data-test-subj="sendToTimelineEmptyButton"]'; export const SHOW_ANONYMIZED_BUTTON = '[data-test-subj="showAnonymizedValues"]'; export const SUBMIT_CHAT = '[data-test-subj="submit-chat"]'; -export const SYSTEM_PROMPT = '[data-test-subj="systemPromptText"]'; +export const SYSTEM_PROMPT = '[data-test-subj="promptSuperSelect"]'; export const SYSTEM_PROMPT_BODY_INPUT = '[data-test-subj="systemPromptModalPromptText"]'; export const SYSTEM_PROMPT_TITLE_INPUT = '[data-test-subj="systemPromptSelector"] [data-test-subj="comboBoxSearchInput"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/assistant.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/assistant.ts index a8898f1652e1e..6a2543ed12bbf 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/assistant.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/assistant.ts @@ -6,8 +6,13 @@ */ import { ConversationCreateProps, ConversationResponse } from '@kbn/elastic-assistant-common'; +import { + PerformPromptsBulkActionRequestBody, + PerformPromptsBulkActionResponse, + PromptCreateProps, +} from '@kbn/elastic-assistant-common/impl/schemas/prompts/bulk_crud_prompts_route.gen'; import { deleteAllDocuments } from './elasticsearch'; -import { getMockConversation } from '../../objects/assistant'; +import { getMockConversation, getMockCreatePrompt } from '../../objects/assistant'; import { getSpaceUrl } from '../space'; import { rootRequest, waitForRootRequest } from './common'; @@ -36,3 +41,21 @@ export const deletePrompts = () => { cy.log('Delete all prompts'); deleteAllDocuments(`.kibana-elastic-ai-assistant-prompts-*`); }; + +const bulkPrompts = ( + body: PerformPromptsBulkActionRequestBody +): Cypress.Chainable> => + cy.currentSpace().then((spaceId) => + rootRequest({ + method: 'POST', + url: spaceId + ? getSpaceUrl(spaceId, `api/security_ai_assistant/prompts/_bulk_action`) + : `api/security_ai_assistant/prompts/_bulk_action`, + body, + }) + ); +export const waitForCreatePrompts = (prompts: Array>) => { + return waitForRootRequest( + bulkPrompts({ create: prompts.map((prompt) => getMockCreatePrompt(prompt)) }) + ); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/assistant.ts b/x-pack/test/security_solution_cypress/cypress/tasks/assistant.ts index c3f4f0cc970e0..8a3bd3600591c 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/assistant.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/assistant.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { DEFAULT_SYSTEM_PROMPT_NON_I18N } from '@kbn/security-solution-plugin/public/assistant/content/prompts/system/translations'; import { TIMELINE_CHECKBOX } from '../screens/timelines'; import { CLOSE_FLYOUT } from '../screens/alerts'; import { @@ -110,6 +109,7 @@ export const sendQueryToTimeline = () => { export const clearSystemPrompt = () => { cy.get(CLEAR_SYSTEM_PROMPT).click(); + assertEmptySystemPrompt(); }; export const sendQuickPrompt = (prompt: string) => { @@ -120,7 +120,7 @@ export const sendQuickPrompt = (prompt: string) => { export const selectSystemPrompt = (systemPrompt: string) => { cy.get(SYSTEM_PROMPT).click(); cy.get(SYSTEM_PROMPT_SELECT(systemPrompt)).click(); - assertSystemPrompt(systemPrompt); + assertSystemPromptSelected(systemPrompt); }; export const createSystemPrompt = ( @@ -174,23 +174,30 @@ export const assertNewConversation = (isWelcome: boolean, title: string) => { cy.get(CONVERSATION_TITLE + ' h2').should('have.text', title); }; -export const assertMessageSent = (message: string, hasDefaultPrompt = false, prompt?: string) => { - cy.get(CONVERSATION_MESSAGE) - .first() - .should( - 'contain', - hasDefaultPrompt ? `${prompt ?? DEFAULT_SYSTEM_PROMPT_NON_I18N}\n${message}` : message - ); +export const assertSystemPromptSent = (message: string) => { + cy.get(CONVERSATION_MESSAGE).eq(0).should('contain', message); +}; + +export const assertMessageSent = (message: string, prompt: boolean = false) => { + if (prompt) { + return cy.get(CONVERSATION_MESSAGE).eq(1).should('contain', message); + } + cy.get(CONVERSATION_MESSAGE).eq(0).should('contain', message); }; export const assertErrorResponse = () => { cy.get(CONVERSATION_MESSAGE_ERROR).should('be.visible'); }; -export const assertSystemPrompt = (systemPrompt: string) => { +export const assertSystemPromptSelected = (systemPrompt: string) => { cy.get(SYSTEM_PROMPT).should('have.text', systemPrompt); }; +export const assertEmptySystemPrompt = () => { + const EMPTY = 'Select a system prompt'; + cy.get(SYSTEM_PROMPT).should('have.text', EMPTY); +}; + export const assertConnectorSelected = (connectorName: string) => { cy.get(CONNECTOR_SELECTOR).should('have.text', connectorName); }; From 10c1c2c7acac40edb592ed19a0c36e7ce515cf0d Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Wed, 11 Sep 2024 17:57:55 -0400 Subject: [PATCH 005/168] [Synthetics] Unbreak uptime journey (#192641) ## Summary Previously the uptime e2e journey we rely on to test the uptime overview page was looking back 5 years to query for canned data we load during the standard Kibana test script. Unfortunately, that data was generated now > 5y ago, so the test started to fail. This patch hardcodes the date of the filter to ensure we permanently look back to a timeframe that includes the canned data we use for testing the page. --------- Co-authored-by: shahzad31 --- x-pack/plugins/observability_solution/uptime/e2e/README.md | 6 +++--- .../uptime/e2e/uptime/journeys/uptime.journey.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/observability_solution/uptime/e2e/README.md b/x-pack/plugins/observability_solution/uptime/e2e/README.md index ab7ebdf591d89..eaca49c558375 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/README.md +++ b/x-pack/plugins/observability_solution/uptime/e2e/README.md @@ -10,7 +10,7 @@ with an example run command when it finishes. ### Run the tests -From the same directory you can now run `node node e2e.js --runner`. +From the same directory you can now run `node e2e.js --runner`. In addition to the usual flags like `--grep`, you can also specify `--no-headless` in order to view your tests as you debug/develop. @@ -22,11 +22,11 @@ script for standing up the test server. ### Start the server -From `~/x-pack/plugins/observability_solution/synthetics/scripts`, run `node uptime_e2e.js --server`. Wait for the server to startup. It will provide you +From `~/x-pack/plugins/observability_solution/uptime/scripts`, run `node uptime_e2e.js --server`. Wait for the server to startup. It will provide you with an example run command when it finishes. ### Run the tests -From the same directory you can now run `node node uptime_e2e.js --runner`. +From the same directory you can now run `node uptime_e2e.js --runner`. In addition to the usual flags like `--grep`, you can also specify `--no-headless` in order to view your tests as you debug/develop. diff --git a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts index f3916cd4eab12..5d6112cc41a95 100644 --- a/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts +++ b/x-pack/plugins/observability_solution/uptime/e2e/uptime/journeys/uptime.journey.ts @@ -17,7 +17,7 @@ journey('uptime', ({ page, params }) => { }); step('Go to Kibana', async () => { - await page.goto(`${params.kibanaUrl}/app/uptime?dateRangeStart=now-5y&dateRangeEnd=now`, { + await page.goto(`${params.kibanaUrl}/app/uptime?dateRangeStart=2018-01-01&dateRangeEnd=now`, { waitUntil: 'networkidle', }); }); From 0ce33f842df3e63d971af553e16e68da75a20bc0 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 11 Sep 2024 15:02:26 -0700 Subject: [PATCH 006/168] [DOCS][API] Adds Crowdstrike connector config and secrets; edits UI text (#192526) --- .../action-types/crowdstrike.asciidoc | 7 +++---- .../images/crowdstrike-connector.png | Bin 399378 -> 178210 bytes oas_docs/overlays/connectors.overlays.yaml | 12 ++++++++---- .../schemas/crowdstrike_config.yaml | 11 +++++++++++ .../schemas/crowdstrike_secrets.yaml | 13 +++++++++++++ .../crowdstrike/translations.ts | 4 ++-- .../stack_connectors/crowdstrike_connector.ts | 9 +++++---- 7 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_config.yaml create mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_secrets.yaml diff --git a/docs/management/connectors/action-types/crowdstrike.asciidoc b/docs/management/connectors/action-types/crowdstrike.asciidoc index ba7e544055910..813b6a699a71c 100644 --- a/docs/management/connectors/action-types/crowdstrike.asciidoc +++ b/docs/management/connectors/action-types/crowdstrike.asciidoc @@ -19,7 +19,7 @@ The CrowdStrike connector communicates with CrowdStrike Management Console via R You can create connectors in *{stack-manage-app} > {connectors-ui}*. For example: [role="screenshot"] -image::management/connectors/images/crowdstrike-connector.png[Crowdstrike connector] +image::management/connectors/images/crowdstrike-connector.png[CrowdStrike connector] // NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] @@ -29,9 +29,8 @@ image::management/connectors/images/crowdstrike-connector.png[Crowdstrike connec CrowdStrike connectors have the following configuration properties: CrowdStrike API URL:: The CrowdStrike tenant URL. If you are using the <> setting, make sure the hostname is added to the allowed hosts. -CrowdStrike Client ID:: A CrowdStrike API client ID. -Client Secret:: A CrowdStrike API client secret created by the user. - +CrowdStrike client ID:: The CrowdStrike API client identifier. +Client secret:: The CrowdStrike API client secret to authenticate the client ID. [float] [[crowdstrike-action-parameters]] diff --git a/docs/management/connectors/images/crowdstrike-connector.png b/docs/management/connectors/images/crowdstrike-connector.png index 04eef86f1e2aed15dd776459c00583ff21f87bdb..4943d2402b1bb08f7426b8a4ca05a362228bc9ca 100644 GIT binary patch literal 178210 zcma&ObyQp5)-_Biv{0Z}aS0AZi@Ovl4y8bGhvHt`inqnxp}0E)_u_@LI0P+PLU0Jq zd${lSe$RdG@BYy-PR7Ux;hcT;S$nNH=bAfT-m1uAJtKXFgoK18FDLyD3F)aF5)vvl z+7sXtZ&Vx#B&0`n)>2Y$<)x&k-nuw`u(q>6LSl+@i|bO9RC_Tf{uL)3OYPUh>W*>Y zheBzo1?;a+ej#IEW^>fa!H;}#$6g1>y0W3N;iB2IzsBJ?GkfWzh(@Zrr_VN(=Ocjd zT}DvuBb-2Ue(5F~6#h&v*tlzP&I)E`L=7}En|G+c*A%5hrg{33=!iGE`YoENpE+nR zoq48LIf#G^ayphM1BymD0&oW3zNZGO!`&Qjk zyWsOUn%LSm0aWzT`;+S>y@fS=r4-oNm8PN|bKfOOGrL~8$20Gxw=JAJ>b7#bp?mX8 z?bt)9j6V_2mcsL%m#uTigH3KlUM}YX(=TA5E&oAT8HpKqkB0Op+!_f5c=rf+kpeFy zB;;?%|L>EhcHbWVzxSxv4}WYlb#OpJl0cG|ey!p8XfF#jlfZ�J~#qVo9!)hh~ZG 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 literal 399378 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 z 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ⅇ_6tpfp{&S%PaJOEyk8G#&}3v+_* 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 z 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 diff --git a/oas_docs/overlays/connectors.overlays.yaml b/oas_docs/overlays/connectors.overlays.yaml index 7cb2f79be3a1e..6168237425cc1 100644 --- a/oas_docs/overlays/connectors.overlays.yaml +++ b/oas_docs/overlays/connectors.overlays.yaml @@ -142,7 +142,8 @@ actions: oneOf: # Bedrock (.bedrock) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_config.yaml' - # Crowdstrike (.crowdstrike) TBD + # Crowdstrike (.crowdstrike) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_config.yaml' # D3 Security (.d3security) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/d3security_config.yaml' # Email (.email) @@ -193,7 +194,8 @@ actions: oneOf: # Bedrock (.bedrock) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_secrets.yaml' - # Crowdstrike (.crowdstrike) TBD + # Crowdstrike (.crowdstrike) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_secrets.yaml' # D3 Security (.d3security) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/d3security_secrets.yaml' # Email (.email) @@ -249,7 +251,8 @@ actions: oneOf: # Bedrock (.bedrock) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_config.yaml' - # Crowdstrike (.crowdstrike) TBD + # Crowdstrike (.crowdstrike) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_config.yaml' # D3 Security (.d3security) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/d3security_config.yaml' # Email (.email) @@ -300,7 +303,8 @@ actions: oneOf: # Bedrock (.bedrock) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_secrets.yaml' - # Crowdstrike (.crowdstrike) TBD + # Crowdstrike (.crowdstrike) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_secrets.yaml' # D3 Security (.d3security) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/d3security_secrets.yaml' # Email (.email) diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_config.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_config.yaml new file mode 100644 index 0000000000000..654baa9f71e95 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_config.yaml @@ -0,0 +1,11 @@ +title: Connector request config properties for a Crowdstrike connector +required: + - url +description: Defines config properties for connectors when type is `.crowdstrike`. +type: object +properties: + url: + description: > + The CrowdStrike tenant URL. + If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. + type: string \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_secrets.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_secrets.yaml new file mode 100644 index 0000000000000..71bb7478b7747 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/crowdstrike_secrets.yaml @@ -0,0 +1,13 @@ +title: Connector secrets properties for a Crowdstrike connector +description: Defines secrets for connectors when type is `.crowdstrike`. +type: object +required: + - clientId + - clientSecret +properties: + clientId: + description: The CrowdStrike API client identifier. + type: string + clientSecret: + description: The CrowdStrike API client secret to authenticate the `clientId`. + type: string \ No newline at end of file diff --git a/x-pack/plugins/stack_connectors/public/connector_types/crowdstrike/translations.ts b/x-pack/plugins/stack_connectors/public/connector_types/crowdstrike/translations.ts index e10226f532914..1fb91cecfe992 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/crowdstrike/translations.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/crowdstrike/translations.ts @@ -19,14 +19,14 @@ export const URL_LABEL = i18n.translate( export const CLIENT_ID_LABEL = i18n.translate( 'xpack.stackConnectors.security.crowdstrike.config.clientIdTextFieldLabel', { - defaultMessage: 'Crowdstrike Client ID', + defaultMessage: 'Crowdstrike client ID', } ); export const CLIENT_SECRET_LABEL = i18n.translate( 'xpack.stackConnectors.security.crowdstrike.config.clientSecretTextFieldLabel', { - defaultMessage: 'Client Secret', + defaultMessage: 'Client secret', } ); diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/crowdstrike_connector.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/crowdstrike_connector.ts index 9a419f949b529..0447b15762262 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/crowdstrike_connector.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/crowdstrike_connector.ts @@ -18,7 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const actions = getService('actions'); const kibanaServer = getService('kibanaServer'); const testSubjects = getService('testSubjects'); - const toasts = getService('toasts'); + // const toasts = getService('toasts'); let simulatorUrl: string; let editSimulatorUrl: string; @@ -44,9 +44,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.setValue('secrets.clientId-input', 'test'); await testSubjects.setValue('secrets.clientSecret-input', 'secret'); await commonScreenshots.takeScreenshot('crowdstrike-connector', screenshotDirectories); - await testSubjects.click('create-connector-flyout-save-test-btn'); - await toasts.dismissAll(); - await commonScreenshots.takeScreenshot('crowdstrike-params-test', screenshotDirectories); + // You cannot test the CrowdStrike connector + // await testSubjects.click('create-connector-flyout-save-test-btn'); + // await toasts.dismissAll(); + // await commonScreenshots.takeScreenshot('crowdstrike-params-test', screenshotDirectories); await testSubjects.click('euiFlyoutCloseButton'); }); }); From f55829155488255476b15b770a338f7be3889802 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 11 Sep 2024 16:29:48 -0700 Subject: [PATCH 007/168] Update oas_docs ownership (#192647) --- .github/CODEOWNERS | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index aaea3b56aa038..2dec31b8135eb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1788,15 +1788,9 @@ test/functional/page_objects/solution_navigation.ts @elastic/appex-sharedux /x-pack/test_serverless/functional/page_objects/svl_common_navigation.ts @elastic/appex-sharedux # OpenAPI spec files -/x-pack/plugins/fleet/common/openapi @elastic/platform-docs -/x-pack/plugins/ml/common/openapi @elastic/platform-docs -/packages/core/saved-objects/docs/openapi @elastic/platform-docs -/plugins/data_views/docs/openapi @elastic/platform-docs oas_docs/.spectral.yaml @elastic/platform-docs oas_docs/kibana.info.serverless.yaml @elastic/platform-docs oas_docs/kibana.info.yaml @elastic/platform-docs -oas_docs/makefile @elastic/platform-docs -oas_docs/overlays @elastic/platform-docs # Plugin manifests /src/plugins/**/kibana.jsonc @elastic/kibana-core From 94411c550995fe727220d64e420b738d8be1d905 Mon Sep 17 00:00:00 2001 From: Brad White Date: Wed, 11 Sep 2024 17:35:32 -0600 Subject: [PATCH 008/168] [Storybook] Mute SASS mixed-decls warnings (#192648) ## Summary This extends #190348 to the Storybook build because it is quite noisy there as well. Example: https://buildkite.com/elastic/kibana-pull-request/builds/233585#0191e2ad-bc90-45f1-b375-959f3fc22b98/268-294 Remediation will be tracked at https://github.com/elastic/kibana/issues/190345 ### Testing The Storybook build step should not have SASS deprecation warnings. --- packages/kbn-storybook/src/webpack.config.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/kbn-storybook/src/webpack.config.ts b/packages/kbn-storybook/src/webpack.config.ts index fb901692e7f66..94302fdc19c41 100644 --- a/packages/kbn-storybook/src/webpack.config.ts +++ b/packages/kbn-storybook/src/webpack.config.ts @@ -120,6 +120,18 @@ export default ({ config: storybookConfig }: { config: Configuration }) => { sassOptions: { includePaths: [resolve(REPO_ROOT, 'node_modules')], quietDeps: true, + logger: { + warn: (message: string, warning: any) => { + // Muted - see https://github.com/elastic/kibana/issues/190345 for tracking remediation + if (warning?.deprecationType?.id === 'mixed-decls') return; + + if (warning.deprecation) + return process.stderr.write( + `DEPRECATION WARNING: ${message}\n${warning.stack}` + ); + process.stderr.write('WARNING: ' + message); + }, + }, }, }, }, From b0683988e4128bfeeab83a03b6b88710fdd31772 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 11 Sep 2024 16:39:55 -0700 Subject: [PATCH 009/168] [DOCS][API] Add TheHive connector config and secrets (#192424) --- docs/action-type-template.asciidoc | 8 +++- oas_docs/overlays/connectors.overlays.yaml | 10 +++- .../schemas/bedrock_create_request.yaml | 23 --------- .../components/schemas/bedrock_response.yaml | 31 ------------ .../schemas/bedrock_update_request.yaml | 13 ----- .../components/schemas/run_createalert.yaml | 47 ++++++++++++++----- .../components/schemas/run_pushtoservice.yaml | 25 ++++++---- .../components/schemas/thehive_config.yaml | 16 +++++++ .../components/schemas/thehive_secrets.yaml | 9 ++++ 9 files changed, 92 insertions(+), 90 deletions(-) delete mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_create_request.yaml delete mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_response.yaml delete mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_update_request.yaml create mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/thehive_config.yaml create mode 100644 x-pack/plugins/actions/docs/openapi/components/schemas/thehive_secrets.yaml diff --git a/docs/action-type-template.asciidoc b/docs/action-type-template.asciidoc index b9d7ca3c6326c..ad59f2a2d9ed6 100644 --- a/docs/action-type-template.asciidoc +++ b/docs/action-type-template.asciidoc @@ -22,7 +22,9 @@ or as needed when you're creating a rule. connectors have the following configuration properties: //// -List of user-facing connector configurations. This should align with the fields available in the Create connector flyout form for this connector type. +List of user-facing connector configurations. +This should align with the fields available in the Create connector flyout form for this connector type. +To include these configuration details in the API documentation, add appropriate files in x-pack/plugins/actions/docs/openapi/components/schemas/ and reference them from oas_docs/overlays/connectors.overlays.yaml //// Property1:: A short description of this property. @@ -41,7 +43,9 @@ You can test connectors as you're creating or editing the connector in {kib}. actions have the following properties. //// -List of user-facing action configurations. This should align with the fields available in the Action section of the Create/Update alert flyout. +List of user-facing action configurations. +This should align with the fields available in the Action section of the Create/Update alert flyout. +To include these configuration details in the API documentation, add appropriate files in x-pack/plugins/actions/docs/openapi/components/schemas/ and reference them from oas_docs/overlays/connectors.overlays.yaml //// Property1:: A short description of this property. diff --git a/oas_docs/overlays/connectors.overlays.yaml b/oas_docs/overlays/connectors.overlays.yaml index 6168237425cc1..022946e893be2 100644 --- a/oas_docs/overlays/connectors.overlays.yaml +++ b/oas_docs/overlays/connectors.overlays.yaml @@ -160,7 +160,7 @@ actions: # Observability AI Assistant (.observability-ai-assistant) TBD # Azure OpenAI (.gen-ai) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/genai_azure_config.yaml' - # OpenAI (.gen-ai) + # OpenAI (.gen-ai) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/genai_openai_config.yaml' # Opsgenie (.opsgenie) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/opsgenie_config.yaml' @@ -178,6 +178,8 @@ actions: - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/slack_api_config.yaml' # Swimlane (.swimlane) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/swimlane_config.yaml' + # TheHive (.thehive) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/thehive_config.yaml' # Tines (.tines) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/tines_config.yaml' # Torq (.torq) @@ -226,6 +228,8 @@ actions: - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/slack_api_secrets.yaml' # Swimlane (.swimlane) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/swimlane_secrets.yaml' + # TheHive (.thehive) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/thehive_secrets.yaml' # Tines (.tines) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/tines_secrets.yaml' # Torq (.torq) @@ -287,6 +291,8 @@ actions: - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/slack_api_config.yaml' # Swimlane (.swimlane) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/swimlane_config.yaml' + # TheHive (.thehive) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/thehive_config.yaml' # Tines (.tines) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/tines_config.yaml' # Torq (.torq) @@ -335,6 +341,8 @@ actions: - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/slack_api_secrets.yaml' # Swimlane (.swimlane) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/swimlane_secrets.yaml' + # TheHive (.thehive) + - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/thehive_secrets.yaml' # Tines (.tines) - $ref: '../../x-pack/plugins/actions/docs/openapi/components/schemas/tines_secrets.yaml' # Torq (.torq) diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_create_request.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_create_request.yaml deleted file mode 100644 index 2acc21bfbfac7..0000000000000 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_create_request.yaml +++ /dev/null @@ -1,23 +0,0 @@ -title: Create Amazon Bedrock connector request -description: The Amazon Bedrock connector uses axios to send a POST request to Amazon Bedrock. -type: object -required: - - config - - connector_type_id - - name - - secrets -properties: - config: - $ref: 'config_properties_bedrock.yaml' - connector_type_id: - type: string - description: The type of connector. - enum: - - .bedrock - example: .bedrock - name: - type: string - description: The display name for the connector. - example: my-connector - secrets: - $ref: 'secrets_properties_bedrock.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_response.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_response.yaml deleted file mode 100644 index 0d3f308744aa3..0000000000000 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_response.yaml +++ /dev/null @@ -1,31 +0,0 @@ -title: Connector response properties for an Amazon Bedrock connector -type: object -required: - - config - - connector_type_id - - id - - is_deprecated - - is_preconfigured - - name -properties: - config: - $ref: 'config_properties_bedrock.yaml' - connector_type_id: - type: string - description: The type of connector. - enum: - - .bedrock - id: - type: string - description: The identifier for the connector. - is_deprecated: - $ref: 'is_deprecated.yaml' - is_missing_secrets: - $ref: 'is_missing_secrets.yaml' - is_preconfigured: - $ref: 'is_preconfigured.yaml' - is_system_action: - $ref: 'is_system_action.yaml' - name: - type: string - description: The display name for the connector. diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_update_request.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_update_request.yaml deleted file mode 100644 index dfa479870aab5..0000000000000 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/bedrock_update_request.yaml +++ /dev/null @@ -1,13 +0,0 @@ -title: Update Amazon Bedrock connector request -type: object -required: - - config - - name -properties: - config: - $ref: 'config_properties_bedrock.yaml' - name: - type: string - description: The display name for the connector. - secrets: - $ref: 'secrets_properties_bedrock.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_createalert.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_createalert.yaml index e739a9ed6c91d..194d9d979cdd8 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_createalert.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_createalert.yaml @@ -3,7 +3,7 @@ type: object required: - subAction - subActionParams -description: The `createAlert` subaction for Opsgenie connectors. +description: The `createAlert` subaction for Opsgenie and TheHive connectors. properties: subAction: type: string @@ -12,12 +12,10 @@ properties: - createAlert subActionParams: type: object - required: - - message properties: actions: type: array - description: The custom actions available to the alert. + description: The custom actions available to the alert in Opsgenie connectors. items: type: string alias: @@ -28,21 +26,21 @@ properties: description: A description that provides detailed information about the alert. details: type: object - description: The custom properties of the alert. + description: The custom properties of the alert in Opsgenie connectors. additionalProperties: true example: {"key1":"value1","key2":"value2"} entity: type: string - description: The domain of the alert. For example, the application or server name. + description: The domain of the alert in Opsgenie connectors. For example, the application or server name. message: type: string - description: The alert message. + description: The alert message in Opsgenie connectors. note: type: string - description: Additional information for the alert. + description: Additional information for the alert in Opsgenie connectors. priority: type: string - description: The priority level for the alert. + description: The priority level for the alert in Opsgenie connectors. enum: - P1 - P2 @@ -52,7 +50,7 @@ properties: responders: type: array description: > - The entities to receive notifications about the alert. + The entities to receive notifications about the alert in Opsgenie connectors. If `type` is `user`, either `id` or `username` is required. If `type` is `team`, either `id` or `name` is required. items: @@ -75,14 +73,39 @@ properties: username: type: string description: A valid email address for the user. + severity: + type: integer + minimum: 1 + maximum: 4 + description: > + The severity of the incident for TheHive connectors. + The value ranges from 1 (low) to 4 (critical) with a default value of 2 (medium). source: type: string - description: The display name for the source of the alert. + description: The display name for the source of the alert in Opsgenie and TheHive connectors. + sourceRef: + type: string + description: A source reference for the alert in TheHive connectors. tags: type: array - description: The tags for the alert. + description: The tags for the alert in Opsgenie and TheHive connectors. items: type: string + title: + type: string + description: > + A title for the incident for TheHive connectors. + It is used for searching the contents of the knowledge base. + tlp: + type: integer + minimum: 0 + maximum: 4 + default: 2 + description: > + The traffic light protocol designation for the incident in TheHive connectors. Valid values include: 0 (clear), 1 (green), 2 (amber), 3 (amber and strict), and 4 (red). + type: + type: string + description: The type of alert in TheHive connectors. user: type: string description: The display name for the owner. diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_pushtoservice.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_pushtoservice.yaml index d81c0e61059be..210bf1dcf8570 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_pushtoservice.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_pushtoservice.yaml @@ -3,7 +3,7 @@ type: object required: - subAction - subActionParams -description: The `pushToService` subaction for Jira, ServiceNow ITSM, ServiceNow SecOps, Swimlane, and Webhook - Case Management connectors. +description: The `pushToService` subaction for Jira, ServiceNow ITSM, ServiceNow SecOps, Swimlane, TheHive, and Webhook - Case Management connectors. properties: subAction: type: string @@ -16,7 +16,7 @@ properties: properties: comments: type: array - description: Additional information that is sent to Jira, ServiceNow ITSM, ServiceNow SecOps, or Swimlane. + description: Additional information that is sent to Jira, ServiceNow ITSM, ServiceNow SecOps, Swimlane, or TheHive. items: type: object properties: @@ -28,7 +28,7 @@ properties: description: A unique identifier for the comment. incident: type: object - description: Information necessary to create or update a Jira, ServiceNow ITSM, ServiveNow SecOps, or Swimlane incident. + description: Information necessary to create or update a Jira, ServiceNow ITSM, ServiveNow SecOps, Swimlane, or TheHive incident. properties: alertId: type: string @@ -52,7 +52,7 @@ properties: NOTE: Using the default configuration of `{{ruleID}}:{{alert ID}}` ensures that ServiceNow creates a separate incident record for every generated alert that uses a unique alert ID. If the rule generates multiple alerts that use the same alert IDs, ServiceNow creates and continually updates a single incident record for the alert. description: type: string - description: The description of the incident for Jira, ServiceNow ITSM, ServiceNow SecOps, Swimlane, and Webhook - Case Management connectors. + description: The description of the incident for Jira, ServiceNow ITSM, ServiceNow SecOps, Swimlane, TheHive, and Webhook - Case Management connectors. dest_ip: description: > A list of destination IP addresses related to the security incident for ServiceNow SecOps connectors. The IPs are added as observables to the security incident. @@ -113,8 +113,10 @@ properties: type: string description: The rule name for Swimlane connectors. severity: - type: string - description: The severity of the incident for ServiceNow ITSM and Swimlane connectors. + type: integer + description: > + The severity of the incident for ServiceNow ITSM, Swimlane, and TheHive connectors. + In TheHive connectors, the severity value ranges from 1 (low) to 4 (critical) with a default value of 2 (medium). short_description: type: string description: > @@ -139,12 +141,19 @@ properties: type: array items: type: string - description: A list of tags for Webhook - Case Management connectors. + description: A list of tags for TheHive and Webhook - Case Management connectors. title: type: string description: > - A title for the incident for Jira and Webhook - Case Management connectors. + A title for the incident for Jira, TheHive, and Webhook - Case Management connectors. It is used for searching the contents of the knowledge base. + tlp: + type: integer + minimum: 0 + maximum: 4 + default: 2 + description: > + The traffic light protocol designation for the incident in TheHive connectors. Valid values include: 0 (clear), 1 (green), 2 (amber), 3 (amber and strict), and 4 (red). urgency: type: string description: The urgency of the incident for ServiceNow ITSM connectors. diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/thehive_config.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/thehive_config.yaml new file mode 100644 index 0000000000000..d317e3af92f2a --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/thehive_config.yaml @@ -0,0 +1,16 @@ +title: Connector request properties for a TheHive connector +description: Defines configuration properties for connectors when type is `.thehive`. +type: object +required: + - url +properties: + organisation: + type: string + description: > + The organisation in TheHive that will contain the alerts or cases. + By default, the connector uses the default organisation of the user account that created the API key. + url: + type: string + description: > + The instance URL in TheHive. + If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/thehive_secrets.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/thehive_secrets.yaml new file mode 100644 index 0000000000000..595af60710b12 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/thehive_secrets.yaml @@ -0,0 +1,9 @@ +title: Connector secrets properties for a TheHive connector +description: Defines secrets for connectors when type is `.thehive`. +required: + - apiKey +type: object +properties: + apiKey: + type: string + description: The API key for authentication in TheHive. From 1e96c81e95364bd99f1721bb22460b751a462728 Mon Sep 17 00:00:00 2001 From: Kris Gross <57641133+k-g-elastic@users.noreply.github.com> Date: Wed, 11 Sep 2024 21:01:49 -0400 Subject: [PATCH 010/168] Make Quality Gate Pipelines Non-Preemptible (#190534) ## Summary [Issue Request](https://github.com/elastic/security-team/issues/9484) --------- Co-authored-by: Elastic Machine --- .../mki_periodic_defend_workflows.yml | 5 ++++ .../mki_periodic_detection_engine.yml | 8 ----- .../mki_periodic_entity_analytics.yml | 4 --- .../mki_periodic/mki_periodic_explore.yml | 4 --- .../mki_periodic/mki_periodic_gen_ai.yml | 4 --- .../mki_periodic_investigations.yml | 4 --- .../mki_periodic_rule_management.yml | 8 ----- .../mki_quality_gate_detection_engine.yml | 24 --------------- .../mki_quality_gate_entity_analytics.yml | 7 ----- .../mki_quality_gate_explore.yml | 9 ------ .../mki_quality_gate_gen_ai.yml | 7 ----- .../mki_quality_gate_investigations.yml | 7 ----- .../mki_quality_gate_rule_management.yml | 29 ------------------- 13 files changed, 5 insertions(+), 115 deletions(-) diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_defend_workflows.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_defend_workflows.yml index 72af06600ada7..5795c8f61f30f 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_defend_workflows.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_defend_workflows.yml @@ -13,6 +13,7 @@ steps: localSsds: 1 localSsdInterface: nvme machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 300 parallelism: 5 retry: @@ -102,6 +103,7 @@ steps: localSsds: 1 localSsdInterface: nvme machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -119,6 +121,7 @@ steps: localSsds: 1 localSsdInterface: nvme machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -136,6 +139,7 @@ steps: localSsds: 1 localSsdInterface: nvme machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -156,6 +160,7 @@ steps: localSsds: 1 localSsdInterface: nvme machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 300 parallelism: 3 retry: diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_detection_engine.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_detection_engine.yml index da5aa911a6c29..e25c6dfef0e4b 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_detection_engine.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_detection_engine.yml @@ -16,10 +16,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 8 - retry: - automatic: - - exit_status: "-1" - limit: 1 - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine:exceptions label: "Cypress MKI - Detection Engine - Exceptions" @@ -35,10 +31,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 6 - retry: - automatic: - - exit_status: "-1" - limit: 1 - group: "API MKI - Detection Engine - " key: api_test_detections_engine diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_entity_analytics.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_entity_analytics.yml index f993986aefbb1..2f3f1082476ef 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_entity_analytics.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_entity_analytics.yml @@ -13,10 +13,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 2 - retry: - automatic: - - exit_status: '-1' - limit: 1 - group: "API MKI - Entity Analytics" key: api_test_entity_analytics diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_explore.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_explore.yml index 7697da4b3edaf..29e838e962a55 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_explore.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_explore.yml @@ -13,10 +13,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 4 - retry: - automatic: - - exit_status: '-1' - limit: 1 - group: "API MKI - Explore" key: api_test_explore diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_gen_ai.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_gen_ai.yml index c9c80c823b227..901425ec57ff4 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_gen_ai.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_gen_ai.yml @@ -13,10 +13,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: "-1" - limit: 1 - group: "API MKI - GenAI" key: api_test_ai_assistant diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_investigations.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_investigations.yml index 0988bf6ecf6b8..9539643ad12c3 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_investigations.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_investigations.yml @@ -13,10 +13,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 8 - retry: - automatic: - - exit_status: '-1' - limit: 1 - group: "API MKI - Investigations" key: api_test_investigations diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_rule_management.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_rule_management.yml index 7f08247a91b86..05613941d7b5e 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_rule_management.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_periodic/mki_periodic_rule_management.yml @@ -16,10 +16,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 8 - retry: - automatic: - - exit_status: "-1" - limit: 1 - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management:prebuilt_rules label: "Cypress MKI - Rule Management - Prebuilt Rules" @@ -35,10 +31,6 @@ steps: # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 4 - retry: - automatic: - - exit_status: "-1" - limit: 1 - group: "API MKI - Rule Management" key: api_test_rule_management diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_detection_engine.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_detection_engine.yml index f73ecc6225dcf..90c90ae8a3a36 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_detection_engine.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_detection_engine.yml @@ -12,14 +12,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: "-1" - limit: 1 - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine:exceptions label: "Cypress MKI - Detection Engine - Exceptions" @@ -31,14 +26,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: "-1" - limit: 1 - group: "API MKI - Detection Engine" key: api_test_detections_engine @@ -51,7 +41,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -66,7 +55,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -81,7 +69,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -96,7 +83,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -111,7 +97,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -126,7 +111,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -141,7 +125,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -156,7 +139,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -171,7 +153,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -186,7 +167,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -201,7 +181,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -216,7 +195,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -231,7 +209,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -246,7 +223,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_entity_analytics.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_entity_analytics.yml index 16f2ec688bde4..da32bc4efc44f 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_entity_analytics.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_entity_analytics.yml @@ -9,14 +9,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: '-1' - limit: 1 - group: "API MKI - Entity Analytics" key: api_test_entity_analytics @@ -29,7 +24,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -44,7 +38,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_explore.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_explore.yml index 2c518fa24efab..efcc5ccf113f5 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_explore.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_explore.yml @@ -9,14 +9,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: '-1' - limit: 1 - group: "API MKI - Explore" key: api_test_explore @@ -29,7 +24,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -44,7 +38,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -59,7 +52,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -74,7 +66,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_gen_ai.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_gen_ai.yml index 677a5c62f4cc0..660d36183fe2f 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_gen_ai.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_gen_ai.yml @@ -9,14 +9,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: "-1" - limit: 1 - group: "API MKI - GenAI" key: api_test_ai_assistant @@ -29,7 +24,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -44,7 +38,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_investigations.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_investigations.yml index d3f57e40ec2cb..7f262340cfa5e 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_investigations.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_investigations.yml @@ -9,14 +9,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: '-1' - limit: 1 - group: "API MKI - Investigations" key: api_test_investigations @@ -29,7 +24,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -44,7 +38,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_rule_management.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_rule_management.yml index affdaca9cb539..b01094d742226 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_rule_management.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_quality_gate/mki_quality_gate_rule_management.yml @@ -12,14 +12,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: "-1" - limit: 1 - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management:prebuilt_rules label: "Cypress MKI - Rule Management - Prebuilt Rules" @@ -31,14 +26,9 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. timeout_in_minutes: 300 parallelism: 1 - retry: - automatic: - - exit_status: "-1" - limit: 1 - group: "API MKI - Rule Management" key: api_test_rule_management @@ -51,7 +41,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -66,7 +55,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -81,7 +69,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -96,7 +83,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -111,7 +97,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -126,7 +111,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -141,7 +125,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -156,7 +139,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -171,7 +153,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -186,7 +167,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -201,7 +181,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -216,7 +195,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -231,7 +209,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -246,7 +223,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -261,7 +237,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -276,7 +251,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -291,7 +265,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -306,7 +279,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: @@ -321,7 +293,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-4 - preemptible: true timeout_in_minutes: 120 retry: automatic: From 771faf19c9f8dff63f19aa0967a8c50b8a028eaa Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Wed, 11 Sep 2024 21:46:48 -0400 Subject: [PATCH 011/168] [Synthetics] Unskip `TestMonitorDetailFlyout` (#192592) ## Summary Unskips this e2e suite. --- .../e2e/synthetics/journeys/detail_flyout.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/detail_flyout.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/detail_flyout.ts index e51dd40bd840b..5159792f9217a 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/detail_flyout.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/detail_flyout.ts @@ -8,14 +8,10 @@ import { expect, journey, step } from '@elastic/synthetics'; import { syntheticsAppPageProvider } from '../page_objects/synthetics_app'; -const journeySkip = - (...params: Parameters) => - () => - journey(...params); -// TODO: skipped because failing on main and need to unblock CI -journeySkip('TestMonitorDetailFlyout', async ({ page, params }) => { +journey('TestMonitorDetailFlyout', async ({ page, params }) => { const syntheticsApp = syntheticsAppPageProvider({ page, kibanaUrl: params.kibanaUrl, params }); const monitorName = 'test-flyout-http-monitor'; + const locationId = 'us_central'; step('Go to monitor-management', async () => { await syntheticsApp.navigateToAddMonitor(); @@ -40,7 +36,7 @@ journeySkip('TestMonitorDetailFlyout', async ({ page, params }) => { step('open overview flyout', async () => { await syntheticsApp.navigateToOverview(); await syntheticsApp.assertText({ text: monitorName }); - await page.click(`[data-test-subj="${monitorName}-metric-item"]`); + await page.click(`[data-test-subj="${monitorName}-${locationId}-metric-item"]`); const flyoutHeader = await page.waitForSelector('.euiFlyoutHeader'); expect(await flyoutHeader.innerText()).toContain(monitorName); }); From 9373d388aeff70817a5d72e6db50c17436259179 Mon Sep 17 00:00:00 2001 From: Bharat Pasupula <123897612+bhapas@users.noreply.github.com> Date: Thu, 12 Sep 2024 05:31:19 +0200 Subject: [PATCH 012/168] [Automatic Import] Add validation and error graphs for structured logs header(KVGraph) (#192578) --- .../__jest__/fixtures/kv.ts | 1 + .../scripts/draw_graphs_script.ts | 3 ++ .../server/graphs/kv/constants.ts | 5 +++ .../server/graphs/kv/error.ts | 24 ++++++++++- .../server/graphs/kv/graph.ts | 26 ++++++++++-- .../server/graphs/kv/header.test.ts | 4 +- .../server/graphs/kv/header.ts | 25 +---------- .../server/graphs/kv/kv.ts | 2 +- .../server/graphs/kv/prompts.ts | 41 +++++++++++++++++++ .../server/graphs/kv/validate.ts | 37 ++++++++++++++++- .../graphs/log_type_detection/prompts.ts | 1 + .../integration_assistant/server/types.ts | 1 + .../server/util/processors.ts | 4 +- 13 files changed, 141 insertions(+), 33 deletions(-) diff --git a/x-pack/plugins/integration_assistant/__jest__/fixtures/kv.ts b/x-pack/plugins/integration_assistant/__jest__/fixtures/kv.ts index bd519410155fe..587d8987c0960 100644 --- a/x-pack/plugins/integration_assistant/__jest__/fixtures/kv.ts +++ b/x-pack/plugins/integration_assistant/__jest__/fixtures/kv.ts @@ -21,4 +21,5 @@ export const kvState = { ecsVersion: 'testVersion', errors: { test: 'testerror' }, additionalProcessors: [{ kv: { field: 'test', target_field: 'newtest' } }], + grokPattern: 'testPattern', }; diff --git a/x-pack/plugins/integration_assistant/scripts/draw_graphs_script.ts b/x-pack/plugins/integration_assistant/scripts/draw_graphs_script.ts index d7ac7478dcc66..12a37f71b184a 100644 --- a/x-pack/plugins/integration_assistant/scripts/draw_graphs_script.ts +++ b/x-pack/plugins/integration_assistant/scripts/draw_graphs_script.ts @@ -19,6 +19,7 @@ import { getCategorizationGraph } from '../server/graphs/categorization/graph'; import { getEcsGraph, getEcsSubGraph } from '../server/graphs/ecs/graph'; import { getLogFormatDetectionGraph } from '../server/graphs/log_type_detection/graph'; import { getRelatedGraph } from '../server/graphs/related/graph'; +import { getKVGraph } from '../server/graphs/kv/graph'; // Some mock elements just to get the graph to compile const model = new FakeLLM({ @@ -50,9 +51,11 @@ export async function drawGraphs() { const categorizationGraph = (await getCategorizationGraph({ client, model })).getGraph(); const ecsSubGraph = (await getEcsSubGraph({ model })).getGraph(); const ecsGraph = (await getEcsGraph({ model })).getGraph(); + const kvGraph = (await getKVGraph({ client, model })).getGraph(); drawGraph(relatedGraph, 'related_graph'); drawGraph(logFormatDetectionGraph, 'log_detection_graph'); drawGraph(categorizationGraph, 'categorization_graph'); drawGraph(ecsSubGraph, 'ecs_subgraph'); drawGraph(ecsGraph, 'ecs_graph'); + drawGraph(kvGraph, 'kv_graph'); } diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/constants.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/constants.ts index 6ddb6974a5b9e..92cc55841bb98 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/constants.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/constants.ts @@ -20,6 +20,11 @@ export const KV_HEADER_EXAMPLE_ANSWER = { grok_pattern: '%{WORD:key1}:%{WORD:value1};%{WORD:key2}:%{WORD:value2}:%{GREEDYDATA:message}', }; +export const KV_HEADER_ERROR_EXAMPLE_ANSWER = { + grok_pattern: + '%{TIMESTAMP:timestamp}:%{WORD:value1};%{WORD:key2}:%{WORD:value2}:%{GREEDYDATA:message}', +}; + export const onFailure = { append: { field: 'error.message', diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/error.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/error.ts index 303c60d21be79..b6d64ee4f615d 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/error.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/error.ts @@ -8,8 +8,8 @@ import { JsonOutputParser } from '@langchain/core/output_parsers'; import type { KVState } from '../../types'; import type { HandleKVNodeParams } from './types'; -import { KV_ERROR_PROMPT } from './prompts'; -import { COMMON_ERRORS, KV_EXAMPLE_ANSWER } from './constants'; +import { KV_ERROR_PROMPT, KV_HEADER_ERROR_PROMPT } from './prompts'; +import { COMMON_ERRORS, KV_EXAMPLE_ANSWER, KV_HEADER_ERROR_EXAMPLE_ANSWER } from './constants'; import { createKVProcessor } from '../../util/processors'; import { KVProcessor } from '../../processor_types'; @@ -36,3 +36,23 @@ export async function handleKVError({ lastExecutedChain: 'kv_error', }; } + +export async function handleHeaderError({ + state, + model, +}: HandleKVNodeParams): Promise> { + const outputParser = new JsonOutputParser(); + const kvHeaderErrorGraph = KV_HEADER_ERROR_PROMPT.pipe(model).pipe(outputParser); + const currentPattern = state.grokPattern; + + const pattern = await kvHeaderErrorGraph.invoke({ + current_pattern: JSON.stringify(currentPattern, null, 2), + errors: JSON.stringify(state.errors, null, 2), + ex_answer: JSON.stringify(KV_HEADER_ERROR_EXAMPLE_ANSWER, null, 2), + }); + + return { + grokPattern: pattern.grok_pattern, + lastExecutedChain: 'kv_header_error', + }; +} diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/graph.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/graph.ts index 07f829c51f689..6f7b43ba40f22 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/graph.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/graph.ts @@ -12,8 +12,8 @@ import type { KVState } from '../../types'; import { handleKV } from './kv'; import type { KVGraphParams, KVBaseNodeParams } from './types'; import { handleHeader } from './header'; -import { handleKVError } from './error'; -import { handleKVValidate } from './validate'; +import { handleHeaderError, handleKVError } from './error'; +import { handleHeaderValidate, handleKVValidate } from './validate'; const graphState: StateGraphArgs['channels'] = { lastExecutedChain: { @@ -56,6 +56,10 @@ const graphState: StateGraphArgs['channels'] = { value: (x: ESProcessorItem, y?: ESProcessorItem) => y ?? x, default: () => ({ kv: {} }), }, + grokPattern: { + value: (x: string, y?: string) => y ?? x, + default: () => '', + }, additionalProcessors: { value: (x: object[], y?: object[]) => y ?? x, default: () => [], @@ -95,6 +99,13 @@ function kvRouter({ state }: KVBaseNodeParams): string { return 'handleKVError'; } +function kvHeaderRouter({ state }: KVBaseNodeParams): string { + if (Object.keys(state.errors).length === 0) { + return 'handleKV'; + } + return 'handleHeaderError'; +} + export async function getKVGraph({ model, client }: KVGraphParams) { const workflow = new StateGraph({ channels: graphState, @@ -103,14 +114,23 @@ export async function getKVGraph({ model, client }: KVGraphParams) { .addNode('modelOutput', (state: KVState) => modelOutput({ state })) .addNode('handleHeader', (state: KVState) => handleHeader({ state, model, client })) .addNode('handleKVError', (state: KVState) => handleKVError({ state, model, client })) + .addNode('handleHeaderError', (state: KVState) => handleHeaderError({ state, model, client })) .addNode('handleKV', (state: KVState) => handleKV({ state, model, client })) .addNode('handleKVValidate', (state: KVState) => handleKVValidate({ state, model, client })) + .addNode('handleHeaderValidate', (state: KVState) => + handleHeaderValidate({ state, model, client }) + ) .addEdge(START, 'modelInput') .addConditionalEdges('modelInput', (state: KVState) => headerRouter({ state }), { header: 'handleHeader', noHeader: 'handleKV', }) - .addEdge('handleHeader', 'handleKV') + .addEdge('handleHeader', 'handleHeaderValidate') + .addConditionalEdges('handleHeaderValidate', (state: KVState) => kvHeaderRouter({ state }), { + handleHeaderError: 'handleHeaderError', + handleKV: 'handleKV', + }) + .addEdge('handleHeaderError', 'handleHeaderValidate') .addEdge('handleKVError', 'handleKVValidate') .addEdge('handleKV', 'handleKVValidate') .addConditionalEdges('handleKVValidate', (state: KVState) => kvRouter({ state }), { diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/header.test.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/header.test.ts index 2c4300aefb15a..7991484024713 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/header.test.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/header.test.ts @@ -40,7 +40,9 @@ describe('Testing kv header', () => { } as unknown as IScopedClusterClient; it('handleHeader()', async () => { const response = await handleHeader({ state, model, client }); - expect(response.kvLogMessages).toStrictEqual(['dummy=data']); + expect(response.grokPattern).toStrictEqual( + '<%{NUMBER:priority}>%{NUMBER:version} %{GREEDYDATA:message}' + ); expect(response.lastExecutedChain).toBe('kv_header'); }); }); diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/header.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/header.ts index 2ffba636639a2..473eae1516112 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/header.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/header.ts @@ -9,14 +9,7 @@ import { JsonOutputParser } from '@langchain/core/output_parsers'; import type { KVState } from '../../types'; import type { HandleKVNodeParams } from './types'; import { KV_HEADER_PROMPT } from './prompts'; -import { KV_HEADER_EXAMPLE_ANSWER, onFailure } from './constants'; -import { createGrokProcessor } from '../../util/processors'; -import { testPipeline } from '../../util'; - -interface GrokResult { - [key: string]: unknown; - message: string; -} +import { KV_HEADER_EXAMPLE_ANSWER } from './constants'; export async function handleHeader({ state, @@ -31,22 +24,8 @@ export async function handleHeader({ ex_answer: JSON.stringify(KV_HEADER_EXAMPLE_ANSWER, null, 2), }); - const grokProcessors = createGrokProcessor(pattern.grok_pattern); - const pipeline = { processors: grokProcessors, on_failure: [onFailure] }; - - const { pipelineResults } = (await testPipeline(state.logSamples, pipeline, client)) as { - pipelineResults: GrokResult[]; - errors: object[]; - }; - - const additionalProcessors = state.additionalProcessors; - additionalProcessors.push(grokProcessors[0]); - - const kvLogMessages: string[] = pipelineResults.map((entry) => entry.message); - return { - kvLogMessages, - additionalProcessors, + grokPattern: pattern.grok_pattern, lastExecutedChain: 'kv_header', }; } diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/kv.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/kv.ts index 2f81d11839243..46820778e5a7d 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/kv.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/kv.ts @@ -27,7 +27,7 @@ export async function handleKV({ const kvMainGraph = KV_MAIN_PROMPT.pipe(model).pipe(new JsonOutputParser()); // Pick logSamples if there was no header detected. - const samples = state.kvLogMessages.length > 0 ? state.kvLogMessages : state.logSamples; + const samples = state.header ? state.kvLogMessages : state.logSamples; const kvInput = (await kvMainGraph.invoke({ samples: samples[0], diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/prompts.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/prompts.ts index e44f164adf75c..0fd7f1262c251 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/prompts.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/prompts.ts @@ -38,6 +38,7 @@ export const KV_MAIN_PROMPT = ChatPromptTemplate.fromMessages([ - Do not create any other processors. - Do not add any prefix to the processor. - Do not use the special characters like \`\s\` or \`\\s+\` in the \`field_split\` or \`value_split\` regular expressions. + - Always use single backslash (\\) for escaping special characters in \`field_split\` or \`value_split\` regular expressions. - Do not add brackets (), <>, [] as well as single or double quotes in \`trim_value\`. - Make sure to trim whitespaces in \`trim_key\`. - Do not respond with anything except the processor as a JSON object enclosed with 3 backticks (\`), see example response below. Use strict JSON response format. @@ -91,6 +92,45 @@ You then have to create a grok pattern using the regex pattern. ['ai', 'Please find the JSON object below:'], ]); +export const KV_HEADER_ERROR_PROMPT = ChatPromptTemplate.fromMessages([ + [ + 'system', + `You are an expert in Syslogs and identifying the headers and structured body in syslog messages. Here is some context for you to reference for your task, read it carefully as you will get questions about it later: + + +{current_pattern} + +`, + ], + [ + 'human', + `Please go through each error below, carefully review the provided current grok pattern, and resolve the most likely cause to the supplied error by returning an updated version of the current_pattern. + + +{errors} + + + You ALWAYS follow these guidelines when writing your response: + + - Identify any mismatches, incorrect syntax, or logical errors in the pattern. + - If the message part contains any unstructured data , make sure to add this in grok pattern. + - Do not parse the message part in the regex. Just the header part should be in regex nad grok_pattern. + - Make sure to map the remaining message part to \'message\' in grok pattern. + - Do not respond with anything except the processor as a JSON object enclosed with 3 backticks (\`), see example response above. Use strict JSON response format. + + + You are required to provide the output in the following example response format: + + + A: Please find the JSON object below: + \`\`\`json + {ex_answer} + \`\`\` + `, + ], + ['ai', 'Please find the JSON object below:'], +]); + export const KV_ERROR_PROMPT = ChatPromptTemplate.fromMessages([ [ 'system', @@ -126,6 +166,7 @@ Follow these steps to help resolve the current ingest pipeline issues: You ALWAYS follow these guidelines when writing your response: - Do not use the special characters like \`\s\` or \`\\s+\` in the \`field_split\` or \`value_split\` regular expressions. +- Always use single backslash (\\) for escaping characters in \`field_split\` or \`value_split\` regular expressions. - Do not add brackets (), <>, [] as well as single or double quotes in \`trim_value\`. - Do not add multiple delimeters in the \`value_split\` regular expression. - Make sure to trim whitespaces in \`trim_key\`. diff --git a/x-pack/plugins/integration_assistant/server/graphs/kv/validate.ts b/x-pack/plugins/integration_assistant/server/graphs/kv/validate.ts index adb60ae6ed955..0bca2ac3fd5e4 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/kv/validate.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/kv/validate.ts @@ -11,11 +11,17 @@ import type { KVState } from '../../types'; import type { HandleKVNodeParams } from './types'; import { testPipeline } from '../../util'; import { onFailure } from './constants'; +import { createGrokProcessor } from '../../util/processors'; interface KVResult { [packageName: string]: { [dataStreamName: string]: unknown }; } +interface GrokResult { + [key: string]: unknown; + message: string; +} + export async function handleKVValidate({ state, client, @@ -25,7 +31,7 @@ export async function handleKVValidate({ const dataStreamName = state.dataStreamName; // Pick logSamples if there was no header detected. - const samples = state.kvLogMessages.length > 0 ? state.kvLogMessages : state.logSamples; + const samples = state.header ? state.kvLogMessages : state.logSamples; const { pipelineResults: kvOutputSamples, errors } = (await createJSONInput( kvProcessor, @@ -54,6 +60,35 @@ export async function handleKVValidate({ }; } +export async function handleHeaderValidate({ + state, + client, +}: HandleKVNodeParams): Promise> { + const grokPattern = state.grokPattern; + const grokProcessor = createGrokProcessor(grokPattern); + const pipeline = { processors: grokProcessor, on_failure: [onFailure] }; + + const { pipelineResults, errors } = (await testPipeline(state.logSamples, pipeline, client)) as { + pipelineResults: GrokResult[]; + errors: object[]; + }; + + if (errors.length > 0) { + return { errors, lastExecutedChain: 'kv_header_validate' }; + } + + const kvLogMessages: string[] = pipelineResults.map((entry) => entry.message); + const additionalProcessors = state.additionalProcessors; + additionalProcessors.push(grokProcessor[0]); + + return { + kvLogMessages, + additionalProcessors, + errors: [], + lastExecutedChain: 'kv_header_validate', + }; +} + async function createJSONInput( kvProcessor: ESProcessorItem, formattedSamples: string[], diff --git a/x-pack/plugins/integration_assistant/server/graphs/log_type_detection/prompts.ts b/x-pack/plugins/integration_assistant/server/graphs/log_type_detection/prompts.ts index 7bbc01d6cc10a..2ed547de00132 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/log_type_detection/prompts.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/log_type_detection/prompts.ts @@ -22,6 +22,7 @@ Here is some context for you to reference for your task, read it carefully as yo `Looking at the log samples , our goal is to identify the syslog type based on the guidelines below. - Go through each log sample and identify the log format type. +- If the samples have a timestamp , loglevel in the beginning information then set "header: true". - If the samples have a syslog header then set "header: true" , else set "header: false". If you are unable to determine the syslog header presence then set "header: false". - If the syslog samples have structured body then classify it as "log_type: structured". - If the syslog samples have unstructured body then classify it as "log_type: unstructured". diff --git a/x-pack/plugins/integration_assistant/server/types.ts b/x-pack/plugins/integration_assistant/server/types.ts index b657ae8f0f110..0fb68b4e04572 100644 --- a/x-pack/plugins/integration_assistant/server/types.ts +++ b/x-pack/plugins/integration_assistant/server/types.ts @@ -111,6 +111,7 @@ export interface KVState { packageName: string; dataStreamName: string; kvProcessor: ESProcessorItem; + grokPattern: string; logSamples: string[]; kvLogMessages: string[]; jsonSamples: string[]; diff --git a/x-pack/plugins/integration_assistant/server/util/processors.ts b/x-pack/plugins/integration_assistant/server/util/processors.ts index dc0c862282bc7..12200f9d32db9 100644 --- a/x-pack/plugins/integration_assistant/server/util/processors.ts +++ b/x-pack/plugins/integration_assistant/server/util/processors.ts @@ -61,8 +61,8 @@ export function createGrokProcessor(grokPattern: string): ESProcessorItem { return grokProcessor; } -// The kv graph returns a simplified grok processor for header -// This function takes in the grok pattern string and creates the grok processor +// The kv graph returns a simplified kv processor for structured body +// This function takes in the kvInput string and creates the kv processor export function createKVProcessor(kvInput: KVProcessor, state: KVState): ESProcessorItem { const templatesPath = joinPath(__dirname, '../templates/processors'); const env = new Environment(new FileSystemLoader(templatesPath), { From 29381c0a34615c26e5e15f620e6d5c297a735c78 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:56:23 +1000 Subject: [PATCH 013/168] [api-docs] 2024-09-12 Daily api_docs build (#192656) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/828 --- 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_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 4 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.devdocs.json | 30 +- 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 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.devdocs.json | 655 ++++++++++++++++++ api_docs/kbn_discover_utils.mdx | 4 +- 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.devdocs.json | 54 ++ api_docs/kbn_elastic_assistant.mdx | 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_utils.devdocs.json | 6 +- api_docs/kbn_esql_utils.mdx | 2 +- ..._esql_validation_autocomplete.devdocs.json | 6 +- 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 +- api_docs/kbn_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- .../kbn_investigation_shared.devdocs.json | 241 ++++++- api_docs/kbn_investigation_shared.mdx | 4 +- 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 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_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 +- .../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 +- ...curitysolution_list_constants.devdocs.json | 8 - .../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_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_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_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 | 361 +--------- 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 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 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 +- 739 files changed, 1716 insertions(+), 1127 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 24855090cad83..f26e18b79daa6 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-11 +date: 2024-09-12 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 a6a842c64b459..d1ab8f09fc24c 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-11 +date: 2024-09-12 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 033db7fdcec51..49feebdf3064c 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-11 +date: 2024-09-12 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 89550b4c8ce8f..4be290a4b0350 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-11 +date: 2024-09-12 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 5005bd9f53069..3b3bf070e8725 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-11 +date: 2024-09-12 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 5a98871616c80..ff44ebc89c563 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-11 +date: 2024-09-12 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 62074dfd57176..4529ffebc0589 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-11 +date: 2024-09-12 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 51053380bb20a..6007013860907 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-11 +date: 2024-09-12 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 3267f7aae0b59..aa85dab6f4179 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-11 +date: 2024-09-12 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 f5cf31954e28e..e20ad07430692 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-11 +date: 2024-09-12 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 c52a9eaa37fcf..6c6d7b5283e94 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-11 +date: 2024-09-12 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 b08b5a41d0929..3a9329a80cd37 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-11 +date: 2024-09-12 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 7b3fcbf4b0e3c..2f596d74f9713 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-11 +date: 2024-09-12 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 0c4c8df2deb7a..04111fdf284c9 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-11 +date: 2024-09-12 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 2855653f79e0d..4111bd08ada52 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index e156dca38d884..41a8a711787f9 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-09-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index df489ccf8223f..98d3bb5bb12de 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-11 +date: 2024-09-12 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 7675ecd3720c5..4babdeb1fd925 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-11 +date: 2024-09-12 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 cd6fefca7b175..f74bf6a890f5b 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-11 +date: 2024-09-12 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 5843e8b140100..a3de9267c2ea9 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-11 +date: 2024-09-12 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 599b9ec9af532..ff8561c17d0a6 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-11 +date: 2024-09-12 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 47162fe5df7ed..96749ea82be05 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-11 +date: 2024-09-12 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 721256871c9ad..83de1f1f96ae7 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-11 +date: 2024-09-12 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 16bf6bf005afd..f33d1518dc3ea 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-11 +date: 2024-09-12 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 1117c8a78a606..8dcc192c1d0f4 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-11 +date: 2024-09-12 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 8ab5184aae2c8..37a18308d3c05 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-11 +date: 2024-09-12 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 d3530e1801a04..ab98ffb3c164b 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index b483828f435f4..b547f93b1ce7a 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-11 +date: 2024-09-12 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 288d97df56d98..33f32b0f10618 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-11 +date: 2024-09-12 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 93f20037624ba..0af1bdfe5b06f 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-11 +date: 2024-09-12 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 8fb18dc942759..0aecee2286681 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-11 +date: 2024-09-12 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 e58edf14936f1..22b7a3d142335 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-11 +date: 2024-09-12 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 3a447009bbeb0..2e7f699cc9f13 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-11 +date: 2024-09-12 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 fb69a5617dbfb..443e85b35c6a4 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index a21c354950469..d6f19212cda88 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1396,7 +1396,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID)+ 8 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION) | - | -| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklist_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/blocklist_validator.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID)+ 8 more | - | +| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID)+ 6 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION) | - | | | [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index f9eaae88d42de..770d31cda8721 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 40c5a4fa80dd1..e4136f3b169ba 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-11 +date: 2024-09-12 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 189d6f6fd1e2c..2bfdd365f546a 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-11 +date: 2024-09-12 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 12037a475cdda..a985639df6fde 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-11 +date: 2024-09-12 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 df18c266a8bc6..f49e7880c15e5 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-11 +date: 2024-09-12 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 f4e73bc9eb4bc..bb2587171689f 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-11 +date: 2024-09-12 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 1ef34b685c47f..e0135ae758e75 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-11 +date: 2024-09-12 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 ffe539cb3cb1a..6228a6124468f 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-11 +date: 2024-09-12 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 e80f0ec89335b..155ff68b70ab6 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-11 +date: 2024-09-12 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 75b081c73e7fc..3d9ac789b0006 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-11 +date: 2024-09-12 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 686c9e6b8fe2f..be6d316bc7fbb 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-11 +date: 2024-09-12 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 45943b46ee136..22da2dca8f213 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-11 +date: 2024-09-12 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 0f1a0b7a92995..19c3045c592fc 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-11 +date: 2024-09-12 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 d0a63797083bc..e09c2026f081d 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-11 +date: 2024-09-12 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 7f07821475fd7..8fa63247fcb68 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-11 +date: 2024-09-12 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 5c8f86abd6a6c..e0e2dbc9a6edc 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-11 +date: 2024-09-12 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 f5ff93cb65784..92a2d552b3ef2 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-11 +date: 2024-09-12 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 a870085e0efaa..34c3650abcefb 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-11 +date: 2024-09-12 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 683162dc055d8..da65f8196de6a 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-11 +date: 2024-09-12 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 23750a173be15..3fab783b37dbd 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-11 +date: 2024-09-12 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 321c79ede411d..4c0286a8e8998 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-11 +date: 2024-09-12 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 03c332ba4e12e..a1527f2cafdf7 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-11 +date: 2024-09-12 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 05d2610986b27..d6c8a86af1b4e 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-11 +date: 2024-09-12 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 7bd90a695906a..1c5d4bc2eb3d2 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-11 +date: 2024-09-12 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 0f191f8528808..383a5e44f71a4 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-11 +date: 2024-09-12 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 b0f617faea5b2..1cdd87e63a433 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-11 +date: 2024-09-12 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 63f01dde86187..3001f21977eb8 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-11 +date: 2024-09-12 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 3f788fb742614..aad01dcd0afc5 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-11 +date: 2024-09-12 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 a12fe79110feb..2a7e3cc982a29 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-11 +date: 2024-09-12 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 c0b17def4bda0..0b2d0283e5baf 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-11 +date: 2024-09-12 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 7e213af22d8be..4f16e7c7fedf1 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-11 +date: 2024-09-12 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 c75fb012b1879..570b8fb1a5dc3 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-11 +date: 2024-09-12 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 b34ea2b8ba3e7..14044d5d6be84 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-11 +date: 2024-09-12 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 f0db4e5fb7076..bc8a66e9d0ff7 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-11 +date: 2024-09-12 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 99f4356034507..c6c438f827241 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-11 +date: 2024-09-12 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 95f4cd1420e47..c222e8472c8c7 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-11 +date: 2024-09-12 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 3660d11b560cb..e6db42319725c 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-11 +date: 2024-09-12 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 008f13c234732..54fd2b2dd5b96 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-11 +date: 2024-09-12 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 a7996dec4f4db..1397848a1bf75 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-11 +date: 2024-09-12 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 3b02d6f477b2c..395f058987650 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-11 +date: 2024-09-12 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 f5feff40fa517..54477df63fd03 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-11 +date: 2024-09-12 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 ebed9e4741aa1..0cabaeabb093c 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-11 +date: 2024-09-12 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 7f3ec5061a455..1d66156ab0329 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-11 +date: 2024-09-12 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 d9f1ef02cf86f..471174d4540fd 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-11 +date: 2024-09-12 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 36f0ac8f8ad32..1125311a71bd5 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-11 +date: 2024-09-12 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 dd094dbec0ff0..c35034fd3e984 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-11 +date: 2024-09-12 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 e83ef6ac1b988..9fa4299c61149 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-11 +date: 2024-09-12 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 86a6c02292b78..3ecd64bfb15f6 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-11 +date: 2024-09-12 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 3873f0ce6a6d1..a6997041c88d6 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-11 +date: 2024-09-12 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 b6d5aad68bf49..c912f7550fb06 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-11 +date: 2024-09-12 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 e7ed8d3d0db40..cff653a40e160 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-11 +date: 2024-09-12 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 6349cd9f80fa8..c8df612f655df 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-11 +date: 2024-09-12 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 01e6d23b4188a..49674b82c0cbc 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 4bdb9c86aa722..ce1da6e30f0fb 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-11 +date: 2024-09-12 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 932cba12f7bab..6cf89a952705f 100644 --- a/api_docs/investigate_app.devdocs.json +++ b/api_docs/investigate_app.devdocs.json @@ -194,9 +194,15 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", "LiteralC", - "<\"closed\">]>; params: ", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", + "LiteralC", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; params: ", "TypeC", "<{ timeRange: ", "TypeC", @@ -204,9 +210,13 @@ "NumberC", "; to: ", "NumberC", - "; }>; }>; }>; }> | undefined; handler: ({}: ", + "; }>; }>; tags: ", + "ArrayC", + "<", + "StringC", + ">; }>; }> | undefined; handler: ({}: ", "InvestigateAppRouteHandlerResources", - " & { params: { path: { investigationId: string; }; body: { title?: string | undefined; status?: \"closed\" | \"ongoing\" | undefined; params?: { timeRange: { from: number; to: number; }; } | undefined; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", + " & { params: { path: { investigationId: string; }; body: { title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", "InvestigateAppRouteCreateOptions", "; \"GET /api/observability/investigations/{investigationId} 2023-10-31\": { endpoint: \"GET /api/observability/investigations/{investigationId} 2023-10-31\"; params?: ", "TypeC", @@ -216,7 +226,7 @@ "StringC", "; }>; }> | undefined; handler: ({}: ", "InvestigateAppRouteHandlerResources", - " & { params: { path: { investigationId: string; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", + " & { params: { path: { investigationId: string; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", "InvestigateAppRouteCreateOptions", "; \"GET /api/observability/investigations 2023-10-31\": { endpoint: \"GET /api/observability/investigations 2023-10-31\"; params?: ", "PartialC", @@ -230,7 +240,7 @@ "StringC", "; }>; }> | undefined; handler: ({}: ", "InvestigateAppRouteHandlerResources", - " & { params?: { query?: { alertId?: string | undefined; page?: string | undefined; perPage?: string | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: { id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }[]; }>; } & ", + " & { params?: { query?: { alertId?: string | undefined; page?: string | undefined; perPage?: string | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: { id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }[]; }>; } & ", "InvestigateAppRouteCreateOptions", "; \"POST /api/observability/investigations 2023-10-31\": { endpoint: \"POST /api/observability/investigations 2023-10-31\"; params?: ", "TypeC", @@ -260,9 +270,13 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"blank\">; }>]>; }>; }> | undefined; handler: ({}: ", + "<\"blank\">; }>]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; }>; }> | undefined; handler: ({}: ", "InvestigateAppRouteHandlerResources", - " & { params: { body: { id: string; title: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", + " & { params: { body: { id: string; title: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; tags: string[]; }; }; }) => Promise<{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }>; } & ", "InvestigateAppRouteCreateOptions", "; }" ], diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 7faddb21ae3b6..3469feca56cce 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-11 +date: 2024-09-12 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 c05e1087a66ce..810f590fdd2a4 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-11 +date: 2024-09-12 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 a2dc3477c613b..ee1c39bc762d7 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-11 +date: 2024-09-12 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 757140692ac4b..133ec1d14f45d 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-11 +date: 2024-09-12 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 59b3541b4edf7..ae3c91213c21c 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-11 +date: 2024-09-12 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 866543e618463..f68b41e8e00b5 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-11 +date: 2024-09-12 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 ceff3aef43750..271d1c0248bb8 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-11 +date: 2024-09-12 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 b9d6f19d514ce..aaf2827ea89ad 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-11 +date: 2024-09-12 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 05cfbf43e286e..1e3c498e5b50a 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-11 +date: 2024-09-12 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 493c68b14061f..ef19136359571 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-11 +date: 2024-09-12 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 e0f04f331b23e..7dd8c8cb84f22 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-11 +date: 2024-09-12 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 5a5f326fbb268..fce9fe6c540a4 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-11 +date: 2024-09-12 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 1dff10df5472e..7d1ae3f4473b7 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-11 +date: 2024-09-12 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 6afc06b6b0658..18499e09c00a7 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-11 +date: 2024-09-12 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 69bf8229e117e..9b7ce89f0d67a 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-11 +date: 2024-09-12 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 cb48088284475..5329891274ca4 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-11 +date: 2024-09-12 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 97d45d29e05a9..02f305002e0ef 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-11 +date: 2024-09-12 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 21976a658d557..2704c8d7808e8 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-11 +date: 2024-09-12 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 5245d5d114552..a2b4d5991a186 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-11 +date: 2024-09-12 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 1330ad11d1376..285fc1f19e429 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-11 +date: 2024-09-12 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 68f277d3e4906..9af16a7a46397 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-11 +date: 2024-09-12 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 ce50e617a8440..babcac53be1d3 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-11 +date: 2024-09-12 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 d0896b0d29914..e5a51803793a8 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-11 +date: 2024-09-12 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 26605c70f5830..532e7fe47e59e 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-11 +date: 2024-09-12 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 0cd97b8adaff3..4ed222537179a 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-11 +date: 2024-09-12 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 cd9909704ab86..3f1781a40d86d 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-11 +date: 2024-09-12 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 c23c5429b00d2..ed3aa2d54d1bd 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-11 +date: 2024-09-12 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 63c4ab8d31573..af28b7c950366 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-11 +date: 2024-09-12 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 98488202a83da..50af830eadbe4 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-11 +date: 2024-09-12 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 348c531d153d1..b62909579c12e 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-11 +date: 2024-09-12 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 964563951c00e..7b7653c03d456 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-11 +date: 2024-09-12 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 ebe1db5bca416..905ba01c23049 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-11 +date: 2024-09-12 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 e8786adbdcf07..09fff2ed71f11 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-11 +date: 2024-09-12 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 eda4dcd94a645..b73873312f123 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-11 +date: 2024-09-12 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 06f2eedd3cdb7..147fe1b82f73d 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-11 +date: 2024-09-12 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 961b04113cacd..343baf9a52093 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-11 +date: 2024-09-12 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 d3ab69c4ac537..44fef4ae80cb6 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 438df658e9924..d65545aab2f84 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-11 +date: 2024-09-12 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 a04354d7d3d0f..1fbed9a68b65e 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-11 +date: 2024-09-12 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 45610348ea208..a179a13ee61f8 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-11 +date: 2024-09-12 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 157b0a45ca0b5..9126a07467a98 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-11 +date: 2024-09-12 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 eb84223c240e1..0d2df6d9e3b89 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-11 +date: 2024-09-12 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 d207eb021e7ed..7b889ab675188 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-11 +date: 2024-09-12 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 4f522fe4b49e7..793f75a26fb26 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-11 +date: 2024-09-12 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 ee0f88652389a..88951101173f7 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-11 +date: 2024-09-12 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 aa67f9fcc554e..11b2693b7ed8f 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-11 +date: 2024-09-12 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 905797efc9158..8b8067bb75f23 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-11 +date: 2024-09-12 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 310573b8e8f81..93e24e3829c1f 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-11 +date: 2024-09-12 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 080d557be8474..1caa66e3c8765 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-11 +date: 2024-09-12 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 56412090773bc..d6ae0d9356e16 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-11 +date: 2024-09-12 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 24bc47c3801b1..b8af32547d83f 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-11 +date: 2024-09-12 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 e08f4e095c6bd..969b829419592 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-11 +date: 2024-09-12 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 2553ce20eaa1c..7f246327ab1b4 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-11 +date: 2024-09-12 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 d8bb47ff0cb33..b352540988b9d 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-11 +date: 2024-09-12 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 e20dafb41a3a9..e30b0678c34d9 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-11 +date: 2024-09-12 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 0606b0538921b..7c2481133a3a8 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-11 +date: 2024-09-12 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 cf709aeae748f..73e80b3135036 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-11 +date: 2024-09-12 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 7cabebce73535..5bcff3cf2c8b8 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-11 +date: 2024-09-12 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 71b689be8a3dc..b88f4fb72e49e 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-11 +date: 2024-09-12 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 d2c1c5fa3e6b5..5a73aaeee1797 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-11 +date: 2024-09-12 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 da695c8f8a5ec..f80631443c18f 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-11 +date: 2024-09-12 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 a3cffdf1d1ee2..bdac296f5db03 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-11 +date: 2024-09-12 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 76c5ff8a479d2..8e1307910737c 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-11 +date: 2024-09-12 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 046c4b9f5cefc..ceda733fbaf67 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-11 +date: 2024-09-12 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 cc556d673faa6..7eba058a915b6 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-11 +date: 2024-09-12 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 4605180e455bb..b7021a6042f8a 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-11 +date: 2024-09-12 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 7da54f78f7ad3..1f38657b27ee2 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-11 +date: 2024-09-12 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 b0e79c60a0f65..e1c642219063d 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-11 +date: 2024-09-12 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 390c1ee48757a..794b84511749f 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-11 +date: 2024-09-12 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 d34a500a01e25..fc94f1469a815 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-11 +date: 2024-09-12 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 e1c6219b24d46..f7b542adf7526 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-11 +date: 2024-09-12 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 86e67643b307f..9d477a6dc1ba4 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-11 +date: 2024-09-12 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 2ac5d7604d52e..c7c5be7355477 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-11 +date: 2024-09-12 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 55570816c5e3a..d9cbc05b1f704 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-11 +date: 2024-09-12 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 2e53ee7ed732a..82cd1866e4d8e 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-11 +date: 2024-09-12 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 e246bc494d1aa..7a75f8664758e 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-11 +date: 2024-09-12 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 66b2a10592a10..ca73c6af47278 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-11 +date: 2024-09-12 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 2a72f96e664e6..6838f9e3d0369 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-11 +date: 2024-09-12 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 4370f71f7269e..b592c69c86d51 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-11 +date: 2024-09-12 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 418d8993c6441..495fc82c7c6e4 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-11 +date: 2024-09-12 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 95d204d37aa8b..da6db9695a950 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-11 +date: 2024-09-12 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 e583666f8717a..b91488c834ee1 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-11 +date: 2024-09-12 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 da7922d100b21..3aa97f14c858c 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-11 +date: 2024-09-12 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 fa80f277f039f..50f59f93b47bf 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-11 +date: 2024-09-12 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 44fae0cc586ca..829d7c2ebfb3f 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-11 +date: 2024-09-12 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 f4f4fe27acf84..919f119820f8f 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-11 +date: 2024-09-12 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 c8c4b0f64f44e..d59d043962b14 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-11 +date: 2024-09-12 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 f3f6b1eac5d95..ee0bdafc8c1d5 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-11 +date: 2024-09-12 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 c4641e7592f27..9e7a28ec0f805 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-11 +date: 2024-09-12 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 95171fc3dc84a..5ea1d5d6adf64 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-11 +date: 2024-09-12 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 74c1d61a2cff6..314537efdf4ee 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-11 +date: 2024-09-12 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 67d62bb9da191..e5d3623068c1c 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-11 +date: 2024-09-12 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 83e36d12c652b..5197f15497dfa 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-11 +date: 2024-09-12 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 cc8224eb6d231..2cdb9a81656ce 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-11 +date: 2024-09-12 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 7097898c180ea..b841f89d9133d 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-11 +date: 2024-09-12 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 9f18805206dd5..3652d615f634a 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-11 +date: 2024-09-12 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 53dd9cc6369cd..5dd6358c1103f 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-11 +date: 2024-09-12 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 b398624bfbd11..8790db9fa4377 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-11 +date: 2024-09-12 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 7c5e4da66fb02..787f80d344c9d 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-11 +date: 2024-09-12 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 c1b5c69e55d08..58cf122a29b4a 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-11 +date: 2024-09-12 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 848130cf38e6c..5b49b6398ba52 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-11 +date: 2024-09-12 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 dc356f89e2ef7..5f518abb6fbd2 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-11 +date: 2024-09-12 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 ca01d4a33ddf6..8cb64b4217197 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-11 +date: 2024-09-12 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 1c84328c2c275..96b2ebb31b620 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-11 +date: 2024-09-12 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 80f8f5f2226d6..d6403c1780ea4 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-11 +date: 2024-09-12 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 5d043baabfb2f..5f5a671c644eb 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-11 +date: 2024-09-12 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 1a4e85c515d15..514183ca34cf0 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-11 +date: 2024-09-12 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 781e276c5dac0..307c50ba7c731 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-11 +date: 2024-09-12 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 82df57923195d..77d00b871e755 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-11 +date: 2024-09-12 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 1a95518ae42e3..f224f9ac216d4 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-11 +date: 2024-09-12 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 6b1a34f9232ee..e94fa03130bb2 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-11 +date: 2024-09-12 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 e8708bc3acd26..d3443644fec1d 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-11 +date: 2024-09-12 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 0f4e24986238f..c6f353d978abf 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 909cf0bacbc61..5903fbf0a1c20 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-11 +date: 2024-09-12 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 f112828ca4c4c..f8a592c12ebbc 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-11 +date: 2024-09-12 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 e4ce9904ed257..619dbe155b7da 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-11 +date: 2024-09-12 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 6b2122d72f708..f1da85cde7f97 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-11 +date: 2024-09-12 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 da0270f10bc1c..b9a01c0fadff7 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-11 +date: 2024-09-12 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 40ec05005f78c..90122125cc14e 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-11 +date: 2024-09-12 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 0dd338e9b89f1..1c9a465e54f25 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-11 +date: 2024-09-12 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 4a295e78a9fd2..898b2d803c246 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-11 +date: 2024-09-12 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 48e2d69cbc9fd..08cb7db283100 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 73795b0c85ff8..11f4b210b2757 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-11 +date: 2024-09-12 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 c769027fbb6b1..eb383b96fe45e 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 760ef4bf8652b..d4ab3e504f90f 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 8879bd03d7ff1..f52ae09f69caa 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-11 +date: 2024-09-12 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 14b0a93140f87..60c38952a6a00 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-11 +date: 2024-09-12 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 2826bdc599ee6..e7bbff113928b 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-11 +date: 2024-09-12 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 b1c07e3925abe..060b0daa0a6d1 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-11 +date: 2024-09-12 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 26451e38ad119..ec5f06d5f1711 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-11 +date: 2024-09-12 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 a95cc54dbab5c..c3df0cbac2369 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-11 +date: 2024-09-12 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 3a696feb36144..142a3950a1061 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-11 +date: 2024-09-12 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 1ca545780c94f..be105e562dacb 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-11 +date: 2024-09-12 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 ee24b452b1125..a92bf3ec79c94 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-11 +date: 2024-09-12 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 6c9a5c71dd214..3144b9363238e 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-11 +date: 2024-09-12 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 d2fd5730ab5cc..0affbbb8946f9 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-11 +date: 2024-09-12 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 fc54dcc2d1432..a67ac70edea55 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-11 +date: 2024-09-12 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 3a54345ef1cc7..3db4fe7f736fa 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-11 +date: 2024-09-12 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 5b0ae5b0fb06f..13bc61d2cd4a8 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-11 +date: 2024-09-12 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 15f218b139c61..f14847239065f 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-11 +date: 2024-09-12 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 d22d807e08be9..4c8c3854c050d 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-11 +date: 2024-09-12 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 ec4b8db93e193..dd944a40094ff 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-11 +date: 2024-09-12 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 17e63aa4c4706..5f773e22f6d34 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-11 +date: 2024-09-12 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 28316c292aaea..a7bc4bf55842e 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-11 +date: 2024-09-12 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 55c6946163da4..8bc9766a66986 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-11 +date: 2024-09-12 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 5347e17a96d8f..4dcdea45b7240 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-11 +date: 2024-09-12 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 53a5b01d69638..ec6419d7a3a09 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-11 +date: 2024-09-12 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 521097303f2ab..6a7305daa368a 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-11 +date: 2024-09-12 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 3e4c81d88fdb0..6564f9459e436 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-11 +date: 2024-09-12 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 f3e5a56532427..7db1f0f9a9746 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-11 +date: 2024-09-12 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 ba759295987e3..63ea325ed2f26 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-11 +date: 2024-09-12 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 7263fa426b564..79f1ff466547c 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-11 +date: 2024-09-12 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 a55e2e6fc9953..d83acb4ee09fb 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-11 +date: 2024-09-12 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 c64e47544fdd3..a164ac097f93b 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-11 +date: 2024-09-12 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 850a43717791b..01eca0a395dac 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-11 +date: 2024-09-12 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 4a0abcc89bd34..29b40dc1c9919 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-11 +date: 2024-09-12 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 dbb687feab20c..0c5bc5685fd17 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-11 +date: 2024-09-12 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 d140266cd2f56..1519f41072e21 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-11 +date: 2024-09-12 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 bba2de7e6650b..9a378cdec7d98 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-11 +date: 2024-09-12 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 5b633624d6083..b86f5c411275a 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-11 +date: 2024-09-12 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 6e5ca681eeaac..e166d01f4a19a 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-11 +date: 2024-09-12 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 ca4d172c2a470..d916eff2e499a 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-11 +date: 2024-09-12 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 3a105c218fdc0..3210d47e840d4 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-11 +date: 2024-09-12 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 e9ccaeb7d943c..0ad3ce820b22e 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-11 +date: 2024-09-12 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 4490c653159f4..6547159712635 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-11 +date: 2024-09-12 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 0f228542cfaf1..c7c4bc0752658 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-11 +date: 2024-09-12 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 4003a8a32db1b..fe231895560be 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-11 +date: 2024-09-12 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 b2689c57b34c3..d7cdd7980c92d 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-11 +date: 2024-09-12 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 9f30d8d7d5505..73a53f6f5aaf0 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-11 +date: 2024-09-12 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 377afcc802e78..fb8676d628b58 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-11 +date: 2024-09-12 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 12dc800b1c90f..bc93cbee78b70 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-11 +date: 2024-09-12 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 0b6294af12c29..6a95b9eae29e9 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-11 +date: 2024-09-12 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 190d288bef963..2e909e279356f 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-11 +date: 2024-09-12 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 8faafa1926599..334e1071454e3 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-11 +date: 2024-09-12 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 2338b601b233f..2d4bf2ffa3375 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-11 +date: 2024-09-12 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 8a63edac29290..9fd68221f9c41 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-11 +date: 2024-09-12 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 7dee816c95327..f9897785a502e 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-11 +date: 2024-09-12 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 9fe3dba2eb0a8..f2e0f8b4f1093 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-11 +date: 2024-09-12 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 ebe9c4fce69dd..bc0a92104d658 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-11 +date: 2024-09-12 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 e32a3ab04ee63..0096aa0da4876 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-11 +date: 2024-09-12 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 a30d711841126..11c7758d1f844 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-11 +date: 2024-09-12 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 a26e579189d3d..d2a5b8df556ae 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-11 +date: 2024-09-12 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 82ed26c2dcd65..4d8faa2c91bdf 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-11 +date: 2024-09-12 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 93ed325abca3f..cd416ff5ca323 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-11 +date: 2024-09-12 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 ebba4ab955d9d..b2235d97401dd 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-11 +date: 2024-09-12 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 b919737cde1f6..eb064479cad53 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-11 +date: 2024-09-12 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 0cf82ec4a01fc..4d512f57c9049 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-11 +date: 2024-09-12 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 be5ff48e22240..bf55734b947ce 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-11 +date: 2024-09-12 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 2128b18b6684e..e3ee2e6a12184 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-11 +date: 2024-09-12 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 c405dd63bf439..ea057516a6b9d 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-11 +date: 2024-09-12 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 a14d8b4ae3db8..1a0f1824c26ea 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-11 +date: 2024-09-12 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 4824a03092627..acb2af118928d 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-11 +date: 2024-09-12 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 d2341b46d7304..65327cfd9690f 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-11 +date: 2024-09-12 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 3b36bb7af131b..6938377c9ded9 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-11 +date: 2024-09-12 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 737396799b83f..28f40caffc29b 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-11 +date: 2024-09-12 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 74551b6a648d9..97ac57b1c18e9 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-11 +date: 2024-09-12 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 e5f89c1db638d..1adf7d984703e 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-11 +date: 2024-09-12 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 746af2a397e9a..f9d13714982f8 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-11 +date: 2024-09-12 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 b57560f587b6d..80311d49b9a41 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-11 +date: 2024-09-12 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 19376a2e3a706..bb1b3366126ae 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-11 +date: 2024-09-12 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 b90735973b296..d2a47ceec8803 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-11 +date: 2024-09-12 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 7d08088d55258..cde0b99d5b578 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-11 +date: 2024-09-12 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 996bf5a73b3ff..b47d6502b0eb2 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-11 +date: 2024-09-12 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 a15f7d313efe5..42cfb02c84bd2 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-11 +date: 2024-09-12 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 b15c3b503014e..cb302f6c796b8 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-11 +date: 2024-09-12 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 42ceb22039153..f3363b5d1fe94 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-11 +date: 2024-09-12 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 0afddd2ee22f4..390838799788f 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-11 +date: 2024-09-12 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 6737d23628408..323a144822ac9 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-11 +date: 2024-09-12 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 033c5461c8764..6d95434e08d65 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-11 +date: 2024-09-12 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 61022bcd3e2bb..e3c70446495dc 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-11 +date: 2024-09-12 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 6f02d4b683567..e6e55402d5b6b 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-11 +date: 2024-09-12 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 36facc4718cdb..b24c05bd8b072 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-11 +date: 2024-09-12 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 82f3e864d513b..572080be49cd2 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-11 +date: 2024-09-12 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 a611d2aebe46f..22f721659df64 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-11 +date: 2024-09-12 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 f690f8752a334..636c3e2b96d13 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-11 +date: 2024-09-12 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 b0525a9873c15..22d61c9a8d1b1 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-11 +date: 2024-09-12 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 fbf9b6d4d9a31..4de068bd4dd97 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-11 +date: 2024-09-12 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 54a784df068c6..32952bdf7452a 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-11 +date: 2024-09-12 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 5b8305db99452..e0dcd0f73c51f 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-11 +date: 2024-09-12 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 c32699c31195d..e9c518bf11ca0 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-11 +date: 2024-09-12 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 1fc5807f95031..0a63217349278 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-11 +date: 2024-09-12 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 d0a41eeebd89c..dad3cc3fef705 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-11 +date: 2024-09-12 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 a7366a3667b42..cbea3979c2e2c 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-11 +date: 2024-09-12 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 820f1678ac60e..2ce812db4c0ec 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-11 +date: 2024-09-12 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 8474ed5756616..00c8623a3d257 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-11 +date: 2024-09-12 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 ac33e785c6fe6..3a265e5be908a 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-11 +date: 2024-09-12 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 a14d96067c108..88f310b91603e 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-11 +date: 2024-09-12 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 8a5091455fd4b..82c97d651f1ef 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-11 +date: 2024-09-12 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 02f7434ac3384..6805551a4c50c 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-11 +date: 2024-09-12 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 c9e388d16dab9..3ef5719d6d572 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-11 +date: 2024-09-12 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 9a0ba12a699a3..9759347f49039 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-11 +date: 2024-09-12 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 63e200712b82e..7e91ad92a4e27 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-11 +date: 2024-09-12 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 50ef39571861d..657294683ac54 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-11 +date: 2024-09-12 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 998cb58f9117d..27610073db233 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-11 +date: 2024-09-12 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 7bbe622f6caa4..fa62ce0db8314 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-11 +date: 2024-09-12 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 b4b5a4aee56bc..827ec4e62c3bf 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-11 +date: 2024-09-12 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 49ac49daea755..3477714bb2b9c 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-11 +date: 2024-09-12 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 b8a5f4a964753..51a972c28e0bf 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-11 +date: 2024-09-12 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 d196148d77f00..67f1cf1293dde 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-11 +date: 2024-09-12 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 5b5d5cc4f3e79..45289aebb5850 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-11 +date: 2024-09-12 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 1fd3e0b3718e1..a6344119fa7f9 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-11 +date: 2024-09-12 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 1905a3053dfd9..3dca15d36ed79 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-11 +date: 2024-09-12 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 b4bf9ff4eb075..4b2c8fb1a0caa 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-11 +date: 2024-09-12 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 933a13423fe98..699cc9d397bfc 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-11 +date: 2024-09-12 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 c369071ab2ef2..570e13beea747 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-11 +date: 2024-09-12 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 94d07c81e1617..685b93fd4c713 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-11 +date: 2024-09-12 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 500dce059c12f..5e0f60618bdf2 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-11 +date: 2024-09-12 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 11e07557e49ff..8f8ff0eb02667 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-11 +date: 2024-09-12 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 af2047304aed0..6499cccf63ade 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-11 +date: 2024-09-12 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 23bc86b4f984e..10d360d99262a 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-11 +date: 2024-09-12 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 c8e7b12c6db0f..b8b1ef9a7f087 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-11 +date: 2024-09-12 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 b98d46a08452f..7b2b8a4bc0472 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-11 +date: 2024-09-12 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 7d6e538038907..a1916f2b9ce3d 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-11 +date: 2024-09-12 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 fe0c27160eca4..d1b5a0c92cd87 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-11 +date: 2024-09-12 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 1e985acf20643..6df54e3a0f29e 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -329,6 +329,158 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.canPrependTimeFieldColumn", + "type": "Function", + "tags": [], + "label": "canPrependTimeFieldColumn", + "description": [], + "signature": [ + "(columns: string[] | undefined, timeFieldName: string | undefined, columnsMeta: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableColumnsMeta", + "text": "DataTableColumnsMeta" + }, + " | undefined, showTimeCol: boolean, isESQLMode: boolean) => boolean" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.canPrependTimeFieldColumn.$1", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.canPrependTimeFieldColumn.$2", + "type": "string", + "tags": [], + "label": "timeFieldName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.canPrependTimeFieldColumn.$3", + "type": "Object", + "tags": [], + "label": "columnsMeta", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableColumnsMeta", + "text": "DataTableColumnsMeta" + }, + " | undefined" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.canPrependTimeFieldColumn.$4", + "type": "boolean", + "tags": [], + "label": "showTimeCol", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.canPrependTimeFieldColumn.$5", + "type": "boolean", + "tags": [], + "label": "isESQLMode", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.createDegradedDocsControl", + "type": "Function", + "tags": [], + "label": "createDegradedDocsControl", + "description": [ + "\nDegraded docs control factory function." + ], + "signature": [ + "(props?: DegradedDocsControlProps | undefined) => ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlColumn", + "text": "RowControlColumn" + } + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/degraded_docs_control.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.createDegradedDocsControl.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [ + "Optional props for the generated Control component, useful to override onClick, etc" + ], + "signature": [ + "DegradedDocsControlProps | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/degraded_docs_control.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.createLogsContextService", @@ -364,6 +516,66 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.createStacktraceControl", + "type": "Function", + "tags": [], + "label": "createStacktraceControl", + "description": [ + "\nStacktrace control factory function." + ], + "signature": [ + "(props?: Partial<", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlProps", + "text": "RowControlProps" + }, + "> | undefined) => ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlColumn", + "text": "RowControlColumn" + } + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/stacktrace_control.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.createStacktraceControl.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [ + "Optional props for the generated Control component, useful to override onClick, etc" + ], + "signature": [ + "Partial<", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlProps", + "text": "RowControlProps" + }, + "> | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/stacktrace_control.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.formatFieldValue", @@ -1375,6 +1587,83 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getVisibleColumns", + "type": "Function", + "tags": [], + "label": "getVisibleColumns", + "description": [], + "signature": [ + "(columns: string[], dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + ", shouldPrependTimeFieldColumn: boolean) => string[]" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getVisibleColumns.$1", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getVisibleColumns.$2", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + } + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getVisibleColumns.$3", + "type": "boolean", + "tags": [], + "label": "shouldPrependTimeFieldColumn", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-discover-utils/src/utils/get_visible_columns.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.isLegacyTableEnabled", @@ -2239,6 +2528,293 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn", + "type": "Interface", + "tags": [], + "label": "RowControlColumn", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn.headerAriaLabel", + "type": "string", + "tags": [], + "label": "headerAriaLabel", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn.headerCellRender", + "type": "CompoundType", + "tags": [], + "label": "headerCellRender", + "description": [], + "signature": [ + "React.ComponentType<{}> | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn.renderControl", + "type": "Function", + "tags": [], + "label": "renderControl", + "description": [], + "signature": [ + "(Control: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlComponent", + "text": "RowControlComponent" + }, + ", props: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlRowProps", + "text": "RowControlRowProps" + }, + ") => React.ReactElement>" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn.renderControl.$1", + "type": "Function", + "tags": [], + "label": "Control", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlComponent", + "text": "RowControlComponent" + } + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlColumn.renderControl.$2", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlRowProps", + "text": "RowControlRowProps" + } + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps", + "type": "Interface", + "tags": [], + "label": "RowControlProps", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.datatestsubj", + "type": "string", + "tags": [], + "label": "'data-test-subj'", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.color", + "type": "CompoundType", + "tags": [], + "label": "color", + "description": [], + "signature": [ + "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.disabled", + "type": "CompoundType", + "tags": [], + "label": "disabled", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.iconType", + "type": "CompoundType", + "tags": [], + "label": "iconType", + "description": [], + "signature": [ + "string | React.ComponentType<{}>" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.onClick", + "type": "Function", + "tags": [], + "label": "onClick", + "description": [], + "signature": [ + "((props: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlRowProps", + "text": "RowControlRowProps" + }, + ") => void) | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlProps.tooltipContent", + "type": "CompoundType", + "tags": [], + "label": "tooltipContent", + "description": [], + "signature": [ + "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlRowProps", + "type": "Interface", + "tags": [], + "label": "RowControlRowProps", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlRowProps.rowIndex", + "type": "number", + "tags": [], + "label": "rowIndex", + "description": [], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlRowProps.record", + "type": "Object", + "tags": [], + "label": "record", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + } + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "enums": [ @@ -2313,6 +2889,31 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DataTableColumnsMeta", + "type": "Type", + "tags": [], + "label": "DataTableColumnsMeta", + "description": [ + "\nCustom column types per column name" + ], + "signature": [ + "{ [x: string]: { type: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumnType", + "text": "DatatableColumnType" + }, + "; esType?: string | undefined; }; }" + ], + "path": "packages/kbn-discover-utils/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.DEFAULT_ALLOWED_LOGS_BASE_PATTERNS", @@ -2465,6 +3066,60 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlComponent", + "type": "Type", + "tags": [], + "label": "RowControlComponent", + "description": [], + "signature": [ + "React.FunctionComponent<", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlProps", + "text": "RowControlProps" + }, + ">" + ], + "path": "packages/kbn-discover-utils/src/components/custom_control_columns/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlComponent.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P & { children?: React.ReactNode; }" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RowControlComponent.$2", + "type": "Any", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.SAMPLE_ROWS_PER_PAGE_SETTING", diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index be42a2c1059e1..2f708d4fd7e7b 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.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 | |-------------------|-----------|------------------------|-----------------| -| 136 | 0 | 109 | 1 | +| 172 | 0 | 138 | 1 | ## Common diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index a6c888a9dc96a..8cea73a91d997 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-11 +date: 2024-09-12 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 78259b983d381..c77ce1eba786b 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-11 +date: 2024-09-12 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 a4415f36afe93..796416674bb1a 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-11 +date: 2024-09-12 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 61cfe1a25a7cd..e6fe00a9711b4 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-11 +date: 2024-09-12 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 ef0e5af9b1c25..e9dfd14abeb66 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-11 +date: 2024-09-12 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 0f30d082029db..dd02bca396f21 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-11 +date: 2024-09-12 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 3d4b510be8d61..0ee66cd790567 100644 --- a/api_docs/kbn_elastic_assistant.devdocs.json +++ b/api_docs/kbn_elastic_assistant.devdocs.json @@ -2518,6 +2518,60 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant", + "id": "def-public.GetAssistantMessages", + "type": "Type", + "tags": [], + "label": "GetAssistantMessages", + "description": [], + "signature": [ + "(commentArgs: { abortStream: () => void; currentConversation?: ", + { + "pluginId": "@kbn/elastic-assistant", + "scope": "public", + "docId": "kibKbnElasticAssistantPluginApi", + "section": "def-public.Conversation", + "text": "Conversation" + }, + " | undefined; isFetchingResponse: boolean; refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean | undefined; }) => void; regenerateMessage: (conversationId: string) => void; showAnonymizedValues: boolean; currentUserAvatar?: ", + "UserAvatar", + " | undefined; setIsStreaming: (isStreaming: boolean) => void; systemPromptContent?: string | undefined; }) => ", + "EuiCommentProps", + "[]" + ], + "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant_context/types.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/elastic-assistant", + "id": "def-public.GetAssistantMessages.$1", + "type": "Object", + "tags": [], + "label": "commentArgs", + "description": [], + "signature": [ + "{ abortStream: () => void; currentConversation?: ", + { + "pluginId": "@kbn/elastic-assistant", + "scope": "public", + "docId": "kibKbnElasticAssistantPluginApi", + "section": "def-public.Conversation", + "text": "Conversation" + }, + " | undefined; isFetchingResponse: boolean; refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean | undefined; }) => void; regenerateMessage: (conversationId: string) => void; showAnonymizedValues: boolean; currentUserAvatar?: ", + "UserAvatar", + " | undefined; setIsStreaming: (isStreaming: boolean) => void; systemPromptContent?: string | undefined; }" + ], + "path": "x-pack/packages/kbn-elastic-assistant/impl/assistant_context/types.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant", "id": "def-public.KNOWLEDGE_BASE_LOCAL_STORAGE_KEY", diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index ffefa42f69035..3b99327a45085 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 156 | 0 | 130 | 9 | +| 158 | 0 | 132 | 10 | ## Client diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 77eb398b16666..e0fb88708fc17 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-11 +date: 2024-09-12 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 1d8fed15a2613..4d500379d67ee 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-11 +date: 2024-09-12 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 3f317ea9addbf..17903cc37d8ab 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-11 +date: 2024-09-12 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 973dcdc341178..dcc93e243a6b4 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-11 +date: 2024-09-12 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 f5a84a34c94fc..f04edcb361ed9 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-11 +date: 2024-09-12 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 873a2efec19d0..19e3f6e39b027 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-11 +date: 2024-09-12 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 32b759b160104..6319eef059fe2 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-11 +date: 2024-09-12 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 ad71385cfad14..163c043551552 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-11 +date: 2024-09-12 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 d4c42e035aa65..94b3d198fcb31 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json index d66c6fa269059..762121594a804 100644 --- a/api_docs/kbn_esql_utils.devdocs.json +++ b/api_docs/kbn_esql_utils.devdocs.json @@ -1441,10 +1441,10 @@ }, { "parentPluginId": "@kbn/esql-utils", - "id": "def-common.retieveMetadataColumns", + "id": "def-common.retrieveMetadataColumns", "type": "Function", "tags": [], - "label": "retieveMetadataColumns", + "label": "retrieveMetadataColumns", "description": [], "signature": [ "(esql: string) => string[]" @@ -1455,7 +1455,7 @@ "children": [ { "parentPluginId": "@kbn/esql-utils", - "id": "def-common.retieveMetadataColumns.$1", + "id": "def-common.retrieveMetadataColumns.$1", "type": "string", "tags": [], "label": "esql", diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 9235e57ac58dc..8a19aaf50e67f 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-11 +date: 2024-09-12 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.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index 15ba63572e521..bee047bed7c0e 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -39,7 +39,7 @@ }, ", parameterDefinition: { name: string; type: ", "FunctionParameterType", - "; optional?: boolean | undefined; noNestingFunctions?: boolean | undefined; supportsWildcard?: boolean | undefined; constantOnly?: boolean | undefined; acceptedValues?: string[] | undefined; literalSuggestions?: string[] | undefined; }, references: ", + "; optional?: boolean | undefined; supportsWildcard?: boolean | undefined; constantOnly?: boolean | undefined; acceptedValues?: string[] | undefined; literalSuggestions?: string[] | undefined; }, references: ", "ReferenceMaps", ", parentCommand: string | undefined) => boolean | undefined" ], @@ -78,7 +78,7 @@ "signature": [ "{ name: string; type: ", "FunctionParameterType", - "; optional?: boolean | undefined; noNestingFunctions?: boolean | undefined; supportsWildcard?: boolean | undefined; constantOnly?: boolean | undefined; acceptedValues?: string[] | undefined; literalSuggestions?: string[] | undefined; }" + "; optional?: boolean | undefined; supportsWildcard?: boolean | undefined; constantOnly?: boolean | undefined; acceptedValues?: string[] | undefined; literalSuggestions?: string[] | undefined; }" ], "path": "packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts", "deprecated": false, @@ -3401,7 +3401,7 @@ "signature": [ "{ params: { name: string; type: ", "FunctionParameterType", - "; optional?: boolean | undefined; noNestingFunctions?: boolean | undefined; supportsWildcard?: boolean | undefined; constantOnly?: boolean | undefined; acceptedValues?: string[] | undefined; literalSuggestions?: string[] | undefined; }[]; minParams?: number | undefined; returnType: ", + "; optional?: boolean | undefined; supportsWildcard?: boolean | undefined; constantOnly?: boolean | undefined; acceptedValues?: string[] | undefined; literalSuggestions?: string[] | undefined; }[]; minParams?: number | undefined; returnType: ", "FunctionReturnType", "; }[]" ], diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 53b8ab6a3832c..6fc704788627c 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-11 +date: 2024-09-12 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 7663b09dc4c92..5927fd60186c2 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-11 +date: 2024-09-12 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 d0b12e11ee223..ecc68b836d7c3 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-11 +date: 2024-09-12 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 e43a65dfc0e54..bfd59a003354a 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-11 +date: 2024-09-12 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 9f1e371419bb6..61af095ef3204 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-11 +date: 2024-09-12 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 9d37e58b67e9a..9483897e3220e 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-11 +date: 2024-09-12 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 b6630e9b0808e..f2d5e559f7968 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-11 +date: 2024-09-12 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 96d3ef084ac0c..8a677a0ac15e4 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-11 +date: 2024-09-12 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 eef41fd9ea38d..23d86a192ca5d 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-11 +date: 2024-09-12 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 0e951af619be6..24e371825aca7 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-11 +date: 2024-09-12 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 ab901a2dccce6..1289b3681fc68 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-11 +date: 2024-09-12 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 2487a72cea7e0..15758953e17de 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-11 +date: 2024-09-12 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 e6b5a3b1f8539..9e831cd03d1e0 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-11 +date: 2024-09-12 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 da5cc88b2c90b..c5c334cb91ce7 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-11 +date: 2024-09-12 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 9339bd996a93d..9cc512188db15 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-11 +date: 2024-09-12 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 9f94765c920ac..cae7b44885dcc 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-11 +date: 2024-09-12 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 59e33dfaf3433..c51dcbb0eee64 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-11 +date: 2024-09-12 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 5e5de1534ca47..5534e54967c53 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-11 +date: 2024-09-12 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 1c1c66089188c..f8e9b0d27ae43 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-11 +date: 2024-09-12 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 860bb1429be8b..0a9adf4ed161f 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-11 +date: 2024-09-12 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 feabb8071438c..9fe08c87f6736 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-11 +date: 2024-09-12 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 bbccde50f61ce..b058b73eaaa95 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-11 +date: 2024-09-12 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 6d95d65e4de73..5c86f99486dad 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-11 +date: 2024-09-12 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 fd12670855f12..3a722927db133 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 97f999e06d3e3..726012399b44d 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-09-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index e0cc97c599200..99ddbd640c0b7 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-11 +date: 2024-09-12 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 6d2dcbc4394ca..76bee719d4cf9 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-11 +date: 2024-09-12 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 5aa7aa0f00f34..76895e247cb92 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-11 +date: 2024-09-12 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 e9444469952dd..67a6cc8c0b64e 100644 --- a/api_docs/kbn_investigation_shared.devdocs.json +++ b/api_docs/kbn_investigation_shared.devdocs.json @@ -90,7 +90,7 @@ "label": "CreateInvestigationParams", "description": [], "signature": [ - "{ id: string; title: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; }" + "{ id: string; title: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; tags: string[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -105,7 +105,7 @@ "label": "CreateInvestigationResponse", "description": [], "signature": [ - "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" + "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -180,7 +180,7 @@ "label": "FindInvestigationsResponse", "description": [], "signature": [ - "{ page: number; perPage: number; total: number; results: { id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }[]; }" + "{ page: number; perPage: number; total: number; results: { id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/find.ts", "deprecated": false, @@ -240,7 +240,7 @@ "label": "GetInvestigationResponse", "description": [], "signature": [ - "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" + "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/get.ts", "deprecated": false, @@ -292,6 +292,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.InvestigationResponse", + "type": "Type", + "tags": [], + "label": "InvestigationResponse", + "description": [], + "signature": [ + "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/investigation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/investigation-shared", "id": "def-common.Item", @@ -375,7 +390,7 @@ "label": "UpdateInvestigationParams", "description": [], "signature": [ - "{ title?: string | undefined; status?: \"closed\" | \"ongoing\" | undefined; params?: { timeRange: { from: number; to: number; }; } | undefined; }" + "{ title?: string | undefined; status?: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\" | undefined; params?: { timeRange: { from: number; to: number; }; } | undefined; tags?: string[] | undefined; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -390,7 +405,7 @@ "label": "UpdateInvestigationResponse", "description": [], "signature": [ - "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"closed\" | \"ongoing\"; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" + "{ id: string; title: string; createdAt: number; createdBy: string; params: { timeRange: { from: number; to: number; }; }; origin: { type: \"alert\"; id: string; } | { type: \"blank\"; }; status: \"active\" | \"triage\" | \"mitigated\" | \"resolved\" | \"cancelled\"; tags: string[]; notes: { id: string; content: string; createdAt: number; createdBy: string; }[]; items: ({ id: string; createdAt: number; createdBy: string; } & { title: string; type: string; params: { [x: string]: any; }; })[]; }" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -588,7 +603,11 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"blank\">; }>]>; }>; }>" + "<\"blank\">; }>]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; }>; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/create.ts", "deprecated": false, @@ -636,9 +655,19 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", "LiteralC", - "<\"closed\">]>; notes: ", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", + "LiteralC", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", "ArrayC", "<", "TypeC", @@ -820,9 +849,19 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", "LiteralC", - "<\"closed\">]>; notes: ", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", "ArrayC", "<", "TypeC", @@ -1030,9 +1069,19 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", + "LiteralC", + "<\"resolved\">, ", "LiteralC", - "<\"closed\">]>; notes: ", + "<\"cancelled\">]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", "ArrayC", "<", "TypeC", @@ -1195,6 +1244,102 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.investigationResponseSchema", + "type": "Object", + "tags": [], + "label": "investigationResponseSchema", + "description": [], + "signature": [ + "TypeC", + "<{ id: ", + "StringC", + "; title: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; params: ", + "TypeC", + "<{ timeRange: ", + "TypeC", + "<{ from: ", + "NumberC", + "; to: ", + "NumberC", + "; }>; }>; origin: ", + "UnionC", + "<[", + "TypeC", + "<{ type: ", + "LiteralC", + "<\"alert\">; id: ", + "StringC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<\"blank\">; }>]>; status: ", + "UnionC", + "<[", + "LiteralC", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", + "LiteralC", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "TypeC", + "<{ id: ", + "StringC", + "; content: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; }>>; items: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ id: ", + "StringC", + "; createdAt: ", + "NumberC", + "; createdBy: ", + "StringC", + "; }>, ", + "TypeC", + "<{ title: ", + "StringC", + "; type: ", + "StringC", + "; params: ", + "RecordC", + "<", + "StringC", + ", ", + "AnyC", + ">; }>]>>; }>" + ], + "path": "packages/kbn-investigation-shared/src/rest_specs/investigation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/investigation-shared", "id": "def-common.investigationSchema", @@ -1236,9 +1381,19 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", "LiteralC", - "<\"closed\">]>; notes: ", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", "ArrayC", "<", "TypeC", @@ -1307,6 +1462,32 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/investigation-shared", + "id": "def-common.statusSchema", + "type": "Object", + "tags": [], + "label": "statusSchema", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", + "LiteralC", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>" + ], + "path": "packages/kbn-investigation-shared/src/schema/investigation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/investigation-shared", "id": "def-common.updateInvestigationItemParamsSchema", @@ -1448,9 +1629,15 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", "LiteralC", - "<\"closed\">]>; params: ", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; params: ", "TypeC", "<{ timeRange: ", "TypeC", @@ -1458,7 +1645,11 @@ "NumberC", "; to: ", "NumberC", - "; }>; }>; }>; }>" + "; }>; }>; tags: ", + "ArrayC", + "<", + "StringC", + ">; }>; }>" ], "path": "packages/kbn-investigation-shared/src/rest_specs/update.ts", "deprecated": false, @@ -1506,9 +1697,19 @@ "UnionC", "<[", "LiteralC", - "<\"ongoing\">, ", + "<\"triage\">, ", + "LiteralC", + "<\"active\">, ", + "LiteralC", + "<\"mitigated\">, ", "LiteralC", - "<\"closed\">]>; notes: ", + "<\"resolved\">, ", + "LiteralC", + "<\"cancelled\">]>; tags: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", "ArrayC", "<", "TypeC", diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index f96e289249798..4a44634edaa53 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 56 | 0 | 56 | 0 | +| 59 | 0 | 59 | 0 | ## Common diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index ae081fd14b869..8649b473e5ad6 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-11 +date: 2024-09-12 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 038dd7142d69b..4c76421a21a09 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-11 +date: 2024-09-12 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 27773267cc643..b57b7151e36b6 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-11 +date: 2024-09-12 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 0c69697afa2b5..8c2ed6cae163d 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-11 +date: 2024-09-12 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 e8fa5427988b2..2ad52dcda9e05 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-11 +date: 2024-09-12 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 f75d8390d940c..9a19501822b36 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-11 +date: 2024-09-12 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 bb0d2053f97c7..3c874afeeb740 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 1850c89a59daf..093210d3ebebb 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-09-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 78e5d00152573..dc5ebb989d714 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-11 +date: 2024-09-12 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 2cf2390b71b4d..71698be9ac2b1 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-11 +date: 2024-09-12 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 4f8b64560b5f0..0cb5854bcd708 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-11 +date: 2024-09-12 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 2aa22c95fab44..45ad903c8b9cb 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-11 +date: 2024-09-12 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 39ae47cb4393c..e62c3151a2ef1 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-11 +date: 2024-09-12 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 0439dce056875..9a1a7d8c7e593 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-11 +date: 2024-09-12 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 2964cc2236af2..345a7442e114b 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-11 +date: 2024-09-12 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 22077564eb635..0d1033c4138df 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-11 +date: 2024-09-12 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 a9b233746f131..d8f136554b2c6 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-11 +date: 2024-09-12 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 d6ba4384023e6..3ed47da5252ef 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-11 +date: 2024-09-12 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 22d995149baf7..b929c217c2004 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-11 +date: 2024-09-12 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 dda0eec1760d8..7bf8eac3ba242 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-11 +date: 2024-09-12 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 2b68e8edd9b31..4dd3407c0ce62 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-11 +date: 2024-09-12 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 ae6d387a4e6b9..cdacdfcc9c851 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-11 +date: 2024-09-12 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 6f347712c52ea..1e89e5062d84e 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-11 +date: 2024-09-12 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 af43360b3beb4..fe00b8e69d266 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-11 +date: 2024-09-12 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 3f12e45898be5..f0bf7b1aa8e73 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-11 +date: 2024-09-12 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 c41b26dfcf725..0ade647e477d6 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-11 +date: 2024-09-12 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 7a4762a80c458..2970a2be80de1 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-11 +date: 2024-09-12 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 709a87329a8ee..d9a2f37e4a775 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-11 +date: 2024-09-12 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 f677bbbb79129..ba9a09c5ccefb 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-11 +date: 2024-09-12 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 bc14dbbb0c9d1..1de14e278b1b3 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-11 +date: 2024-09-12 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 e57aa0c4230e6..90f8f10556587 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-11 +date: 2024-09-12 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 fef57aae5a7c9..494097051844b 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-11 +date: 2024-09-12 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 d23fd567ead92..c176726f765be 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-11 +date: 2024-09-12 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 79417b27985cf..3424781a53a16 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-11 +date: 2024-09-12 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 b73235ed97274..4c2f8464c3766 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-11 +date: 2024-09-12 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 a306d295a0d00..5c9e331e39856 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-11 +date: 2024-09-12 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 613f529b12d9f..79f296e32a7a0 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-11 +date: 2024-09-12 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 b70e3edc81afa..dcd7aecc4a030 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 1d6f45efe239f..924948fe85092 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-11 +date: 2024-09-12 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 3528210d2495f..1f038f017c43c 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-11 +date: 2024-09-12 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 cbfc23205a869..1fa52f47b1a4e 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-11 +date: 2024-09-12 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 2ae5dbbe63de8..e6890d74ada79 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-11 +date: 2024-09-12 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 ea816b8fc1872..f0a21f361e3d6 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-11 +date: 2024-09-12 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 4a3d9c4bb6445..b110330976534 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-11 +date: 2024-09-12 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 0e75c085f1425..8f05ae2918623 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 71f72b07dcd22..d868da4b3f3ab 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-11 +date: 2024-09-12 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 45f6603a41bef..1b14dfdf8c8d0 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-11 +date: 2024-09-12 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 fce7edf186061..b282f05c2c018 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-11 +date: 2024-09-12 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 b0846ca2cf432..81ffb5854f756 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-11 +date: 2024-09-12 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 cb9258ef222bb..af8cea4284167 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-11 +date: 2024-09-12 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 c244e94a619e3..064ecda5c689d 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-11 +date: 2024-09-12 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 98ea0204ca7c0..2e4874453dca1 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-11 +date: 2024-09-12 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 29dc2c3d6c536..e59349e2e6b8b 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-11 +date: 2024-09-12 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 dba766d4690c5..cf7be5278d822 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index a7f478d07ba1b..ec7612d35215b 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-11 +date: 2024-09-12 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 ddd1de6314117..747ac180d36ac 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-11 +date: 2024-09-12 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 46035ffd315f5..9327171468bf2 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-11 +date: 2024-09-12 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 823dd351fa205..5b0a240dd4b26 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-11 +date: 2024-09-12 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 2ec12f7f34f21..01d95c102f1df 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-11 +date: 2024-09-12 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 f9ba239c2cba6..46b4b819d2a28 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-11 +date: 2024-09-12 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 e3808a9f149ff..d1183d99b391f 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-11 +date: 2024-09-12 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 3b682b017ab6d..f3934cc6bc719 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-11 +date: 2024-09-12 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 015a14e231fe1..e1a0f6f51b229 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-11 +date: 2024-09-12 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 0fb1cde3bd873..ab455f5b1d9a1 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-11 +date: 2024-09-12 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 e1b97b070e053..b57615cf47f02 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-11 +date: 2024-09-12 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 8ce2fdecda378..db8d39a184be5 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-11 +date: 2024-09-12 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 691d987cadd0a..a852cd1fcbcde 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-11 +date: 2024-09-12 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 282a9de6f268d..890b76781f8cc 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-11 +date: 2024-09-12 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 72bccadff94a0..dbb203f815070 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-11 +date: 2024-09-12 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 5f4efe9277750..c54c2e8ebc27b 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-11 +date: 2024-09-12 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 911bb33a53568..c09f7a19d1ec0 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-11 +date: 2024-09-12 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 eeca08987c373..e9cecd61c6b4f 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-11 +date: 2024-09-12 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 96ef346167f9e..4078334da7ecc 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-11 +date: 2024-09-12 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 58f78ea73efb1..cb28e1bcf81b1 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-11 +date: 2024-09-12 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 a2923217c2d74..317ac77c681b4 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-11 +date: 2024-09-12 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 e985a7545c790..9dae66767dc87 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-11 +date: 2024-09-12 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 48dc483b1704e..9a704c1a4fcb4 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-11 +date: 2024-09-12 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 a791bd8b2eb89..c0a0fbc6a815e 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-11 +date: 2024-09-12 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 f0e97adb1db0a..89173edf598f6 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-11 +date: 2024-09-12 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 b5be6c6439abe..68ffaf26ea2f8 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-11 +date: 2024-09-12 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 1956d8a324342..3d384d2041e2c 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-11 +date: 2024-09-12 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 491afe6174136..1d169b61a0220 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-11 +date: 2024-09-12 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 a1d41b00b2570..57d366f649bdb 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-11 +date: 2024-09-12 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 3c4117a306bcf..c211556ad89f3 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-11 +date: 2024-09-12 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 552afa33c3f79..537faf09f6b29 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-11 +date: 2024-09-12 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 29b68b3130743..4e7f2a36a3926 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-11 +date: 2024-09-12 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 13281b90b02fe..2e27ac4e364e8 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-11 +date: 2024-09-12 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 ef6c27bab755e..87b827605252d 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-11 +date: 2024-09-12 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 0f1548b13a686..f9b58b3533f5b 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-11 +date: 2024-09-12 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 18ed2ec867542..1d6208a48f8d2 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-11 +date: 2024-09-12 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 adbb03892ab9d..5994767baf49a 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-11 +date: 2024-09-12 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 dc7e863c32b83..532f6241be691 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-11 +date: 2024-09-12 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 70119876e3f96..7ebae6958568c 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-11 +date: 2024-09-12 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 44a92bfec8ea6..3922bf00f4dc7 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-11 +date: 2024-09-12 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 e12b3126d4cb6..db3861381cabe 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-11 +date: 2024-09-12 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 ae2d17b1f3c42..77603c5203ac7 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-11 +date: 2024-09-12 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 d381b955bd7d8..05970802c8d0c 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-11 +date: 2024-09-12 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 bc5f5bfcb2076..5de2a7d450f68 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-11 +date: 2024-09-12 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 db924d7c23b8b..fd8118a0121e2 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-11 +date: 2024-09-12 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 d6e183d318411..db00c4a450202 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-11 +date: 2024-09-12 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 7f5cd761aa23e..5aa6ffc5091c9 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-11 +date: 2024-09-12 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 6da263108cb67..a4150f190c2f6 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-11 +date: 2024-09-12 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 1649e19e0f9e2..903160a6cb48e 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-11 +date: 2024-09-12 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 7bc8133a3692d..47a6d0249bb1e 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-11 +date: 2024-09-12 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 fc9f07b486cef..6bc39846dee52 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-11 +date: 2024-09-12 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 a1234177ed7fb..712d15137e40f 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-11 +date: 2024-09-12 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 7db91bf4aa269..c45ec62a7e65d 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-11 +date: 2024-09-12 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 9b9132ca53dc1..a5b66ff01202d 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-11 +date: 2024-09-12 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 a432e4ee0a5a4..ddabd62d23b8b 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-11 +date: 2024-09-12 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 0a7dc3a7fcb34..e33abd89c4225 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-11 +date: 2024-09-12 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 fce8cb9728aee..4b1e72f94de0a 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-11 +date: 2024-09-12 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 894ccf68c036b..3c1dfe6784b70 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-11 +date: 2024-09-12 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 6496bb726f6ed..c953d71db6903 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-11 +date: 2024-09-12 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 0bd3342251fc2..8f07257e636fd 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-11 +date: 2024-09-12 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 0d78251da8635..2831c1c9b15d6 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-11 +date: 2024-09-12 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 05689d95c66f9..1a46aa53f9e38 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-11 +date: 2024-09-12 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 59631ee8eb734..dbc390139996c 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-11 +date: 2024-09-12 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 a09396c23b6d9..cea86de591268 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-11 +date: 2024-09-12 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 21c53ff7e5db7..ce1183050458f 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-11 +date: 2024-09-12 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 90a1de0b828df..f24da174b8473 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-11 +date: 2024-09-12 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 b9e1931a3b7de..5c6dfcdcb8d7e 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-11 +date: 2024-09-12 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 d8cb7a016b322..e1a046f1bd179 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-11 +date: 2024-09-12 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 3bb0976421b6e..8cf0290fbd3c5 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-11 +date: 2024-09-12 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 d307440e04e0e..dd88bcc1c105f 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-11 +date: 2024-09-12 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 9bc2e092f4a59..6880ee5389aec 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-11 +date: 2024-09-12 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 489cfd1fa02b9..aca397afe03bb 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-11 +date: 2024-09-12 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 080a524bbc9dd..fedfad0619c0a 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-11 +date: 2024-09-12 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 2e471eac37a7e..bafd6a9288004 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-11 +date: 2024-09-12 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 c4f5bd19ab9c6..7bfa4702ba6e2 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-11 +date: 2024-09-12 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 b21fa523bf8e7..85b3a97ed2a15 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-11 +date: 2024-09-12 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 a9c515db7212f..aa29604f5a142 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-11 +date: 2024-09-12 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 8464aff0fd63f..72f25220f6664 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-11 +date: 2024-09-12 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 28c96dfad9133..4d75bdd4447f2 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-11 +date: 2024-09-12 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 aefe5052bcb99..a4938a3a10bef 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-11 +date: 2024-09-12 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 3f719bce0c4c5..f991b8b509b35 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-11 +date: 2024-09-12 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 1ecdfe7612534..3713686ffd4f4 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-11 +date: 2024-09-12 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 bf37c598ad9dd..a6a963e817230 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-11 +date: 2024-09-12 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 9581088b7a95a..11b109ec18b27 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-11 +date: 2024-09-12 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 54744d48c4535..ce70b5d7cd08c 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-11 +date: 2024-09-12 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 8ef4342a6228a..4c93c1796ad66 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-11 +date: 2024-09-12 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 45393712d7f94..9eafd1ee62c8c 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-11 +date: 2024-09-12 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 fcb4c917e7731..ed7bac8bb58d6 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-11 +date: 2024-09-12 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.devdocs.json b/api_docs/kbn_securitysolution_list_constants.devdocs.json index f4fe485c20c72..e1069bb51c152 100644 --- a/api_docs/kbn_securitysolution_list_constants.devdocs.json +++ b/api_docs/kbn_securitysolution_list_constants.devdocs.json @@ -103,14 +103,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/blocklist_validator.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/blocklist_validator.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts" diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index b742c65091e90..e45f17b96bb09 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-11 +date: 2024-09-12 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 0f10f8a5586b4..9603cb87bf9ec 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-11 +date: 2024-09-12 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 8786185fc46be..a81b1e2bcaec9 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-11 +date: 2024-09-12 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 896a62b87bf93..5f35000109001 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-11 +date: 2024-09-12 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 5e84835ae87f9..aa2ef54ea08af 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-11 +date: 2024-09-12 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 deee7dea73f95..9a45bfcd88d1f 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-11 +date: 2024-09-12 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 b9cabedba5191..16dd29c2b9e57 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-11 +date: 2024-09-12 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 31332cb549070..4883ce98760b0 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-11 +date: 2024-09-12 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 5c8fd9630cc2e..417a42afa47a4 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-11 +date: 2024-09-12 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 2fa23575ff8bc..e209836e6169e 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-11 +date: 2024-09-12 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 7af875ae2299e..40b3ecaaca8f6 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-11 +date: 2024-09-12 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 e9d602c995112..aae486f9d8f31 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-11 +date: 2024-09-12 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 41c0b61e7e03d..82fa54d5728e5 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-11 +date: 2024-09-12 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 611ec5c5d2019..09886f41af3df 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-11 +date: 2024-09-12 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 a3bb80aed4b99..1a1f377723b44 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-11 +date: 2024-09-12 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 417952b7d798c..36a76df293f72 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-11 +date: 2024-09-12 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 2806d928ca5b7..b2544eefc5980 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-11 +date: 2024-09-12 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 d50b87a0b4e34..f991c5e446a05 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-11 +date: 2024-09-12 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 63cf1e71fe1ef..5d0a53c217777 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-11 +date: 2024-09-12 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 dd54f6a54f0fb..9d1ecf3950a8e 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-11 +date: 2024-09-12 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 8ce28c355c15f..1fe749a3236ba 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-11 +date: 2024-09-12 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 777c0a36c1d5c..fc29a015ff046 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-11 +date: 2024-09-12 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 650761322474f..35d69080ebefe 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-11 +date: 2024-09-12 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 c328873757c0d..34ba65ee31d91 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-11 +date: 2024-09-12 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 a4428537457bd..d08f3ce8e9db6 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-11 +date: 2024-09-12 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 bc04f6bfd0674..de1a8e2e52e30 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-11 +date: 2024-09-12 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 51bc5ac01916c..686b02b500488 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-11 +date: 2024-09-12 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 c7ad3e3fc656e..f0f58029b8a95 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-11 +date: 2024-09-12 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 e159ec69ec07b..668f7cd410591 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-11 +date: 2024-09-12 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 4ad1db3ca3ff4..3944b79d92945 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-11 +date: 2024-09-12 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 184ffd0a1a14e..b1432aa184e45 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-11 +date: 2024-09-12 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 5fb61c3694b90..97f839b7b9597 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-11 +date: 2024-09-12 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 af59e7fa57e51..dfeb9a0468271 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-11 +date: 2024-09-12 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 ff3d76a21c2cf..b02a276233da4 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-11 +date: 2024-09-12 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 616da46698b8c..3851137a644cd 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-11 +date: 2024-09-12 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 d845e8a56aaf0..f6721c08096aa 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-11 +date: 2024-09-12 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 e8239908e460a..09a7323ab12ad 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-11 +date: 2024-09-12 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 cdb2de320bb1a..748f6b6e5d5d3 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-11 +date: 2024-09-12 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 6e38f236b6811..79ba2d4cfba75 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-11 +date: 2024-09-12 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 0fb26d5008678..c1626acde5b2b 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-11 +date: 2024-09-12 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 d431956f6a96d..90d73fdf8dce6 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-11 +date: 2024-09-12 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 3a33ec0e69e17..eb2ef52910afc 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-11 +date: 2024-09-12 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 7ade0c73fbeb6..24a95a892240f 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-11 +date: 2024-09-12 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 13d73882e7abe..406b2d539ddea 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-11 +date: 2024-09-12 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 8cb3925a8a8c0..c39dc8e7502ba 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-11 +date: 2024-09-12 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 f7fd2d502e3db..6e9a944c2c4ff 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-11 +date: 2024-09-12 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 ca28e0353eb3c..7cc5ae7dbc021 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-11 +date: 2024-09-12 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 5427894535a89..171e5d3b5b9dc 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-11 +date: 2024-09-12 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 b421e8ba965d5..022180e735f23 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-11 +date: 2024-09-12 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 81908e7da178d..d48c8381d0f24 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-11 +date: 2024-09-12 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 24d46844fc74c..c782fadfa6743 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-11 +date: 2024-09-12 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 86e817bbfbe56..0f0ca084da0fd 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-11 +date: 2024-09-12 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 3a8a8bc414685..1b61ac3895dc1 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-11 +date: 2024-09-12 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 5bc9c91fde8a3..0590d5a9521b4 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-11 +date: 2024-09-12 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 13732826c2690..7486622be57ed 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-11 +date: 2024-09-12 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 05799817a7d6e..436735729616b 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-11 +date: 2024-09-12 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 7e436f97fb2d2..a8e6d7838e65d 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-11 +date: 2024-09-12 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 6241acafca71f..12405690f642f 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-11 +date: 2024-09-12 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 f7a6b00c04fd5..92e69328979f6 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-11 +date: 2024-09-12 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 9e76ad93a1248..cb808b1387280 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 8f7d523e36139..6de5a059fb6b7 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-11 +date: 2024-09-12 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 5fcdcb4b414db..0fa13655914f5 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-11 +date: 2024-09-12 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 6cf7e3b53ec33..b417da91fefe7 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-11 +date: 2024-09-12 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 899346c757531..149b884384a51 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-11 +date: 2024-09-12 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 20b5b596a9fca..ae62651691ff5 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-11 +date: 2024-09-12 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 33aad56446b3b..55db2ff0778ce 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-11 +date: 2024-09-12 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 34e1ba73dabaa..5265d324fd2b0 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-11 +date: 2024-09-12 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 71427d385baa4..c58fe56b628f3 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-11 +date: 2024-09-12 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 d526d5d11962e..7b9b2a9f5322a 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-11 +date: 2024-09-12 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 18d316ac27571..6b56ef97a113e 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 0f4de353c7a49..f46641851828c 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-09-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index d26191ebd6af4..afdc8d5317162 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-11 +date: 2024-09-12 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 0b97495313ad2..522cb19ac69ba 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-11 +date: 2024-09-12 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 aa913ce110823..374db8f341624 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-11 +date: 2024-09-12 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 7d46d12a4a75e..f7b1b31057678 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-11 +date: 2024-09-12 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 4d83b67ec28e6..7628ac237c90d 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-11 +date: 2024-09-12 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 200f93a00b2f1..c8ba81976ca63 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-11 +date: 2024-09-12 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 c621110228276..cc2989fde1c08 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-11 +date: 2024-09-12 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 e47b5375287d0..233357c689a4c 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-11 +date: 2024-09-12 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 430f34f7c1393..2ae9c74102ecf 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-11 +date: 2024-09-12 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 6ed6026730b6d..bf0686fb24c6c 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -638,279 +638,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn", - "type": "Interface", - "tags": [], - "label": "RowControlColumn", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn.headerAriaLabel", - "type": "string", - "tags": [], - "label": "headerAriaLabel", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn.headerCellRender", - "type": "CompoundType", - "tags": [], - "label": "headerCellRender", - "description": [], - "signature": [ - "React.ComponentType<{}> | undefined" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn.renderControl", - "type": "Function", - "tags": [], - "label": "renderControl", - "description": [], - "signature": [ - "(Control: ", - { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlComponent", - "text": "RowControlComponent" - }, - ", props: ", - { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlRowProps", - "text": "RowControlRowProps" - }, - ") => React.ReactElement>" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn.renderControl.$1", - "type": "Function", - "tags": [], - "label": "Control", - "description": [], - "signature": [ - { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlComponent", - "text": "RowControlComponent" - } - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlColumn.renderControl.$2", - "type": "Object", - "tags": [], - "label": "props", - "description": [], - "signature": [ - { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlRowProps", - "text": "RowControlRowProps" - } - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps", - "type": "Interface", - "tags": [], - "label": "RowControlProps", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps.datatestsubj", - "type": "string", - "tags": [], - "label": "'data-test-subj'", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps.color", - "type": "CompoundType", - "tags": [], - "label": "color", - "description": [], - "signature": [ - "\"text\" | \"warning\" | \"success\" | \"primary\" | \"accent\" | \"danger\" | undefined" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps.disabled", - "type": "CompoundType", - "tags": [], - "label": "disabled", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps.iconType", - "type": "CompoundType", - "tags": [], - "label": "iconType", - "description": [], - "signature": [ - "string | React.ComponentType<{}>" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlProps.onClick", - "type": "Function", - "tags": [], - "label": "onClick", - "description": [], - "signature": [ - "((props: ", - { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlRowProps", - "text": "RowControlRowProps" - }, - ") => void) | undefined" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlRowProps", - "type": "Interface", - "tags": [], - "label": "RowControlRowProps", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlRowProps.rowIndex", - "type": "number", - "tags": [], - "label": "rowIndex", - "description": [], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlRowProps.record", - "type": "Object", - "tags": [], - "label": "record", - "description": [], - "signature": [ - { - "pluginId": "@kbn/discover-utils", - "scope": "common", - "docId": "kibKbnDiscoverUtilsPluginApi", - "section": "def-common.DataTableRecord", - "text": "DataTableRecord" - } - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-public.RowHeightSettingsProps", @@ -1143,10 +870,10 @@ ], "signature": [ { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.DataTableColumnsMeta", + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableColumnsMeta", "text": "DataTableColumnsMeta" }, " | undefined" @@ -2085,10 +1812,10 @@ }, "[], displayedColumns: string[], columnsMeta?: ", { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.DataTableColumnsMeta", + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableColumnsMeta", "text": "DataTableColumnsMeta" }, " | undefined) => JSX.Element | undefined) | undefined" @@ -2164,10 +1891,10 @@ "description": [], "signature": [ { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.DataTableColumnsMeta", + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableColumnsMeta", "text": "DataTableColumnsMeta" }, " | undefined" @@ -2267,10 +1994,10 @@ ], "signature": [ { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlColumn", + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.RowControlColumn", "text": "RowControlColumn" }, "[] | undefined" @@ -3188,7 +2915,7 @@ }, "; esType?: string | undefined; }; }" ], - "path": "packages/kbn-unified-data-table/src/types.ts", + "path": "packages/kbn-discover-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -3208,60 +2935,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlComponent", - "type": "Type", - "tags": [], - "label": "RowControlComponent", - "description": [], - "signature": [ - "React.FunctionComponent<", - { - "pluginId": "@kbn/unified-data-table", - "scope": "public", - "docId": "kibKbnUnifiedDataTablePluginApi", - "section": "def-public.RowControlProps", - "text": "RowControlProps" - }, - ">" - ], - "path": "packages/kbn-unified-data-table/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlComponent.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "P & { children?: React.ReactNode; }" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-public.RowControlComponent.$2", - "type": "Any", - "tags": [], - "label": "context", - "description": [], - "signature": [ - "any" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-public.SELECT_ROW", diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index b6578e62569fc..0282cb3699e0a 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-11 +date: 2024-09-12 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 | |-------------------|-----------|------------------------|-----------------| -| 185 | 0 | 108 | 2 | +| 165 | 0 | 90 | 2 | ## Client diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index da49379ca0be9..bcb0ae9f0be86 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-11 +date: 2024-09-12 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 37557e68222b2..f3a042d298466 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-11 +date: 2024-09-12 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 618116e5c0d10..3a19ac34ce723 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-11 +date: 2024-09-12 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 a75e7efe0d4f3..adc7104e069dd 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-11 +date: 2024-09-12 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 44a8c50274697..bba318204f197 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-11 +date: 2024-09-12 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 3bd0f0deba37d..a33771faf2ddd 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-11 +date: 2024-09-12 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 30d39c49d5a25..90a800dc1dc7b 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-11 +date: 2024-09-12 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 5165fafc988a4..2d39df34efd67 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-11 +date: 2024-09-12 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 a4a2967db31ef..4f112bfef1619 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-11 +date: 2024-09-12 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 4943db59bc738..c2adbb1c120fb 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-11 +date: 2024-09-12 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 76718e830f6c1..611a73dadd2aa 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-11 +date: 2024-09-12 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 5d6c443d1e719..72fade11e0007 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-11 +date: 2024-09-12 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 4a8139866dd9a..7572c6703cd07 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-11 +date: 2024-09-12 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 dc16e9b75a4b1..409e5a534db4f 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-11 +date: 2024-09-12 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 6330ed61cb349..eb4370017a066 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-11 +date: 2024-09-12 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 a310296f28b33..9decf727da62f 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-11 +date: 2024-09-12 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 4cf448ef4bc6e..3c4b66e6c1ae5 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-11 +date: 2024-09-12 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 195b25bbfcca1..7e866d40f21e0 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-11 +date: 2024-09-12 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 c6d748369529d..6c97bbacd633e 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-11 +date: 2024-09-12 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 3dde96349f44b..fe6fd0381d650 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-11 +date: 2024-09-12 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 977f5c45e847b..e3be629a22288 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-11 +date: 2024-09-12 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 e2b6eae045304..13a447bd406ca 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-11 +date: 2024-09-12 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 221e8fc450bdb..669abae624030 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-11 +date: 2024-09-12 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 b3cee3e93a749..73f8ea16e50e6 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-11 +date: 2024-09-12 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 82fd0431114ac..5fb65d799cf99 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-11 +date: 2024-09-12 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 bd16ead1ae389..b1aab67d92064 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-11 +date: 2024-09-12 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 a0fd0267f436d..7b79a902413a3 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-11 +date: 2024-09-12 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 52f533bbfe79f..c8b8ccc43eded 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-11 +date: 2024-09-12 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 99a1280dc24e4..bc81438ea7e47 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-11 +date: 2024-09-12 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 f821801774168..027e9f7fe776e 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-11 +date: 2024-09-12 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 960751376af7c..e2d844a09bdef 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-11 +date: 2024-09-12 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 6ade551ac4d55..401e4d9c01a16 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-11 +date: 2024-09-12 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 589f9d22b722b..67f2818ca53f9 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-11 +date: 2024-09-12 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 5bb2841050b9a..efa0ba8a13fc9 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-11 +date: 2024-09-12 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 a5bf1bab65b09..67186612c4654 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-11 +date: 2024-09-12 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 ae51ca5280ca5..d79630bb0bc06 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-11 +date: 2024-09-12 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 0b576e0e5b4c1..ba75cc4885903 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-11 +date: 2024-09-12 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 a881bda121f87..f38b8240a584b 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-11 +date: 2024-09-12 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 dc4c9dc75313c..3c9743d308c20 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-11 +date: 2024-09-12 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 cc36a9e0e7bbf..8f9d30b33fdf2 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-11 +date: 2024-09-12 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 4a3d1ad08b86d..dfdc54ebbc7f8 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a19da5dc686ba..58413d2c993ac 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-11 +date: 2024-09-12 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 8ef621f7a6043..eef6f5e2c760f 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-11 +date: 2024-09-12 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 c20a710e83e08..e6c72b2560049 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-11 +date: 2024-09-12 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 c5acbb6094b50..ee9ffadbe6f04 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-11 +date: 2024-09-12 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 f3e55d70ba077..9614fb7c0f111 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 43d40f724c334..325efa79d5b09 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 98421078aa309..f4090f9454693 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-11 +date: 2024-09-12 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 78754d1bdca27..cc3b4cf261d13 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-11 +date: 2024-09-12 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 3b5e6d607bd88..2f197f4d93ada 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53013 | 245 | 39835 | 1965 | +| 53034 | 245 | 39851 | 1966 | ## Plugin Directory @@ -493,14 +493,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 102 | 0 | 86 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 15 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 38 | 2 | 33 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 136 | 0 | 109 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 172 | 0 | 138 | 1 | | | [@elastic/docs](https://github.com/orgs/elastic/teams/docs) | - | 78 | 0 | 78 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 5 | 0 | 5 | 1 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 57 | 0 | 30 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 28 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 16 | 0 | 8 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 156 | 0 | 130 | 9 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 158 | 0 | 132 | 10 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 390 | 0 | 363 | 0 | | | [@elastic/obs-entities](https://github.com/orgs/elastic/teams/obs-entities) | - | 41 | 0 | 41 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 55 | 0 | 40 | 7 | @@ -539,7 +539,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 56 | 0 | 56 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 59 | 0 | 59 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 60 | 0 | 60 | 4 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 44 | 0 | 44 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 13 | 0 | @@ -762,7 +762,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 | 185 | 0 | 108 | 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 | 165 | 0 | 90 | 2 | | | [@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 a75ecc24ec756..979b2f5236904 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-11 +date: 2024-09-12 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 65223ee0973d9..d04f1f0ca2292 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-11 +date: 2024-09-12 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 a5c3f9d17fd42..3a3bb4d3875fc 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-11 +date: 2024-09-12 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 0357563af7f5e..50b4fd4aa8da7 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-11 +date: 2024-09-12 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 060d02308196b..77ba5f4a5d9cc 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-11 +date: 2024-09-12 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 acc336379cd73..ce1f08e87801d 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-11 +date: 2024-09-12 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 d6cde975bc87b..abc4bdaa7cea2 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-11 +date: 2024-09-12 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 8b6634ccfbfdd..df817b699a82b 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-11 +date: 2024-09-12 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 099da73adad76..056ac9ca2e194 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-11 +date: 2024-09-12 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 4a87b09502f6c..5ac9fa4815e10 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-11 +date: 2024-09-12 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 60707427cf376..e6406e1cbf060 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-11 +date: 2024-09-12 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 b39a5d35540b1..dacfd6117e7c8 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-11 +date: 2024-09-12 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 b0e13874c1b2d..67d7bac8ccb4b 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-11 +date: 2024-09-12 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 6cd20526b61af..6c57cd3516bde 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-11 +date: 2024-09-12 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 58ab596206bb8..fbbf12ab3f0f7 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-11 +date: 2024-09-12 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 5d03d531f5e4e..24966afbc1bdc 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-11 +date: 2024-09-12 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 df42f01f8175c..e61d9bdb7add9 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-11 +date: 2024-09-12 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 038258398cf5a..fc95933a37da4 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-11 +date: 2024-09-12 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 68b88ec6f2e99..11d3278f9ac66 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-11 +date: 2024-09-12 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 292f35fb2895a..b7fa958a2b335 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-11 +date: 2024-09-12 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 01d372947a819..feb738da1bcaf 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-11 +date: 2024-09-12 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 f6adf0f8dd5a3..4cd93b4cfa1a2 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-11 +date: 2024-09-12 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 ea8442a4bd730..4d72b57968549 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-11 +date: 2024-09-12 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 a064aad4c6002..20ef83e34fb45 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-11 +date: 2024-09-12 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 0c9e86a95d9ae..74bc73869d614 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-11 +date: 2024-09-12 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 f7e4a4445e58e..9a79b9eff24f7 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-11 +date: 2024-09-12 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 d76c33c121667..940a09b78b33c 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-11 +date: 2024-09-12 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 fcdb4b9e154fa..e0eefa0249f2c 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-11 +date: 2024-09-12 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 4d188e1af276f..21dea7c62efed 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-11 +date: 2024-09-12 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 3891c93146e08..4a0f815ea2a09 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-11 +date: 2024-09-12 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 c19ec032fc1e2..4ef4e9d54821b 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-11 +date: 2024-09-12 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 b9865907cf9cf..d72c283a103cc 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-11 +date: 2024-09-12 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 7f0bdcc780338..2fd739072ba03 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-11 +date: 2024-09-12 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 65a249e219ba8..9548dc61a0eca 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-11 +date: 2024-09-12 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 00ed75a24caad..882360bad1660 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-11 +date: 2024-09-12 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 6d55bbfd83848..4ac993cafb897 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-11 +date: 2024-09-12 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 1e0c99affa251..28a13999a0a5c 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-11 +date: 2024-09-12 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 b86e17f4f1540..105945cc478ff 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-11 +date: 2024-09-12 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 8926aebc6e3bf..28e826844e697 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-11 +date: 2024-09-12 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 bc0a5d326a3d6..4a5d405bc5a15 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-11 +date: 2024-09-12 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 f93bf8f51822e..5681d2361bbf7 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-11 +date: 2024-09-12 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 51c205d192a0e..6f09f281c1ec8 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-11 +date: 2024-09-12 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 151b507300bfa..027c92743f6e5 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-11 +date: 2024-09-12 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 8bf8f27f4da19..50d2c1a97d6f6 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-11 +date: 2024-09-12 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 0d131f580cd67..c66a56ce72a82 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-11 +date: 2024-09-12 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 e70f970fe0795..b285c42f78b94 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-11 +date: 2024-09-12 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 f078badc7e833..9fa2e5f7b20f4 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-11 +date: 2024-09-12 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 4b7e5d5c06ad3..db222e5007ba1 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-11 +date: 2024-09-12 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 a3b3fb63d0911..6fb14992fc137 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-11 +date: 2024-09-12 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 001cb1e06c140..8dc80c9e76d8b 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-11 +date: 2024-09-12 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 fff7ae6a994ee..41451610d42e7 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-11 +date: 2024-09-12 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 82c652ce2a9fb..b16bc08ca3259 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-11 +date: 2024-09-12 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 40473f8a61274..650e5e98c9115 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-11 +date: 2024-09-12 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 ba9d623e17738..20b52d62d93d0 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-11 +date: 2024-09-12 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 8488e1d36d6b2..fa6d6bad367f8 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-11 +date: 2024-09-12 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 73101f9e7c8a1..18cba02be9c32 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-11 +date: 2024-09-12 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 d9f54a1a5f8c1..befe236980235 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-11 +date: 2024-09-12 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 65a7d82579030..bfb639371659a 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-11 +date: 2024-09-12 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 6e19252494a5e..4fbb582a74b51 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-11 +date: 2024-09-12 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 535c84e59cf8c..b7c3256a13ffb 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-11 +date: 2024-09-12 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 40ce04132477a..5e0b5e426d022 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-11 +date: 2024-09-12 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 3b5695680c145..8b75ca07d7880 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-11 +date: 2024-09-12 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 7eaeb4c56bb2a..07e1cb2a4e51e 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-11 +date: 2024-09-12 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 017d1a77ff354..6bd1dfebd3902 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-11 +date: 2024-09-12 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 bfd2b767b8d90..f3b2154fc53a3 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-11 +date: 2024-09-12 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 c2cb00fea7202..e609656066986 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-11 +date: 2024-09-12 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 536bac1b89442..3b59fc3b7d289 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-11 +date: 2024-09-12 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 fb7084188e519..576c8183258dd 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-11 +date: 2024-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From de454fee9cc5c7f959cb853322522014f5de77f8 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 12 Sep 2024 08:28:24 +0200 Subject: [PATCH 014/168] [Otel Onboarding] Replace setcap with running with sudo (#192585) Replace `setcap` with running the collector with `sudo` on Linux as it follows best practices. Later on, this can be replaced by instructions to install the collector instead. --- .../public/application/quickstart_flows/otel_logs/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx index d5101790a164a..57c92ea7ebc8d 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx @@ -548,10 +548,8 @@ spec: curl --output elastic-distro-${agentVersion}-linux-$arch.tar.gz --url https://${AGENT_CDN_BASE_URL}/elastic-agent-${agentVersion}-linux-$arch.tar.gz --proto '=https' --tlsv1.2 -fOL && mkdir -p elastic-distro-${agentVersion}-linux-$arch && tar -xvf elastic-distro-${agentVersion}-linux-$arch.tar.gz -C "elastic-distro-${agentVersion}-linux-$arch" --strip-components=1 && cd elastic-distro-${agentVersion}-linux-$arch -sudo setcap 'cap_dac_read_search=ep' ./data/elastic-agent-*/elastic-agent - rm ./otel.yml && cp ./otel_samples/platformlogs_hostmetrics.yml ./otel.yml && mkdir -p ./data/otelcol && sed -i 's#\\\${env:STORAGE_DIR}#'"$PWD"/data/otelcol'#g' ./otel.yml && sed -i 's#\\\${env:ELASTIC_ENDPOINT}#${setup?.elasticsearchUrl}#g' ./otel.yml && sed -i 's/\\\${env:ELASTIC_API_KEY}/${apiKeyData?.apiKeyEncoded}/g' ./otel.yml`, - start: './otelcol --config otel.yml', + start: 'sudo ./otelcol --config otel.yml', type: 'copy', }, { From 3a68f8b3ae639b3c40ad6392298f22f435d1f7e1 Mon Sep 17 00:00:00 2001 From: "Christiane (Tina) Heiligers" Date: Thu, 12 Sep 2024 00:23:10 -0700 Subject: [PATCH 015/168] [http] api_integration tests handle internal route restriction (#192407) fix https://github.com/elastic/kibana/issues/192052 ## Summary Internal APIs will be [restricted](https://github.com/elastic/kibana/issues/163654) from public access as of 9.0.0. In non-serverless environments, this breaking change will result in a 400 error if an external request is made to an internal Kibana API (route `access` option as `"internal"` or `"public"`). This PR allows API owners of non-xpack plugins to run their `ftr` API integration tests against the restriction and adds examples of how to handle it. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Note to reviewers: The header needed to allow access to internal apis shouldn't change your test output, with or without the restriction enabled. ### How to test the changes work: #### Non x-pack: 1. Set `server.restrictInternalApis: true` in `test/common/config.js` 2. Ensure your tests pass #### x-pack: 1. Set `server.restrictInternalApis: true` in `x-pack/test/api_integration/apis/security/config.ts` 2. Ensure the spaces tests pass --------- Co-authored-by: Elastic Machine --- .../__snapshots__/http_config.test.ts.snap | 1 + .../src/http_config.test.ts | 18 +++--- .../src/http_config.ts | 1 + .../http/core-http-server/src/router/route.ts | 2 +- test/analytics/config.ts | 1 + test/analytics/services/kibana_ebt.ts | 4 ++ .../tests/analytics_from_the_server.ts | 3 + .../apis/console/autocomplete_entities.ts | 6 +- .../api_integration/apis/console/es_config.ts | 2 + .../apis/console/proxy_route.ts | 4 +- .../api_integration/apis/core/capabilities.ts | 2 + .../apis/custom_integration/integrations.ts | 3 + .../data_view_field_editor/field_preview.ts | 12 +++- .../deprecations/scripted_fields.ts | 46 ++++++++------- .../existing_indices_route/params.ts | 11 +++- .../existing_indices_route/response.ts | 7 ++- .../fields_for_wildcard_route/conflicts.ts | 6 +- .../fields_for_wildcard_route/filter.ts | 6 +- .../fields_for_wildcard_route/params.ts | 17 +++++- .../fields_for_wildcard_route/response.ts | 13 ++++- .../apis/data_views/fields_route/cache.ts | 56 ++++++++++++------- .../apis/data_views/fields_route/conflicts.ts | 2 + .../apis/data_views/fields_route/params.ts | 13 +++++ .../apis/data_views/fields_route/response.ts | 11 ++++ .../has_user_index_pattern.ts | 16 ++++-- .../data_views/resolve_index/resolve_index.ts | 11 +++- .../event_annotations/event_annotations.ts | 21 ++++++- .../apis/guided_onboarding/get_config.ts | 6 +- .../apis/guided_onboarding/get_guides.ts | 11 +++- .../apis/guided_onboarding/get_state.ts | 31 ++++++++-- .../apis/guided_onboarding/put_state.ts | 7 +++ test/api_integration/apis/home/sample_data.ts | 38 +++++++++++-- .../apis/kql_telemetry/kql_telemetry.ts | 10 +++- .../apis/saved_objects/bulk_create.ts | 3 + .../apis/saved_objects/bulk_delete.ts | 4 ++ .../apis/saved_objects/bulk_get.ts | 4 ++ .../apis/saved_objects/bulk_update.ts | 5 ++ .../apis/saved_objects/create.ts | 3 + .../apis/saved_objects/delete.ts | 3 + .../saved_objects/delete_unknown_types.ts | 2 + .../apis/saved_objects/find.ts | 27 +++++++++ .../api_integration/apis/saved_objects/get.ts | 9 ++- .../apis/saved_objects/resolve.ts | 4 ++ .../apis/saved_objects/update.ts | 10 ++++ .../saved_objects_management/bulk_delete.ts | 4 ++ .../apis/saved_objects_management/bulk_get.ts | 4 ++ .../apis/saved_objects_management/find.ts | 14 +++++ .../saved_objects_management/relationships.ts | 27 ++++++++- .../saved_objects_management/scroll_count.ts | 6 ++ .../apis/saved_queries/saved_queries.ts | 24 ++++++-- .../api_integration/apis/scripts/languages.js | 7 ++- test/api_integration/apis/search/bsearch.ts | 20 ++++++- test/api_integration/apis/search/search.ts | 17 +++++- .../api_integration/apis/search/sql_search.ts | 12 +++- .../apis/suggestions/suggestions.js | 17 +++++- .../apis/ui_counters/ui_counters.ts | 3 + .../apis/ui_metric/ui_metric.ts | 4 ++ test/functional/config.base.js | 3 +- .../server_integration/http/platform/cache.ts | 8 ++- .../http/platform/status.ts | 2 + .../apis/spaces/get_active_space.ts | 5 ++ .../apis/spaces/get_content_summary.ts | 7 +++ .../apis/spaces/saved_objects.ts | 6 ++ .../apis/spaces/space_attributes.ts | 4 ++ .../ftr_apis/security_and_spaces/config.ts | 2 + x-pack/test/functional/config.base.js | 2 + 66 files changed, 572 insertions(+), 98 deletions(-) diff --git a/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap b/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap index 34cdcd15db7df..6cad6f9686a6d 100644 --- a/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap +++ b/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap @@ -88,6 +88,7 @@ Object { "allowFromAnyIp": false, "ipAllowlist": Array [], }, + "restrictInternalApis": false, "rewriteBasePath": false, "securityResponseHeaders": Object { "crossOriginOpenerPolicy": "same-origin", diff --git a/packages/core/http/core-http-server-internal/src/http_config.test.ts b/packages/core/http/core-http-server-internal/src/http_config.test.ts index 70002994445f6..bf9ea2fe53875 100644 --- a/packages/core/http/core-http-server-internal/src/http_config.test.ts +++ b/packages/core/http/core-http-server-internal/src/http_config.test.ts @@ -525,23 +525,27 @@ describe('versioned', () => { }); describe('restrictInternalApis', () => { - it('is only allowed on serverless', () => { - expect(() => config.schema.validate({ restrictInternalApis: false }, {})).toThrow( - /a value wasn't expected/ - ); - expect(() => config.schema.validate({ restrictInternalApis: true }, {})).toThrow( - /a value wasn't expected/ - ); + it('is allowed on serverless and traditional', () => { + expect(() => config.schema.validate({ restrictInternalApis: false }, {})).not.toThrow(); + expect(() => config.schema.validate({ restrictInternalApis: true }, {})).not.toThrow(); expect( config.schema.validate({ restrictInternalApis: true }, { serverless: true }) ).toMatchObject({ restrictInternalApis: true, }); + expect( + config.schema.validate({ restrictInternalApis: true }, { traditional: true }) + ).toMatchObject({ + restrictInternalApis: true, + }); }); it('defaults to false', () => { expect( config.schema.validate({ restrictInternalApis: undefined }, { serverless: true }) ).toMatchObject({ restrictInternalApis: false }); + expect( + config.schema.validate({ restrictInternalApis: undefined }, { traditional: true }) + ).toMatchObject({ restrictInternalApis: false }); }); }); diff --git a/packages/core/http/core-http-server-internal/src/http_config.ts b/packages/core/http/core-http-server-internal/src/http_config.ts index 05f88bf8fb34f..d4560febb6f26 100644 --- a/packages/core/http/core-http-server-internal/src/http_config.ts +++ b/packages/core/http/core-http-server-internal/src/http_config.ts @@ -208,6 +208,7 @@ const configSchema = schema.object( // allow access to internal routes by default to prevent breaking changes in current offerings restrictInternalApis: offeringBasedSchema({ serverless: schema.boolean({ defaultValue: false }), + traditional: schema.boolean({ defaultValue: false }), }), versioned: schema.object({ 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 f313d14a7710a..85eef993adcc0 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -107,7 +107,7 @@ export interface RouteConfigOptionsBody { * Public routes are stable and intended for external access and are subject to * stricter change management and have long term maintenance windows. * - * @remark On serverless access to internal routes is restricted. + * @remark as of 9.0, access to internal routes is restricted by default. See https://github.com/elastic/kibana/issues/163654. */ export type RouteAccess = 'public' | 'internal'; diff --git a/test/analytics/config.ts b/test/analytics/config.ts index cc162b0a96d4b..aae2458c3ad6f 100644 --- a/test/analytics/config.ts +++ b/test/analytics/config.ts @@ -36,6 +36,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { serverArgs: [ ...functionalConfig.get('kbnTestServer.serverArgs'), '--telemetry.optIn=true', + '--server.restrictInternalApis=false', `--plugin-path=${path.resolve(__dirname, './plugins/analytics_plugin_a')}`, `--plugin-path=${path.resolve(__dirname, './plugins/analytics_ftr_helpers')}`, ], diff --git a/test/analytics/services/kibana_ebt.ts b/test/analytics/services/kibana_ebt.ts index e82196d028fd4..f2b635dcbdbbe 100644 --- a/test/analytics/services/kibana_ebt.ts +++ b/test/analytics/services/kibana_ebt.ts @@ -9,6 +9,7 @@ import '@kbn/analytics-ftr-helpers-plugin/public/types'; import type { EBTHelpersContract } from '@kbn/analytics-ftr-helpers-plugin/common/types'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../functional/ftr_provider_context'; export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBTHelpersContract { @@ -18,6 +19,7 @@ export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBT await supertest .post(`/internal/analytics_ftr_helpers/opt_in`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ consent: optIn }) .expect(200); }; @@ -38,6 +40,7 @@ export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBT fromTimestamp, }) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); return resp.body; @@ -48,6 +51,7 @@ export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBT .get(`/internal/analytics_ftr_helpers/count_events`) .query({ eventTypes: JSON.stringify(eventTypes), withTimeoutMs, fromTimestamp }) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); return resp.body.count; diff --git a/test/analytics/tests/analytics_from_the_server.ts b/test/analytics/tests/analytics_from_the_server.ts index a1b75db9985b3..af15d083419a3 100644 --- a/test/analytics/tests/analytics_from_the_server.ts +++ b/test/analytics/tests/analytics_from_the_server.ts @@ -10,6 +10,7 @@ import expect from '@kbn/expect'; import type { Event, TelemetryCounter } from '@kbn/core/server'; import type { Action } from '@kbn/analytics-plugin-a-plugin/server/custom_shipper'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../services'; export default function ({ getService }: FtrProviderContext) { @@ -23,6 +24,7 @@ export default function ({ getService }: FtrProviderContext) { .get(`/internal/analytics_plugin_a/stats`) .query({ takeNumberOfCounters, eventType: 'test-plugin-lifecycle' }) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); return resp.body; @@ -32,6 +34,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .get(`/internal/analytics_plugin_a/actions`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); return resp.body; diff --git a/test/api_integration/apis/console/autocomplete_entities.ts b/test/api_integration/apis/console/autocomplete_entities.ts index 6cd0f6df35401..2a19f2c9f7f45 100644 --- a/test/api_integration/apis/console/autocomplete_entities.ts +++ b/test/api_integration/apis/console/autocomplete_entities.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getService }: FtrProviderContext) => { @@ -15,7 +16,10 @@ export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const sendRequest = (query: object) => - supertest.get('/api/console/autocomplete_entities').query(query); + supertest + .get('/api/console/autocomplete_entities') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .query(query); describe('/api/console/autocomplete_entities', function () { const indexName = 'test-index-1'; diff --git a/test/api_integration/apis/console/es_config.ts b/test/api_integration/apis/console/es_config.ts index cea71fefb0142..190e35d1f3827 100644 --- a/test/api_integration/apis/console/es_config.ts +++ b/test/api_integration/apis/console/es_config.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -18,6 +19,7 @@ export default function ({ getService }: FtrProviderContext) { const { body } = await supertest .get('/api/console/es_config') .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(body.host).to.be.ok(); }); diff --git a/test/api_integration/apis/console/proxy_route.ts b/test/api_integration/apis/console/proxy_route.ts index bc02a4863eb99..3cc40f318d97b 100644 --- a/test/api_integration/apis/console/proxy_route.ts +++ b/test/api_integration/apis/console/proxy_route.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -19,6 +20,7 @@ export default function ({ getService }: FtrProviderContext) { return await supertest .post('/api/console/proxy?method=GET&path=/.kibana/_settings') .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .then((response) => { expect(response.header).to.have.property('warning'); const { warning } = response.header as { warning: string }; @@ -28,12 +30,12 @@ export default function ({ getService }: FtrProviderContext) { }); it('does not forward x-elastic-product-origin', async () => { - // If we pass the header and we still get the warning back, we assume that the header was not forwarded. return await supertest .post('/api/console/proxy?method=GET&path=/.kibana/_settings') .set('kbn-xsrf', 'true') .set('x-elastic-product-origin', 'kibana') .then((response) => { + expect(response.header).to.have.property('connection', 'close'); expect(response.header).to.have.property('warning'); const { warning } = response.header as { warning: string }; expect(warning.startsWith('299')).to.be(true); diff --git a/test/api_integration/apis/core/capabilities.ts b/test/api_integration/apis/core/capabilities.ts index d99c47213fb04..6816090d36c37 100644 --- a/test/api_integration/apis/core/capabilities.ts +++ b/test/api_integration/apis/core/capabilities.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -17,6 +18,7 @@ export default function ({ getService }: FtrProviderContext) { it(`returns a 400 when an invalid app id is provided`, async () => { const { body } = await supertest .post('/api/core/capabilities') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ applications: ['dashboard', 'discover', 'bad%app'], }) diff --git a/test/api_integration/apis/custom_integration/integrations.ts b/test/api_integration/apis/custom_integration/integrations.ts index ecb53f6200780..a3d50533010f1 100644 --- a/test/api_integration/apis/custom_integration/integrations.ts +++ b/test/api_integration/apis/custom_integration/integrations.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -19,6 +20,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .get(`/internal/customIntegrations/appendCustomIntegrations`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body).to.be.an('array'); @@ -37,6 +39,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .get(`/internal/customIntegrations/replacementCustomIntegrations`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body).to.be.an('array'); diff --git a/test/api_integration/apis/data_view_field_editor/field_preview.ts b/test/api_integration/apis/data_view_field_editor/field_preview.ts index 5190ebde33953..24762ea2242e4 100644 --- a/test/api_integration/apis/data_view_field_editor/field_preview.ts +++ b/test/api_integration/apis/data_view_field_editor/field_preview.ts @@ -9,7 +9,10 @@ import expect from '@kbn/expect'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { getErrorCodeFromErrorReason } from '@kbn/data-view-field-editor-plugin/public/lib/runtime_field_validation'; import { FIELD_PREVIEW_PATH, @@ -92,6 +95,7 @@ export default function ({ getService }: FtrProviderContext) { .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) .send(payload) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(response.values).eql([test.expected]); @@ -109,6 +113,7 @@ export default function ({ getService }: FtrProviderContext) { index: INDEX_NAME, }) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400); }); @@ -121,6 +126,7 @@ export default function ({ getService }: FtrProviderContext) { index: INDEX_NAME, }) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400); }); @@ -133,6 +139,7 @@ export default function ({ getService }: FtrProviderContext) { context: 'keyword_field', }) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400); }); }); @@ -150,7 +157,8 @@ export default function ({ getService }: FtrProviderContext) { context: 'keyword_field', index: INDEX_NAME, }) - .set('kbn-xsrf', 'xxx'); + .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const errorCode = getErrorCodeFromErrorReason(response.error?.caused_by?.reason); diff --git a/test/api_integration/apis/data_views/deprecations/scripted_fields.ts b/test/api_integration/apis/data_views/deprecations/scripted_fields.ts index 7fcfd432d0782..083fabada4ec7 100644 --- a/test/api_integration/apis/data_views/deprecations/scripted_fields.ts +++ b/test/api_integration/apis/data_views/deprecations/scripted_fields.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import type { DeprecationsGetResponse } from '@kbn/core/server'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -28,7 +29,9 @@ export default function ({ getService }: FtrProviderContext) { }); it('no scripted fields deprecations', async () => { - const { body } = await supertest.get('/api/deprecations/'); + const { body } = await supertest + .get('/api/deprecations/') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const { deprecations } = body as DeprecationsGetResponse; const dataPluginDeprecations = deprecations.filter( @@ -40,27 +43,32 @@ export default function ({ getService }: FtrProviderContext) { it('scripted field deprecation', async () => { const title = `basic_index`; - await supertest.post('/api/index_patterns/index_pattern').send({ - index_pattern: { - title, - fields: { - foo: { - name: 'foo', - type: 'string', - scripted: true, - script: "doc['field_name'].value", - }, - bar: { - name: 'bar', - type: 'number', - scripted: true, - script: "doc['field_name'].value", + await supertest + .post('/api/index_patterns/index_pattern') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send({ + index_pattern: { + title, + fields: { + foo: { + name: 'foo', + type: 'string', + scripted: true, + script: "doc['field_name'].value", + }, + bar: { + name: 'bar', + type: 'number', + scripted: true, + script: "doc['field_name'].value", + }, }, }, - }, - }); + }); - const { body } = await supertest.get('/api/deprecations/'); + const { body } = await supertest + .get('/api/deprecations/') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const { deprecations } = body as DeprecationsGetResponse; const dataPluginDeprecations = deprecations.filter( ({ domainId }) => domainId === 'dataViews' diff --git a/test/api_integration/apis/data_views/existing_indices_route/params.ts b/test/api_integration/apis/data_views/existing_indices_route/params.ts index 4bebcca337260..8e1e4bab0cbdd 100644 --- a/test/api_integration/apis/data_views/existing_indices_route/params.ts +++ b/test/api_integration/apis/data_views/existing_indices_route/params.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { EXISTING_INDICES_PATH } from '@kbn/data-views-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; @@ -29,6 +32,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({}) .expect(400)); @@ -36,6 +40,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ indices: 'filebeat-*', }) @@ -45,6 +50,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ indices: ['filebeat-*'], }) @@ -54,6 +60,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ indices: ['filebeat-*', 'packetbeat-*'], }) @@ -63,6 +70,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ [randomness.word()]: randomness.word(), }) @@ -72,6 +80,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ indices: 'filebeat-*,packetbeat-*', }) diff --git a/test/api_integration/apis/data_views/existing_indices_route/response.ts b/test/api_integration/apis/data_views/existing_indices_route/response.ts index 8ccc723eff9d9..7959945081219 100644 --- a/test/api_integration/apis/data_views/existing_indices_route/response.ts +++ b/test/api_integration/apis/data_views/existing_indices_route/response.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { EXISTING_INDICES_PATH } from '@kbn/data-views-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; @@ -28,6 +31,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ indices: ['basic_index', 'bad_index'], }) @@ -38,6 +42,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ indices: ['bad_index'], }) diff --git a/test/api_integration/apis/data_views/fields_for_wildcard_route/conflicts.ts b/test/api_integration/apis/data_views/fields_for_wildcard_route/conflicts.ts index 19fdbeedaa9f2..852ea100ae051 100644 --- a/test/api_integration/apis/data_views/fields_for_wildcard_route/conflicts.ts +++ b/test/api_integration/apis/data_views/fields_for_wildcard_route/conflicts.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; @@ -29,6 +32,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'logs-*' }) .expect(200) .then((resp) => { diff --git a/test/api_integration/apis/data_views/fields_for_wildcard_route/filter.ts b/test/api_integration/apis/data_views/fields_for_wildcard_route/filter.ts index 0d66365907aec..04574801a16c8 100644 --- a/test/api_integration/apis/data_views/fields_for_wildcard_route/filter.ts +++ b/test/api_integration/apis/data_views/fields_for_wildcard_route/filter.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; @@ -38,6 +41,7 @@ export default function ({ getService }: FtrProviderContext) { const a = await supertest .put(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'helloworld*' }) .send({ index_filter: { exists: { field: 'bye' } } }); diff --git a/test/api_integration/apis/data_views/fields_for_wildcard_route/params.ts b/test/api_integration/apis/data_views/fields_for_wildcard_route/params.ts index 8b42c645f913a..04aaaa2adc331 100644 --- a/test/api_integration/apis/data_views/fields_for_wildcard_route/params.ts +++ b/test/api_integration/apis/data_views/fields_for_wildcard_route/params.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import { FtrProviderContext } from '../../../ftr_provider_context'; @@ -29,6 +32,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({}) .expect(400)); @@ -36,6 +40,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', include_unmapped: true, @@ -46,6 +51,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: randomness.word(), [randomness.word()]: randomness.word(), @@ -57,6 +63,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: JSON.stringify(['baz']), @@ -67,6 +74,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: ['baz', 'foo'], @@ -77,6 +85,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: ['baz'], @@ -87,6 +96,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: 'baz', @@ -97,6 +107,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: 'foo,bar', @@ -109,6 +120,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: JSON.stringify(['meta']), @@ -119,6 +131,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: ['_id', 'meta'], @@ -129,6 +142,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: ['_id'], @@ -139,6 +153,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: 'foo,bar', diff --git a/test/api_integration/apis/data_views/fields_for_wildcard_route/response.ts b/test/api_integration/apis/data_views/fields_for_wildcard_route/response.ts index d818e0f85eac2..2b0fa0dab4424 100644 --- a/test/api_integration/apis/data_views/fields_for_wildcard_route/response.ts +++ b/test/api_integration/apis/data_views/fields_for_wildcard_route/response.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; @@ -89,6 +92,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index' }) .expect(200, { fields: testFields, @@ -101,6 +105,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', fields: JSON.stringify(['bar']) }) .expect(200, { fields: [testFields[0]], @@ -112,6 +117,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', meta_fields: JSON.stringify(['_id', '_source', 'crazy_meta_field']), @@ -205,6 +211,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'bad_index,basic_index' }) .expect(200, { fields: testFields, @@ -216,6 +223,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'bad_index,bad_index_2' }) .expect(404); }); @@ -224,6 +232,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'bad_index', }) @@ -238,6 +247,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index' }) .expect(200, { fields: [], @@ -251,6 +261,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'fields-for-wildcard-000001', meta_fields: ['_id', '_index'], diff --git a/test/api_integration/apis/data_views/fields_route/cache.ts b/test/api_integration/apis/data_views/fields_route/cache.ts index a9ca10d3400ee..e906b34336f40 100644 --- a/test/api_integration/apis/data_views/fields_route/cache.ts +++ b/test/api_integration/apis/data_views/fields_route/cache.ts @@ -10,6 +10,7 @@ import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -26,11 +27,14 @@ export default function ({ getService }: FtrProviderContext) { ); it('are present', async () => { - const response = await supertest.get(FIELDS_PATH).query({ - pattern: '*', - include_unmapped: true, - apiVersion: INITIAL_REST_VERSION_INTERNAL, - }); + const response = await supertest + .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .query({ + pattern: '*', + include_unmapped: true, + apiVersion: INITIAL_REST_VERSION_INTERNAL, + }); const cacheControlHeader = response.get('cache-control'); @@ -44,11 +48,14 @@ export default function ({ getService }: FtrProviderContext) { it('no-cache when data_views:cache_max_age set to zero', async () => { await kibanaServer.uiSettings.update({ 'data_views:cache_max_age': 0 }); - const response = await supertest.get(FIELDS_PATH).query({ - pattern: 'b*', - include_unmapped: true, - apiVersion: INITIAL_REST_VERSION_INTERNAL, - }); + const response = await supertest + .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .query({ + pattern: 'b*', + include_unmapped: true, + apiVersion: INITIAL_REST_VERSION_INTERNAL, + }); const cacheControlHeader = response.get('cache-control'); @@ -63,15 +70,19 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns 304 on matching etag', async () => { - const response = await supertest.get(FIELDS_PATH).query({ - pattern: '*', - include_unmapped: true, - apiVersion: INITIAL_REST_VERSION_INTERNAL, - }); + const response = await supertest + .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .query({ + pattern: '*', + include_unmapped: true, + apiVersion: INITIAL_REST_VERSION_INTERNAL, + }); await supertest .get(FIELDS_PATH) .set('If-None-Match', response.get('etag')!) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', include_unmapped: true, @@ -81,12 +92,15 @@ export default function ({ getService }: FtrProviderContext) { }); it('handles empty field lists', async () => { - const response = await supertest.get(FIELDS_PATH).query({ - pattern: 'xyz', - include_unmapped: true, - apiVersion: INITIAL_REST_VERSION_INTERNAL, - allow_no_index: true, - }); + const response = await supertest + .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .query({ + pattern: 'xyz', + include_unmapped: true, + apiVersion: INITIAL_REST_VERSION_INTERNAL, + allow_no_index: true, + }); expect(response.body.fields).to.be.empty(); }); diff --git a/test/api_integration/apis/data_views/fields_route/conflicts.ts b/test/api_integration/apis/data_views/fields_route/conflicts.ts index 18bbe689c9937..681512af62e7f 100644 --- a/test/api_integration/apis/data_views/fields_route/conflicts.ts +++ b/test/api_integration/apis/data_views/fields_route/conflicts.ts @@ -10,6 +10,7 @@ import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -27,6 +28,7 @@ export default function ({ getService }: FtrProviderContext) { it('flags fields with mismatched types as conflicting', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'logs-*', apiVersion: INITIAL_REST_VERSION_INTERNAL }) .expect(200) .then((resp) => { diff --git a/test/api_integration/apis/data_views/fields_route/params.ts b/test/api_integration/apis/data_views/fields_route/params.ts index 3d6dcef506aa5..bdd99b78e670b 100644 --- a/test/api_integration/apis/data_views/fields_route/params.ts +++ b/test/api_integration/apis/data_views/fields_route/params.ts @@ -9,6 +9,7 @@ import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_PATH } from '@kbn/data-views-plugin/common/constants'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -27,6 +28,7 @@ export default function ({ getService }: FtrProviderContext) { it('requires a pattern query param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ apiVersion: INITIAL_REST_VERSION_INTERNAL, }) @@ -35,6 +37,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts include_unmapped param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', include_unmapped: true, @@ -45,6 +48,7 @@ export default function ({ getService }: FtrProviderContext) { it('rejects unexpected query params', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: randomness.word(), [randomness.word()]: randomness.word(), @@ -56,6 +60,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts a JSON formatted fields query param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: JSON.stringify(['baz']), @@ -66,6 +71,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts meta_fields query param in string array', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: ['baz', 'foo'], @@ -76,6 +82,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts single array fields query param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: ['baz'], @@ -86,6 +93,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts single fields query param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: 'baz', @@ -96,6 +104,7 @@ export default function ({ getService }: FtrProviderContext) { it('rejects a comma-separated list of fields', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', fields: 'foo,bar', @@ -108,6 +117,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts a JSON formatted meta_fields query param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: JSON.stringify(['meta']), @@ -118,6 +128,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts meta_fields query param in string array', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: ['_id', 'meta'], @@ -128,6 +139,7 @@ export default function ({ getService }: FtrProviderContext) { it('accepts single meta_fields query param', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: ['_id'], @@ -138,6 +150,7 @@ export default function ({ getService }: FtrProviderContext) { it('rejects a comma-separated list of meta_fields', () => supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: '*', meta_fields: 'foo,bar', diff --git a/test/api_integration/apis/data_views/fields_route/response.ts b/test/api_integration/apis/data_views/fields_route/response.ts index 149ebf4d5ce4a..541434b872eb2 100644 --- a/test/api_integration/apis/data_views/fields_route/response.ts +++ b/test/api_integration/apis/data_views/fields_route/response.ts @@ -11,6 +11,7 @@ import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/con import { FIELDS_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; import { sortBy } from 'lodash'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -87,6 +88,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns a flattened version of the fields in es', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', apiVersion: INITIAL_REST_VERSION_INTERNAL }) .expect(200, { fields: testFields, @@ -98,6 +100,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns a single field as requested', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', fields: ['bar'], @@ -112,6 +115,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns a single field as requested with json encoding', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', fields: JSON.stringify(['bar']), @@ -126,6 +130,7 @@ export default function ({ getService }: FtrProviderContext) { it('always returns a field for all passed meta fields', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', meta_fields: ['_id', '_source', 'crazy_meta_field'], @@ -219,6 +224,7 @@ export default function ({ getService }: FtrProviderContext) { it('can request fields by type', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', field_types: 'boolean', @@ -233,6 +239,7 @@ export default function ({ getService }: FtrProviderContext) { it('can request fields by multiple types', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'basic_index', field_types: ['boolean', 'text'], @@ -247,6 +254,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns fields when one pattern exists and the other does not', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'bad_index,basic_index', apiVersion: INITIAL_REST_VERSION_INTERNAL }) .expect(200, { fields: testFields, @@ -257,6 +265,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns 404 when neither exists', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'bad_index,bad_index_2', apiVersion: INITIAL_REST_VERSION_INTERNAL }) .expect(404); }); @@ -264,6 +273,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns 404 when no patterns exist', async () => { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'bad_index', apiVersion: INITIAL_REST_VERSION_INTERNAL, @@ -276,6 +286,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(FIELDS_PATH) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ pattern: 'fields-route-000001', meta_fields: ['_id', '_index'], diff --git a/test/api_integration/apis/data_views/has_user_index_pattern/has_user_index_pattern.ts b/test/api_integration/apis/data_views/has_user_index_pattern/has_user_index_pattern.ts index 0193040dcef2c..f781704bb5af3 100644 --- a/test/api_integration/apis/data_views/has_user_index_pattern/has_user_index_pattern.ts +++ b/test/api_integration/apis/data_views/has_user_index_pattern/has_user_index_pattern.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { INITIAL_REST_VERSION, INITIAL_REST_VERSION_INTERNAL, @@ -42,7 +45,8 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.emptyKibanaIndex(); const response = await supertest .get(servicePath) - .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL); + .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(response.status).to.be(200); expect(response.body.result).to.be(false); }); @@ -54,6 +58,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ override: true, [config.serviceKey]: { @@ -63,7 +68,8 @@ export default function ({ getService }: FtrProviderContext) { const response = await supertest .get(servicePath) - .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL); + .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(response.status).to.be(200); expect(response.body.result).to.be(true); @@ -76,6 +82,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ override: true, [config.serviceKey]: { @@ -86,7 +93,8 @@ export default function ({ getService }: FtrProviderContext) { const response = await supertest .get(servicePath) - .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL); + .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); expect(response.status).to.be(200); expect(response.body.result).to.be(true); }); diff --git a/test/api_integration/apis/data_views/resolve_index/resolve_index.ts b/test/api_integration/apis/data_views/resolve_index/resolve_index.ts index 2cf3f6702cddf..cd13d23e80c1e 100644 --- a/test/api_integration/apis/data_views/resolve_index/resolve_index.ts +++ b/test/api_integration/apis/data_views/resolve_index/resolve_index.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; // node scripts/functional_tests --config test/api_integration/config.js --grep="Resolve index API" @@ -16,9 +17,15 @@ export default function ({ getService }: FtrProviderContext) { describe('Resolve index API', function () { it('should return 200 for a search for indices with wildcard', () => - supertest.get(`/internal/index-pattern-management/resolve_index/test*`).expect(200)); + supertest + .get(`/internal/index-pattern-management/resolve_index/test*`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200)); it('should return 404 for an exact match index', () => - supertest.get(`/internal/index-pattern-management/resolve_index/test`).expect(404)); + supertest + .get(`/internal/index-pattern-management/resolve_index/test`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(404)); }); } diff --git a/test/api_integration/apis/event_annotations/event_annotations.ts b/test/api_integration/apis/event_annotations/event_annotations.ts index 1232bc5d69adb..c6df9b16d3c6c 100644 --- a/test/api_integration/apis/event_annotations/event_annotations.ts +++ b/test/api_integration/apis/event_annotations/event_annotations.ts @@ -22,6 +22,7 @@ import type { } from '@kbn/event-annotation-plugin/common'; import { CONTENT_ID } from '@kbn/event-annotation-plugin/common'; import { EVENT_ANNOTATION_GROUP_TYPE } from '@kbn/event-annotation-common'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; const CONTENT_ENDPOINT = '/api/content_management/rpc'; @@ -94,6 +95,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`${CONTENT_ENDPOINT}/get`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload) .expect(200); @@ -138,6 +140,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`${CONTENT_ENDPOINT}/get`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload) .expect(404); @@ -151,7 +154,11 @@ export default function ({ getService }: FtrProviderContext) { describe('search', () => { const performSearch = (payload: EventAnnotationGroupSearchIn) => - supertest.post(`${CONTENT_ENDPOINT}/search`).set('kbn-xsrf', 'kibana').send(payload); + supertest + .post(`${CONTENT_ENDPOINT}/search`) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send(payload); it(`should retrieve existing groups`, async () => { const payload: EventAnnotationGroupSearchIn = { @@ -277,6 +284,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`${CONTENT_ENDPOINT}/create`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload) .expect(200); @@ -325,6 +333,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`${CONTENT_ENDPOINT}/create`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload) .expect(400); @@ -345,6 +354,7 @@ export default function ({ getService }: FtrProviderContext) { return supertest .post(`${CONTENT_ENDPOINT}/create`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload); }; @@ -380,6 +390,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`${CONTENT_ENDPOINT}/update`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload) .expect(200); @@ -431,6 +442,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`${CONTENT_ENDPOINT}/update`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload) .expect(400); @@ -453,6 +465,7 @@ export default function ({ getService }: FtrProviderContext) { return supertest .post(`${CONTENT_ENDPOINT}/update`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(payload); }; const errorResp = await updateWithDataViewSpec(undefined).expect(400); @@ -477,7 +490,11 @@ export default function ({ getService }: FtrProviderContext) { version: API_VERSION, }; - return supertest.post(`${CONTENT_ENDPOINT}/delete`).set('kbn-xsrf', 'kibana').send(payload); + return supertest + .post(`${CONTENT_ENDPOINT}/delete`) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .send(payload); }; it(`should delete a group`, async () => { diff --git a/test/api_integration/apis/guided_onboarding/get_config.ts b/test/api_integration/apis/guided_onboarding/get_config.ts index 3331a08f33c3b..6ab2095e594b8 100644 --- a/test/api_integration/apis/guided_onboarding/get_config.ts +++ b/test/api_integration/apis/guided_onboarding/get_config.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { API_BASE_PATH } from '@kbn/guided-onboarding-plugin/common'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; const getConfigsPath = `${API_BASE_PATH}/configs`; @@ -19,7 +20,10 @@ export default function testGetGuideConfig({ getService }: FtrProviderContext) { // check that production guides are present ['siem', 'appSearch', 'websiteSearch', 'databaseSearch', 'kubernetes'].map((guideId) => { it(`returns config for ${guideId}`, async () => { - const response = await supertest.get(`${getConfigsPath}/${guideId}`).expect(200); + const response = await supertest + .get(`${getConfigsPath}/${guideId}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body).not.to.be.empty(); const { config } = response.body; expect(config).to.not.be.empty(); diff --git a/test/api_integration/apis/guided_onboarding/get_guides.ts b/test/api_integration/apis/guided_onboarding/get_guides.ts index bc4a4628317dc..029a4b2eb33b7 100644 --- a/test/api_integration/apis/guided_onboarding/get_guides.ts +++ b/test/api_integration/apis/guided_onboarding/get_guides.ts @@ -15,6 +15,7 @@ import { } from '@kbn/guided-onboarding-plugin/server/saved_objects/guided_setup'; import { appSearchGuideId } from '@kbn/enterprise-search-plugin/common/guided_onboarding/search_guide_config'; import { API_BASE_PATH } from '@kbn/guided-onboarding-plugin/common'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; import { createGuides } from './helpers'; @@ -32,7 +33,10 @@ export default function testGetGuidesState({ getService }: FtrProviderContext) { }); it('returns an empty array if no guides', async () => { - const response = await supertest.get(getGuidesPath).expect(200); + const response = await supertest + .get(getGuidesPath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body).not.to.be.empty(); expect(response.body.state).to.be.empty(); }); @@ -42,7 +46,10 @@ export default function testGetGuidesState({ getService }: FtrProviderContext) { testGuideStep1ActiveState, { ...testGuideStep1ActiveState, guideId: appSearchGuideId }, ]); - const response = await supertest.get(getGuidesPath).expect(200); + const response = await supertest + .get(getGuidesPath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body).not.to.be.empty(); expect(response.body.state).to.eql([ testGuideStep1ActiveState, diff --git a/test/api_integration/apis/guided_onboarding/get_state.ts b/test/api_integration/apis/guided_onboarding/get_state.ts index 54118d993d139..68e291b75dc5e 100644 --- a/test/api_integration/apis/guided_onboarding/get_state.ts +++ b/test/api_integration/apis/guided_onboarding/get_state.ts @@ -19,6 +19,7 @@ import { pluginStateSavedObjectsType, } from '@kbn/guided-onboarding-plugin/server/saved_objects/guided_setup'; import { API_BASE_PATH } from '@kbn/guided-onboarding-plugin/common'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; import { createPluginState, createGuides } from './helpers'; @@ -42,7 +43,10 @@ export default function testGetState({ getService }: FtrProviderContext) { }); it('returns the default plugin state if no saved objects', async () => { - const response = await supertest.get(getStatePath).expect(200); + const response = await supertest + .get(getStatePath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body.pluginState).not.to.be.empty(); expect(response.body).to.eql({ pluginState: mockPluginStateNotStarted, @@ -59,7 +63,10 @@ export default function testGetState({ getService }: FtrProviderContext) { creationDate: new Date().toISOString(), }); - const response = await supertest.get(getStatePath).expect(200); + const response = await supertest + .get(getStatePath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body.pluginState).not.to.be.empty(); expect(response.body).to.eql({ pluginState: { @@ -80,7 +87,10 @@ export default function testGetState({ getService }: FtrProviderContext) { creationDate: new Date().toISOString(), }); - const response = await supertest.get(getStatePath).expect(200); + const response = await supertest + .get(getStatePath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body.pluginState).not.to.be.empty(); expect(response.body).to.eql({ pluginState: { @@ -97,7 +107,10 @@ export default function testGetState({ getService }: FtrProviderContext) { creationDate: getDateXDaysAgo(40), }); - const response = await supertest.get(getStatePath).expect(200); + const response = await supertest + .get(getStatePath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body.pluginState).not.to.be.empty(); expect(response.body.pluginState.isActivePeriod).to.eql(false); }); @@ -109,7 +122,10 @@ export default function testGetState({ getService }: FtrProviderContext) { creationDate: getDateXDaysAgo(20), }); - const response = await supertest.get(getStatePath).expect(200); + const response = await supertest + .get(getStatePath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body.pluginState).not.to.be.empty(); expect(response.body.pluginState.isActivePeriod).to.eql(true); }); @@ -124,7 +140,10 @@ export default function testGetState({ getService }: FtrProviderContext) { creationDate: new Date().toISOString(), }); - const response = await supertest.get(getStatePath).expect(200); + const response = await supertest + .get(getStatePath) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(response.body.pluginState.activeGuide.params).to.eql(testGuideParams); }); }); diff --git a/test/api_integration/apis/guided_onboarding/put_state.ts b/test/api_integration/apis/guided_onboarding/put_state.ts index cf3b7b7bfbc3a..c6682be76d528 100644 --- a/test/api_integration/apis/guided_onboarding/put_state.ts +++ b/test/api_integration/apis/guided_onboarding/put_state.ts @@ -23,6 +23,7 @@ import { import { testGuideId } from '@kbn/guided-onboarding'; import { appSearchGuideId } from '@kbn/enterprise-search-plugin/common/guided_onboarding/search_guide_config'; import { API_BASE_PATH } from '@kbn/guided-onboarding-plugin/common'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; import { createGuides, createPluginState } from './helpers'; @@ -43,6 +44,7 @@ export default function testPutState({ getService }: FtrProviderContext) { const response = await supertest .put(putStatePath) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ status: 'in_progress', }) @@ -72,6 +74,7 @@ export default function testPutState({ getService }: FtrProviderContext) { const response = await supertest .put(putStatePath) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ status: 'in_progress', }) @@ -96,6 +99,7 @@ export default function testPutState({ getService }: FtrProviderContext) { await supertest .put(putStatePath) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ guide: testGuideStep1ActiveState, }) @@ -115,6 +119,7 @@ export default function testPutState({ getService }: FtrProviderContext) { await supertest .put(putStatePath) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ guide: testGuideNotActiveState, }) @@ -139,6 +144,7 @@ export default function testPutState({ getService }: FtrProviderContext) { await supertest .put(putStatePath) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ guide: { ...testGuideStep1ActiveState, @@ -175,6 +181,7 @@ export default function testPutState({ getService }: FtrProviderContext) { await supertest .put(putStatePath) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ guide: { ...testGuideStep2ActiveState, diff --git a/test/api_integration/apis/home/sample_data.ts b/test/api_integration/apis/home/sample_data.ts index 4778acc6f4d7a..d290f772fdec5 100644 --- a/test/api_integration/apis/home/sample_data.ts +++ b/test/api_integration/apis/home/sample_data.ts @@ -10,6 +10,7 @@ import expect from '@kbn/expect'; import type { Response } from 'superagent'; import differenceInMilliseconds from 'date-fns/differenceInMilliseconds'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -43,7 +44,11 @@ export default function ({ getService }: FtrProviderContext) { describe(`list in the ${space} space (before install)`, () => { it('should return list of sample data sets with installed status', async () => { - const resp = await supertest.get(apiPath).set('kbn-xsrf', 'kibana').expect(200); + const resp = await supertest + .get(apiPath) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); const flightsData = findFlightsData(resp); expect(flightsData.status).to.be('not_installed'); @@ -58,13 +63,18 @@ export default function ({ getService }: FtrProviderContext) { describe(`install in the ${space} space`, () => { it('should return 404 if id does not match any sample data sets', async () => { - await supertest.post(`${apiPath}/xxxx`).set('kbn-xsrf', 'kibana').expect(404); + await supertest + .post(`${apiPath}/xxxx`) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(404); }); it('should return 200 if success', async () => { const resp = await supertest .post(`${apiPath}/flights`) .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body).to.eql({ @@ -97,7 +107,10 @@ export default function ({ getService }: FtrProviderContext) { it('should load elasticsearch index containing sample data with dates relative to now parameter', async () => { const nowString = `2000-01-01T00:00:00`; - await supertest.post(`${apiPath}/flights?now=${nowString}`).set('kbn-xsrf', 'kibana'); + await supertest + .post(`${apiPath}/flights?now=${nowString}`) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const resp = await es.search<{ timestamp: string }>({ index: 'kibana_sample_data_flights', @@ -115,7 +128,11 @@ export default function ({ getService }: FtrProviderContext) { describe(`list in the ${space} space (after install)`, () => { it('should return list of sample data sets with installed status', async () => { - const resp = await supertest.get(apiPath).set('kbn-xsrf', 'kibana').expect(200); + const resp = await supertest + .get(apiPath) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); const flightsData = findFlightsData(resp); expect(flightsData.status).to.be('installed'); @@ -143,7 +160,12 @@ export default function ({ getService }: FtrProviderContext) { describe(`uninstall in the ${space} space`, () => { it('should uninstall sample data', async () => { // Note: the second time this happens, the index has already been removed, but the uninstall works anyway - await supertest.delete(`${apiPath}/flights`).set('kbn-xsrf', 'kibana').expect(204); + await supertest + .delete(`${apiPath}/flights`) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(204); }); it('should remove elasticsearch index containing sample data', async () => { @@ -156,7 +178,11 @@ export default function ({ getService }: FtrProviderContext) { describe(`list in the ${space} space (after uninstall)`, () => { it('should return list of sample data sets with installed status', async () => { - const resp = await supertest.get(apiPath).set('kbn-xsrf', 'kibana').expect(200); + const resp = await supertest + .get(apiPath) + .set('kbn-xsrf', 'kibana') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); const flightsData = findFlightsData(resp); expect(flightsData.status).to.be('not_installed'); diff --git a/test/api_integration/apis/kql_telemetry/kql_telemetry.ts b/test/api_integration/apis/kql_telemetry/kql_telemetry.ts index c3e0d20d276b4..7d3224c0306a5 100644 --- a/test/api_integration/apis/kql_telemetry/kql_telemetry.ts +++ b/test/api_integration/apis/kql_telemetry/kql_telemetry.ts @@ -11,7 +11,10 @@ import expect from '@kbn/expect'; import { get } from 'lodash'; import { ANALYTICS_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import { KQL_TELEMETRY_ROUTE_LATEST_VERSION } from '@kbn/data-plugin/common'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -36,6 +39,7 @@ export default function ({ getService }: FtrProviderContext) { .post('/internal/kql_opt_in_stats') .set('content-type', 'application/json') .set(ELASTIC_HTTP_VERSION_HEADER, KQL_TELEMETRY_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ opt_in: true }) .expect(200); @@ -55,6 +59,7 @@ export default function ({ getService }: FtrProviderContext) { .post('/internal/kql_opt_in_stats') .set('content-type', 'application/json') .set(ELASTIC_HTTP_VERSION_HEADER, KQL_TELEMETRY_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ opt_in: false }) .expect(200); @@ -74,6 +79,7 @@ export default function ({ getService }: FtrProviderContext) { .post('/internal/kql_opt_in_stats') .set('content-type', 'application/json') .set(ELASTIC_HTTP_VERSION_HEADER, KQL_TELEMETRY_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ opt_in: true }) .expect('Content-Type', /json/) .expect(200) @@ -87,6 +93,7 @@ export default function ({ getService }: FtrProviderContext) { .post('/internal/kql_opt_in_stats') .set('content-type', 'application/json') .set(ELASTIC_HTTP_VERSION_HEADER, KQL_TELEMETRY_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ opt_in: false }) .expect('Content-Type', /json/) .expect(200) @@ -101,6 +108,7 @@ export default function ({ getService }: FtrProviderContext) { .post('/internal/kql_opt_in_stats') .set('content-type', 'application/json') .set(ELASTIC_HTTP_VERSION_HEADER, KQL_TELEMETRY_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ opt_in: 'notabool' }) .expect(400), supertest diff --git a/test/api_integration/apis/saved_objects/bulk_create.ts b/test/api_integration/apis/saved_objects/bulk_create.ts index 80dbbc14e3b50..3e1ad63e3b6ed 100644 --- a/test/api_integration/apis/saved_objects/bulk_create.ts +++ b/test/api_integration/apis/saved_objects/bulk_create.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -47,6 +48,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses', async () => await supertest .post(`/s/${SPACE_ID}/api/saved_objects/_bulk_create`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(BULK_REQUESTS) .expect(200) .then((resp) => { @@ -87,6 +89,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not return raw id when object id is unspecified', async () => await supertest .post(`/s/${SPACE_ID}/api/saved_objects/_bulk_create`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(BULK_REQUESTS.map(({ id, ...rest }) => rest)) .expect(200) .then((resp) => { diff --git a/test/api_integration/apis/saved_objects/bulk_delete.ts b/test/api_integration/apis/saved_objects/bulk_delete.ts index f5c191e8dabe7..68b2862ff5c8b 100644 --- a/test/api_integration/apis/saved_objects/bulk_delete.ts +++ b/test/api_integration/apis/saved_objects/bulk_delete.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -29,6 +30,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses when deleting many docs', async () => await supertest .post(`/api/saved_objects/_bulk_delete`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'visualization', @@ -60,6 +62,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return generic 404 when deleting an unknown doc', async () => await supertest .post(`/api/saved_objects/_bulk_delete`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([{ type: 'dashboard', id: 'not-a-real-id' }]) .expect(200) .then((resp) => { @@ -82,6 +85,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return the result of deleting valid and invalid objects in the same request', async () => await supertest .post(`/api/saved_objects/_bulk_delete`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'visualization', id: 'not-a-real-vis-id' }, { diff --git a/test/api_integration/apis/saved_objects/bulk_get.ts b/test/api_integration/apis/saved_objects/bulk_get.ts index 37bb4f17b530d..019297455bdd0 100644 --- a/test/api_integration/apis/saved_objects/bulk_get.ts +++ b/test/api_integration/apis/saved_objects/bulk_get.ts @@ -9,6 +9,7 @@ import { MAIN_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -72,6 +73,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses', async () => await supertest .post(`/api/saved_objects/_bulk_get`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(BULK_REQUESTS) .expect(200) .then((resp) => { @@ -147,6 +149,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses that include the managed property of each object', async () => await supertest .post(`/api/saved_objects/_bulk_get`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(BULK_REQUESTS_MANAGED) .expect(200) .then((resp) => { @@ -281,6 +284,7 @@ export default function ({ getService }: FtrProviderContext) { const { body } = await supertest .post(`/api/saved_objects/_bulk_get`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'config', diff --git a/test/api_integration/apis/saved_objects/bulk_update.ts b/test/api_integration/apis/saved_objects/bulk_update.ts index 332cd84926922..2233dbdde641d 100644 --- a/test/api_integration/apis/saved_objects/bulk_update.ts +++ b/test/api_integration/apis/saved_objects/bulk_update.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import _ from 'lodash'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -30,6 +31,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200', async () => { const response = await supertest .put(`/api/saved_objects/_bulk_update`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'visualization', @@ -98,6 +100,7 @@ export default function ({ getService }: FtrProviderContext) { const response = await supertest .put(`/api/saved_objects/_bulk_update`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'visualization', @@ -160,6 +163,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .put(`/api/saved_objects/_bulk_update`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'visualization', @@ -191,6 +195,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return a generic 404', async () => { const response = await supertest .put(`/api/saved_objects/_bulk_update`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([ { type: 'visualization', diff --git a/test/api_integration/apis/saved_objects/create.ts b/test/api_integration/apis/saved_objects/create.ts index 40b1a3617f1fa..1778719fbc502 100644 --- a/test/api_integration/apis/saved_objects/create.ts +++ b/test/api_integration/apis/saved_objects/create.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -30,6 +31,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200', async () => { await supertest .post(`/api/saved_objects/visualization`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ attributes: { title: 'My favorite vis', @@ -72,6 +74,7 @@ export default function ({ getService }: FtrProviderContext) { it('result should not be updated to the latest Kibana version if there are no migrations', async () => { await supertest .post(`/api/saved_objects/visualization`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ attributes: { title: 'My favorite vis', diff --git a/test/api_integration/apis/saved_objects/delete.ts b/test/api_integration/apis/saved_objects/delete.ts index ba2b66548a558..4630943680f3b 100644 --- a/test/api_integration/apis/saved_objects/delete.ts +++ b/test/api_integration/apis/saved_objects/delete.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -29,6 +30,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 when deleting a doc', async () => await supertest .delete(`/api/saved_objects/dashboard/be3733a0-9efe-11e7-acb3-3dab96693fab`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({}); @@ -37,6 +39,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return generic 404 when deleting an unknown doc', async () => await supertest .delete(`/api/saved_objects/dashboard/not-a-real-id`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404) .then((resp) => { expect(resp.body).to.eql({ diff --git a/test/api_integration/apis/saved_objects/delete_unknown_types.ts b/test/api_integration/apis/saved_objects/delete_unknown_types.ts index e61c7d84bc580..b03f6eebc3cfb 100644 --- a/test/api_integration/apis/saved_objects/delete_unknown_types.ts +++ b/test/api_integration/apis/saved_objects/delete_unknown_types.ts @@ -12,6 +12,7 @@ import { MAIN_SAVED_OBJECT_INDEX, ANALYTICS_SAVED_OBJECT_INDEX, } from '@kbn/core-saved-objects-server'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); @@ -72,6 +73,7 @@ export default function ({ getService }: FtrProviderContext) { .post(`/internal/saved_objects/deprecations/_delete_unknown_types`) .send({}) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ success: true }); diff --git a/test/api_integration/apis/saved_objects/find.ts b/test/api_integration/apis/saved_objects/find.ts index 4664171879813..fb100210b19ac 100644 --- a/test/api_integration/apis/saved_objects/find.ts +++ b/test/api_integration/apis/saved_objects/find.ts @@ -11,6 +11,7 @@ import { sortBy } from 'lodash'; import { MAIN_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import expect from '@kbn/expect'; import { SavedObject } from '@kbn/core/server'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -47,6 +48,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses', async () => await supertest .get(`/s/${SPACE_ID}/api/saved_objects/_find?type=visualization&fields=title`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body.saved_objects.map((so: { id: string }) => so.id)).to.eql([ @@ -68,6 +70,7 @@ export default function ({ getService }: FtrProviderContext) { const { body } = await supertest .get(`/s/${SPACE_ID}/api/saved_objects/_find?type=config`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(body.saved_objects.map((so: { id: string }) => so.id)).to.eql(['7.0.0-alpha1']); @@ -81,6 +84,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with empty response', async () => await supertest .get(`/s/${SPACE_ID}/api/saved_objects/_find?type=wigwags`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -97,6 +101,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with empty response', async () => await supertest .get(`/s/${SPACE_ID}/api/saved_objects/_find?type=visualization&page=100&per_page=100`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -112,6 +117,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with empty response', async () => await supertest .get(`/s/${SPACE_ID}/api/saved_objects/_find?type=url&search_fields=a`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -127,6 +133,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with empty response', async () => await supertest .get(`/s/${SPACE_ID}/api/saved_objects/_find?type=visualization&namespaces=foo`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -142,6 +149,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses', async () => await supertest .get(`/api/saved_objects/_find?type=visualization&fields=title&namespaces=${SPACE_ID}`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect( @@ -161,6 +169,7 @@ export default function ({ getService }: FtrProviderContext) { .get( `/api/saved_objects/_find?type=visualization&fields=title&fields=originId&namespaces=*` ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const knownDocuments = resp.body.saved_objects.filter((so: { namespaces: string[] }) => @@ -187,6 +196,7 @@ export default function ({ getService }: FtrProviderContext) { .get( `/s/${SPACE_ID}/api/saved_objects/_find?type=visualization&filter=visualization.attributes.title:"Count of requests"` ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body.saved_objects.map((so: { id: string }) => so.id)).to.eql([ @@ -199,6 +209,7 @@ export default function ({ getService }: FtrProviderContext) { .get( `/s/${SPACE_ID}/api/saved_objects/_find?type=visualization&filter=dashboard.attributes.title:foo` ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400) .then((resp) => { expect(resp.body).to.eql({ @@ -213,6 +224,7 @@ export default function ({ getService }: FtrProviderContext) { .get( `/s/${SPACE_ID}/api/saved_objects/_find?type=dashboard&filter=dashboard.attributes.title:foo { expect(resp.body.error).to.be('Bad Request'); @@ -231,6 +243,7 @@ export default function ({ getService }: FtrProviderContext) { }) )}` ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -255,6 +268,7 @@ export default function ({ getService }: FtrProviderContext) { }) )}` ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400) .then((resp) => { expect(resp.body).to.eql({ @@ -279,6 +293,7 @@ export default function ({ getService }: FtrProviderContext) { }) )}` ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400) .then((resp) => { expect(resp.body).to.eql({ @@ -311,6 +326,7 @@ export default function ({ getService }: FtrProviderContext) { type: 'visualization', has_reference: JSON.stringify({ type: 'ref-type', id: 'ref-1' }), }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -332,6 +348,7 @@ export default function ({ getService }: FtrProviderContext) { ]), has_reference_operator: 'OR', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -354,6 +371,7 @@ export default function ({ getService }: FtrProviderContext) { ]), has_reference_operator: 'AND', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -383,6 +401,7 @@ export default function ({ getService }: FtrProviderContext) { type: 'visualization', has_no_reference: JSON.stringify({ type: 'ref-type', id: 'ref-1' }), }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -405,6 +424,7 @@ export default function ({ getService }: FtrProviderContext) { ]), has_no_reference_operator: 'OR', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -428,6 +448,7 @@ export default function ({ getService }: FtrProviderContext) { ]), has_no_reference_operator: 'AND', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -462,6 +483,7 @@ export default function ({ getService }: FtrProviderContext) { has_reference: JSON.stringify({ type: 'ref-type', id: 'ref-1' }), has_no_reference: JSON.stringify({ type: 'ref-type', id: 'ref-2' }), }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -478,6 +500,7 @@ export default function ({ getService }: FtrProviderContext) { has_reference: JSON.stringify({ type: 'ref-type', id: 'ref-1' }), has_no_reference: JSON.stringify({ type: 'ref-type', id: 'ref-1' }), }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const objects = resp.body.saved_objects; @@ -509,6 +532,7 @@ export default function ({ getService }: FtrProviderContext) { search_fields: 'title', search: 'my-vis*', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const savedObjects = resp.body.saved_objects; @@ -525,6 +549,7 @@ export default function ({ getService }: FtrProviderContext) { search_fields: 'title', search: 'my-*', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const savedObjects = resp.body.saved_objects; @@ -541,6 +566,7 @@ export default function ({ getService }: FtrProviderContext) { search_fields: 'title', search: 'some*vi*', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const savedObjects = resp.body.saved_objects; @@ -557,6 +583,7 @@ export default function ({ getService }: FtrProviderContext) { search_fields: 'title', search: 'visuali*', }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { const savedObjects = resp.body.saved_objects; diff --git a/test/api_integration/apis/saved_objects/get.ts b/test/api_integration/apis/saved_objects/get.ts index 2f03a8d031a1e..d745c0ea2d585 100644 --- a/test/api_integration/apis/saved_objects/get.ts +++ b/test/api_integration/apis/saved_objects/get.ts @@ -9,6 +9,7 @@ import { MAIN_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -37,6 +38,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200', async () => await supertest .get(`/api/saved_objects/visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -74,6 +76,7 @@ export default function ({ getService }: FtrProviderContext) { it("should return an object's managed property", async () => { await supertest .get(`/api/saved_objects/dashboard/11fb046d-0e50-48a0-a410-a744b82cbffd`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { expect(resp.body).to.eql({ @@ -126,7 +129,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const { body } = await supertest.get(`/api/saved_objects/config/7.0.0-alpha1`).expect(200); + const { body } = await supertest + .get(`/api/saved_objects/config/7.0.0-alpha1`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(body.coreMigrationVersion).to.be.ok(); expect(body.coreMigrationVersion).not.to.be('7.0.0'); @@ -138,6 +144,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return same generic error as when index does not exist', async () => await supertest .get(`/api/saved_objects/visualization/foobar`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404) .then((resp) => { expect(resp.body).to.eql({ diff --git a/test/api_integration/apis/saved_objects/resolve.ts b/test/api_integration/apis/saved_objects/resolve.ts index b538216e0ec19..6ef773b2c170f 100644 --- a/test/api_integration/apis/saved_objects/resolve.ts +++ b/test/api_integration/apis/saved_objects/resolve.ts @@ -9,6 +9,7 @@ import { MAIN_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -32,6 +33,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200', async () => await supertest .get(`/api/saved_objects/resolve/visualization/dd7caf20-9efd-11e7-acb3-3dab96693fab`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { resp.body.saved_object.updated_at = '2015-01-01T00:00:00.000Z'; @@ -85,6 +87,7 @@ export default function ({ getService }: FtrProviderContext) { const { body } = await supertest .get(`/api/saved_objects/resolve/config/7.0.0-alpha1`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(body.saved_object.coreMigrationVersion).to.be.ok(); @@ -97,6 +100,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return same generic error as when index does not exist', async () => await supertest .get(`/api/saved_objects/resolve/visualization/foobar`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404) .then((resp) => { expect(resp.body).to.eql({ diff --git a/test/api_integration/apis/saved_objects/update.ts b/test/api_integration/apis/saved_objects/update.ts index e04072f0bae0e..744704a7d3537 100644 --- a/test/api_integration/apis/saved_objects/update.ts +++ b/test/api_integration/apis/saved_objects/update.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -33,6 +34,7 @@ export default function ({ getService }: FtrProviderContext) { title: 'My second favorite vis', }, }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp) => { // loose uuid validation @@ -66,6 +68,7 @@ export default function ({ getService }: FtrProviderContext) { title: 'foo', }, }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body).not.to.have.property('references'); @@ -82,6 +85,7 @@ export default function ({ getService }: FtrProviderContext) { }, references, }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body).to.have.property('references'); @@ -97,6 +101,7 @@ export default function ({ getService }: FtrProviderContext) { }, references: [], }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body).to.have.property('references'); @@ -115,10 +120,12 @@ export default function ({ getService }: FtrProviderContext) { description: 'upserted description', }, }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); const { body: upserted } = await supertest .get(`/api/saved_objects/visualization/upserted-viz`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(upserted.attributes).to.eql({ @@ -137,10 +144,12 @@ export default function ({ getService }: FtrProviderContext) { version: 9000, }, }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); const { body: notUpserted } = await supertest .get(`/api/saved_objects/visualization/upserted-viz`) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(notUpserted.attributes).to.eql({ @@ -158,6 +167,7 @@ export default function ({ getService }: FtrProviderContext) { title: 'My second favorite vis', }, }) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404) .then((resp) => { expect(resp.body).eql({ diff --git a/test/api_integration/apis/saved_objects_management/bulk_delete.ts b/test/api_integration/apis/saved_objects_management/bulk_delete.ts index 5c71b982307f6..c1a862eb75b12 100644 --- a/test/api_integration/apis/saved_objects_management/bulk_delete.ts +++ b/test/api_integration/apis/saved_objects_management/bulk_delete.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import type { Response } from 'supertest'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -52,6 +53,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 for an existing object', async () => await supertest .post(endpoint) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([validObject]) .expect(200) .then((response: Response) => { @@ -62,6 +64,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return error for invalid object type', async () => await supertest .post(endpoint) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([invalidObject]) .expect(200) .then((response: Response) => { @@ -72,6 +75,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return mix of successes and errors', async () => await supertest .post(endpoint) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([validObject, invalidObject]) .expect(200) .then((response: Response) => { diff --git a/test/api_integration/apis/saved_objects_management/bulk_get.ts b/test/api_integration/apis/saved_objects_management/bulk_get.ts index 0acbb03fa7d53..01a05ff48758d 100644 --- a/test/api_integration/apis/saved_objects_management/bulk_get.ts +++ b/test/api_integration/apis/saved_objects_management/bulk_get.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import type { Response } from 'supertest'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -53,6 +54,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 for object that exists and inject metadata', async () => await supertest .post(URL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([validObject]) .expect(200) .then((response: Response) => { @@ -63,6 +65,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return error for invalid object type', async () => await supertest .post(URL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([invalidObject]) .expect(200) .then((response: Response) => { @@ -73,6 +76,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return mix of successes and errors', async () => await supertest .post(URL) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send([validObject, invalidObject]) .expect(200) .then((response: Response) => { diff --git a/test/api_integration/apis/saved_objects_management/find.ts b/test/api_integration/apis/saved_objects_management/find.ts index 539fb10c7ee09..5d5c953065eac 100644 --- a/test/api_integration/apis/saved_objects_management/find.ts +++ b/test/api_integration/apis/saved_objects_management/find.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { Response } from 'supertest'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -39,6 +40,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with individual responses', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=visualization') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body.saved_objects.map((so: { id: string }) => so.id)).to.eql([ @@ -50,6 +52,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 200 with empty response', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=wigwags') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body).to.eql({ @@ -67,6 +70,7 @@ export default function ({ getService }: FtrProviderContext) { .get( '/api/kibana/management/saved_objects/_find?type=visualization&page=100&perPage=100' ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body).to.eql({ @@ -82,6 +86,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 400 when using searchFields', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=url&searchFields=a') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(400) .then((resp: Response) => { expect(resp.body).to.eql({ @@ -107,6 +112,7 @@ export default function ({ getService }: FtrProviderContext) { it('search for a reference', async () => { await supertest .get('/api/kibana/management/saved_objects/_find') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ type: 'visualization', hasReference: JSON.stringify({ type: 'ref-type', id: 'ref-1' }), @@ -121,6 +127,7 @@ export default function ({ getService }: FtrProviderContext) { it('search for multiple references with OR operator', async () => { await supertest .get('/api/kibana/management/saved_objects/_find') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ type: 'visualization', hasReference: JSON.stringify([ @@ -143,6 +150,7 @@ export default function ({ getService }: FtrProviderContext) { it('search for multiple references with AND operator', async () => { await supertest .get('/api/kibana/management/saved_objects/_find') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ type: 'visualization', hasReference: JSON.stringify([ @@ -163,6 +171,7 @@ export default function ({ getService }: FtrProviderContext) { it('sort objects by "type" in "asc" order', async () => { await supertest .get('/api/kibana/management/saved_objects/_find') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ type: ['visualization', 'dashboard'], sortField: 'type', @@ -179,6 +188,7 @@ export default function ({ getService }: FtrProviderContext) { it('sort objects by "type" in "desc" order', async () => { await supertest .get('/api/kibana/management/saved_objects/_find') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .query({ type: ['visualization', 'dashboard'], sortField: 'type', @@ -210,6 +220,7 @@ export default function ({ getService }: FtrProviderContext) { it('should inject meta attributes for searches', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=search') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(1); @@ -228,6 +239,7 @@ export default function ({ getService }: FtrProviderContext) { it('should inject meta attributes for dashboards', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=dashboard') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(1); @@ -246,6 +258,7 @@ export default function ({ getService }: FtrProviderContext) { it('should inject meta attributes for visualizations', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=visualization') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(2); @@ -274,6 +287,7 @@ export default function ({ getService }: FtrProviderContext) { it('should inject meta attributes for index patterns', async () => await supertest .get('/api/kibana/management/saved_objects/_find?type=index-pattern') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((resp: Response) => { expect(resp.body.saved_objects).to.have.length(1); diff --git a/test/api_integration/apis/saved_objects_management/relationships.ts b/test/api_integration/apis/saved_objects_management/relationships.ts index 9245c84674458..15b7ee51d40af 100644 --- a/test/api_integration/apis/saved_objects_management/relationships.ts +++ b/test/api_integration/apis/saved_objects_management/relationships.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { schema } from '@kbn/config-schema'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -67,6 +68,7 @@ export default function ({ getService }: FtrProviderContext) { it('should validate search response schema', async () => { const resp = await supertest .get(relationshipsUrl('search', '960372e0-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(() => { @@ -77,6 +79,7 @@ export default function ({ getService }: FtrProviderContext) { it('should work for searches', async () => { const resp = await supertest .get(relationshipsUrl('search', '960372e0-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -119,6 +122,7 @@ export default function ({ getService }: FtrProviderContext) { .get( relationshipsUrl('search', '960372e0-3224-11e8-a572-ffca06da1357', ['visualization']) ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -159,6 +163,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 404 if search finds no results', async () => { await supertest .get(relationshipsUrl('search', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404); }); }); @@ -167,6 +172,7 @@ export default function ({ getService }: FtrProviderContext) { it('should validate dashboard response schema', async () => { const resp = await supertest .get(relationshipsUrl('dashboard', 'b70c7ae0-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(() => { @@ -177,6 +183,7 @@ export default function ({ getService }: FtrProviderContext) { it('should work for dashboards', async () => { const resp = await supertest .get(relationshipsUrl('dashboard', 'b70c7ae0-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -216,6 +223,7 @@ export default function ({ getService }: FtrProviderContext) { it('should filter based on savedObjectTypes', async () => { const resp = await supertest .get(relationshipsUrl('dashboard', 'b70c7ae0-3224-11e8-a572-ffca06da1357', ['search'])) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -255,6 +263,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 404 if dashboard finds no results', async () => { await supertest .get(relationshipsUrl('dashboard', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404); }); }); @@ -263,6 +272,7 @@ export default function ({ getService }: FtrProviderContext) { it('should validate visualization response schema', async () => { const resp = await supertest .get(relationshipsUrl('visualization', 'a42c0580-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(() => { @@ -273,6 +283,7 @@ export default function ({ getService }: FtrProviderContext) { it('should work for visualizations', async () => { const resp = await supertest .get(relationshipsUrl('visualization', 'a42c0580-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -314,6 +325,7 @@ export default function ({ getService }: FtrProviderContext) { .get( relationshipsUrl('visualization', 'a42c0580-3224-11e8-a572-ffca06da1357', ['search']) ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -338,6 +350,7 @@ export default function ({ getService }: FtrProviderContext) { it('should return 404 if visualizations finds no results', async () => { await supertest .get(relationshipsUrl('visualization', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404); }); }); @@ -346,6 +359,7 @@ export default function ({ getService }: FtrProviderContext) { it('should validate index-pattern response schema', async () => { const resp = await supertest .get(relationshipsUrl('index-pattern', '8963ca30-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(() => { @@ -356,6 +370,7 @@ export default function ({ getService }: FtrProviderContext) { it('should work for index patterns', async () => { const resp = await supertest .get(relationshipsUrl('index-pattern', '8963ca30-3224-11e8-a572-ffca06da1357')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -397,6 +412,7 @@ export default function ({ getService }: FtrProviderContext) { .get( relationshipsUrl('index-pattern', '8963ca30-3224-11e8-a572-ffca06da1357', ['search']) ) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); expect(resp.body.relations).to.eql([ @@ -421,13 +437,17 @@ export default function ({ getService }: FtrProviderContext) { it('should return 404 if index pattern finds no results', async () => { await supertest .get(relationshipsUrl('index-pattern', 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404); }); }); describe('invalid references', () => { it('should validate the response schema', async () => { - const resp = await supertest.get(relationshipsUrl('dashboard', 'invalid-refs')).expect(200); + const resp = await supertest + .get(relationshipsUrl('dashboard', 'invalid-refs')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(() => { responseSchema.validate(resp.body); @@ -435,7 +455,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('should return the invalid relations', async () => { - const resp = await supertest.get(relationshipsUrl('dashboard', 'invalid-refs')).expect(200); + const resp = await supertest + .get(relationshipsUrl('dashboard', 'invalid-refs')) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); expect(resp.body).to.eql({ invalidRelations: [ diff --git a/test/api_integration/apis/saved_objects_management/scroll_count.ts b/test/api_integration/apis/saved_objects_management/scroll_count.ts index dcaf1fedcd071..761f2aea4184a 100644 --- a/test/api_integration/apis/saved_objects_management/scroll_count.ts +++ b/test/api_integration/apis/saved_objects_management/scroll_count.ts @@ -8,6 +8,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; const apiUrl = '/api/kibana/management/saved_objects/scroll/counts'; @@ -36,6 +37,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns the count for each included types', async () => { const res = await supertest .post(apiUrl) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ typesToInclude: defaultTypes, }) @@ -52,6 +54,7 @@ export default function ({ getService }: FtrProviderContext) { it('only returns count for types to include', async () => { const res = await supertest .post(apiUrl) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ typesToInclude: ['dashboard', 'search'], }) @@ -66,6 +69,7 @@ export default function ({ getService }: FtrProviderContext) { it('filters on title when `searchString` is provided', async () => { const res = await supertest .post(apiUrl) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ typesToInclude: defaultTypes, searchString: 'Amazing', @@ -83,6 +87,7 @@ export default function ({ getService }: FtrProviderContext) { it('includes all requested types even when none match the search', async () => { const res = await supertest .post(apiUrl) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ typesToInclude: ['dashboard', 'search', 'visualization'], searchString: 'nothing-will-match', @@ -139,6 +144,7 @@ export default function ({ getService }: FtrProviderContext) { it('returns the correct count for each included types', async () => { const res = await supertest .post(apiUrl) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ typesToInclude: ['visualization'], }) diff --git a/test/api_integration/apis/saved_queries/saved_queries.ts b/test/api_integration/apis/saved_queries/saved_queries.ts index 679020430b877..f211dfc06da7f 100644 --- a/test/api_integration/apis/saved_queries/saved_queries.ts +++ b/test/api_integration/apis/saved_queries/saved_queries.ts @@ -8,7 +8,10 @@ */ import expect from '@kbn/expect'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { SavedQueryAttributes, SAVED_QUERY_BASE_URL } from '@kbn/data-plugin/common'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -33,33 +36,46 @@ export default function ({ getService }: FtrProviderContext) { supertest .post(`${SAVED_QUERY_BASE_URL}/_create`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(query); const updateQuery = (id: string, query: Partial = mockSavedQuery) => supertest .put(`${SAVED_QUERY_BASE_URL}/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(query); const deleteQuery = (id: string) => - supertest.delete(`${SAVED_QUERY_BASE_URL}/${id}`).set(ELASTIC_HTTP_VERSION_HEADER, '1'); + supertest + .delete(`${SAVED_QUERY_BASE_URL}/${id}`) + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const getQuery = (id: string) => - supertest.get(`${SAVED_QUERY_BASE_URL}/${id}`).set(ELASTIC_HTTP_VERSION_HEADER, '1'); + supertest + .get(`${SAVED_QUERY_BASE_URL}/${id}`) + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const findQueries = (options: { search?: string; perPage?: number; page?: number } = {}) => supertest .post(`${SAVED_QUERY_BASE_URL}/_find`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(options); const countQueries = () => - supertest.get(`${SAVED_QUERY_BASE_URL}/_count`).set(ELASTIC_HTTP_VERSION_HEADER, '1'); + supertest + .get(`${SAVED_QUERY_BASE_URL}/_count`) + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana'); const isDuplicateTitle = (title: string, id?: string) => supertest .post(`${SAVED_QUERY_BASE_URL}/_is_duplicate_title`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ title, id }); describe('Saved queries API', function () { diff --git a/test/api_integration/apis/scripts/languages.js b/test/api_integration/apis/scripts/languages.js index 2c85f359ce486..b77cc9c01c5ad 100644 --- a/test/api_integration/apis/scripts/languages.js +++ b/test/api_integration/apis/scripts/languages.js @@ -9,7 +9,10 @@ import expect from '@kbn/expect'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { SCRIPT_LANGUAGES_ROUTE_LATEST_VERSION } from '@kbn/data-plugin/common/constants'; export default function ({ getService }) { @@ -20,6 +23,7 @@ export default function ({ getService }) { supertest .get('/internal/scripts/languages') .set(ELASTIC_HTTP_VERSION_HEADER, SCRIPT_LANGUAGES_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((response) => { expect(response.body).to.be.an('array'); @@ -30,6 +34,7 @@ export default function ({ getService }) { supertest .get('/internal/scripts/languages') .set(ELASTIC_HTTP_VERSION_HEADER, SCRIPT_LANGUAGES_ROUTE_LATEST_VERSION) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((response) => { expect(response.body).to.contain('expression'); diff --git a/test/api_integration/apis/search/bsearch.ts b/test/api_integration/apis/search/bsearch.ts index ed080ee4f553c..2c4bcead1d475 100644 --- a/test/api_integration/apis/search/bsearch.ts +++ b/test/api_integration/apis/search/bsearch.ts @@ -10,7 +10,10 @@ import expect from '@kbn/expect'; import request from 'superagent'; import { inflateResponse } from '@kbn/bfetch-plugin/public/streaming'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { BFETCH_ROUTE_VERSION_LATEST } from '@kbn/bfetch-plugin/common'; import { FtrProviderContext } from '../../ftr_provider_context'; import { painlessErrReq } from './painless_err_req'; @@ -35,6 +38,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -68,6 +72,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch?compress=true`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -101,6 +106,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -144,6 +150,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -175,6 +182,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -215,6 +223,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -240,6 +249,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -274,6 +284,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -324,6 +335,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -359,6 +371,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -408,6 +421,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -436,6 +450,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -466,6 +481,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -495,6 +511,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { @@ -526,6 +543,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/bsearch`) .set(ELASTIC_HTTP_VERSION_HEADER, BFETCH_ROUTE_VERSION_LATEST) + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ batch: [ { diff --git a/test/api_integration/apis/search/search.ts b/test/api_integration/apis/search/search.ts index c3bf86933bd1c..01609bec6f1b9 100644 --- a/test/api_integration/apis/search/search.ts +++ b/test/api_integration/apis/search/search.ts @@ -7,7 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; import { painlessErrReq } from './painless_err_req'; @@ -31,6 +34,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/es`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { body: { @@ -53,6 +57,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/es`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { terminateAfter: 1, @@ -78,6 +83,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ body: { query: { @@ -94,6 +100,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/banana`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ body: { query: { @@ -102,9 +109,8 @@ export default function ({ getService }: FtrProviderContext) { }, }) .expect(404); - verifyErrorResponse(resp.body, 404); - expect(resp.body.message).to.contain('banana not found'); + expect(resp.body.message).to.be('Search strategy banana not found'); expect(resp.header).to.have.property(ELASTIC_HTTP_VERSION_HEADER, '1'); }); @@ -112,6 +118,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/es`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { timeout: 1, // This should be a time range string! @@ -133,6 +140,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/es`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { body: { @@ -150,6 +158,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/es`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(painlessErrReq) .expect(400); @@ -162,6 +171,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .delete(`/internal/search/es`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send() .expect(404); verifyErrorResponse(resp.body, 404); @@ -171,6 +181,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .delete(`/internal/search/es/123`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send() .expect(400); verifyErrorResponse(resp.body, 400); diff --git a/test/api_integration/apis/search/sql_search.ts b/test/api_integration/apis/search/sql_search.ts index e4d0f15e24040..374fdd263ee29 100644 --- a/test/api_integration/apis/search/sql_search.ts +++ b/test/api_integration/apis/search/sql_search.ts @@ -8,7 +8,10 @@ */ import expect from '@kbn/expect'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -31,6 +34,7 @@ export default function ({ getService }: FtrProviderContext) { const resp = await supertest .post(`/internal/search/sql`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { query: sqlQuery, @@ -49,6 +53,7 @@ export default function ({ getService }: FtrProviderContext) { const resp1 = await supertest .post(`/internal/search/sql`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { query: sqlQuery, @@ -61,6 +66,7 @@ export default function ({ getService }: FtrProviderContext) { const resp2 = await supertest .post(`/internal/search/sql/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({}); expect(resp2.status).to.be(200); @@ -77,6 +83,7 @@ export default function ({ getService }: FtrProviderContext) { const resp1 = await supertest .post(`/internal/search/sql`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ params: { query: sqlQuery, @@ -90,6 +97,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post(`/internal/search/sql/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({}) .expect(200); @@ -97,6 +105,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .delete(`/internal/search/sql/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send() .expect(200); @@ -104,6 +113,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post(`/internal/search/sql/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({}) .expect(404); }); diff --git a/test/api_integration/apis/suggestions/suggestions.js b/test/api_integration/apis/suggestions/suggestions.js index ad18af6689c63..97a1dbae734de 100644 --- a/test/api_integration/apis/suggestions/suggestions.js +++ b/test/api_integration/apis/suggestions/suggestions.js @@ -8,7 +8,10 @@ */ import expect from '@kbn/expect'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; export default function ({ getService }) { const esArchiver = getService('esArchiver'); @@ -37,6 +40,7 @@ export default function ({ getService }) { supertest .post('/internal/kibana/suggestions/values/basic_index') .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ field: 'baz.keyword', query: '', @@ -51,6 +55,7 @@ export default function ({ getService }) { supertest .post('/internal/kibana/suggestions/values/basic_index') .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ field: 'baz.keyword', method: 'terms_agg', @@ -66,6 +71,7 @@ export default function ({ getService }) { supertest .post('/internal/kibana/suggestions/values/basic_index') .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ field: 'baz.keyword', method: 'terms_enum', @@ -81,6 +87,7 @@ export default function ({ getService }) { supertest .post('/internal/kibana/suggestions/values/basic_index') .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ field: 'baz.keyword', query: ' { await supertest .get('/translations/en.json') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect('Cache-Control', 'public, max-age=31536000, immutable') .expect(200); }); it('allows the bootstrap bundles to be cached', async () => { - await supertest.get('/bootstrap.js').expect('Cache-Control', 'must-revalidate').expect(200); + await supertest + .get('/bootstrap.js') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect('Cache-Control', 'must-revalidate') + .expect(200); }); }); } diff --git a/test/server_integration/http/platform/status.ts b/test/server_integration/http/platform/status.ts index a00aa46ad9f23..f27a5e624de76 100644 --- a/test/server_integration/http/platform/status.ts +++ b/test/server_integration/http/platform/status.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import type { ServiceStatus, ServiceStatusLevels } from '@kbn/core/server'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../services/types'; type ServiceStatusSerialized = Omit & { level: string }; @@ -30,6 +31,7 @@ export default function ({ getService }: FtrProviderContext) { supertest .post(`/internal/status_plugin_a/status/set?level=${level}`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); describe('status service', function () { diff --git a/x-pack/test/api_integration/apis/spaces/get_active_space.ts b/x-pack/test/api_integration/apis/spaces/get_active_space.ts index 627b0847aee35..e32f20f0268b5 100644 --- a/x-pack/test/api_integration/apis/spaces/get_active_space.ts +++ b/x-pack/test/api_integration/apis/spaces/get_active_space.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -30,6 +31,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get('/internal/spaces/_active_space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((response) => { const { id, name, _reserved } = response.body; @@ -45,6 +47,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get('/s/default/internal/spaces/_active_space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((response) => { const { id, name, _reserved } = response.body; @@ -60,6 +63,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get('/s/foo-space/internal/spaces/_active_space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200, { id: 'foo-space', name: 'Foo Space', @@ -72,6 +76,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get('/s/not-found-space/internal/spaces/_active_space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404, { statusCode: 404, error: 'Not Found', diff --git a/x-pack/test/api_integration/apis/spaces/get_content_summary.ts b/x-pack/test/api_integration/apis/spaces/get_content_summary.ts index 39fa00ebd8ff1..07f9226dafa4c 100644 --- a/x-pack/test/api_integration/apis/spaces/get_content_summary.ts +++ b/x-pack/test/api_integration/apis/spaces/get_content_summary.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; const sampleDashboard = { @@ -71,16 +72,19 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post(`/s/${ATestSpace}/api/content_management/rpc/create`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(sampleDashboard); await supertest .post(`/s/${ATestSpace}/api/content_management/rpc/create`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(sampleDashboard); await supertest .get(`/internal/spaces/${ATestSpace}/content_summary`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((response) => { const { summary, total } = response.body; @@ -100,6 +104,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post(`/s/${BTestSpace}/api/content_management/rpc/create`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send(sampleDashboard); await supertest @@ -111,6 +116,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get(`/internal/spaces/${BTestSpace}/content_summary`) .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200) .then((response) => { const { summary, total } = response.body; @@ -137,6 +143,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get('/internal/spaces/not-found-space/content_summary') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(404, { statusCode: 404, error: 'Not Found', diff --git a/x-pack/test/api_integration/apis/spaces/saved_objects.ts b/x-pack/test/api_integration/apis/spaces/saved_objects.ts index 806929e67ebbc..63bf35ce76c6d 100644 --- a/x-pack/test/api_integration/apis/spaces/saved_objects.ts +++ b/x-pack/test/api_integration/apis/spaces/saved_objects.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -17,6 +18,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .get('/api/saved_objects/space/default') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send() .expect(404) .then((response: Record) => { @@ -33,6 +35,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not locate any spaces', async () => { await supertest .get('/api/saved_objects/_find?type=space') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .set('kbn-xsrf', 'xxx') .send() .expect(200) @@ -51,6 +54,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not allow a space to be created', async () => { await supertest .post('/api/saved_objects/space/my-space') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .set('kbn-xsrf', 'xxx') .send({ attributes: {} }) .expect(400) @@ -68,6 +72,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not allow a space to be updated', async () => { await supertest .post('/api/saved_objects/space/default') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .set('kbn-xsrf', 'xxx') .send({ attributes: {} }) .expect(400) @@ -85,6 +90,7 @@ export default function ({ getService }: FtrProviderContext) { it('should not allow a space to be deleted', async () => { await supertest .delete('/api/saved_objects/space/default') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .set('kbn-xsrf', 'xxx') .send() .expect(404) diff --git a/x-pack/test/api_integration/apis/spaces/space_attributes.ts b/x-pack/test/api_integration/apis/spaces/space_attributes.ts index 65cff6e1b6876..c9e02b8142e7e 100644 --- a/x-pack/test/api_integration/apis/spaces/space_attributes.ts +++ b/x-pack/test/api_integration/apis/spaces/space_attributes.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -15,6 +16,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post('/api/spaces/space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ id: 'api-test-space', name: 'api test space', @@ -33,6 +35,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post('/api/spaces/space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ id: 'api-test-space2', name: 'Space with image', @@ -55,6 +58,7 @@ export default function ({ getService }: FtrProviderContext) { await supertest .post('/api/spaces/space') .set('kbn-xsrf', 'xxx') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ id: 'api-test-space3', name: 'Space with invalid image', diff --git a/x-pack/test/ftr_apis/security_and_spaces/config.ts b/x-pack/test/ftr_apis/security_and_spaces/config.ts index 8cfc662bb0b96..2326d768ee776 100644 --- a/x-pack/test/ftr_apis/security_and_spaces/config.ts +++ b/x-pack/test/ftr_apis/security_and_spaces/config.ts @@ -30,6 +30,8 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { serverArgs: [ ...apiIntegrationConfig.get('kbnTestServer.serverArgs'), '--server.xsrf.disableProtection=true', + // disable internal API restriction. See https://github.com/elastic/kibana/issues/163654 + '--server.restrictInternalApis=false', `--xpack.fleet.registryUrl=http://localhost:12345`, // setting to invalid registry url to prevent installing preconfigured packages ], }, diff --git a/x-pack/test/functional/config.base.js b/x-pack/test/functional/config.base.js index 4fdb988fef098..033a7faa98303 100644 --- a/x-pack/test/functional/config.base.js +++ b/x-pack/test/functional/config.base.js @@ -51,6 +51,8 @@ export default async function ({ readConfigFile }) { '--xpack.discoverEnhanced.actions.exploreDataInContextMenu.enabled=true', '--savedObjects.maxImportPayloadBytes=10485760', // for OSS test management/_import_objects, '--savedObjects.allowHttpApiAccess=false', // override default to not allow hiddenFromHttpApis saved objects access to the http APIs see https://github.com/elastic/dev/issues/2200 + // explicitly disable internal API restriction. See https://github.com/elastic/kibana/issues/163654 + '--server.restrictInternalApis=false', // disable fleet task that writes to metrics.fleet_server.* data streams, impacting functional tests `--xpack.task_manager.unsafe.exclude_task_types=${JSON.stringify(['Fleet-Metrics-Task'])}`, ], From f7dc0570bb7e7efd98f02b9e819999c863ec4cab Mon Sep 17 00:00:00 2001 From: Milton Hultgren Date: Thu, 12 Sep 2024 09:27:59 +0200 Subject: [PATCH 016/168] [EEM] Add docs about how to iterate the design of a definition (#192474) --- .../entity_manager/docs/entity_definitions.md | 187 +++++++++++++++++- 1 file changed, 183 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md b/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md index deedb12ebf390..da02bc7f69c3f 100644 --- a/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md +++ b/x-pack/plugins/observability_solution/entity_manager/docs/entity_definitions.md @@ -16,13 +16,192 @@ To enable the backfill transform set a value to `history.settings.backfillSyncDe History and summary transforms will output their data to indices where history writes to time-based (monthly) indices (`.entities.v1.history..`) and summary writes to a unique indice (`.entities.v1.latest.`). For convenience we create type-based aliases on top on these indices, where the type is extracted from the `entityDefinition.type` property. For a definition of `type: service`, the data can be read through the `entities-service-history` and `entities-service-latest` aliases. -**Entity definition example**: +#### Iterating on a definition -One can create a definition with a `POST kbn:/internal/entities/definition` request, or through the [entity client](../server/lib/entity_client.ts). +One can create a definition with a request to `POST kbn:/internal/entities/definition`, or through the [entity client](../server/lib/entity_client.ts). -Given the `services_from_logs` definition below, the history transform will create one entity document per service per minute (based on `@timestamp` field, granted at least one document exist for a given bucket in the source indices), with the `logRate`, `logErrorRatio` metrics and `data_stream.type`, `sourceIndex` metadata aggregated over one minute. +When creating the definition, there are 3 main pieces to consider: +1. The core entity discovery settings +2. The metadata to collect for each entity that is identified +3. The metrics to compute for each entity that is identified -Note that it is not necessary to add the `identifyFields` as metadata as these will be automatically collected in the output documents, and that it is possible to set `identityFields` as optional. +Let's look at the most basic example, one that only discovers entities. + +```json +{ + "id": "my_hosts", + "name": "Hosts from logs data", + "description": "This definition extracts host entities from log data", + "version": "1.0.0", + "type": "host", + "indexPatterns": ["logs-*"], + "identityFields": ["host.name"], + "displayNameTemplate": "{{host.name}}", + "history": { + "timestampField": "@timestamp", + "interval": "2m", + "settings": { + "frequency": "2m" + } + } +} +``` + +This definition will look inside the `logs-*` index pattern for documents that container the field `host.name` and group them based on that value to create the entities. It will run the discovery every 2 minutes. +The documents will be of type "host" so they can be queried via `entities-host-history` or `entities-host-latest`. Beyond the basic `entity` fields, each entity document will also contain all the identify fields at the root of the document, this it is easy to find your hosts by filtering by `host.name`. Note that it is not necessary to add the `identifyFields` as metadata as these will be automatically collected in the output documents, and that it is possible to set `identityFields` as optional. + +An entity document for this definition will look like below. + +History: +```json +{ + "host": { + "name": "gke-edge-oblt-edge-oblt-pool-8fc2868f-jf56" + }, + "@timestamp": "2024-09-10T12:36:00.000Z", + "event": { + "ingested": "2024-09-10T13:06:54.211210797Z" + }, + "entity": { + "lastSeenTimestamp": "2024-09-10T12:37:59.334Z", + "identityFields": [ + "host.name" + ], + "id": "X/FDBqGTvfnAAHTrv6XfzQ==", + "definitionId": "my_hosts", + "definitionVersion": "1.0.0", + "schemaVersion": "v1", + "type": "host" + } +} +``` + +Latest: +```json +{ + "event": { + "ingested": "2024-09-10T13:07:19.042735184Z" + }, + "host": { + "name": "gke-edge-oblt-edge-oblt-pool-8fc2868f-lgmr" + }, + "entity": { + "firstSeenTimestamp": "2024-09-10T12:06:00.000Z", + "lastSeenTimestamp": "2024-09-10T13:03:59.432Z", + "id": "0j+khoOmcrluI7nhYSVnCw==", + "displayName": "gke-edge-oblt-edge-oblt-pool-8fc2868f-lgmr", + "definitionId": "my_hosts", + "definitionVersion": "1.0.0", + "identityFields": [ + "host.name" + ], + "type": "host", + "schemaVersion": "v1" + } +} +``` + +Let's extend our definition by adding some metadata and a metric to compute. We can do this by issuing a request to `PATCH kbn:/internal/entities/definition/my_hosts` with the following body: + +```json +{ + "version": "1.1.0", + "metadata": [ + "cloud.provider" + ], + "metrics": [ + { + "name": "cpu_usage_avg", + "equation": "A", + "metrics": [ + { + "name": "A", + "aggregation": "avg", + "field": "system.cpu.total.norm.pct" + } + ] + } + ] +} +``` + +Once that is done, we can view how the shape of the entity documents change. + +History: +```json +{ + "cloud": { + "provider": [ + "gcp" + ] + }, + "host": { + "name": "opbeans-go-nsn-7f8749688-qfw4t" + }, + "@timestamp": "2024-09-10T12:58:00.000Z", + "event": { + "ingested": "2024-09-10T13:28:50.505448228Z" + }, + "entity": { + "lastSeenTimestamp": "2024-09-10T12:59:57.501Z", + "schemaVersion": "v1", + "definitionVersion": "1.1.0", + "identityFields": [ + "host.name" + ], + "metrics": { + "log_rate": 183 + }, + "id": "8yUkkMImEDcbgXmMIm7rkA==", + "type": "host", + "definitionId": "my_hosts" + } +} +} +``` + +Latest: +```json +{ + "cloud": { + "provider": [ + "gcp" + ] + }, + "host": { + "name": "opbeans-go-nsn-7f8749688-qfw4t" + }, + "event": { + "ingested": "2024-09-10T13:29:15.028655880Z" + }, + "entity": { + "lastSeenTimestamp": "2024-09-10T13:25:59.278Z", + "schemaVersion": "v1", + "definitionVersion": "1.1.0", + "displayName": "opbeans-go-nsn-7f8749688-qfw4t", + "identityFields": [ + "host.name" + ], + "id": "8yUkkMImEDcbgXmMIm7rkA==", + "metrics": { + "log_rate": 203 + }, + "type": "host", + "firstSeenTimestamp": "2024-09-10T12:06:00.000Z", + "definitionId": "my_hosts" + } +} +``` + +The key additions to notice are: +1. The new root field `cloud.provider` +2. The new metric field `entity.metrics.log_rate` + +Through this iterative process you can craft a definition to meet your needs, verifying along the way that the data is captured as you expect. +In case the data is not captured correctly, a common cause is due to the exact timings of the two transforms. +If the history transform is lagging behind, then the latest transform will not have any data in its lookback window to capture. + +**Entity definition examples**: __service_from_logs definition__


From cd970c6c33e16c1a5460d1fa99742ba722c0c39a Mon Sep 17 00:00:00 2001
From: Zacqary Adam Xeper 
Date: Thu, 12 Sep 2024 02:29:45 -0500
Subject: [PATCH 017/168] [Embeddables Rebuild] Move legacy viusalize
 embeddable to legacy/embeddable (#192002)

## Summary

In visualize, renames the new `react_embeddable` folder to just
`embeddable`, and moves the previous `embeddable` folder to
`legacy/embeddable`.

Keeps a few constants and interfaces that are reused in the new
embeddable in the `embeddable` folder, and imports them into
`legacy/embeddable` where needed.

---------

Co-authored-by: Marco Liberati 
---
 .../public/dynamically_add_panels_example.tsx |    2 +-
 .../public/actions/edit_in_lens_action.tsx    |    2 +-
 .../create_vis_instance.ts                    |    0
 .../get_expression_renderer_props.ts          |    2 +-
 .../get_visualize_embeddable_factory_lazy.ts} |    5 +-
 .../visualizations/public/embeddable/index.ts |    8 +-
 .../save_to_library.ts                        |    0
 .../state.test.ts                             |    0
 .../{react_embeddable => embeddable}/state.ts |    0
 .../{react_embeddable => embeddable}/types.ts |    2 +-
 .../embeddable/visualize_embeddable.tsx       | 1176 +++++++----------
 src/plugins/visualizations/public/index.ts    |   13 +-
 .../{ => legacy}/embeddable/constants.ts      |    2 +-
 .../create_vis_embeddable_from_object.ts      |    6 +-
 .../{ => legacy}/embeddable/embeddables.scss  |    0
 .../public/legacy/embeddable/index.ts         |   18 +
 .../embeddable/visualize_embeddable.tsx       |  717 ++++++++++
 .../embeddable/visualize_embeddable_async.ts  |    0
 .../visualize_embeddable_factory.test.ts      |    0
 .../visualize_embeddable_factory.tsx          |   16 +-
 src/plugins/visualizations/public/plugin.ts   |   11 +-
 .../react_embeddable/visualize_embeddable.tsx |  549 --------
 .../save_with_confirmation.ts                 |    2 +-
 .../saved_visualization_references.ts         |    2 +-
 .../public/visualize_app/types.ts             |    2 +-
 .../utils/get_visualization_instance.ts       |    2 +-
 26 files changed, 1276 insertions(+), 1261 deletions(-)
 rename src/plugins/visualizations/public/{react_embeddable => embeddable}/create_vis_instance.ts (100%)
 rename src/plugins/visualizations/public/{react_embeddable => embeddable}/get_expression_renderer_props.ts (98%)
 rename src/plugins/visualizations/public/{react_embeddable/index.ts => embeddable/get_visualize_embeddable_factory_lazy.ts} (71%)
 rename src/plugins/visualizations/public/{react_embeddable => embeddable}/save_to_library.ts (100%)
 rename src/plugins/visualizations/public/{react_embeddable => embeddable}/state.test.ts (100%)
 rename src/plugins/visualizations/public/{react_embeddable => embeddable}/state.ts (100%)
 rename src/plugins/visualizations/public/{react_embeddable => embeddable}/types.ts (98%)
 rename src/plugins/visualizations/public/{ => legacy}/embeddable/constants.ts (91%)
 rename src/plugins/visualizations/public/{ => legacy}/embeddable/create_vis_embeddable_from_object.ts (94%)
 rename src/plugins/visualizations/public/{ => legacy}/embeddable/embeddables.scss (100%)
 create mode 100644 src/plugins/visualizations/public/legacy/embeddable/index.ts
 create mode 100644 src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable.tsx
 rename src/plugins/visualizations/public/{ => legacy}/embeddable/visualize_embeddable_async.ts (100%)
 rename src/plugins/visualizations/public/{ => legacy}/embeddable/visualize_embeddable_factory.test.ts (100%)
 rename src/plugins/visualizations/public/{ => legacy}/embeddable/visualize_embeddable_factory.tsx (96%)
 delete mode 100644 src/plugins/visualizations/public/react_embeddable/visualize_embeddable.tsx

diff --git a/examples/portable_dashboards_example/public/dynamically_add_panels_example.tsx b/examples/portable_dashboards_example/public/dynamically_add_panels_example.tsx
index fad894349491b..3816beea96341 100644
--- a/examples/portable_dashboards_example/public/dynamically_add_panels_example.tsx
+++ b/examples/portable_dashboards_example/public/dynamically_add_panels_example.tsx
@@ -23,7 +23,7 @@ import {
   VisualizeEmbeddable,
   VisualizeInput,
   VisualizeOutput,
-} from '@kbn/visualizations-plugin/public/embeddable/visualize_embeddable';
+} from '@kbn/visualizations-plugin/public/legacy/embeddable/visualize_embeddable';
 
 const INPUT_KEY = 'portableDashboard:saveExample:input';
 
diff --git a/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx b/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx
index 6d3a2ce697f7b..8995b2abf7385 100644
--- a/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx
+++ b/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx
@@ -26,7 +26,7 @@ import {
 import { Action } from '@kbn/ui-actions-plugin/public';
 import React from 'react';
 import { take } from 'rxjs';
-import { apiHasVisualizeConfig, HasVisualizeConfig } from '../embeddable';
+import { apiHasVisualizeConfig, HasVisualizeConfig } from '../legacy/embeddable';
 import {
   apiHasExpressionVariables,
   HasExpressionVariables,
diff --git a/src/plugins/visualizations/public/react_embeddable/create_vis_instance.ts b/src/plugins/visualizations/public/embeddable/create_vis_instance.ts
similarity index 100%
rename from src/plugins/visualizations/public/react_embeddable/create_vis_instance.ts
rename to src/plugins/visualizations/public/embeddable/create_vis_instance.ts
diff --git a/src/plugins/visualizations/public/react_embeddable/get_expression_renderer_props.ts b/src/plugins/visualizations/public/embeddable/get_expression_renderer_props.ts
similarity index 98%
rename from src/plugins/visualizations/public/react_embeddable/get_expression_renderer_props.ts
rename to src/plugins/visualizations/public/embeddable/get_expression_renderer_props.ts
index 67d38577b54d4..69dfef84c2be0 100644
--- a/src/plugins/visualizations/public/react_embeddable/get_expression_renderer_props.ts
+++ b/src/plugins/visualizations/public/embeddable/get_expression_renderer_props.ts
@@ -10,7 +10,7 @@
 import type { KibanaExecutionContext } from '@kbn/core-execution-context-common';
 import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query';
 import { ExpressionRendererEvent, ExpressionRendererParams } from '@kbn/expressions-plugin/public';
-import { toExpressionAst } from '../embeddable/to_ast';
+import { toExpressionAst } from './to_ast';
 import { getExecutionContext, getTimeFilter } from '../services';
 import type { VisParams } from '../types';
 import type { Vis } from '../vis';
diff --git a/src/plugins/visualizations/public/react_embeddable/index.ts b/src/plugins/visualizations/public/embeddable/get_visualize_embeddable_factory_lazy.ts
similarity index 71%
rename from src/plugins/visualizations/public/react_embeddable/index.ts
rename to src/plugins/visualizations/public/embeddable/get_visualize_embeddable_factory_lazy.ts
index 77f7ee433a996..b14d03ec5030c 100644
--- a/src/plugins/visualizations/public/react_embeddable/index.ts
+++ b/src/plugins/visualizations/public/embeddable/get_visualize_embeddable_factory_lazy.ts
@@ -7,4 +7,7 @@
  * License v3.0 only", or the "Server Side Public License, v 1".
  */
 
-export { getVisualizeEmbeddableFactory } from './visualize_embeddable';
+export const getVisualizeEmbeddableFactoryLazy = async () => {
+  const { getVisualizeEmbeddableFactory } = await import('./visualize_embeddable');
+  return getVisualizeEmbeddableFactory;
+};
diff --git a/src/plugins/visualizations/public/embeddable/index.ts b/src/plugins/visualizations/public/embeddable/index.ts
index c3855d3ab171f..6d1649771c8ef 100644
--- a/src/plugins/visualizations/public/embeddable/index.ts
+++ b/src/plugins/visualizations/public/embeddable/index.ts
@@ -7,11 +7,5 @@
  * License v3.0 only", or the "Server Side Public License, v 1".
  */
 
-export { VisualizeEmbeddableFactory } from './visualize_embeddable_factory';
-export { VISUALIZE_EMBEDDABLE_TYPE, COMMON_VISUALIZATION_GROUPING } from './constants';
+export { getVisualizeEmbeddableFactoryLazy } from './get_visualize_embeddable_factory_lazy';
 export { VIS_EVENT_TO_TRIGGER } from './events';
-export { createVisEmbeddableFromObject } from './create_vis_embeddable_from_object';
-
-export type { VisualizeEmbeddable, VisualizeInput } from './visualize_embeddable';
-
-export { type HasVisualizeConfig, apiHasVisualizeConfig } from './interfaces/has_visualize_config';
diff --git a/src/plugins/visualizations/public/react_embeddable/save_to_library.ts b/src/plugins/visualizations/public/embeddable/save_to_library.ts
similarity index 100%
rename from src/plugins/visualizations/public/react_embeddable/save_to_library.ts
rename to src/plugins/visualizations/public/embeddable/save_to_library.ts
diff --git a/src/plugins/visualizations/public/react_embeddable/state.test.ts b/src/plugins/visualizations/public/embeddable/state.test.ts
similarity index 100%
rename from src/plugins/visualizations/public/react_embeddable/state.test.ts
rename to src/plugins/visualizations/public/embeddable/state.test.ts
diff --git a/src/plugins/visualizations/public/react_embeddable/state.ts b/src/plugins/visualizations/public/embeddable/state.ts
similarity index 100%
rename from src/plugins/visualizations/public/react_embeddable/state.ts
rename to src/plugins/visualizations/public/embeddable/state.ts
diff --git a/src/plugins/visualizations/public/react_embeddable/types.ts b/src/plugins/visualizations/public/embeddable/types.ts
similarity index 98%
rename from src/plugins/visualizations/public/react_embeddable/types.ts
rename to src/plugins/visualizations/public/embeddable/types.ts
index b0c6b296112b9..2536b478debb4 100644
--- a/src/plugins/visualizations/public/react_embeddable/types.ts
+++ b/src/plugins/visualizations/public/embeddable/types.ts
@@ -22,7 +22,7 @@ import {
   SerializedTitles,
 } from '@kbn/presentation-publishing';
 import { DeepPartial } from '@kbn/utility-types';
-import { HasVisualizeConfig } from '../embeddable';
+import { HasVisualizeConfig } from '../legacy/embeddable';
 import type { Vis, VisParams, VisSavedObject } from '../types';
 import type { SerializedVis } from '../vis';
 
diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx
index 6c684b58af888..8e1861af15a98 100644
--- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx
+++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx
@@ -7,711 +7,543 @@
  * License v3.0 only", or the "Server Side Public License, v 1".
  */
 
-import _, { get } from 'lodash';
-import { Subscription, ReplaySubject, mergeMap } from 'rxjs';
-import { i18n } from '@kbn/i18n';
-import React from 'react';
-import { render } from 'react-dom';
-import { EuiLoadingChart } from '@elastic/eui';
-import { Filter, onlyDisabledFiltersChanged, Query, TimeRange } from '@kbn/es-query';
-import type { KibanaExecutionContext, SavedObjectAttributes } from '@kbn/core/public';
-import type { ErrorLike } from '@kbn/expressions-plugin/common';
-import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render';
-import { TimefilterContract } from '@kbn/data-plugin/public';
+import { EuiEmptyPrompt, EuiFlexGroup, EuiLoadingChart } from '@elastic/eui';
+import { isChartSizeEvent } from '@kbn/chart-expressions-common';
+import { APPLY_FILTER_TRIGGER } from '@kbn/data-plugin/public';
 import type { DataView } from '@kbn/data-views-plugin/public';
-import { Warnings } from '@kbn/charts-plugin/public';
-import { hasUnsupportedDownsampledAggregationFailure } from '@kbn/search-response-warnings';
+import { EmbeddableEnhancedPluginStart } from '@kbn/embeddable-enhanced-plugin/public';
 import {
-  Adapters,
-  AttributeService,
-  Embeddable,
-  EmbeddableInput,
-  EmbeddableOutput,
-  FilterableEmbeddable,
-  IContainer,
-  ReferenceOrValueEmbeddable,
-  SavedObjectEmbeddableInput,
+  EmbeddableStart,
+  ReactEmbeddableFactory,
+  SELECT_RANGE_TRIGGER,
 } from '@kbn/embeddable-plugin/public';
+import { ExpressionRendererParams, useExpressionRenderer } from '@kbn/expressions-plugin/public';
+import { i18n } from '@kbn/i18n';
+import { dispatchRenderComplete } from '@kbn/kibana-utils-plugin/public';
+import { apiPublishesSettings } from '@kbn/presentation-containers';
 import {
-  ExpressionAstExpression,
-  ExpressionLoader,
-  ExpressionRenderError,
-  IExpressionLoaderParams,
-} from '@kbn/expressions-plugin/public';
-import type { RenderMode } from '@kbn/expressions-plugin/common';
-import { DATA_VIEW_SAVED_OBJECT_TYPE } from '@kbn/data-views-plugin/public';
-import { mapAndFlattenFilters } from '@kbn/data-plugin/public';
-import { isChartSizeEvent } from '@kbn/chart-expressions-common';
-import { isFallbackDataView } from '../visualize_app/utils';
-import { VisualizationMissedSavedObjectError } from '../components/visualization_missed_saved_object_error';
-import VisualizationError from '../components/visualization_error';
-import { VISUALIZE_EMBEDDABLE_TYPE } from './constants';
-import { SerializedVis, Vis } from '../vis';
-import { getApplication, getExecutionContext, getExpressions, getUiActions } from '../services';
+  apiHasAppContext,
+  apiHasDisableTriggers,
+  apiHasExecutionContext,
+  apiIsOfType,
+  apiPublishesTimeRange,
+  apiPublishesTimeslice,
+  apiPublishesUnifiedSearch,
+  apiPublishesViewMode,
+  fetch$,
+  getUnchangingComparator,
+  initializeTimeRange,
+  initializeTitles,
+  useStateFromPublishingSubject,
+} from '@kbn/presentation-publishing';
+import { apiPublishesSearchSession } from '@kbn/presentation-publishing/interfaces/fetch/publishes_search_session';
+import { get, isEmpty, isEqual, isNil, omitBy } from 'lodash';
+import React, { useEffect, useRef } from 'react';
+import { BehaviorSubject, switchMap } from 'rxjs';
+import { VISUALIZE_APP_NAME, VISUALIZE_EMBEDDABLE_TYPE } from '../../common/constants';
 import { VIS_EVENT_TO_TRIGGER } from './events';
-import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory';
-import { getSavedVisualization } from '../utils/saved_visualize_utils';
-import { VisSavedObject } from '../types';
-import { toExpressionAst } from './to_ast';
-
-export interface VisualizeEmbeddableConfiguration {
-  vis: Vis;
-  indexPatterns?: DataView[];
-  editPath: string;
-  editUrl: string;
-  capabilities: { visualizeSave: boolean; dashboardSave: boolean; visualizeOpen: boolean };
-  deps: VisualizeEmbeddableFactoryDeps;
-}
-
-export interface VisualizeInput extends EmbeddableInput {
-  vis?: {
-    colors?: { [key: string]: string };
-  };
-  savedVis?: SerializedVis;
-  renderMode?: RenderMode;
-  table?: unknown;
-  query?: Query;
-  filters?: Filter[];
-  timeRange?: TimeRange;
-  timeslice?: [number, number];
-}
-
-export interface VisualizeOutput extends EmbeddableOutput {
-  editPath: string;
-  editApp: string;
-  editUrl: string;
-  indexPatterns?: DataView[];
-  visTypeName: string;
-}
-
-export type VisualizeSavedObjectAttributes = SavedObjectAttributes & {
-  title: string;
-  vis?: Vis;
-  savedVis?: VisSavedObject;
-};
-export type VisualizeByValueInput = { attributes: VisualizeSavedObjectAttributes } & VisualizeInput;
-export type VisualizeByReferenceInput = SavedObjectEmbeddableInput & VisualizeInput;
-
-/** @deprecated
- * VisualizeEmbeddable is no longer registered with the legacy embeddable system and is only
- * used within the visualize editor.
- */
-export class VisualizeEmbeddable
-  extends Embeddable
-  implements
-    ReferenceOrValueEmbeddable,
-    FilterableEmbeddable
-{
-  private handler?: ExpressionLoader;
-  private timefilter: TimefilterContract;
-  private timeRange?: TimeRange;
-  private query?: Query;
-  private filters?: Filter[];
-  private searchSessionId?: string;
-  private syncColors?: boolean;
-  private syncTooltips?: boolean;
-  private syncCursor?: boolean;
-  private embeddableTitle?: string;
-  private visCustomizations?: Pick;
-  private subscriptions: Subscription[] = [];
-  private expression?: ExpressionAstExpression;
-  private vis: Vis;
-  private domNode: any;
-  private warningDomNode: any;
-  public readonly type = VISUALIZE_EMBEDDABLE_TYPE;
-  private abortController?: AbortController;
-  private readonly deps: VisualizeEmbeddableFactoryDeps;
-  private readonly inspectorAdapters?: Adapters;
-  private attributeService?: AttributeService<
-    VisualizeSavedObjectAttributes,
-    VisualizeByValueInput,
-    VisualizeByReferenceInput
-  >;
-  private expressionVariables: Record | undefined;
-  private readonly expressionVariablesSubject = new ReplaySubject<
-    Record | undefined
-  >(1);
-
-  constructor(
-    timefilter: TimefilterContract,
-    { vis, editPath, editUrl, indexPatterns, deps, capabilities }: VisualizeEmbeddableConfiguration,
-    initialInput: VisualizeInput,
-    attributeService?: AttributeService<
-      VisualizeSavedObjectAttributes,
-      VisualizeByValueInput,
-      VisualizeByReferenceInput
-    >,
-    parent?: IContainer
-  ) {
-    super(
-      initialInput,
-      {
-        defaultTitle: vis.title,
-        defaultDescription: vis.description,
-        editPath,
-        editApp: 'visualize',
-        editUrl,
-        indexPatterns,
-        visTypeName: vis.type.name,
-      },
-      parent
-    );
-    this.deps = deps;
-    this.timefilter = timefilter;
-    this.syncColors = this.input.syncColors;
-    this.syncTooltips = this.input.syncTooltips;
-    this.syncCursor = this.input.syncCursor;
-    this.searchSessionId = this.input.searchSessionId;
-    this.query = this.input.query;
-    this.embeddableTitle = this.getTitle();
-
-    this.vis = vis;
-    this.vis.uiState.on('change', this.uiStateChangeHandler);
-    this.vis.uiState.on('reload', this.reload);
-    this.attributeService = attributeService;
-
-    if (this.attributeService) {
-      const readOnly = Boolean(vis.type.disableEdit);
-      const isByValue = !this.inputIsRefType(initialInput);
-      const editable = readOnly
-        ? false
-        : capabilities.visualizeSave ||
-          (isByValue && capabilities.dashboardSave && capabilities.visualizeOpen);
-      this.updateOutput({ ...this.getOutput(), editable });
-    }
-
-    this.subscriptions.push(
-      this.getInput$().subscribe(() => {
-        const isDirty = this.handleChanges();
+import { getCapabilities, getInspector, getUiActions, getUsageCollection } from '../services';
+import { ACTION_CONVERT_TO_LENS } from '../triggers';
+import { urlFor } from '../utils/saved_visualize_utils';
+import type { SerializedVis, Vis } from '../vis';
+import { createVisInstance } from './create_vis_instance';
+import { getExpressionRendererProps } from './get_expression_renderer_props';
+import { saveToLibrary } from './save_to_library';
+import { deserializeState, serializeState } from './state';
+import {
+  ExtraSavedObjectProperties,
+  VisualizeApi,
+  VisualizeOutputState,
+  VisualizeRuntimeState,
+  VisualizeSerializedState,
+  isVisualizeSavedObjectState,
+} from './types';
+
+export const getVisualizeEmbeddableFactory: (deps: {
+  embeddableStart: EmbeddableStart;
+  embeddableEnhancedStart?: EmbeddableEnhancedPluginStart;
+}) => ReactEmbeddableFactory = ({
+  embeddableStart,
+  embeddableEnhancedStart,
+}) => ({
+  type: VISUALIZE_EMBEDDABLE_TYPE,
+  deserializeState,
+  buildEmbeddable: async (initialState: unknown, buildApi, uuid, parentApi) => {
+    // Handle state transfer from legacy visualize editor, which uses the legacy visualize embeddable and doesn't
+    // produce a snapshot state. If buildEmbeddable is passed only a savedObjectId in the state, this means deserializeState
+    // was never run, and it needs to be invoked manually
+    const state = isVisualizeSavedObjectState(initialState)
+      ? await deserializeState({
+          rawState: initialState,
+        })
+      : (initialState as VisualizeRuntimeState);
 
-        if (isDirty && this.handler) {
-          this.updateHandler();
-        }
-      })
+    // Initialize dynamic actions
+    const dynamicActionsApi = embeddableEnhancedStart?.initializeReactEmbeddableDynamicActions(
+      uuid,
+      () => titlesApi.panelTitle.getValue(),
+      state
     );
+    // if it is provided, start the dynamic actions manager
+    const maybeStopDynamicActions = dynamicActionsApi?.startDynamicActions();
+
+    const { titlesApi, titleComparators, serializeTitles } = initializeTitles(state);
+
+    // Count renders; mostly used for testing.
+    const renderCount$ = new BehaviorSubject(0);
+    const hasRendered$ = new BehaviorSubject(false);
+
+    // Track vis data and initialize it into a vis instance
+    const serializedVis$ = new BehaviorSubject(state.serializedVis);
+    const initialVisInstance = await createVisInstance(state.serializedVis);
+    const vis$ = new BehaviorSubject(initialVisInstance);
+
+    // Track UI state
+    const onUiStateChange = () => serializedVis$.next(vis$.getValue().serialize());
+    initialVisInstance.uiState.on('change', onUiStateChange);
+    vis$.subscribe((vis) => vis.uiState.on('change', onUiStateChange));
+
+    // When the serialized vis changes, update the vis instance
+    serializedVis$
+      .pipe(
+        switchMap(async (serializedVis) => {
+          const currentVis = vis$.getValue();
+          if (currentVis) currentVis.uiState.off('change', onUiStateChange);
+          const vis = await createVisInstance(serializedVis);
+          const { params, abortController } = await getExpressionParams();
+          return { vis, params, abortController };
+        })
+      )
+      .subscribe(({ vis, params, abortController }) => {
+        vis$.next(vis);
+        if (params) expressionParams$.next(params);
+        expressionAbortController$.next(abortController);
+      });
 
-    const inspectorAdapters = this.vis.type.inspectorAdapters;
-
-    if (inspectorAdapters) {
-      this.inspectorAdapters =
-        typeof inspectorAdapters === 'function' ? inspectorAdapters() : inspectorAdapters;
-    }
-  }
-
-  public reportsEmbeddableLoad() {
-    return true;
-  }
-
-  public getVis() {
-    return this.vis;
-  }
-
-  /**
-   * Gets the Visualize embeddable's local filters
-   * @returns Local/panel-level array of filters for Visualize embeddable
-   */
-  public getFilters() {
-    const filters = this.vis.serialize().data.searchSource?.filter ?? [];
-    // must clone the filters so that it's not read only, because mapAndFlattenFilters modifies the array
-    return mapAndFlattenFilters(_.cloneDeep(filters));
-  }
-
-  /**
-   * Gets the Visualize embeddable's local query
-   * @returns Local/panel-level query for Visualize embeddable
-   */
-  public getQuery() {
-    return this.vis.serialize().data.searchSource.query;
-  }
-
-  public getInspectorAdapters = () => {
-    if (!this.handler || (this.inspectorAdapters && !Object.keys(this.inspectorAdapters).length)) {
-      return undefined;
-    }
-    return this.handler.inspect();
-  };
-
-  public openInspector = () => {
-    if (!this.handler) return;
-
-    const adapters = this.handler.inspect();
-    if (!adapters) return;
+    // Track visualizations linked to a saved object in the library
+    const savedObjectId$ = new BehaviorSubject(
+      state.savedObjectId ?? state.serializedVis.id
+    );
+    const savedObjectProperties$ = new BehaviorSubject(
+      undefined
+    );
+    const linkedToLibrary$ = new BehaviorSubject(state.linkedToLibrary);
 
-    return this.deps.start().plugins.inspector.open(adapters, {
-      title:
-        this.getTitle() ||
-        i18n.translate('visualizations.embeddable.inspectorTitle', {
-          defaultMessage: 'Inspector',
-        }),
+    // Track the vis expression
+    const expressionParams$ = new BehaviorSubject({
+      expression: '',
     });
-  };
-
-  /**
-   * Transfers all changes in the containerState.customization into
-   * the uiState of this visualization.
-   */
-  public transferCustomizationsToUiState() {
-    // Check for changes that need to be forwarded to the uiState
-    // Since the vis has an own listener on the uiState we don't need to
-    // pass anything from here to the handler.update method
-    const visCustomizations = { vis: this.input.vis, table: this.input.table };
-    if (visCustomizations.vis || visCustomizations.table) {
-      if (!_.isEqual(visCustomizations, this.visCustomizations)) {
-        this.visCustomizations = visCustomizations;
-        // Turn this off or the uiStateChangeHandler will fire for every modification.
-        this.vis.uiState.off('change', this.uiStateChangeHandler);
-        this.vis.uiState.clearAllKeys();
-
-        Object.entries(visCustomizations).forEach(([key, value]) => {
-          if (value) {
-            this.vis.uiState.set(key, value);
-          }
-        });
-
-        this.vis.uiState.on('change', this.uiStateChangeHandler);
-      }
-    } else if (this.parent) {
-      this.vis.uiState.clearAllKeys();
-    }
-  }
 
-  private handleChanges(): boolean {
-    this.transferCustomizationsToUiState();
+    const expressionAbortController$ = new BehaviorSubject(new AbortController());
+    let getExpressionParams: () => ReturnType = async () => ({
+      params: expressionParams$.getValue(),
+      abortController: expressionAbortController$.getValue(),
+    });
 
-    let dirty = false;
+    const {
+      api: customTimeRangeApi,
+      serialize: serializeCustomTimeRange,
+      comparators: customTimeRangeComparators,
+    } = initializeTimeRange(state);
 
-    // Check if timerange has changed
-    const nextTimeRange =
-      this.input.timeslice !== undefined
-        ? {
-            from: new Date(this.input.timeslice[0]).toISOString(),
-            to: new Date(this.input.timeslice[1]).toISOString(),
-            mode: 'absolute' as 'absolute',
-          }
-        : this.input.timeRange;
-    if (!_.isEqual(nextTimeRange, this.timeRange)) {
-      this.timeRange = _.cloneDeep(nextTimeRange);
-      dirty = true;
-    }
+    const searchSessionId$ = new BehaviorSubject('');
 
-    // Check if filters has changed
-    if (!onlyDisabledFiltersChanged(this.input.filters, this.filters)) {
-      this.filters = this.input.filters;
-      dirty = true;
-    }
+    const viewMode$ = apiPublishesViewMode(parentApi)
+      ? parentApi.viewMode
+      : new BehaviorSubject('view');
 
-    // Check if query has changed
-    if (!_.isEqual(this.input.query, this.query)) {
-      this.query = this.input.query;
-      dirty = true;
-    }
+    const executionContext = apiHasExecutionContext(parentApi)
+      ? parentApi.executionContext
+      : undefined;
 
-    if (this.searchSessionId !== this.input.searchSessionId) {
-      this.searchSessionId = this.input.searchSessionId;
-      dirty = true;
-    }
+    const disableTriggers = apiHasDisableTriggers(parentApi)
+      ? parentApi.disableTriggers
+      : undefined;
 
-    if (this.syncColors !== this.input.syncColors) {
-      this.syncColors = this.input.syncColors;
-      dirty = true;
-    }
+    const parentApiContext = apiHasAppContext(parentApi) ? parentApi.getAppContext() : undefined;
 
-    if (this.syncTooltips !== this.input.syncTooltips) {
-      this.syncTooltips = this.input.syncTooltips;
-      dirty = true;
-    }
+    const inspectorAdapters$ = new BehaviorSubject>({});
 
-    if (this.syncCursor !== this.input.syncCursor) {
-      this.syncCursor = this.input.syncCursor;
-      dirty = true;
+    // Track data views
+    let initialDataViews: DataView[] | undefined = [];
+    if (initialVisInstance.data.indexPattern)
+      initialDataViews = [initialVisInstance.data.indexPattern];
+    if (initialVisInstance.type.getUsedIndexPattern) {
+      initialDataViews = await initialVisInstance.type.getUsedIndexPattern(
+        initialVisInstance.params
+      );
     }
 
-    if (this.embeddableTitle !== this.getTitle()) {
-      this.embeddableTitle = this.getTitle();
-      dirty = true;
-    }
+    const dataLoading$ = new BehaviorSubject(true);
 
-    if (this.vis.description && this.domNode) {
-      this.domNode.setAttribute('data-description', this.vis.description);
-    }
+    const defaultPanelTitle = new BehaviorSubject(initialVisInstance.title);
 
-    return dirty;
-  }
-
-  private handleWarnings() {
-    const warnings: React.ReactNode[] = [];
-    if (this.getInspectorAdapters()?.requests) {
-      this.deps
-        .start()
-        .plugins.data.search.showWarnings(this.getInspectorAdapters()!.requests!, (warning) => {
-          if (hasUnsupportedDownsampledAggregationFailure(warning)) {
-            warnings.push(
-              i18n.translate('visualizations.embeddable.tsdbRollupWarning', {
-                defaultMessage:
-                  'Visualization uses a function that is unsupported by rolled up data. Select a different function or change the time range.',
-              })
+    const api = buildApi(
+      {
+        ...customTimeRangeApi,
+        ...titlesApi,
+        ...(dynamicActionsApi?.dynamicActionsApi ?? {}),
+        defaultPanelTitle,
+        dataLoading: dataLoading$,
+        dataViews: new BehaviorSubject(initialDataViews),
+        supportedTriggers: () => [
+          ACTION_CONVERT_TO_LENS,
+          APPLY_FILTER_TRIGGER,
+          SELECT_RANGE_TRIGGER,
+        ],
+        serializeState: () => {
+          const savedObjectProperties = savedObjectProperties$.getValue();
+          return serializeState({
+            serializedVis: vis$.getValue().serialize(),
+            titles: serializeTitles(),
+            id: savedObjectId$.getValue(),
+            linkedToLibrary:
+              // In the visualize editor, linkedToLibrary should always be false to force the full state to be serialized,
+              // instead of just passing a reference to the linked saved object. Other contexts like dashboards should
+              // serialize the state with just the savedObjectId so that the current revision of the vis is always used
+              apiIsOfType(parentApi, VISUALIZE_APP_NAME) ? false : linkedToLibrary$.getValue(),
+            ...(savedObjectProperties ? { savedObjectProperties } : {}),
+            ...(dynamicActionsApi?.serializeDynamicActions?.() ?? {}),
+            ...serializeCustomTimeRange(),
+          });
+        },
+        getVis: () => vis$.getValue(),
+        getInspectorAdapters: () => inspectorAdapters$.getValue(),
+        getTypeDisplayName: () =>
+          i18n.translate('visualizations.displayName', {
+            defaultMessage: 'visualization',
+          }),
+        onEdit: async () => {
+          const stateTransferService = embeddableStart.getStateTransfer();
+          const visId = savedObjectId$.getValue();
+          const editPath = visId ? urlFor(visId) : '#/edit_by_value';
+          const parentTimeRange = apiPublishesTimeRange(parentApi)
+            ? parentApi.timeRange$.getValue()
+            : {};
+          const customTimeRange = customTimeRangeApi.timeRange$.getValue();
+
+          await stateTransferService.navigateToEditor('visualize', {
+            path: editPath,
+            state: {
+              embeddableId: uuid,
+              valueInput: {
+                savedVis: vis$.getValue().serialize(),
+                title: api.panelTitle?.getValue(),
+                description: api.panelDescription?.getValue(),
+                timeRange: customTimeRange ?? parentTimeRange,
+              },
+              originatingApp: parentApiContext?.currentAppId ?? '',
+              searchSessionId: searchSessionId$.getValue() || undefined,
+              originatingPath: parentApiContext?.getCurrentPath?.(),
+            },
+          });
+        },
+        isEditingEnabled: () => {
+          if (viewMode$.getValue() !== 'edit') return false;
+          const readOnly = Boolean(vis$.getValue().type.disableEdit);
+          if (readOnly) return false;
+          const capabilities = getCapabilities();
+          const isByValue = !savedObjectId$.getValue();
+          if (isByValue)
+            return Boolean(
+              capabilities.dashboard?.showWriteControls && capabilities.visualize?.show
             );
-            return true;
-          }
-          if (this.vis.type.suppressWarnings?.()) {
-            // if the vis type wishes to supress all warnings, return true so the default logic won't pick it up
-            return true;
+          else return Boolean(capabilities.visualize?.save);
+        },
+        updateVis: async (visUpdates) => {
+          const currentSerializedVis = vis$.getValue().serialize();
+          serializedVis$.next({
+            ...currentSerializedVis,
+            ...visUpdates,
+            params: {
+              ...currentSerializedVis.params,
+              ...visUpdates.params,
+            },
+            data: {
+              ...currentSerializedVis.data,
+              ...visUpdates.data,
+            },
+          } as SerializedVis);
+          if (visUpdates.title) {
+            titlesApi.setPanelTitle(visUpdates.title);
           }
-        });
-    }
-
-    if (this.warningDomNode) {
-      const { core } = this.deps.start();
-      render(
-        
-          
-        ,
-        this.warningDomNode
-      );
-    }
-  }
-
-  // this is a hack to make editor still work, will be removed once we clean up editor
-  // @ts-ignore
-  hasInspector = () => Boolean(this.getInspectorAdapters());
-
-  onContainerLoading = () => {
-    this.renderComplete.dispatchInProgress();
-    this.updateOutput({
-      ...this.getOutput(),
-      loading: true,
-      rendered: false,
-      error: undefined,
-    });
-  };
-
-  onContainerData = () => {
-    this.handleWarnings();
-    this.updateOutput({
-      ...this.getOutput(),
-      loading: false,
-    });
-  };
-
-  onContainerRender = () => {
-    this.renderComplete.dispatchComplete();
-    this.updateOutput({
-      ...this.getOutput(),
-      rendered: true,
-    });
-  };
-
-  onContainerError = (error: ExpressionRenderError) => {
-    if (this.abortController) {
-      this.abortController.abort();
-    }
-    this.renderComplete.dispatchError();
-
-    if (isFallbackDataView(this.vis.data.indexPattern)) {
-      error = new Error(
-        i18n.translate('visualizations.missedDataView.errorMessage', {
-          defaultMessage: `Could not find the {type}: {id}`,
-          values: {
-            id: this.vis.data.indexPattern.id ?? '-',
-            type: this.vis.data.savedSearchId
-              ? i18n.translate('visualizations.noSearch.label', {
-                  defaultMessage: 'search',
-                })
-              : i18n.translate('visualizations.noDataView.label', {
-                  defaultMessage: 'data view',
-                }),
+        },
+        openInspector: () => {
+          const adapters = inspectorAdapters$.getValue();
+          if (!adapters) return;
+          const inspector = getInspector();
+          if (!inspector.isAvailable(adapters)) return;
+          return getInspector().open(adapters, {
+            title:
+              titlesApi.panelTitle?.getValue() ||
+              i18n.translate('visualizations.embeddable.inspectorTitle', {
+                defaultMessage: 'Inspector',
+              }),
+          });
+        },
+        // Library transforms
+        saveToLibrary: (newTitle: string) => {
+          titlesApi.setPanelTitle(newTitle);
+          const { rawState, references } = serializeState({
+            serializedVis: vis$.getValue().serialize(),
+            titles: {
+              ...serializeTitles(),
+              title: newTitle,
+            },
+          });
+          return saveToLibrary({
+            uiState: vis$.getValue().uiState,
+            rawState: rawState as VisualizeOutputState,
+            references,
+          });
+        },
+        canLinkToLibrary: () => !state.linkedToLibrary,
+        canUnlinkFromLibrary: () => !!state.linkedToLibrary,
+        checkForDuplicateTitle: () => false, // Handled by saveToLibrary action
+        getByValueState: () => ({
+          savedVis: vis$.getValue().serialize(),
+          ...serializeTitles(),
+        }),
+        getByReferenceState: (libraryId) =>
+          serializeState({
+            serializedVis: vis$.getValue().serialize(),
+            titles: serializeTitles(),
+            id: libraryId,
+            linkedToLibrary: true,
+          }).rawState,
+      },
+      {
+        ...titleComparators,
+        ...customTimeRangeComparators,
+        ...(dynamicActionsApi?.dynamicActionsComparator ?? {
+          enhancements: getUnchangingComparator(),
+        }),
+        serializedVis: [
+          serializedVis$,
+          (value) => {
+            serializedVis$.next(value);
           },
-        })
-      );
-    }
-
-    this.updateOutput({
-      ...this.getOutput(),
-      rendered: true,
-      error,
-    });
-  };
-
-  /**
-   *
-   * @param {Element} domNode
-   */
-  public async render(domNode: HTMLElement) {
-    this.timeRange = _.cloneDeep(this.input.timeRange);
-
-    this.transferCustomizationsToUiState();
-
-    const div = document.createElement('div');
-    div.className = `visualize panel-content panel-content--fullWidth`;
-    domNode.appendChild(div);
-
-    const warningDiv = document.createElement('div');
-    warningDiv.className = 'visPanel__warnings';
-    domNode.appendChild(warningDiv);
-    this.warningDomNode = warningDiv;
-
-    this.domNode = div;
-    super.render(this.domNode);
-    const { core } = this.deps.start();
-
-    render(
-      
-        
- -
-
, - this.domNode + (a, b) => { + const visA = a + ? { + ...omitBy(a, isEmpty), + data: omitBy(a.data, isNil), + params: omitBy(a.params, isNil), + } + : {}; + const visB = b + ? { + ...omitBy(b, isEmpty), + data: omitBy(b.data, isNil), + params: omitBy(b.params, isNil), + } + : {}; + return isEqual(visA, visB); + }, + ], + savedObjectId: [ + savedObjectId$, + (value) => savedObjectId$.next(value), + (a, b) => { + if (!a && !b) return true; + return a === b; + }, + ], + savedObjectProperties: getUnchangingComparator(), + linkedToLibrary: [linkedToLibrary$, (value) => linkedToLibrary$.next(value)], + } ); - const expressions = getExpressions(); - this.handler = await expressions.loader(this.domNode, undefined, { - renderMode: this.input.renderMode || 'view', - onRenderError: (element: HTMLElement, error: ExpressionRenderError) => { - this.onContainerError(error); - }, - executionContext: this.getExecutionContext(), - }); - - this.subscriptions.push( - this.handler.events$ - .pipe( - mergeMap(async (event) => { - // Visualize doesn't respond to sizing events, so ignore. - if (isChartSizeEvent(event)) { - return; - } - if (!this.input.disableTriggers) { - const triggerId = get(VIS_EVENT_TO_TRIGGER, event.name, VIS_EVENT_TO_TRIGGER.filter); - let context; - - if (triggerId === VIS_EVENT_TO_TRIGGER.applyFilter) { - context = { - embeddable: this, - timeFieldName: this.vis.data.indexPattern?.timeFieldName!, - ...event.data, - }; - } else { - context = { - embeddable: this, - data: { - timeFieldName: this.vis.data.indexPattern?.timeFieldName!, - ...event.data, - }, - }; + const fetchSubscription = fetch$(api) + .pipe( + switchMap(async (data) => { + const unifiedSearch = apiPublishesUnifiedSearch(parentApi) + ? { + query: data.query, + filters: data.filters, } + : {}; + const searchSessionId = apiPublishesSearchSession(parentApi) ? data.searchSessionId : ''; + searchSessionId$.next(searchSessionId); + const settings = apiPublishesSettings(parentApi) + ? { + syncColors: parentApi.settings.syncColors$.getValue(), + syncCursor: parentApi.settings.syncCursor$.getValue(), + syncTooltips: parentApi.settings.syncTooltips$.getValue(), + } + : {}; - await getUiActions().getTrigger(triggerId).exec(context); - } - }) - ) - .subscribe() - ); - - if (this.vis.description) { - div.setAttribute('data-description', this.vis.description); - } - - div.setAttribute('data-test-subj', 'visualizationLoader'); - div.setAttribute('data-shared-item', ''); - - this.subscriptions.push(this.handler.loading$.subscribe(this.onContainerLoading)); - this.subscriptions.push(this.handler.data$.subscribe(this.onContainerData)); - this.subscriptions.push(this.handler.render$.subscribe(this.onContainerRender)); - - this.subscriptions.push( - this.getUpdated$().subscribe(() => { - const { error } = this.getOutput(); - - if (error) { - render(this.renderError(error), this.domNode); - } - }) - ); - - await this.updateHandler(); - } - - private renderError(error: ErrorLike | string) { - const { core } = this.deps.start(); - if (isFallbackDataView(this.vis.data.indexPattern)) { - return ( - - - - ); - } - - return ( - - - - ); - } + dataLoading$.next(true); - public destroy() { - super.destroy(); - this.subscriptions.forEach((s) => s.unsubscribe()); - this.vis.uiState.off('change', this.uiStateChangeHandler); - this.vis.uiState.off('reload', this.reload); + const timeslice = apiPublishesTimeslice(parentApi) + ? parentApi.timeslice$.getValue() + : undefined; - if (this.handler) { - this.handler.destroy(); - this.handler.getElement().remove(); - } - } - - public reload = async () => { - await this.handleVisUpdate(); - }; - - private getExecutionContext() { - const parentContext = this.parent?.getInput().executionContext || getExecutionContext().get(); - const child: KibanaExecutionContext = { - type: 'agg_based', - name: this.vis.type.name, - id: this.vis.id ?? 'new', - description: this.vis.title || this.input.title || this.vis.type.name, - url: this.output.editUrl, - }; + const customTimeRange = customTimeRangeApi.timeRange$.getValue(); + const parentTimeRange = apiPublishesTimeRange(parentApi) ? data.timeRange : undefined; + const timesliceTimeRange = timeslice + ? { + from: new Date(timeslice[0]).toISOString(), + to: new Date(timeslice[1]).toISOString(), + mode: 'absolute' as 'absolute', + } + : undefined; + + // Precedence should be: + // custom time range from state > + // timeslice time range > + // parent API time range from e.g. unified search + const timeRangeToRender = customTimeRange ?? timesliceTimeRange ?? parentTimeRange; + + getExpressionParams = async () => { + return await getExpressionRendererProps({ + unifiedSearch, + vis: vis$.getValue(), + settings, + disableTriggers, + searchSessionId, + parentExecutionContext: executionContext, + abortController: expressionAbortController$.getValue(), + timeRange: timeRangeToRender, + onRender: async (renderCount) => { + if (renderCount === renderCount$.getValue()) return; + renderCount$.next(renderCount); + const visInstance = vis$.getValue(); + const visTypeName = visInstance.type.name; + + let telemetryVisTypeName = visTypeName; + if (visTypeName === 'metrics') { + telemetryVisTypeName = 'legacy_metric'; + } + if (visTypeName === 'pie' && visInstance.params.isDonut) { + telemetryVisTypeName = 'donut'; + } + if ( + visTypeName === 'area' && + visInstance.params.seriesParams.some( + (seriesParams: { mode: string }) => seriesParams.mode === 'stacked' + ) + ) { + telemetryVisTypeName = 'area_stacked'; + } + + getUsageCollection().reportUiCounter( + executionContext?.type ?? '', + 'count', + `render_agg_based_${telemetryVisTypeName}` + ); + + if (hasRendered$.getValue() === true) return; + hasRendered$.next(true); + hasRendered$.complete(); + }, + onEvent: async (event) => { + // Visualize doesn't respond to sizing events, so ignore. + if (isChartSizeEvent(event)) { + return; + } + const currentVis = vis$.getValue(); + if (!disableTriggers) { + const triggerId = get( + VIS_EVENT_TO_TRIGGER, + event.name, + VIS_EVENT_TO_TRIGGER.filter + ); + let context; + + if (triggerId === VIS_EVENT_TO_TRIGGER.applyFilter) { + context = { + embeddable: api, + timeFieldName: currentVis.data.indexPattern?.timeFieldName!, + ...event.data, + }; + } else { + context = { + embeddable: api, + data: { + timeFieldName: currentVis.data.indexPattern?.timeFieldName!, + ...event.data, + }, + }; + } + await getUiActions().getTrigger(triggerId).exec(context); + } + }, + onData: (_, inspectorAdapters) => { + inspectorAdapters$.next( + typeof inspectorAdapters === 'function' ? inspectorAdapters() : inspectorAdapters + ); + dataLoading$.next(false); + }, + }); + }; + return await getExpressionParams(); + }) + ) + .subscribe(({ params, abortController }) => { + if (params) expressionParams$.next(params); + expressionAbortController$.next(abortController); + }); return { - ...parentContext, - child, - }; - } - - private async updateHandler() { - const context = this.getExecutionContext(); - - this.expressionVariables = await this.vis.type.getExpressionVariables?.( - this.vis, - this.timefilter - ); - - this.expressionVariablesSubject.next(this.expressionVariables); - - const expressionParams: IExpressionLoaderParams = { - searchContext: { - timeRange: this.timeRange, - query: this.input.query, - filters: this.input.filters, - disableWarningToasts: true, - }, - variables: { - embeddableTitle: this.getTitle(), - ...this.expressionVariables, + api, + Component: () => { + const expressionParams = useStateFromPublishingSubject(expressionParams$); + const renderCount = useStateFromPublishingSubject(renderCount$); + const hasRendered = useStateFromPublishingSubject(hasRendered$); + const domNode = useRef(null); + const { error, isLoading } = useExpressionRenderer(domNode, expressionParams); + + useEffect(() => { + return () => { + fetchSubscription.unsubscribe(); + maybeStopDynamicActions?.stopDynamicActions(); + }; + }, []); + + useEffect(() => { + if (hasRendered && domNode.current) { + dispatchRenderComplete(domNode.current); + } + }, [hasRendered]); + + return ( +
+ {/* Replicate the loading state for the expression renderer to avoid FOUC */} + + {isLoading && } + {!isLoading && error && ( + + {i18n.translate('visualizations.embeddable.errorTitle', { + defaultMessage: 'Unable to load visualization ', + })} + + } + body={ +

+ {error.name}: {error.message} +

+ } + /> + )} +
+
+ ); }, - searchSessionId: this.input.searchSessionId, - syncColors: this.input.syncColors, - syncTooltips: this.input.syncTooltips, - syncCursor: this.input.syncCursor, - uiState: this.vis.uiState, - interactive: !this.input.disableTriggers, - inspectorAdapters: this.inspectorAdapters, - executionContext: context, - }; - if (this.abortController) { - this.abortController.abort(); - } - this.abortController = new AbortController(); - const abortController = this.abortController; - - try { - this.expression = await toExpressionAst(this.vis, { - timefilter: this.timefilter, - timeRange: this.timeRange, - abortSignal: this.abortController!.signal, - }); - } catch (e) { - this.onContainerError(e); - } - - if (this.handler && !abortController.signal.aborted) { - this.handler.update(this.expression, expressionParams); - } - } - - private handleVisUpdate = async () => { - this.handleChanges(); - await this.updateHandler(); - }; - - private uiStateChangeHandler = () => { - this.updateInput({ - ...this.vis.uiState.toJSON(), - }); - }; - - public supportedTriggers(): string[] { - return this.vis.type.getSupportedTriggers?.(this.vis.params) ?? []; - } - - public getExpressionVariables$() { - return this.expressionVariablesSubject.asObservable(); - } - - public getExpressionVariables() { - return this.expressionVariables; - } - - inputIsRefType = (input: VisualizeInput): input is VisualizeByReferenceInput => { - if (!this.attributeService) { - throw new Error('AttributeService must be defined for getInputAsRefType'); - } - return this.attributeService.inputIsRefType(input as VisualizeByReferenceInput); - }; - - getInputAsValueType = async (): Promise => { - const input = { - savedVis: this.vis.serialize(), - }; - delete input.savedVis.id; - _.unset(input, 'savedVis.title'); - return new Promise((resolve) => { - resolve({ ...(input as VisualizeByValueInput) }); - }); - }; - - getInputAsRefType = async (): Promise => { - const { plugins, core } = this.deps.start(); - const { data, spaces, savedObjectsTaggingOss } = plugins; - const savedVis = await getSavedVisualization({ - search: data.search, - dataViews: data.dataViews, - spaces, - savedObjectsTagging: savedObjectsTaggingOss?.getTaggingApi(), - ...core, - }); - if (!savedVis) { - throw new Error('Error creating a saved vis object'); - } - if (!this.attributeService) { - throw new Error('AttributeService must be defined for getInputAsRefType'); - } - const saveModalTitle = this.getTitle() - ? this.getTitle() - : i18n.translate('visualizations.embeddable.placeholderTitle', { - defaultMessage: 'Placeholder Title', - }); - // @ts-ignore - const attributes: VisualizeSavedObjectAttributes = { - savedVis, - vis: this.vis, - title: this.vis.title, }; - return this.attributeService.getInputAsRefType( - { - id: this.id, - attributes, - }, - { showSaveModal: true, saveModalTitle } - ); - }; -} + }, +}); diff --git a/src/plugins/visualizations/public/index.ts b/src/plugins/visualizations/public/index.ts index 09048ba87d83b..3de1bfc01f2ef 100644 --- a/src/plugins/visualizations/public/index.ts +++ b/src/plugins/visualizations/public/index.ts @@ -10,7 +10,7 @@ import { PublicContract } from '@kbn/utility-types'; import { PluginInitializerContext } from '@kbn/core/public'; import { VisualizationsPlugin, VisualizationsSetup, VisualizationsStart } from './plugin'; -import type { VisualizeEmbeddableFactory, VisualizeEmbeddable } from './embeddable'; +import type { VisualizeEmbeddableFactory, VisualizeEmbeddable } from './legacy/embeddable'; export function plugin(initializerContext: PluginInitializerContext) { return new VisualizationsPlugin(initializerContext); @@ -18,11 +18,8 @@ export function plugin(initializerContext: PluginInitializerContext) { /** @public static code */ export { TypesService } from './vis_types/types_service'; -export { - apiHasVisualizeConfig, - VIS_EVENT_TO_TRIGGER, - COMMON_VISUALIZATION_GROUPING, -} from './embeddable'; +export { VIS_EVENT_TO_TRIGGER } from './embeddable'; +export { apiHasVisualizeConfig, COMMON_VISUALIZATION_GROUPING } from './legacy/embeddable'; export { VisualizationContainer } from './components'; export { getVisSchemas } from './vis_schemas'; @@ -38,13 +35,13 @@ export type { VisualizationClient, SerializableAttributes, } from './vis_types'; -export type { VisualizeEditorInput } from './react_embeddable/types'; +export type { VisualizeEditorInput } from './embeddable/types'; export type { Vis, SerializedVis, SerializedVisData, VisData } from './vis'; export type VisualizeEmbeddableFactoryContract = PublicContract; export type VisualizeEmbeddableContract = PublicContract; export type { SchemaConfig } from '../common/types'; export { updateOldState } from './legacy/vis_update_state'; -export type { VisualizeInput, VisualizeEmbeddable, HasVisualizeConfig } from './embeddable'; +export type { VisualizeInput, VisualizeEmbeddable, HasVisualizeConfig } from './legacy/embeddable'; export type { PersistedState } from './persisted_state'; export type { ISavedVis, diff --git a/src/plugins/visualizations/public/embeddable/constants.ts b/src/plugins/visualizations/public/legacy/embeddable/constants.ts similarity index 91% rename from src/plugins/visualizations/public/embeddable/constants.ts rename to src/plugins/visualizations/public/legacy/embeddable/constants.ts index 85c8554265541..79d87ec59b1e1 100644 --- a/src/plugins/visualizations/public/embeddable/constants.ts +++ b/src/plugins/visualizations/public/legacy/embeddable/constants.ts @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; -export { VISUALIZE_EMBEDDABLE_TYPE } from '../../common/constants'; +export { VISUALIZE_EMBEDDABLE_TYPE } from '../../../common/constants'; export const COMMON_VISUALIZATION_GROUPING = [ { diff --git a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts b/src/plugins/visualizations/public/legacy/embeddable/create_vis_embeddable_from_object.ts similarity index 94% rename from src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts rename to src/plugins/visualizations/public/legacy/embeddable/create_vis_embeddable_from_object.ts index b496be0a9e810..69ed12302f4ec 100644 --- a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts +++ b/src/plugins/visualizations/public/legacy/embeddable/create_vis_embeddable_from_object.ts @@ -9,7 +9,7 @@ import { IContainer, ErrorEmbeddable, AttributeService } from '@kbn/embeddable-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; -import { Vis } from '../types'; +import { Vis } from '../../types'; import type { VisualizeInput, VisualizeEmbeddable, @@ -17,8 +17,8 @@ import type { VisualizeByReferenceInput, VisualizeSavedObjectAttributes, } from './visualize_embeddable'; -import { getHttp, getTimeFilter, getCapabilities } from '../services'; -import { urlFor } from '../utils/saved_visualize_utils'; +import { getHttp, getTimeFilter, getCapabilities } from '../../services'; +import { urlFor } from '../../utils/saved_visualize_utils'; import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory'; import { createVisualizeEmbeddableAsync } from './visualize_embeddable_async'; diff --git a/src/plugins/visualizations/public/embeddable/embeddables.scss b/src/plugins/visualizations/public/legacy/embeddable/embeddables.scss similarity index 100% rename from src/plugins/visualizations/public/embeddable/embeddables.scss rename to src/plugins/visualizations/public/legacy/embeddable/embeddables.scss diff --git a/src/plugins/visualizations/public/legacy/embeddable/index.ts b/src/plugins/visualizations/public/legacy/embeddable/index.ts new file mode 100644 index 0000000000000..6afee494e6f4f --- /dev/null +++ b/src/plugins/visualizations/public/legacy/embeddable/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", 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 { VisualizeEmbeddableFactory } from './visualize_embeddable_factory'; +export { VISUALIZE_EMBEDDABLE_TYPE, COMMON_VISUALIZATION_GROUPING } from './constants'; +export { createVisEmbeddableFromObject } from './create_vis_embeddable_from_object'; + +export type { VisualizeEmbeddable, VisualizeInput } from './visualize_embeddable'; +export { + type HasVisualizeConfig, + apiHasVisualizeConfig, +} from '../../embeddable/interfaces/has_visualize_config'; diff --git a/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable.tsx new file mode 100644 index 0000000000000..85166441a1634 --- /dev/null +++ b/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable.tsx @@ -0,0 +1,717 @@ +/* + * Copyright 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 _, { get } from 'lodash'; +import { Subscription, ReplaySubject, mergeMap } from 'rxjs'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { render } from 'react-dom'; +import { EuiLoadingChart } from '@elastic/eui'; +import { Filter, onlyDisabledFiltersChanged, Query, TimeRange } from '@kbn/es-query'; +import type { KibanaExecutionContext, SavedObjectAttributes } from '@kbn/core/public'; +import type { ErrorLike } from '@kbn/expressions-plugin/common'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import { TimefilterContract } from '@kbn/data-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { Warnings } from '@kbn/charts-plugin/public'; +import { hasUnsupportedDownsampledAggregationFailure } from '@kbn/search-response-warnings'; +import { + Adapters, + AttributeService, + Embeddable, + EmbeddableInput, + EmbeddableOutput, + FilterableEmbeddable, + IContainer, + ReferenceOrValueEmbeddable, + SavedObjectEmbeddableInput, +} from '@kbn/embeddable-plugin/public'; +import { + ExpressionAstExpression, + ExpressionLoader, + ExpressionRenderError, + IExpressionLoaderParams, +} from '@kbn/expressions-plugin/public'; +import type { RenderMode } from '@kbn/expressions-plugin/common'; +import { DATA_VIEW_SAVED_OBJECT_TYPE } from '@kbn/data-views-plugin/public'; +import { mapAndFlattenFilters } from '@kbn/data-plugin/public'; +import { isChartSizeEvent } from '@kbn/chart-expressions-common'; +import { isFallbackDataView } from '../../visualize_app/utils'; +import { VisualizationMissedSavedObjectError } from '../../components/visualization_missed_saved_object_error'; +import VisualizationError from '../../components/visualization_error'; +import { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; +import { SerializedVis, Vis } from '../../vis'; +import { getApplication, getExecutionContext, getExpressions, getUiActions } from '../../services'; +import { VIS_EVENT_TO_TRIGGER } from '../../embeddable/events'; +import { VisualizeEmbeddableFactoryDeps } from './visualize_embeddable_factory'; +import { getSavedVisualization } from '../../utils/saved_visualize_utils'; +import { VisSavedObject } from '../../types'; +import { toExpressionAst } from '../../embeddable/to_ast'; + +export interface VisualizeEmbeddableConfiguration { + vis: Vis; + indexPatterns?: DataView[]; + editPath: string; + editUrl: string; + capabilities: { visualizeSave: boolean; dashboardSave: boolean; visualizeOpen: boolean }; + deps: VisualizeEmbeddableFactoryDeps; +} + +export interface VisualizeInput extends EmbeddableInput { + vis?: { + colors?: { [key: string]: string }; + }; + savedVis?: SerializedVis; + renderMode?: RenderMode; + table?: unknown; + query?: Query; + filters?: Filter[]; + timeRange?: TimeRange; + timeslice?: [number, number]; +} + +export interface VisualizeOutput extends EmbeddableOutput { + editPath: string; + editApp: string; + editUrl: string; + indexPatterns?: DataView[]; + visTypeName: string; +} + +export type VisualizeSavedObjectAttributes = SavedObjectAttributes & { + title: string; + vis?: Vis; + savedVis?: VisSavedObject; +}; +export type VisualizeByValueInput = { attributes: VisualizeSavedObjectAttributes } & VisualizeInput; +export type VisualizeByReferenceInput = SavedObjectEmbeddableInput & VisualizeInput; + +/** @deprecated + * VisualizeEmbeddable is no longer registered with the legacy embeddable system and is only + * used within the visualize editor. + */ +export class VisualizeEmbeddable + extends Embeddable + implements + ReferenceOrValueEmbeddable, + FilterableEmbeddable +{ + private handler?: ExpressionLoader; + private timefilter: TimefilterContract; + private timeRange?: TimeRange; + private query?: Query; + private filters?: Filter[]; + private searchSessionId?: string; + private syncColors?: boolean; + private syncTooltips?: boolean; + private syncCursor?: boolean; + private embeddableTitle?: string; + private visCustomizations?: Pick; + private subscriptions: Subscription[] = []; + private expression?: ExpressionAstExpression; + private vis: Vis; + private domNode: any; + private warningDomNode: any; + public readonly type = VISUALIZE_EMBEDDABLE_TYPE; + private abortController?: AbortController; + private readonly deps: VisualizeEmbeddableFactoryDeps; + private readonly inspectorAdapters?: Adapters; + private attributeService?: AttributeService< + VisualizeSavedObjectAttributes, + VisualizeByValueInput, + VisualizeByReferenceInput + >; + private expressionVariables: Record | undefined; + private readonly expressionVariablesSubject = new ReplaySubject< + Record | undefined + >(1); + + constructor( + timefilter: TimefilterContract, + { vis, editPath, editUrl, indexPatterns, deps, capabilities }: VisualizeEmbeddableConfiguration, + initialInput: VisualizeInput, + attributeService?: AttributeService< + VisualizeSavedObjectAttributes, + VisualizeByValueInput, + VisualizeByReferenceInput + >, + parent?: IContainer + ) { + super( + initialInput, + { + defaultTitle: vis.title, + defaultDescription: vis.description, + editPath, + editApp: 'visualize', + editUrl, + indexPatterns, + visTypeName: vis.type.name, + }, + parent + ); + this.deps = deps; + this.timefilter = timefilter; + this.syncColors = this.input.syncColors; + this.syncTooltips = this.input.syncTooltips; + this.syncCursor = this.input.syncCursor; + this.searchSessionId = this.input.searchSessionId; + this.query = this.input.query; + this.embeddableTitle = this.getTitle(); + + this.vis = vis; + this.vis.uiState.on('change', this.uiStateChangeHandler); + this.vis.uiState.on('reload', this.reload); + this.attributeService = attributeService; + + if (this.attributeService) { + const readOnly = Boolean(vis.type.disableEdit); + const isByValue = !this.inputIsRefType(initialInput); + const editable = readOnly + ? false + : capabilities.visualizeSave || + (isByValue && capabilities.dashboardSave && capabilities.visualizeOpen); + this.updateOutput({ ...this.getOutput(), editable }); + } + + this.subscriptions.push( + this.getInput$().subscribe(() => { + const isDirty = this.handleChanges(); + + if (isDirty && this.handler) { + this.updateHandler(); + } + }) + ); + + const inspectorAdapters = this.vis.type.inspectorAdapters; + + if (inspectorAdapters) { + this.inspectorAdapters = + typeof inspectorAdapters === 'function' ? inspectorAdapters() : inspectorAdapters; + } + } + + public reportsEmbeddableLoad() { + return true; + } + + public getVis() { + return this.vis; + } + + /** + * Gets the Visualize embeddable's local filters + * @returns Local/panel-level array of filters for Visualize embeddable + */ + public getFilters() { + const filters = this.vis.serialize().data.searchSource?.filter ?? []; + // must clone the filters so that it's not read only, because mapAndFlattenFilters modifies the array + return mapAndFlattenFilters(_.cloneDeep(filters)); + } + + /** + * Gets the Visualize embeddable's local query + * @returns Local/panel-level query for Visualize embeddable + */ + public getQuery() { + return this.vis.serialize().data.searchSource.query; + } + + public getInspectorAdapters = () => { + if (!this.handler || (this.inspectorAdapters && !Object.keys(this.inspectorAdapters).length)) { + return undefined; + } + return this.handler.inspect(); + }; + + public openInspector = () => { + if (!this.handler) return; + + const adapters = this.handler.inspect(); + if (!adapters) return; + + return this.deps.start().plugins.inspector.open(adapters, { + title: + this.getTitle() || + i18n.translate('visualizations.embeddable.inspectorTitle', { + defaultMessage: 'Inspector', + }), + }); + }; + + /** + * Transfers all changes in the containerState.customization into + * the uiState of this visualization. + */ + public transferCustomizationsToUiState() { + // Check for changes that need to be forwarded to the uiState + // Since the vis has an own listener on the uiState we don't need to + // pass anything from here to the handler.update method + const visCustomizations = { vis: this.input.vis, table: this.input.table }; + if (visCustomizations.vis || visCustomizations.table) { + if (!_.isEqual(visCustomizations, this.visCustomizations)) { + this.visCustomizations = visCustomizations; + // Turn this off or the uiStateChangeHandler will fire for every modification. + this.vis.uiState.off('change', this.uiStateChangeHandler); + this.vis.uiState.clearAllKeys(); + + Object.entries(visCustomizations).forEach(([key, value]) => { + if (value) { + this.vis.uiState.set(key, value); + } + }); + + this.vis.uiState.on('change', this.uiStateChangeHandler); + } + } else if (this.parent) { + this.vis.uiState.clearAllKeys(); + } + } + + private handleChanges(): boolean { + this.transferCustomizationsToUiState(); + + let dirty = false; + + // Check if timerange has changed + const nextTimeRange = + this.input.timeslice !== undefined + ? { + from: new Date(this.input.timeslice[0]).toISOString(), + to: new Date(this.input.timeslice[1]).toISOString(), + mode: 'absolute' as 'absolute', + } + : this.input.timeRange; + if (!_.isEqual(nextTimeRange, this.timeRange)) { + this.timeRange = _.cloneDeep(nextTimeRange); + dirty = true; + } + + // Check if filters has changed + if (!onlyDisabledFiltersChanged(this.input.filters, this.filters)) { + this.filters = this.input.filters; + dirty = true; + } + + // Check if query has changed + if (!_.isEqual(this.input.query, this.query)) { + this.query = this.input.query; + dirty = true; + } + + if (this.searchSessionId !== this.input.searchSessionId) { + this.searchSessionId = this.input.searchSessionId; + dirty = true; + } + + if (this.syncColors !== this.input.syncColors) { + this.syncColors = this.input.syncColors; + dirty = true; + } + + if (this.syncTooltips !== this.input.syncTooltips) { + this.syncTooltips = this.input.syncTooltips; + dirty = true; + } + + if (this.syncCursor !== this.input.syncCursor) { + this.syncCursor = this.input.syncCursor; + dirty = true; + } + + if (this.embeddableTitle !== this.getTitle()) { + this.embeddableTitle = this.getTitle(); + dirty = true; + } + + if (this.vis.description && this.domNode) { + this.domNode.setAttribute('data-description', this.vis.description); + } + + return dirty; + } + + private handleWarnings() { + const warnings: React.ReactNode[] = []; + if (this.getInspectorAdapters()?.requests) { + this.deps + .start() + .plugins.data.search.showWarnings(this.getInspectorAdapters()!.requests!, (warning) => { + if (hasUnsupportedDownsampledAggregationFailure(warning)) { + warnings.push( + i18n.translate('visualizations.embeddable.tsdbRollupWarning', { + defaultMessage: + 'Visualization uses a function that is unsupported by rolled up data. Select a different function or change the time range.', + }) + ); + return true; + } + if (this.vis.type.suppressWarnings?.()) { + // if the vis type wishes to supress all warnings, return true so the default logic won't pick it up + return true; + } + }); + } + + if (this.warningDomNode) { + const { core } = this.deps.start(); + render( + + + , + this.warningDomNode + ); + } + } + + // this is a hack to make editor still work, will be removed once we clean up editor + // @ts-ignore + hasInspector = () => Boolean(this.getInspectorAdapters()); + + onContainerLoading = () => { + this.renderComplete.dispatchInProgress(); + this.updateOutput({ + ...this.getOutput(), + loading: true, + rendered: false, + error: undefined, + }); + }; + + onContainerData = () => { + this.handleWarnings(); + this.updateOutput({ + ...this.getOutput(), + loading: false, + }); + }; + + onContainerRender = () => { + this.renderComplete.dispatchComplete(); + this.updateOutput({ + ...this.getOutput(), + rendered: true, + }); + }; + + onContainerError = (error: ExpressionRenderError) => { + if (this.abortController) { + this.abortController.abort(); + } + this.renderComplete.dispatchError(); + + if (isFallbackDataView(this.vis.data.indexPattern)) { + error = new Error( + i18n.translate('visualizations.missedDataView.errorMessage', { + defaultMessage: `Could not find the {type}: {id}`, + values: { + id: this.vis.data.indexPattern.id ?? '-', + type: this.vis.data.savedSearchId + ? i18n.translate('visualizations.noSearch.label', { + defaultMessage: 'search', + }) + : i18n.translate('visualizations.noDataView.label', { + defaultMessage: 'data view', + }), + }, + }) + ); + } + + this.updateOutput({ + ...this.getOutput(), + rendered: true, + error, + }); + }; + + /** + * + * @param {Element} domNode + */ + public async render(domNode: HTMLElement) { + this.timeRange = _.cloneDeep(this.input.timeRange); + + this.transferCustomizationsToUiState(); + + const div = document.createElement('div'); + div.className = `visualize panel-content panel-content--fullWidth`; + domNode.appendChild(div); + + const warningDiv = document.createElement('div'); + warningDiv.className = 'visPanel__warnings'; + domNode.appendChild(warningDiv); + this.warningDomNode = warningDiv; + + this.domNode = div; + super.render(this.domNode); + const { core } = this.deps.start(); + + render( + +
+ +
+
, + this.domNode + ); + + const expressions = getExpressions(); + this.handler = await expressions.loader(this.domNode, undefined, { + renderMode: this.input.renderMode || 'view', + onRenderError: (element: HTMLElement, error: ExpressionRenderError) => { + this.onContainerError(error); + }, + executionContext: this.getExecutionContext(), + }); + + this.subscriptions.push( + this.handler.events$ + .pipe( + mergeMap(async (event) => { + // Visualize doesn't respond to sizing events, so ignore. + if (isChartSizeEvent(event)) { + return; + } + if (!this.input.disableTriggers) { + const triggerId = get(VIS_EVENT_TO_TRIGGER, event.name, VIS_EVENT_TO_TRIGGER.filter); + let context; + + if (triggerId === VIS_EVENT_TO_TRIGGER.applyFilter) { + context = { + embeddable: this, + timeFieldName: this.vis.data.indexPattern?.timeFieldName!, + ...event.data, + }; + } else { + context = { + embeddable: this, + data: { + timeFieldName: this.vis.data.indexPattern?.timeFieldName!, + ...event.data, + }, + }; + } + + await getUiActions().getTrigger(triggerId).exec(context); + } + }) + ) + .subscribe() + ); + + if (this.vis.description) { + div.setAttribute('data-description', this.vis.description); + } + + div.setAttribute('data-test-subj', 'visualizationLoader'); + div.setAttribute('data-shared-item', ''); + + this.subscriptions.push(this.handler.loading$.subscribe(this.onContainerLoading)); + this.subscriptions.push(this.handler.data$.subscribe(this.onContainerData)); + this.subscriptions.push(this.handler.render$.subscribe(this.onContainerRender)); + + this.subscriptions.push( + this.getUpdated$().subscribe(() => { + const { error } = this.getOutput(); + + if (error) { + render(this.renderError(error), this.domNode); + } + }) + ); + + await this.updateHandler(); + } + + private renderError(error: ErrorLike | string) { + const { core } = this.deps.start(); + if (isFallbackDataView(this.vis.data.indexPattern)) { + return ( + + + + ); + } + + return ( + + + + ); + } + + public destroy() { + super.destroy(); + this.subscriptions.forEach((s) => s.unsubscribe()); + this.vis.uiState.off('change', this.uiStateChangeHandler); + this.vis.uiState.off('reload', this.reload); + + if (this.handler) { + this.handler.destroy(); + this.handler.getElement().remove(); + } + } + + public reload = async () => { + await this.handleVisUpdate(); + }; + + private getExecutionContext() { + const parentContext = this.parent?.getInput().executionContext || getExecutionContext().get(); + const child: KibanaExecutionContext = { + type: 'agg_based', + name: this.vis.type.name, + id: this.vis.id ?? 'new', + description: this.vis.title || this.input.title || this.vis.type.name, + url: this.output.editUrl, + }; + + return { + ...parentContext, + child, + }; + } + + private async updateHandler() { + const context = this.getExecutionContext(); + + this.expressionVariables = await this.vis.type.getExpressionVariables?.( + this.vis, + this.timefilter + ); + + this.expressionVariablesSubject.next(this.expressionVariables); + + const expressionParams: IExpressionLoaderParams = { + searchContext: { + timeRange: this.timeRange, + query: this.input.query, + filters: this.input.filters, + disableWarningToasts: true, + }, + variables: { + embeddableTitle: this.getTitle(), + ...this.expressionVariables, + }, + searchSessionId: this.input.searchSessionId, + syncColors: this.input.syncColors, + syncTooltips: this.input.syncTooltips, + syncCursor: this.input.syncCursor, + uiState: this.vis.uiState, + interactive: !this.input.disableTriggers, + inspectorAdapters: this.inspectorAdapters, + executionContext: context, + }; + if (this.abortController) { + this.abortController.abort(); + } + this.abortController = new AbortController(); + const abortController = this.abortController; + + try { + this.expression = await toExpressionAst(this.vis, { + timefilter: this.timefilter, + timeRange: this.timeRange, + abortSignal: this.abortController!.signal, + }); + } catch (e) { + this.onContainerError(e); + } + + if (this.handler && !abortController.signal.aborted) { + this.handler.update(this.expression, expressionParams); + } + } + + private handleVisUpdate = async () => { + this.handleChanges(); + await this.updateHandler(); + }; + + private uiStateChangeHandler = () => { + this.updateInput({ + ...this.vis.uiState.toJSON(), + }); + }; + + public supportedTriggers(): string[] { + return this.vis.type.getSupportedTriggers?.(this.vis.params) ?? []; + } + + public getExpressionVariables$() { + return this.expressionVariablesSubject.asObservable(); + } + + public getExpressionVariables() { + return this.expressionVariables; + } + + inputIsRefType = (input: VisualizeInput): input is VisualizeByReferenceInput => { + if (!this.attributeService) { + throw new Error('AttributeService must be defined for getInputAsRefType'); + } + return this.attributeService.inputIsRefType(input as VisualizeByReferenceInput); + }; + + getInputAsValueType = async (): Promise => { + const input = { + savedVis: this.vis.serialize(), + }; + delete input.savedVis.id; + _.unset(input, 'savedVis.title'); + return new Promise((resolve) => { + resolve({ ...(input as VisualizeByValueInput) }); + }); + }; + + getInputAsRefType = async (): Promise => { + const { plugins, core } = this.deps.start(); + const { data, spaces, savedObjectsTaggingOss } = plugins; + const savedVis = await getSavedVisualization({ + search: data.search, + dataViews: data.dataViews, + spaces, + savedObjectsTagging: savedObjectsTaggingOss?.getTaggingApi(), + ...core, + }); + if (!savedVis) { + throw new Error('Error creating a saved vis object'); + } + if (!this.attributeService) { + throw new Error('AttributeService must be defined for getInputAsRefType'); + } + const saveModalTitle = this.getTitle() + ? this.getTitle() + : i18n.translate('visualizations.embeddable.placeholderTitle', { + defaultMessage: 'Placeholder Title', + }); + // @ts-ignore + const attributes: VisualizeSavedObjectAttributes = { + savedVis, + vis: this.vis, + title: this.vis.title, + }; + return this.attributeService.getInputAsRefType( + { + id: this.id, + attributes, + }, + { showSaveModal: true, saveModalTitle } + ); + }; +} diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_async.ts b/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_async.ts similarity index 100% rename from src/plugins/visualizations/public/embeddable/visualize_embeddable_async.ts rename to src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_async.ts diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.test.ts b/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_factory.test.ts similarity index 100% rename from src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.test.ts rename to src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_factory.test.ts diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx b/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_factory.tsx similarity index 96% rename from src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx rename to src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_factory.tsx index e38924a76ef28..7594c8d42f2ea 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx +++ b/src/plugins/visualizations/public/legacy/embeddable/visualize_embeddable_factory.tsx @@ -28,7 +28,7 @@ import { AttributeService, } from '@kbn/embeddable-plugin/public'; import type { StartServicesGetter } from '@kbn/kibana-utils-plugin/public'; -import { checkForDuplicateTitle } from '../utils/saved_objects_utils/check_for_duplicate_title'; +import { checkForDuplicateTitle } from '../../utils/saved_objects_utils/check_for_duplicate_title'; import type { VisualizeByReferenceInput, VisualizeByValueInput, @@ -38,24 +38,24 @@ import type { VisualizeSavedObjectAttributes, } from './visualize_embeddable'; import { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; -import type { SerializedVis, Vis } from '../vis'; -import { createVisAsync } from '../vis_async'; -import { getCapabilities, getTypes } from '../services'; -import { showNewVisModal } from '../wizard'; +import type { SerializedVis, Vis } from '../../vis'; +import { createVisAsync } from '../../vis_async'; +import { getCapabilities, getTypes } from '../../services'; +import { showNewVisModal } from '../../wizard'; import { convertToSerializedVis, getSavedVisualization, saveVisualization, getFullPath, -} from '../utils/saved_visualize_utils'; +} from '../../utils/saved_visualize_utils'; import { extractControlsReferences, extractTimeSeriesReferences, injectTimeSeriesReferences, injectControlsReferences, -} from '../utils/saved_visualization_references'; +} from '../../utils/saved_visualization_references'; import { createVisEmbeddableFromObject } from './create_vis_embeddable_from_object'; -import type { VisualizationsStartDeps } from '../plugin'; +import type { VisualizationsStartDeps } from '../../plugin'; interface VisualizationAttributes extends SavedObjectAttributes { title: string; diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index e8b13639fa092..24a2c488e0f79 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -126,7 +126,8 @@ import { VisualizationSavedObjectAttributes, } from '../common/content_management'; import { AddAggVisualizationPanelAction } from './actions/add_agg_vis_action'; -import { VisualizeSerializedState } from './react_embeddable/types'; +import type { VisualizeSerializedState } from './embeddable/types'; +import { getVisualizeEmbeddableFactoryLazy } from './embeddable'; /** * Interface for this plugin's returned setup/start contracts. @@ -308,7 +309,10 @@ export class VisualizationsPlugin * this should be replaced to use only scoped history after moving legacy apps to browser routing */ const history = createHashHistory(); - const { createVisEmbeddableFromObject } = await import('./embeddable'); + const [{ createVisEmbeddableFromObject }, { renderApp }] = await Promise.all([ + import('./legacy/embeddable'), + import('./visualize_app'), + ]); const services: VisualizeServices = { ...coreStart, history, @@ -352,7 +356,6 @@ export class VisualizationsPlugin }; params.element.classList.add('visAppWrapper'); - const { renderApp } = await import('./visualize_app'); if (pluginsStart.screenshotMode.isScreenshotMode()) { params.element.classList.add('visEditorScreenshotModeActive'); // @ts-expect-error TS error, cannot find type declaration for scss @@ -407,7 +410,7 @@ export class VisualizationsPlugin plugins: { embeddable: embeddableStart, embeddableEnhanced: embeddableEnhancedStart }, } = start(); - const { getVisualizeEmbeddableFactory } = await import('./react_embeddable'); + const getVisualizeEmbeddableFactory = await getVisualizeEmbeddableFactoryLazy(); return getVisualizeEmbeddableFactory({ embeddableStart, embeddableEnhancedStart }); }); embeddable.registerReactEmbeddableSavedObject({ diff --git a/src/plugins/visualizations/public/react_embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/react_embeddable/visualize_embeddable.tsx deleted file mode 100644 index ee95e8d0d94b3..0000000000000 --- a/src/plugins/visualizations/public/react_embeddable/visualize_embeddable.tsx +++ /dev/null @@ -1,549 +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 { EuiEmptyPrompt, EuiFlexGroup, EuiLoadingChart } from '@elastic/eui'; -import { isChartSizeEvent } from '@kbn/chart-expressions-common'; -import { APPLY_FILTER_TRIGGER } from '@kbn/data-plugin/public'; -import type { DataView } from '@kbn/data-views-plugin/public'; -import { EmbeddableEnhancedPluginStart } from '@kbn/embeddable-enhanced-plugin/public'; -import { - EmbeddableStart, - ReactEmbeddableFactory, - SELECT_RANGE_TRIGGER, -} from '@kbn/embeddable-plugin/public'; -import { ExpressionRendererParams, useExpressionRenderer } from '@kbn/expressions-plugin/public'; -import { i18n } from '@kbn/i18n'; -import { dispatchRenderComplete } from '@kbn/kibana-utils-plugin/public'; -import { apiPublishesSettings } from '@kbn/presentation-containers'; -import { - apiHasAppContext, - apiHasDisableTriggers, - apiHasExecutionContext, - apiIsOfType, - apiPublishesTimeRange, - apiPublishesTimeslice, - apiPublishesUnifiedSearch, - apiPublishesViewMode, - fetch$, - getUnchangingComparator, - initializeTimeRange, - initializeTitles, - useStateFromPublishingSubject, -} from '@kbn/presentation-publishing'; -import { apiPublishesSearchSession } from '@kbn/presentation-publishing/interfaces/fetch/publishes_search_session'; -import { get, isEmpty, isEqual, isNil, omitBy } from 'lodash'; -import React, { useEffect, useRef } from 'react'; -import { BehaviorSubject, switchMap } from 'rxjs'; -import { VISUALIZE_APP_NAME, VISUALIZE_EMBEDDABLE_TYPE } from '../../common/constants'; -import { VIS_EVENT_TO_TRIGGER } from '../embeddable'; -import { getCapabilities, getInspector, getUiActions, getUsageCollection } from '../services'; -import { ACTION_CONVERT_TO_LENS } from '../triggers'; -import { urlFor } from '../utils/saved_visualize_utils'; -import type { SerializedVis, Vis } from '../vis'; -import { createVisInstance } from './create_vis_instance'; -import { getExpressionRendererProps } from './get_expression_renderer_props'; -import { saveToLibrary } from './save_to_library'; -import { deserializeState, serializeState } from './state'; -import { - ExtraSavedObjectProperties, - VisualizeApi, - VisualizeOutputState, - VisualizeRuntimeState, - VisualizeSerializedState, - isVisualizeSavedObjectState, -} from './types'; - -export const getVisualizeEmbeddableFactory: (deps: { - embeddableStart: EmbeddableStart; - embeddableEnhancedStart?: EmbeddableEnhancedPluginStart; -}) => ReactEmbeddableFactory = ({ - embeddableStart, - embeddableEnhancedStart, -}) => ({ - type: VISUALIZE_EMBEDDABLE_TYPE, - deserializeState, - buildEmbeddable: async (initialState: unknown, buildApi, uuid, parentApi) => { - // Handle state transfer from legacy visualize editor, which uses the legacy visualize embeddable and doesn't - // produce a snapshot state. If buildEmbeddable is passed only a savedObjectId in the state, this means deserializeState - // was never run, and it needs to be invoked manually - const state = isVisualizeSavedObjectState(initialState) - ? await deserializeState({ - rawState: initialState, - }) - : (initialState as VisualizeRuntimeState); - - // Initialize dynamic actions - const dynamicActionsApi = embeddableEnhancedStart?.initializeReactEmbeddableDynamicActions( - uuid, - () => titlesApi.panelTitle.getValue(), - state - ); - // if it is provided, start the dynamic actions manager - const maybeStopDynamicActions = dynamicActionsApi?.startDynamicActions(); - - const { titlesApi, titleComparators, serializeTitles } = initializeTitles(state); - - // Count renders; mostly used for testing. - const renderCount$ = new BehaviorSubject(0); - const hasRendered$ = new BehaviorSubject(false); - - // Track vis data and initialize it into a vis instance - const serializedVis$ = new BehaviorSubject(state.serializedVis); - const initialVisInstance = await createVisInstance(state.serializedVis); - const vis$ = new BehaviorSubject(initialVisInstance); - - // Track UI state - const onUiStateChange = () => serializedVis$.next(vis$.getValue().serialize()); - initialVisInstance.uiState.on('change', onUiStateChange); - vis$.subscribe((vis) => vis.uiState.on('change', onUiStateChange)); - - // When the serialized vis changes, update the vis instance - serializedVis$ - .pipe( - switchMap(async (serializedVis) => { - const currentVis = vis$.getValue(); - if (currentVis) currentVis.uiState.off('change', onUiStateChange); - const vis = await createVisInstance(serializedVis); - const { params, abortController } = await getExpressionParams(); - return { vis, params, abortController }; - }) - ) - .subscribe(({ vis, params, abortController }) => { - vis$.next(vis); - if (params) expressionParams$.next(params); - expressionAbortController$.next(abortController); - }); - - // Track visualizations linked to a saved object in the library - const savedObjectId$ = new BehaviorSubject( - state.savedObjectId ?? state.serializedVis.id - ); - const savedObjectProperties$ = new BehaviorSubject( - undefined - ); - const linkedToLibrary$ = new BehaviorSubject(state.linkedToLibrary); - - // Track the vis expression - const expressionParams$ = new BehaviorSubject({ - expression: '', - }); - - const expressionAbortController$ = new BehaviorSubject(new AbortController()); - let getExpressionParams: () => ReturnType = async () => ({ - params: expressionParams$.getValue(), - abortController: expressionAbortController$.getValue(), - }); - - const { - api: customTimeRangeApi, - serialize: serializeCustomTimeRange, - comparators: customTimeRangeComparators, - } = initializeTimeRange(state); - - const searchSessionId$ = new BehaviorSubject(''); - - const viewMode$ = apiPublishesViewMode(parentApi) - ? parentApi.viewMode - : new BehaviorSubject('view'); - - const executionContext = apiHasExecutionContext(parentApi) - ? parentApi.executionContext - : undefined; - - const disableTriggers = apiHasDisableTriggers(parentApi) - ? parentApi.disableTriggers - : undefined; - - const parentApiContext = apiHasAppContext(parentApi) ? parentApi.getAppContext() : undefined; - - const inspectorAdapters$ = new BehaviorSubject>({}); - - // Track data views - let initialDataViews: DataView[] | undefined = []; - if (initialVisInstance.data.indexPattern) - initialDataViews = [initialVisInstance.data.indexPattern]; - if (initialVisInstance.type.getUsedIndexPattern) { - initialDataViews = await initialVisInstance.type.getUsedIndexPattern( - initialVisInstance.params - ); - } - - const dataLoading$ = new BehaviorSubject(true); - - const defaultPanelTitle = new BehaviorSubject(initialVisInstance.title); - - const api = buildApi( - { - ...customTimeRangeApi, - ...titlesApi, - ...(dynamicActionsApi?.dynamicActionsApi ?? {}), - defaultPanelTitle, - dataLoading: dataLoading$, - dataViews: new BehaviorSubject(initialDataViews), - supportedTriggers: () => [ - ACTION_CONVERT_TO_LENS, - APPLY_FILTER_TRIGGER, - SELECT_RANGE_TRIGGER, - ], - serializeState: () => { - const savedObjectProperties = savedObjectProperties$.getValue(); - return serializeState({ - serializedVis: vis$.getValue().serialize(), - titles: serializeTitles(), - id: savedObjectId$.getValue(), - linkedToLibrary: - // In the visualize editor, linkedToLibrary should always be false to force the full state to be serialized, - // instead of just passing a reference to the linked saved object. Other contexts like dashboards should - // serialize the state with just the savedObjectId so that the current revision of the vis is always used - apiIsOfType(parentApi, VISUALIZE_APP_NAME) ? false : linkedToLibrary$.getValue(), - ...(savedObjectProperties ? { savedObjectProperties } : {}), - ...(dynamicActionsApi?.serializeDynamicActions?.() ?? {}), - ...serializeCustomTimeRange(), - }); - }, - getVis: () => vis$.getValue(), - getInspectorAdapters: () => inspectorAdapters$.getValue(), - getTypeDisplayName: () => - i18n.translate('visualizations.displayName', { - defaultMessage: 'visualization', - }), - onEdit: async () => { - const stateTransferService = embeddableStart.getStateTransfer(); - const visId = savedObjectId$.getValue(); - const editPath = visId ? urlFor(visId) : '#/edit_by_value'; - const parentTimeRange = apiPublishesTimeRange(parentApi) - ? parentApi.timeRange$.getValue() - : {}; - const customTimeRange = customTimeRangeApi.timeRange$.getValue(); - - await stateTransferService.navigateToEditor('visualize', { - path: editPath, - state: { - embeddableId: uuid, - valueInput: { - savedVis: vis$.getValue().serialize(), - title: api.panelTitle?.getValue(), - description: api.panelDescription?.getValue(), - timeRange: customTimeRange ?? parentTimeRange, - }, - originatingApp: parentApiContext?.currentAppId ?? '', - searchSessionId: searchSessionId$.getValue() || undefined, - originatingPath: parentApiContext?.getCurrentPath?.(), - }, - }); - }, - isEditingEnabled: () => { - if (viewMode$.getValue() !== 'edit') return false; - const readOnly = Boolean(vis$.getValue().type.disableEdit); - if (readOnly) return false; - const capabilities = getCapabilities(); - const isByValue = !savedObjectId$.getValue(); - if (isByValue) - return Boolean( - capabilities.dashboard?.showWriteControls && capabilities.visualize?.show - ); - else return Boolean(capabilities.visualize?.save); - }, - updateVis: async (visUpdates) => { - const currentSerializedVis = vis$.getValue().serialize(); - serializedVis$.next({ - ...currentSerializedVis, - ...visUpdates, - params: { - ...currentSerializedVis.params, - ...visUpdates.params, - }, - data: { - ...currentSerializedVis.data, - ...visUpdates.data, - }, - } as SerializedVis); - if (visUpdates.title) { - titlesApi.setPanelTitle(visUpdates.title); - } - }, - openInspector: () => { - const adapters = inspectorAdapters$.getValue(); - if (!adapters) return; - const inspector = getInspector(); - if (!inspector.isAvailable(adapters)) return; - return getInspector().open(adapters, { - title: - titlesApi.panelTitle?.getValue() || - i18n.translate('visualizations.embeddable.inspectorTitle', { - defaultMessage: 'Inspector', - }), - }); - }, - // Library transforms - saveToLibrary: (newTitle: string) => { - titlesApi.setPanelTitle(newTitle); - const { rawState, references } = serializeState({ - serializedVis: vis$.getValue().serialize(), - titles: { - ...serializeTitles(), - title: newTitle, - }, - }); - return saveToLibrary({ - uiState: vis$.getValue().uiState, - rawState: rawState as VisualizeOutputState, - references, - }); - }, - canLinkToLibrary: () => !state.linkedToLibrary, - canUnlinkFromLibrary: () => !!state.linkedToLibrary, - checkForDuplicateTitle: () => false, // Handled by saveToLibrary action - getByValueState: () => ({ - savedVis: vis$.getValue().serialize(), - ...serializeTitles(), - }), - getByReferenceState: (libraryId) => - serializeState({ - serializedVis: vis$.getValue().serialize(), - titles: serializeTitles(), - id: libraryId, - linkedToLibrary: true, - }).rawState, - }, - { - ...titleComparators, - ...customTimeRangeComparators, - ...(dynamicActionsApi?.dynamicActionsComparator ?? { - enhancements: getUnchangingComparator(), - }), - serializedVis: [ - serializedVis$, - (value) => { - serializedVis$.next(value); - }, - (a, b) => { - const visA = a - ? { - ...omitBy(a, isEmpty), - data: omitBy(a.data, isNil), - params: omitBy(a.params, isNil), - } - : {}; - const visB = b - ? { - ...omitBy(b, isEmpty), - data: omitBy(b.data, isNil), - params: omitBy(b.params, isNil), - } - : {}; - return isEqual(visA, visB); - }, - ], - savedObjectId: [ - savedObjectId$, - (value) => savedObjectId$.next(value), - (a, b) => { - if (!a && !b) return true; - return a === b; - }, - ], - savedObjectProperties: getUnchangingComparator(), - linkedToLibrary: [linkedToLibrary$, (value) => linkedToLibrary$.next(value)], - } - ); - - const fetchSubscription = fetch$(api) - .pipe( - switchMap(async (data) => { - const unifiedSearch = apiPublishesUnifiedSearch(parentApi) - ? { - query: data.query, - filters: data.filters, - } - : {}; - const searchSessionId = apiPublishesSearchSession(parentApi) ? data.searchSessionId : ''; - searchSessionId$.next(searchSessionId); - const settings = apiPublishesSettings(parentApi) - ? { - syncColors: parentApi.settings.syncColors$.getValue(), - syncCursor: parentApi.settings.syncCursor$.getValue(), - syncTooltips: parentApi.settings.syncTooltips$.getValue(), - } - : {}; - - dataLoading$.next(true); - - const timeslice = apiPublishesTimeslice(parentApi) - ? parentApi.timeslice$.getValue() - : undefined; - - const customTimeRange = customTimeRangeApi.timeRange$.getValue(); - const parentTimeRange = apiPublishesTimeRange(parentApi) ? data.timeRange : undefined; - const timesliceTimeRange = timeslice - ? { - from: new Date(timeslice[0]).toISOString(), - to: new Date(timeslice[1]).toISOString(), - mode: 'absolute' as 'absolute', - } - : undefined; - - // Precedence should be: - // custom time range from state > - // timeslice time range > - // parent API time range from e.g. unified search - const timeRangeToRender = customTimeRange ?? timesliceTimeRange ?? parentTimeRange; - - getExpressionParams = async () => { - return await getExpressionRendererProps({ - unifiedSearch, - vis: vis$.getValue(), - settings, - disableTriggers, - searchSessionId, - parentExecutionContext: executionContext, - abortController: expressionAbortController$.getValue(), - timeRange: timeRangeToRender, - onRender: async (renderCount) => { - if (renderCount === renderCount$.getValue()) return; - renderCount$.next(renderCount); - const visInstance = vis$.getValue(); - const visTypeName = visInstance.type.name; - - let telemetryVisTypeName = visTypeName; - if (visTypeName === 'metrics') { - telemetryVisTypeName = 'legacy_metric'; - } - if (visTypeName === 'pie' && visInstance.params.isDonut) { - telemetryVisTypeName = 'donut'; - } - if ( - visTypeName === 'area' && - visInstance.params.seriesParams.some( - (seriesParams: { mode: string }) => seriesParams.mode === 'stacked' - ) - ) { - telemetryVisTypeName = 'area_stacked'; - } - - getUsageCollection().reportUiCounter( - executionContext?.type ?? '', - 'count', - `render_agg_based_${telemetryVisTypeName}` - ); - - if (hasRendered$.getValue() === true) return; - hasRendered$.next(true); - hasRendered$.complete(); - }, - onEvent: async (event) => { - // Visualize doesn't respond to sizing events, so ignore. - if (isChartSizeEvent(event)) { - return; - } - const currentVis = vis$.getValue(); - if (!disableTriggers) { - const triggerId = get( - VIS_EVENT_TO_TRIGGER, - event.name, - VIS_EVENT_TO_TRIGGER.filter - ); - let context; - - if (triggerId === VIS_EVENT_TO_TRIGGER.applyFilter) { - context = { - embeddable: api, - timeFieldName: currentVis.data.indexPattern?.timeFieldName!, - ...event.data, - }; - } else { - context = { - embeddable: api, - data: { - timeFieldName: currentVis.data.indexPattern?.timeFieldName!, - ...event.data, - }, - }; - } - await getUiActions().getTrigger(triggerId).exec(context); - } - }, - onData: (_, inspectorAdapters) => { - inspectorAdapters$.next( - typeof inspectorAdapters === 'function' ? inspectorAdapters() : inspectorAdapters - ); - dataLoading$.next(false); - }, - }); - }; - return await getExpressionParams(); - }) - ) - .subscribe(({ params, abortController }) => { - if (params) expressionParams$.next(params); - expressionAbortController$.next(abortController); - }); - - return { - api, - Component: () => { - const expressionParams = useStateFromPublishingSubject(expressionParams$); - const renderCount = useStateFromPublishingSubject(renderCount$); - const hasRendered = useStateFromPublishingSubject(hasRendered$); - const domNode = useRef(null); - const { error, isLoading } = useExpressionRenderer(domNode, expressionParams); - - useEffect(() => { - return () => { - fetchSubscription.unsubscribe(); - maybeStopDynamicActions?.stopDynamicActions(); - }; - }, []); - - useEffect(() => { - if (hasRendered && domNode.current) { - dispatchRenderComplete(domNode.current); - } - }, [hasRendered]); - - return ( -
- {/* Replicate the loading state for the expression renderer to avoid FOUC */} - - {isLoading && } - {!isLoading && error && ( - - {i18n.translate('visualizations.embeddable.errorTitle', { - defaultMessage: 'Unable to load visualization ', - })} - - } - body={ -

- {error.name}: {error.message} -

- } - /> - )} -
-
- ); - }, - }; - }, -}); diff --git a/src/plugins/visualizations/public/utils/saved_objects_utils/save_with_confirmation.ts b/src/plugins/visualizations/public/utils/saved_objects_utils/save_with_confirmation.ts index 18d6fc578d073..a7417585795f0 100644 --- a/src/plugins/visualizations/public/utils/saved_objects_utils/save_with_confirmation.ts +++ b/src/plugins/visualizations/public/utils/saved_objects_utils/save_with_confirmation.ts @@ -15,7 +15,7 @@ import { confirmModalPromise } from './confirm_modal_promise'; import type { StartServices } from '../../types'; import { visualizationsClient } from '../../content_management'; import { VisualizationSavedObjectAttributes, VisualizationSavedObject } from '../../../common'; -import { VisualizeOutputState } from '../../react_embeddable/types'; +import { VisualizeOutputState } from '../../embeddable/types'; /** * Attempts to create the current object using the serialized source. If an object already diff --git a/src/plugins/visualizations/public/utils/saved_visualization_references/saved_visualization_references.ts b/src/plugins/visualizations/public/utils/saved_visualization_references/saved_visualization_references.ts index f972b0682bd89..7e8e86b469c5d 100644 --- a/src/plugins/visualizations/public/utils/saved_visualization_references/saved_visualization_references.ts +++ b/src/plugins/visualizations/public/utils/saved_visualization_references/saved_visualization_references.ts @@ -16,7 +16,7 @@ import { import { DATA_VIEW_SAVED_OBJECT_TYPE } from '@kbn/data-views-plugin/common'; import { isObject } from 'lodash'; import { Reference } from '../../../common/content_management'; -import { VisualizeSavedVisInputState } from '../../react_embeddable/types'; +import { VisualizeSavedVisInputState } from '../../embeddable/types'; import { SavedVisState, SerializedVis, VisSavedObject } from '../../types'; import type { SerializableAttributes } from '../../vis_types/vis_type_alias_registry'; import { extractControlsReferences, injectControlsReferences } from './controls_references'; diff --git a/src/plugins/visualizations/public/visualize_app/types.ts b/src/plugins/visualizations/public/visualize_app/types.ts index 7a80dd2e4a8e2..53fb35114d0f9 100644 --- a/src/plugins/visualizations/public/visualize_app/types.ts +++ b/src/plugins/visualizations/public/visualize_app/types.ts @@ -53,7 +53,7 @@ import type { } from '..'; import type { ListingViewRegistry, SavedVisState } from '../types'; -import type { createVisEmbeddableFromObject } from '../embeddable'; +import type { createVisEmbeddableFromObject } from '../legacy/embeddable'; import type { VisEditorsRegistry } from '../vis_editors_registry'; export interface VisualizeAppState { diff --git a/src/plugins/visualizations/public/visualize_app/utils/get_visualization_instance.ts b/src/plugins/visualizations/public/visualize_app/utils/get_visualization_instance.ts index 1ad0803edf38c..3a3898093a8eb 100644 --- a/src/plugins/visualizations/public/visualize_app/utils/get_visualization_instance.ts +++ b/src/plugins/visualizations/public/visualize_app/utils/get_visualization_instance.ts @@ -16,7 +16,7 @@ import { createVisAsync } from '../../vis_async'; import { convertToSerializedVis, getSavedVisualization } from '../../utils/saved_visualize_utils'; import { SerializedVis, Vis, VisSavedObject, VisualizeEmbeddableContract } from '../..'; import type { VisInstance, VisualizeServices } from '../types'; -import { VisualizeInput } from '../../embeddable'; +import { VisualizeInput } from '../../legacy/embeddable'; function isErrorRelatedToRuntimeFields(error: ExpressionValueError['error']) { const originalError = error.original || error; From 756cd63a83044e2aefe41e183fff38acf387d597 Mon Sep 17 00:00:00 2001 From: Agustina Nahir Ruidiaz <61565784+agusruidiazgd@users.noreply.github.com> Date: Thu, 12 Sep 2024 09:38:32 +0200 Subject: [PATCH 018/168] [Security Solution] Data ingestion hub header cards (#190696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR is one of the tasks on the issue [#189487](https://github.com/elastic/kibana/issues/189487). I've created this PR that contains the new cards that will be placed in the new header under the new **Data Ingestion Hub**. Cards: Screenshot 2024-09-02 at 14 32 55 Screenshot 2024-09-02 at 14 42 13 **Summary:** - Card 1: On click `Watch video` → Open modal with current Get Started video. - Card 2: On click `Add users` → `ESS: http://localhost:5601/app/management/security/users` `serverless: https://cloud.elastic.co/account/members`. - Card 3: On click `Explore Demo` → navigate to `https://www.elastic.co/demo-gallery/security-overview` Behavior of each card: https://github.com/user-attachments/assets/fabdb807-5442-42c9-84c7-6bbc0084e7a1 ** UPDATE: @paulewing I've removed the feature flag and render directly the new header, also I've removed the card that renders the same video we are showing on the new header (first card). Screenshot 2024-09-09 at 10 11 10 ### 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: Elastic Machine Co-authored-by: Angela Chuang <6295984+angorayc@users.noreply.github.com> --- .../onboarding/onboarding_page_service.ts | 7 ++ .../onboarding/card_item.test.tsx | 16 +-- .../content/data_ingestion_hub_video.tsx | 77 ++++++++++++++ .../card_step/step_content.test.tsx | 47 ++++---- .../cards/card.styles.ts | 56 ++++++++++ .../cards/card.test.tsx | 42 ++++++++ .../data_ingestion_hub_header/cards/card.tsx | 60 +++++++++++ .../cards/header_cards.tsx | 64 +++++++++++ .../cards/link_card/link_card.tsx | 43 ++++++++ .../cards/video_card/video_card.tsx | 75 +++++++++++++ .../cards/video_card/video_modal.styles.ts | 29 +++++ .../cards/video_card/video_modal.test.tsx | 43 ++++++++ .../cards/video_card/video_modal.tsx | 80 ++++++++++++++ .../index.styles.ts} | 0 .../data_ingestion_hub_header/index.test.tsx | 53 +++++++++- .../data_ingestion_hub_header/index.tsx | 79 ++++++++------ .../data_ingestion_hub_header/translations.ts | 100 ++++++++++++++++++ .../landing_page/onboarding/helpers.test.ts | 5 - .../hooks/use_toggle_panel.test.tsx | 19 ---- .../onboarding/hooks/use_users_url.ts | 14 +++ .../images/dark_data_ingestion_hub_demo.png | Bin 0 -> 9548 bytes .../dark_data_ingestion_hub_teammates.png | Bin 0 -> 10901 bytes .../images/dark_data_ingestion_hub_video.png | Bin 0 -> 5298 bytes .../images/data_ingestion_hub_demo.png | Bin 0 -> 6826 bytes .../images/data_ingestion_hub_teammates.png | Bin 0 -> 10464 bytes .../images/data_ingestion_hub_video.png | Bin 0 -> 6645 bytes .../onboarding/onboarding.test.tsx | 28 +---- .../landing_page/onboarding/onboarding.tsx | 22 +--- .../landing_page/onboarding/reducer.test.ts | 17 +-- .../landing_page/onboarding/sections.tsx | 4 - .../public/common/constants.ts | 2 + .../public/onboarding/onboarding.ts | 9 +- .../public/plugin.ts | 3 + .../functional/services/svl_sec_navigation.ts | 2 +- 34 files changed, 846 insertions(+), 150 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/data_ingestion_hub_video.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/card.styles.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/card.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/card.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/header_cards.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/link_card/link_card.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/video_card/video_card.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/video_card/video_modal.styles.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/video_card/video_modal.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/cards/video_card/video_modal.tsx rename x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/{styles/data_ingestion_hub_header.styles.ts => data_ingestion_hub_header/index.styles.ts} (100%) create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/data_ingestion_hub_header/translations.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/hooks/use_users_url.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/images/dark_data_ingestion_hub_demo.png create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/images/dark_data_ingestion_hub_teammates.png create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/images/dark_data_ingestion_hub_video.png create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/images/data_ingestion_hub_demo.png create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/images/data_ingestion_hub_teammates.png create mode 100644 x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/images/data_ingestion_hub_video.png diff --git a/x-pack/plugins/security_solution/public/app/components/onboarding/onboarding_page_service.ts b/x-pack/plugins/security_solution/public/app/components/onboarding/onboarding_page_service.ts index ea5beab4608d2..16448b92d3a4f 100644 --- a/x-pack/plugins/security_solution/public/app/components/onboarding/onboarding_page_service.ts +++ b/x-pack/plugins/security_solution/public/app/components/onboarding/onboarding_page_service.ts @@ -13,22 +13,26 @@ import type { StepId } from '../../../common/components/landing_page/onboarding/ export class OnboardingPageService { private productTypesSubject$: BehaviorSubject; private projectsUrlSubject$: BehaviorSubject; + private usersUrlSubject$: BehaviorSubject; private projectFeaturesUrlSubject$: BehaviorSubject; private availableStepsSubject$: BehaviorSubject; public productTypes$: Observable; public projectsUrl$: Observable; + public usersUrl$: Observable; public projectFeaturesUrl$: Observable; public availableSteps$: Observable; constructor() { this.productTypesSubject$ = new BehaviorSubject(undefined); this.projectsUrlSubject$ = new BehaviorSubject(undefined); + this.usersUrlSubject$ = new BehaviorSubject(undefined); this.projectFeaturesUrlSubject$ = new BehaviorSubject(undefined); this.availableStepsSubject$ = new BehaviorSubject([]); this.productTypes$ = this.productTypesSubject$.asObservable(); this.projectsUrl$ = this.projectsUrlSubject$.asObservable(); + this.usersUrl$ = this.usersUrlSubject$.asObservable(); this.projectFeaturesUrl$ = this.projectFeaturesUrlSubject$.asObservable(); this.availableSteps$ = this.availableStepsSubject$.asObservable(); } @@ -39,6 +43,9 @@ export class OnboardingPageService { setProjectFeaturesUrl(projectFeaturesUrl: string | undefined) { this.projectFeaturesUrlSubject$.next(projectFeaturesUrl); } + setUsersUrl(userUrl: string | undefined) { + this.usersUrlSubject$.next(userUrl); + } setProjectsUrl(projectsUrl: string | undefined) { this.projectsUrlSubject$.next(projectsUrl); } diff --git a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_item.test.tsx b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_item.test.tsx index 91417dc8e3ddf..c0730847c5e43 100644 --- a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_item.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_item.test.tsx @@ -9,7 +9,7 @@ import { render } from '@testing-library/react'; import { CardItem } from './card_item'; import type { ExpandedCardSteps, StepId } from './types'; -import { QuickStartSectionCardsId, SectionId, OverviewSteps } from './types'; +import { SectionId, ViewDashboardSteps, AddAndValidateYourDataCardsId } from './types'; jest.mock('./card_step'); describe('CardItemComponent', () => { @@ -17,7 +17,7 @@ describe('CardItemComponent', () => { const onStepClicked = jest.fn(); const toggleTaskCompleteStatus = jest.fn(); const expandedCardSteps = { - [QuickStartSectionCardsId.watchTheOverviewVideo]: { + [AddAndValidateYourDataCardsId.viewDashboards]: { isExpanded: false, expandedSteps: [] as StepId[], }, @@ -26,17 +26,17 @@ describe('CardItemComponent', () => { it('should render card', () => { const { getByTestId } = render( ); - const cardTitle = getByTestId(QuickStartSectionCardsId.watchTheOverviewVideo); + const cardTitle = getByTestId(AddAndValidateYourDataCardsId.viewDashboards); expect(cardTitle).toBeInTheDocument(); }); @@ -44,12 +44,12 @@ describe('CardItemComponent', () => { const { queryByText } = render( ); diff --git a/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/data_ingestion_hub_video.tsx b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/data_ingestion_hub_video.tsx new file mode 100644 index 0000000000000..181d4a797ebbc --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/landing_page/onboarding/card_step/content/data_ingestion_hub_video.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 { EuiFlexGroup, EuiFlexItem, EuiIcon, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; +import React, { useCallback } from 'react'; +import { INGESTION_HUB_VIDEO_SOURCE } from '../../../../../constants'; +import { WATCH_VIDEO_BUTTON_TITLE } from '../../translations'; + +const VIDEO_CONTENT_HEIGHT = 309; + +const DataIngestionHubVideoComponent: React.FC = () => { + const ref = React.useRef(null); + const [isVideoPlaying, setIsVideoPlaying] = React.useState(false); + const { euiTheme } = useEuiTheme(); + + const onVideoClicked = useCallback(() => { + setIsVideoPlaying(true); + }, []); + + return ( +
+
+ {isVideoPlaying && ( + + + + + + )} + {!isVideoPlaying && ( +