diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index e0faadd77091c6..1e2bc2a852ac09 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -11,12 +11,13 @@ disabled: - x-pack/test/fleet_api_integration/config.base.ts - x-pack/test/security_solution_api_integration/config/ess/config.base.ts - x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts + - x-pack/test/security_solution_api_integration/config/ess/config.base.edr_workflows.trial.ts + - x-pack/test/security_solution_api_integration/config/ess/config.base.edr_workflows.ts + - x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts - x-pack/test/security_solution_api_integration/config/serverless/config.base.ts + - x-pack/test/security_solution_api_integration/config/serverless/config.base.edr_workflows.ts - x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/config.base.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.base.ts - - x-pack/test/security_solution_endpoint/config.base.ts - - x-pack/test/security_solution_endpoint_api_int/config.base.ts + - x-pack/test/security_solution_endpoint/configs/config.base.ts # QA suites that are run out-of-band - x-pack/test/stack_functional_integration/configs/config.stack_functional_integration_base.js @@ -408,6 +409,10 @@ enabled: - x-pack/test/security_functional/insecure_cluster_warning.config.ts - x-pack/test/security_functional/user_profiles.config.ts - x-pack/test/security_functional/expired_session.config.ts + - x-pack/test/security_solution_endpoint/configs/endpoint.config.ts + - x-pack/test/security_solution_endpoint/configs/serverless.endpoint.config.ts + - x-pack/test/security_solution_endpoint/configs/integrations.config.ts + - x-pack/test/security_solution_endpoint/configs/serverless.integrations.config.ts - x-pack/test/session_view/basic/config.ts - x-pack/test/spaces_api_integration/security_and_spaces/config_basic.ts - x-pack/test/spaces_api_integration/security_and_spaces/copy_to_space_config_basic.ts @@ -578,9 +583,17 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/security_and_spaces/configs/ess.trial.config.ts - x-pack/test/security_solution_api_integration/test_suites/sources/indices/trial_license_complete_tier/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/sources/indices/trial_license_complete_tier/configs/serverless.config.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/config.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/configs/serverless.config.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/endpoint.config.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.endpoint.config.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/integrations.config.ts - - x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/configs/serverless.integrations.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/artifacts/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/artifacts/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/authentication/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/metadata/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/metadata/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/package/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/package/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/policy_response/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/policy_response/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/resolver/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/resolver/trial_license_complete_tier/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/edr_workflows/response_actions/trial_license_complete_tier/configs/serverless.config.ts diff --git a/.buildkite/pipeline-utils/agent_images.ts b/.buildkite/pipeline-utils/agent_images.ts index 0606f036b1c647..d139f7953e00fa 100644 --- a/.buildkite/pipeline-utils/agent_images.ts +++ b/.buildkite/pipeline-utils/agent_images.ts @@ -52,4 +52,19 @@ function getAgentImageConfig({ returnYaml = false } = {}): string | AgentImageCo return config; } -export { getAgentImageConfig }; +const expandAgentQueue = (queueName: string = 'n2-4-spot') => { + const [kind, cores, addition] = queueName.split('-'); + const additionalProps = + { + spot: { preemptible: true }, + virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, + }[addition] || {}; + + return { + ...getAgentImageConfig(), + machineType: `${kind}-standard-${cores}`, + ...additionalProps, + }; +}; + +export { getAgentImageConfig, expandAgentQueue }; diff --git a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts index 20b2d366e60675..a24214b1e62b0d 100644 --- a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts +++ b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts @@ -16,27 +16,10 @@ import { BuildkiteClient, BuildkiteStep } from '../buildkite'; import { CiStatsClient, TestGroupRunOrderResponse } from './client'; import DISABLED_JEST_CONFIGS from '../../disabled_jest_configs.json'; -import { getAgentImageConfig } from '#pipeline-utils'; +import { expandAgentQueue } from '#pipeline-utils'; type RunGroup = TestGroupRunOrderResponse['types'][0]; -// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized -/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ -const getAgentRule = (queueName: string = 'n2-4-spot') => { - if (process.env?.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld') { - const [kind, cores, spot] = queueName.split('-'); - return { - ...getAgentImageConfig(), - machineType: `${kind}-standard-${cores}`, - preemptible: spot === 'spot', - }; - } else { - return { - queue: queueName, - }; - } -}; - const getRequiredEnv = (name: string) => { const value = process.env[name]; if (typeof value !== 'string' || !value) { @@ -436,7 +419,7 @@ export async function pickTestGroupRunOrder() { parallelism: unit.count, timeout_in_minutes: 120, key: 'jest', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -454,7 +437,7 @@ export async function pickTestGroupRunOrder() { parallelism: integration.count, timeout_in_minutes: 120, key: 'jest-integration', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -488,7 +471,7 @@ export async function pickTestGroupRunOrder() { label: title, command: getRequiredEnv('FTR_CONFIGS_SCRIPT'), timeout_in_minutes: 90, - agents: getAgentRule(queue), + agents: expandAgentQueue(queue), env: { FTR_CONFIG_GROUP_KEY: key, ...FTR_EXTRA_ARGS, diff --git a/.buildkite/pipelines/flaky_tests/pipeline.ts b/.buildkite/pipelines/flaky_tests/pipeline.ts index 6a5b7da38a1436..d77504deacb454 100644 --- a/.buildkite/pipelines/flaky_tests/pipeline.ts +++ b/.buildkite/pipelines/flaky_tests/pipeline.ts @@ -7,7 +7,7 @@ */ import { groups } from './groups.json'; -import { BuildkiteStep } from '#pipeline-utils'; +import { BuildkiteStep, expandAgentQueue } from '#pipeline-utils'; const configJson = process.env.KIBANA_FLAKY_TEST_RUNNER_CONFIG; if (!configJson) { @@ -32,34 +32,6 @@ if (Number.isNaN(concurrency)) { const BASE_JOBS = 1; const MAX_JOBS = 500; -// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized -/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ -const getAgentRule = (queueName: string = 'n2-4-spot') => { - if ( - process.env.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld' || - process.env.BUILDKITE_AGENT_META_DATA_PROVIDER === 'k8s' - ) { - const [kind, cores, addition] = queueName.split('-'); - const additionalProps = - { - spot: { preemptible: true }, - virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, - }[addition] || {}; - - return { - provider: 'gcp', - image: 'family/kibana-ubuntu-2004', - imageProject: 'elastic-images-prod', - machineType: `${kind}-standard-${cores}`, - ...additionalProps, - }; - } else { - return { - queue: queueName, - }; - } -}; - function getTestSuitesFromJson(json: string) { const fail = (errorMsg: string) => { console.error('+++ Invalid test config provided'); @@ -150,7 +122,7 @@ const pipeline = { steps.push({ command: '.buildkite/scripts/steps/build_kibana.sh', label: 'Build Kibana Distribution and Plugins', - agents: getAgentRule('c2-8'), + agents: expandAgentQueue('c2-8'), key: 'build', if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''", }); @@ -173,7 +145,7 @@ for (const testSuite of testSuites) { concurrency, concurrency_group: process.env.UUID, concurrency_method: 'eager', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), depends_on: 'build', timeout_in_minutes: 150, cancel_on_build_failing: true, @@ -197,7 +169,7 @@ for (const testSuite of testSuites) { steps.push({ command: `.buildkite/scripts/steps/functional/${suiteName}.sh`, label: group.name, - agents: getAgentRule(agentQueue), + agents: expandAgentQueue(agentQueue), key: `cypress-suite-${suiteIndex++}`, depends_on: 'build', timeout_in_minutes: 150, @@ -233,7 +205,7 @@ pipeline.steps.push({ pipeline.steps.push({ command: 'ts-node .buildkite/pipelines/flaky_tests/post_stats_on_pr.ts', label: 'Post results on Github pull request', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), timeout_in_minutes: 15, retry: { automatic: [{ exit_status: '-1', limit: 3 }], diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index ae6c05721ae843..4eb15c16970ef3 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -16,28 +16,6 @@ steps: limit: 1 - wait - - label: 'Triggering changes-based pipelines' - branches: main - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-2 - # TODO: this can probably be deleted after the migration https://github.com/elastic/kibana-operations/issues/15 - plugins: - - chronotc/monorepo-diff#v2.0.4: - watch: - - path: - - 'versions.json' - config: - command: 'ts-node .buildkite/scripts/steps/trigger_pipeline.ts kibana-buildkite-pipelines-deploy main' - label: 'Trigger pipeline deploy' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-2 - - command: .buildkite/scripts/steps/on_merge_build_and_metrics.sh label: Build Kibana Distribution and Plugins agents: 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 b880b0a5f2f020..b9ff060e706e77 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 @@ -1,18 +1,143 @@ steps: - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/edr_workflows/mki_security_solution_defend_workflows.sh cypress:dw:qa:serverless:run - label: "Cypress MKI - Defend Workflows " - key: test_defend_workflows - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - enableNestedVirtualization: true - localSsds: 1 - localSsdInterface: nvme - machineType: n2-standard-4 - timeout_in_minutes: 300 - parallelism: 6 - retry: - automatic: - - exit_status: "*" - limit: 1 + - group: "Cypress MKI - Defend Workflows" + key: cypress_test_defend_workflows + steps: + - label: "Running cypress:dw:qa:serverless:run" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/edr_workflows/mki_security_solution_defend_workflows.sh cypress:dw:qa:serverless:run + key: test_defend_workflows + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 + timeout_in_minutes: 300 + parallelism: 6 + retry: + automatic: + - exit_status: "*" + limit: 1 + + - group: "API MKI - Defend Workflows" + key: api_test_defend_workflows + steps: +# - label: "Running edr_workflows:artifacts:qa:serverless" +# command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:artifacts:qa:serverless +# key: edr_workflows:artifacts:qa:serverless +# agents: +# image: family/kibana-ubuntu-2004 +# imageProject: elastic-images-prod +# provider: gcp +# enableNestedVirtualization: true +# localSsds: 1 +# localSsdInterface: nvme +# machineType: n2-standard-4 +# timeout_in_minutes: 120 +# retry: +# automatic: +# - exit_status: "1" +# limit: 1 +# +# - label: "Running edr_workflows:authentication:qa:serverless" +# command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:authentication:qa:serverless +# key: edr_workflows:authentication:qa:serverless +# agents: +# image: family/kibana-ubuntu-2004 +# imageProject: elastic-images-prod +# provider: gcp +# enableNestedVirtualization: true +# localSsds: 1 +# localSsdInterface: nvme +# machineType: n2-standard-4 +# timeout_in_minutes: 120 +# retry: +# automatic: +# - exit_status: "1" +# limit: 1 +# +# - label: "Running edr_workflows:metadata:qa:serverless" +# command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:metadata:qa:serverless +# key: edr_workflows:metadata:qa:serverless +# agents: +# image: family/kibana-ubuntu-2004 +# imageProject: elastic-images-prod +# provider: gcp +# enableNestedVirtualization: true +# localSsds: 1 +# localSsdInterface: nvme +# machineType: n2-standard-4 +# timeout_in_minutes: 120 +# retry: +# automatic: +# - exit_status: "1" +# limit: 1 +# +# - label: "Running edr_workflows:package:qa:serverless" +# command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:package:qa:serverless +# key: edr_workflows:package:qa:serverless +# agents: +# image: family/kibana-ubuntu-2004 +# imageProject: elastic-images-prod +# provider: gcp +# enableNestedVirtualization: true +# localSsds: 1 +# localSsdInterface: nvme +# machineType: n2-standard-4 +# timeout_in_minutes: 120 +# retry: +# automatic: +# - exit_status: "1" +# limit: 1 + + - label: "Running edr_workflows:policy_response:qa:serverless" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:policy_response:qa:serverless + key: edr_workflows:policy_response:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 1 + + - label: "Running edr_workflows:resolver:qa:serverless" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:resolver:qa:serverless + key: edr_workflows:resolver:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 1 + + - label: "Running edr_workflows:response_actions:qa:serverless" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh edr_workflows:response_actions:qa:serverless + key: edr_workflows:response_actions:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 1 diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 0c6714d1c75b77..0758e0255247f6 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -45,52 +45,6 @@ "/__snapshots__/", "\\.test\\.(ts|tsx|js|jsx)" ] - }, - { - "repoOwner": "elastic", - "repoName": "kibana", - "pipelineSlug": "kibana-kme-test", - - "enabled": true, - "allow_org_users": true, - "allowed_repo_permissions": ["admin", "write"], - "set_commit_status": true, - "commit_status_context": "kibana-ci-test", - "build_on_commit": true, - "build_on_comment": false, - "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))", - "skip_ci_labels": [], - "labels": ["kme-test"], - "skip_target_branches": ["6.8", "7.11", "7.12"], - "enable_skippable_commits": true, - "skip_ci_on_only_changed": [ - "^dev_docs/", - "^docs/", - "^rfcs/", - "^\\.github/", - "\\.md$", - "\\.mdx$", - "^api_docs/.+\\.devdocs\\.json$", - "^\\.backportrc\\.json$", - "^nav-kibana-dev\\.docnav\\.json$", - "^src/dev/prs/kibana_qa_pr_list\\.json$", - "^\\.buildkite/pull_requests\\.json$", - "^\\.catalog-info\\.yaml$" - ], - "always_require_ci_on_changed": [ - "^docs/developer/plugin-list.asciidoc$", - "^\\.github/CODEOWNERS$", - "/plugins/[^/]+/readme\\.(md|asciidoc)$" - ], - "kibana_versions_check": true, - "kibana_build_reuse": true, - "kibana_build_reuse_pipeline_slugs": ["kibana-kme-test", "kibana-on-merge"], - "kibana_build_reuse_regexes": [ - "^test/", - "^x-pack/test/", - "/__snapshots__/", - "\\.test\\.(ts|tsx|js|jsx)" - ] } ] } diff --git a/.buildkite/scripts/common/env.sh b/.buildkite/scripts/common/env.sh index a8fa9cae419d00..1d401bab4282ab 100755 --- a/.buildkite/scripts/common/env.sh +++ b/.buildkite/scripts/common/env.sh @@ -47,7 +47,6 @@ export MERGE_QUEUE_TARGET_BRANCH BUILDKITE_BRANCH_MERGE_QUEUE="${MERGE_QUEUE_TARGET_BRANCH:-${BUILDKITE_BRANCH:-}}" export BUILDKITE_BRANCH_MERGE_QUEUE - BUILDKITE_AGENT_GCP_REGION="" if [[ "$(curl -is metadata.google.internal || true)" ]]; then # projects/1003139005402/zones/us-central1-a -> us-central1-a -> us-central1 @@ -62,7 +61,6 @@ fi export GECKODRIVER_CDNURL="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache$CI_PROXY_CACHE_SUFFIX" export CHROMEDRIVER_CDNURL="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache$CI_PROXY_CACHE_SUFFIX" -export RE2_DOWNLOAD_MIRROR="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache$CI_PROXY_CACHE_SUFFIX" export CYPRESS_DOWNLOAD_MIRROR="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache$CI_PROXY_CACHE_SUFFIX/cypress" export NODE_OPTIONS="--max-old-space-size=4096" @@ -133,15 +131,19 @@ export TEST_GROUP_TYPE_FUNCTIONAL="Functional Tests" export GH_REPO=github.com/elastic/kibana FTR_ENABLE_FIPS_AGENT=false -# used by FIPS agents to link FIPS OpenSSL modules if [[ "${KBN_ENABLE_FIPS:-}" == "true" ]] || is_pr_with_label "ci:enable-fips-agent"; then FTR_ENABLE_FIPS_AGENT=true + # used by FIPS agents to link FIPS OpenSSL modules export OPENSSL_MODULES=$HOME/openssl/lib/ossl-modules if [[ -f "$KIBANA_DIR/config/node.options" ]]; then echo -e '\n--enable-fips' >>"$KIBANA_DIR/config/node.options" echo "--openssl-config=$HOME/nodejs.cnf" >>"$KIBANA_DIR/config/node.options" fi + + if [[ -f "$KIBANA_DIR/config/kibana.yml" ]]; then + echo -e '\nxpack.security.experimental.fipsMode.enabled: true' >>"$KIBANA_DIR/config/kibana.yml" + fi fi export FTR_ENABLE_FIPS_AGENT diff --git a/.buildkite/scripts/common/util.sh b/.buildkite/scripts/common/util.sh index bc5983e2496691..90648165a082d4 100755 --- a/.buildkite/scripts/common/util.sh +++ b/.buildkite/scripts/common/util.sh @@ -33,7 +33,7 @@ check_for_changed_files() { SHOULD_AUTO_COMMIT_CHANGES="${2:-}" CUSTOM_FIX_MESSAGE="${3:-}" - GIT_CHANGES="$(git status --porcelain -- . ':!:.bazelrc' ':!:config/node.options')" + GIT_CHANGES="$(git status --porcelain -- . ':!:.bazelrc' ':!:config/node.options' ':!config/kibana.yml')" if [ "$GIT_CHANGES" ]; then if ! is_auto_commit_disabled && [[ "$SHOULD_AUTO_COMMIT_CHANGES" == "true" && "${BUILDKITE_PULL_REQUEST:-}" ]]; then @@ -56,7 +56,7 @@ check_for_changed_files() { git config --global user.name kibanamachine git config --global user.email '42973632+kibanamachine@users.noreply.github.com' gh pr checkout "${BUILDKITE_PULL_REQUEST}" - git add -A -- . ':!.bazelrc' ':!config/node.options' + git add -A -- . ':!.bazelrc' ':!config/node.options' ':!config/kibana.yml' git commit -m "$NEW_COMMIT_MESSAGE" git push diff --git a/.buildkite/scripts/steps/artifacts/publish.sh b/.buildkite/scripts/steps/artifacts/publish.sh index c272acac22614c..08c6ecc1e25ad8 100644 --- a/.buildkite/scripts/steps/artifacts/publish.sh +++ b/.buildkite/scripts/steps/artifacts/publish.sh @@ -62,7 +62,7 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]]; then download_artifact beats_manifest.json /tmp --build "${KIBANA_BUILD_ID:-$BUILDKITE_BUILD_ID}" export BEATS_MANIFEST_URL=$(jq -r .manifest_url /tmp/beats_manifest.json) - PUBLISH_CMD=$(cat < EOF + PUBLISH_CMD=$(cat << EOF docker run --rm \ --name release-manager \ -e VAULT_ADDR \ @@ -79,7 +79,8 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]]; then --qualifier "$VERSION_QUALIFIER" \ --dependency "beats:$BEATS_MANIFEST_URL" \ --artifact-set main -EOF) +EOF +) if [[ "${DRY_RUN:-}" =~ ^(1|true)$ ]]; then PUBLISH_CMD+=(" --dry-run") fi diff --git a/.buildkite/scripts/steps/code_generation/security_solution_codegen.sh b/.buildkite/scripts/steps/code_generation/security_solution_codegen.sh index 5a37c8a08d99a7..63ed00a3513f9c 100755 --- a/.buildkite/scripts/steps/code_generation/security_solution_codegen.sh +++ b/.buildkite/scripts/steps/code_generation/security_solution_codegen.sh @@ -6,17 +6,22 @@ source .buildkite/scripts/common/util.sh echo --- Security Solution OpenAPI Code Generation -echo OpenAPI Common Package +echo -e "\n[Security Solution OpenAPI Code Generation] OpenAPI Common Package" (cd packages/kbn-openapi-common && yarn openapi:generate) check_for_changed_files "yarn openapi:generate" true -echo Lists API Common Package +echo -e "\n[Security Solution OpenAPI Code Generation] Lists Common Package\n" (cd packages/kbn-securitysolution-lists-common && yarn openapi:generate) check_for_changed_files "yarn openapi:generate" true -echo Security Solution Plugin +echo -e "\n[Security Solution OpenAPI Code Generation] Exceptions Common Package" + +(cd packages/kbn-securitysolution-exceptions-common && yarn openapi:generate) +check_for_changed_files "yarn openapi:generate" true + +echo -e "\n[Security Solution OpenAPI Code Generation] Security Solution Plugin" (cd x-pack/plugins/security_solution && yarn openapi:generate) check_for_changed_files "yarn openapi:generate" true \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bb9fa9d83a5cd2..36e3b0f10d4ca9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -752,6 +752,7 @@ x-pack/packages/security-solution/data_table @elastic/security-threat-hunting-in packages/kbn-securitysolution-ecs @elastic/security-threat-hunting-explore packages/kbn-securitysolution-es-utils @elastic/security-detection-engine packages/kbn-securitysolution-exception-list-components @elastic/security-detection-engine +packages/kbn-securitysolution-exceptions-common @elastic/security-detection-engine packages/kbn-securitysolution-hook-utils @elastic/security-detection-engine packages/kbn-securitysolution-io-ts-alerting-types @elastic/security-detection-engine packages/kbn-securitysolution-io-ts-list-types @elastic/security-detection-engine @@ -1236,6 +1237,7 @@ x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant /.buildkite/scripts/steps/esql_grammar_sync.sh @elastic/kibana-esql /.buildkite/scripts/steps/esql_generate_function_metadata.sh @elastic/kibana-esql /.buildkite/pipelines/esql_grammar_sync.yml @elastic/kibana-esql +/.buildkite/scripts/steps/code_generation/security_solution_codegen.sh @elastic/security-detection-rule-management /kbn_pm/ @elastic/kibana-operations /x-pack/dev-tools @elastic/kibana-operations /catalog-info.yaml @elastic/kibana-operations @elastic/kibana-tech-leads @@ -1617,8 +1619,8 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/server/lib/license/ @elastic/security-defend-workflows /x-pack/plugins/security_solution/server/fleet_integration/ @elastic/security-defend-workflows /x-pack/plugins/security_solution/scripts/endpoint/ @elastic/security-defend-workflows -/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/ @elastic/security-defend-workflows -/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/ @elastic/security-defend-workflows +/x-pack/test/security_solution_endpoint/ @elastic/security-defend-workflows +/x-pack/test/security_solution_api_integration/test_suites/edr_workflows/ @elastic/security-defend-workflows /x-pack/test_serverless/shared/lib/security/kibana_roles/ @elastic/security-defend-workflows /x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management @elastic/security-defend-workflows /x-pack/plugins/security_solution_serverless/public/upselling/pages/endpoint_management @elastic/security-defend-workflows diff --git a/.github/paths-labeller.yml b/.github/paths-labeller.yml index 49c2f6dba53b01..dbbefda24c9ac1 100644 --- a/.github/paths-labeller.yml +++ b/.github/paths-labeller.yml @@ -14,14 +14,15 @@ - 'packages/kbn-apm-synthtrace/**/*.*' - 'packages/kbn-apm-synthtrace-client/**/*.*' - 'packages/kbn-apm-utils/**/*.*' - - 'x-pack/plugins/observability_solution/synthetics/**/*.*' - 'x-pack/plugins/observability_solution/ux/**/*.*' - - 'x-pack/plugins/observability_solution/exploratory_view/**/*.*' - 'Team:Fleet': - 'x-pack/plugins/fleet/**/*.*' - 'x-pack/test/fleet_api_integration/**/*.*' - 'Team:obs-ux-management': - 'x-pack/plugins/observability_solution/observability/**/*.*' + - 'x-pack/plugins/observability_solution/slo/**/*.*' + - 'x-pack/plugins/observability_solution/synthetics/**/*.*' + - 'x-pack/plugins/observability_solution/exploratory_view/**/*.*' - 'Team:Obs AI Assistant': - 'x-pack/plugins/observability_solution/observability_ai_assistant/**/*.*' - 'x-pack/plugins/observability_solution/observability_ai_assistant_*/**/*.*' diff --git a/.node-version b/.node-version index f203ab89b795f5..b8e593f5210c85 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -20.13.1 +20.15.1 diff --git a/.nvmrc b/.nvmrc index f203ab89b795f5..b8e593f5210c85 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.13.1 +20.15.1 diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 2b03b20803bd7f..c1bae6c549f52a 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -22,13 +22,13 @@ load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install # Setup the Node.js toolchain for the architectures we want to support node_repositories( node_repositories = { - "20.13.1-darwin_amd64": ("node-v20.13.1-darwin-x64.tar.gz", "node-v20.13.1-darwin-x64", "80bde95dc976b84db5ca566738c07305087ae578f5f3b05191e0e6ff54aaeaf2"), - "20.13.1-darwin_arm64": ("node-v20.13.1-darwin-arm64.tar.gz", "node-v20.13.1-darwin-arm64", "c30fe595f59dcd2c5158da6bf8bc251ffc85ca37304afa89db150fb3c62c4507"), - "20.13.1-linux_arm64": ("node-v20.13.1-linux-arm64.tar.xz", "node-v20.13.1-linux-arm64", "5a41797a5815f42e0e9e4d2185d07d5d395386dc681a5a914563586c735ae31f"), - "20.13.1-linux_amd64": ("node-v20.13.1-linux-x64.tar.xz", "node-v20.13.1-linux-x64", "eb449c4db6c5769c4219fdbfa1c7cbc8b367b9f8c7be1eb534dc8f6a3c80a97f"), - "20.13.1-windows_amd64": ("node-v20.13.1-win-x64.zip", "node-v20.13.1-win-x64", "555a55c0c7441cb90e441115c81f610fca712dd5b192034d5eaafd7c29924425"), + "20.15.1-darwin_amd64": ("node-v20.15.1-darwin-x64.tar.gz", "node-v20.15.1-darwin-x64", "f5379772ffae1404cfd1fcc8cf0c6c5971306b8fb2090d348019047306de39dc"), + "20.15.1-darwin_arm64": ("node-v20.15.1-darwin-arm64.tar.gz", "node-v20.15.1-darwin-arm64", "4743bc042f90ba5d9edf09403207290a9cdd2f6061bdccf7caaa0bbfd49f343e"), + "20.15.1-linux_arm64": ("node-v20.15.1-linux-arm64.tar.xz", "node-v20.15.1-linux-arm64", "c049d670df0c27ae2fd53446df79b6227ab23aff930e38daf0ab3da41c396db5"), + "20.15.1-linux_amd64": ("node-v20.15.1-linux-x64.tar.xz", "node-v20.15.1-linux-x64", "a854c291c7b775bedab54251e1e273cfee1adf1dba25435bc52305ef41f143ab"), + "20.15.1-windows_amd64": ("node-v20.15.1-win-x64.zip", "node-v20.15.1-win-x64", "ba6c3711e2c3d0638c5f7cea3c234553808a73c52a5962a6cdb47b5210b70b04"), }, - node_version = "20.13.1", + node_version = "20.15.1", node_urls = [ "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v{version}/{filename}", ], @@ -60,7 +60,6 @@ yarn_install( "GECKODRIVER_CDNURL": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache", "CHROMEDRIVER_CDNURL": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache", "CHROMEDRIVER_CDNBINARIESURL": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache", - "RE2_DOWNLOAD_MIRROR": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2", "CYPRESS_DOWNLOAD_MIRROR": "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/cypress", } ) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 4ab36f970a7631..21cbf127536928 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-07-10 +date: 2024-07-16 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 ae76364c4ec724..5802bf7c0e9c77 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-07-10 +date: 2024-07-16 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 f858eb52a31b02..e8e4f1c6f71755 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-07-10 +date: 2024-07-16 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 b531df2cf8a7bb..53e4f4495167d5 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-07-10 +date: 2024-07-16 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 7dc9cabc2a4131..b5448af6ac92b6 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index d88ea5a9e24d14..e6605684d7f8fb 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -418,7 +418,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/entities/services\" | \"GET /internal/apm/entities/services/{serviceName}/logs_rate_timeseries\" | \"GET /internal/apm/entities/services/{serviceName}/logs_error_rate_timeseries\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/transactions\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/mobile-services/{serviceName}/error/http_error_rate\" | \"GET /internal/apm/mobile-services/{serviceName}/errors/groups/main_statistics\" | \"POST /internal/apm/mobile-services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/error_terms\" | \"POST /internal/apm/mobile-services/{serviceName}/crashes/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/distribution\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/flamegraph\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/entities/services\" | \"GET /internal/apm/entities/services/{serviceName}/logs_rate_timeseries\" | \"GET /internal/apm/entities/services/{serviceName}/logs_error_rate_timeseries\" | \"POST /internal/apm/entities/services/detailed_statistics\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/transactions\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/has_entities\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/mobile-services/{serviceName}/error/http_error_rate\" | \"GET /internal/apm/mobile-services/{serviceName}/errors/groups/main_statistics\" | \"POST /internal/apm/mobile-services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/error_terms\" | \"POST /internal/apm/mobile-services/{serviceName}/crashes/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/distribution\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/flamegraph\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" ], "path": "x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -889,7 +889,7 @@ "IntersectionC", "<[", "TypeC", - "<{ 'service.name': ", + "<{ serviceName: ", "StringC", "; start: ", "StringC", @@ -897,11 +897,11 @@ "StringC", "; }>, ", "PartialC", - "<{ 'service.environment': ", + "<{ serviceEnvironment: ", "StringC", "; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { query: { 'service.name': string; start: string; end: string; } & { 'service.environment'?: string | undefined; }; }; }) => Promise<{ content: ", + " & { params: { query: { serviceName: string; start: string; end: string; } & { serviceEnvironment?: string | undefined; }; }; }) => Promise<{ content: ", "APMDownstreamDependency", "[]; }>; } & ", "APMRouteCreateOptions", @@ -2893,6 +2893,10 @@ }, "; id: string; }; query: { start: number; end: number; }; }; }) => Promise<{ metadata: Partial>; }>; } & ", "APMRouteCreateOptions", + "; \"GET /internal/apm/has_entities\": { endpoint: \"GET /internal/apm/has_entities\"; params?: undefined; handler: ({}: ", + "APMRouteHandlerResources", + ") => Promise<{ hasData: boolean; }>; } & ", + "APMRouteCreateOptions", "; \"GET /internal/apm/has_data\": { endpoint: \"GET /internal/apm/has_data\"; params?: undefined; handler: ({}: ", "APMRouteHandlerResources", ") => Promise<{ hasData: boolean; }>; } & ", @@ -5671,6 +5675,116 @@ "SavedServiceGroup", "[]; }>; } & ", "APMRouteCreateOptions", + "; \"POST /internal/apm/entities/services/detailed_statistics\": { endpoint: \"POST /internal/apm/entities/services/detailed_statistics\"; params?: ", + "TypeC", + "<{ query: ", + "IntersectionC", + "<[", + "TypeC", + "<{ environment: ", + "UnionC", + "<[", + "LiteralC", + "<\"ENVIRONMENT_NOT_DEFINED\">, ", + "LiteralC", + "<\"ENVIRONMENT_ALL\">, ", + "BrandC", + "<", + "StringC", + ", ", + { + "pluginId": "@kbn/io-ts-utils", + "scope": "common", + "docId": "kibKbnIoTsUtilsPluginApi", + "section": "def-common.NonEmptyStringBrand", + "text": "NonEmptyStringBrand" + }, + ">]>; }>, ", + "TypeC", + "<{ kuery: ", + "StringC", + "; }>, ", + "TypeC", + "<{ start: ", + "Type", + "; end: ", + "Type", + "; }>, ", + "IntersectionC", + "<[", + "PartialC", + "<{ offset: ", + "StringC", + "; }>, ", + "TypeC", + "<{ probability: ", + "Type", + "; }>, ", + "TypeC", + "<{ documentType: ", + "UnionC", + "<[", + "LiteralC", + "<", + "ApmDocumentType", + ".ServiceTransactionMetric>, ", + "LiteralC", + "<", + "ApmDocumentType", + ".TransactionMetric>, ", + "LiteralC", + "<", + "ApmDocumentType", + ".TransactionEvent>]>; rollupInterval: ", + "UnionC", + "<[", + "LiteralC", + "<", + "RollupInterval", + ".OneMinute>, ", + "LiteralC", + "<", + "RollupInterval", + ".TenMinutes>, ", + "LiteralC", + "<", + "RollupInterval", + ".SixtyMinutes>, ", + "LiteralC", + "<", + "RollupInterval", + ".None>]>; }>]>, ", + "TypeC", + "<{ bucketSizeInSeconds: ", + "Type", + "; }>]>; body: ", + "TypeC", + "<{ serviceNames: ", + "Type", + "; }>; }> | undefined; handler: ({}: ", + "APMRouteHandlerResources", + " & { params: { query: { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + "Branded", + "; } & { kuery: string; } & { start: number; end: number; } & { offset?: string | undefined; } & { probability: number; } & { documentType: ", + "ApmDocumentType", + ".TransactionMetric | ", + "ApmDocumentType", + ".ServiceTransactionMetric | ", + "ApmDocumentType", + ".TransactionEvent; rollupInterval: ", + "RollupInterval", + "; } & { bucketSizeInSeconds: number; }; body: { serviceNames: string[]; }; }; }) => Promise<{ currentPeriod: { apm: { [x: string]: ", + "ServiceTransactionDetailedStat", + "; }; logErrorRate: { [x: string]: { x: number; y: number | null; }[]; }; logRate: { [x: string]: { x: number; y: number | null; }[]; }; }; }>; } & ", + "APMRouteCreateOptions", "; \"GET /internal/apm/entities/services/{serviceName}/logs_error_rate_timeseries\": { endpoint: \"GET /internal/apm/entities/services/{serviceName}/logs_error_rate_timeseries\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index f5f06b8e74070c..1009cf888e8bbe 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 29 | 0 | 29 | 123 | +| 29 | 0 | 29 | 124 | ## Client diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 8f86fdb36cd2a7..7ff13ff73968f8 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 6ba79a185aef3e..9889afae371f58 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 244eb9bae85c01..b9b7c2133bc598 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-07-10 +date: 2024-07-16 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 3ca9e70563e6f8..a512fc7192aac1 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-07-10 +date: 2024-07-16 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 97fda29eaa639c..7127d9641c31ee 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-07-10 +date: 2024-07-16 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 7f35d571cec41e..5e1c7d4cb56a34 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-07-10 +date: 2024-07-16 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 406b5aa2fda76e..c4f5c844826ed6 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-07-10 +date: 2024-07-16 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 b57f89c35c1379..f85844e0a2501d 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-07-10 +date: 2024-07-16 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 3674bbfd1c5b3b..4088d1e0621b5b 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-07-10 +date: 2024-07-16 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 791d46b97f4708..3d8223bcc4b9ce 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.devdocs.json b/api_docs/cloud_experiments.devdocs.json index 6df2dc117f7a4c..76d3f7adecb5c6 100644 --- a/api_docs/cloud_experiments.devdocs.json +++ b/api_docs/cloud_experiments.devdocs.json @@ -98,20 +98,122 @@ "parentPluginId": "cloudExperiments", "id": "def-common.CloudExperimentsPluginStart", "type": "Interface", - "tags": [], + "tags": [ + "deprecated" + ], "label": "CloudExperimentsPluginStart", "description": [ "\nThe contract of the start lifecycle method\n" ], "path": "x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [ + { + "plugin": "spaces", + "path": "x-pack/plugins/spaces/public/experiments/is_solution_nav_enabled.ts" + }, + { + "plugin": "spaces", + "path": "x-pack/plugins/spaces/public/experiments/is_solution_nav_enabled.ts" + }, + { + "plugin": "spaces", + "path": "x-pack/plugins/spaces/public/plugin.tsx" + }, + { + "plugin": "spaces", + "path": "x-pack/plugins/spaces/public/plugin.tsx" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/public/types.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/public/types.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/utils.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/utils.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/utils.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/plugin_contract.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/plugin_contract.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/types.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/types.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/types.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/types.ts" + }, + { + "plugin": "cloudChat", + "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts" + }, + { + "plugin": "cloudChat", + "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts" + }, + { + "plugin": "observabilityOnboarding", + "path": "x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts" + }, + { + "plugin": "observabilityOnboarding", + "path": "x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/server/types.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/server/types.ts" + } + ], "children": [ { "parentPluginId": "cloudExperiments", "id": "def-common.CloudExperimentsPluginStart.getVariation", "type": "Function", - "tags": [], + "tags": [ + "deprecated" + ], "label": "getVariation", "description": [ "\nFetch the configuration assigned to variation `configKey`. If nothing is found, fallback to `defaultValue`." @@ -120,8 +222,58 @@ "(featureFlagName: \"security-solutions.add-integrations-url\" | \"security-solutions.guided-onboarding-content\" | \"cloud-chat.enabled\" | \"cloud-chat.chat-variant\" | \"observability_onboarding.experimental_onboarding_flow_enabled\" | \"solutionNavEnabled\", defaultValue: Data) => Promise" ], "path": "x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [ + { + "plugin": "spaces", + "path": "x-pack/plugins/spaces/public/experiments/is_solution_nav_enabled.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/public/plugin.tsx" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/utils.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/plugin.ts" + }, + { + "plugin": "cloudChat", + "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts" + }, + { + "plugin": "cloudChat", + "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/utils.test.ts" + }, + { + "plugin": "securitySolutionEss", + "path": "x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.test.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/public/plugin.test.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/public/plugin.test.ts" + }, + { + "plugin": "navigation", + "path": "src/plugins/navigation/public/plugin.test.ts" + } + ], "children": [ { "parentPluginId": "cloudExperiments", @@ -164,7 +316,9 @@ "parentPluginId": "cloudExperiments", "id": "def-common.CloudExperimentsPluginStart.reportMetric", "type": "Function", - "tags": [], + "tags": [ + "deprecated" + ], "label": "reportMetric", "description": [ "\nReport metrics back to the A/B testing service to measure the conversion rate for each variation in the experiment." @@ -181,8 +335,9 @@ ") => void" ], "path": "x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [], "children": [ { "parentPluginId": "cloudExperiments", diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 158ee1ce6978f6..4044b0c4508d48 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-07-10 +date: 2024-07-16 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 4cf82bac4f4f42..023f54487b4140 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-07-10 +date: 2024-07-16 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 05af1aff6e9fb2..f829ce515b4d20 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-07-10 +date: 2024-07-16 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 2336fc498da8f3..b352b053587648 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-07-10 +date: 2024-07-16 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 23d9b1b0f3db57..a3a2229b2e846e 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-07-10 +date: 2024-07-16 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 a249305bca74b6..2f2807ffa8f449 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-07-10 +date: 2024-07-16 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 59e0235903c55d..6065eeca808b4a 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-07-10 +date: 2024-07-16 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 734405a4a261b0..b0260de9c825fa 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-07-10 +date: 2024-07-16 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 7481ab2d2ab76a..d7fd78543cefb5 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-07-10 +date: 2024-07-16 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 9f5495e0c79d12..43e94da67670b5 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-07-10 +date: 2024-07-16 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 3c71d748fa9cdd..361f0a8589ef0c 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-07-10 +date: 2024-07-16 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 70e71ee5aa5c44..2bceceff8f2251 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-07-10 +date: 2024-07-16 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 8984de2773bb77..ec74c2eb572e8d 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-07-10 +date: 2024-07-16 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 f78c44f5962640..d6ff862d950bd5 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-07-10 +date: 2024-07-16 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 3e1e9f293c4827..9333aee0629151 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 611d75c419502a..34d0c5981196f8 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -13260,18 +13260,6 @@ "plugin": "maps", "path": "x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts" }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts" - }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts" - }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.test.ts" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index db20d4edea7971..6bf58bccfde416 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-07-10 +date: 2024-07-16 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 56cf47d4c4aa30..cb59cb5bdff1ea 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-07-10 +date: 2024-07-16 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 fe5acec36e9328..d48c11813573f8 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-07-10 +date: 2024-07-16 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 338694c6a2a55b..ca80db6138660c 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -32,6 +32,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core, visualizations, triggersActionsUi | - | | | ruleRegistry, securitySolution, synthetics, slo | - | | | security, actions, alerting, ruleRegistry, files, cases, fleet, securitySolution | - | +| | spaces, navigation, securitySolution, securitySolutionEss, cloudChat, observabilityOnboarding | - | +| | spaces, navigation, securitySolution, cloudChat, securitySolutionEss | - | | | alerting, discover, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | @@ -66,6 +68,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/monaco, securitySolution | - | | | fleet, cloudSecurityPosture, exploratoryView, osquery, synthetics | - | | | alerting, observabilityAIAssistant, fleet, cloudSecurityPosture, enterpriseSearch, serverlessSearch, transform, upgradeAssistant, apm, entityManager, observabilityOnboarding, synthetics, security | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core, spaces, savedSearch, visualizations, lens, cases, maps, canvas, graph | - | +| | spaces, savedObjectsManagement | - | +| | @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-migration-server-internal, spaces, data, savedSearch, cloudSecurityPosture, visualizations, dashboard, @kbn/core-test-helpers-so-type-serializer | - | +| | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | | | actions, alerting | - | | | visualizations, lens, controls, dashboard, discover | - | | | discover, @kbn/reporting-public | - | @@ -95,7 +101,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | -| | @kbn/core-saved-objects-browser-internal, @kbn/core, spaces, savedSearch, visualizations, lens, cases, maps, canvas, graph | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core | - | @@ -105,7 +110,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-root-browser-internal, @kbn/core-saved-objects-browser-mocks | - | | | @kbn/core-saved-objects-api-server-internal | - | | | @kbn/core-saved-objects-api-server-internal | - | -| | @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-migration-server-internal, spaces, data, savedSearch, cloudSecurityPosture, visualizations, dashboard, @kbn/core-test-helpers-so-type-serializer | - | | | graph, visTypeTimeseries, dataViewManagement, dataViews | - | | | graph, visTypeTimeseries, dataViewManagement, dataViews | - | | | graph, visTypeTimeseries, dataViewManagement | - | @@ -127,7 +131,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | maps | - | | | dataViewManagement | - | | | dataViewManagement | - | -| | spaces, savedObjectsManagement | - | | | unifiedSearch | - | | | unifiedSearch | - | | | savedSearch, visualizations, lens | - | @@ -142,7 +145,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | canvas | - | | | enterpriseSearch | - | -| | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | | | embeddableEnhanced | - | | | embeddableEnhanced | - | | | uiActionsEnhanced | - | @@ -198,6 +200,7 @@ Safe to remove. | | alerting | | | alerting | | | alerting | +| | cloudExperiments | | | data | | | data | | | data | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 850dc5df41ba7d..3117567315dbff 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -550,6 +550,15 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## cloudChat + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=CloudExperimentsPluginStart), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=CloudExperimentsPluginStart) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=getVariation), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_chat/server/plugin.ts#:~:text=getVariation) | - | + + + ## cloudDefend | Deprecated API | Reference location(s) | Remove By | @@ -909,7 +918,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts#:~:text=title), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts#:~:text=title), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts#:~:text=title), [use_waffle_filters.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts#:~:text=title) | - | +| | [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [use_waffle_filters.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts#:~:text=title) | - | | | [saved_object_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/sources/saved_object_type.ts#:~:text=migrations) | - | @@ -1084,6 +1093,15 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## navigation + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/types.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/types.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/server/types.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/server/types.ts#:~:text=CloudExperimentsPluginStart) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/plugin.tsx#:~:text=getVariation), [plugin.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/plugin.test.ts#:~:text=getVariation), [plugin.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/plugin.test.ts#:~:text=getVariation), [plugin.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/plugin.test.ts#:~:text=getVariation) | - | + + + ## observabilityAIAssistant | Deprecated API | Reference location(s) | Remove By | @@ -1104,6 +1122,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts#:~:text=CloudExperimentsPluginStart), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/public/plugin.ts#:~:text=CloudExperimentsPluginStart) | - | | | [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts#:~:text=authc), [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts#:~:text=authc) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_onboarding/server/plugin.ts#:~:text=legacy) | - | @@ -1314,6 +1333,8 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=alertFactory) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/utils.ts#:~:text=CloudExperimentsPluginStart), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/utils.ts#:~:text=CloudExperimentsPluginStart), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/utils.ts#:~:text=CloudExperimentsPluginStart), [plugin_contract.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin_contract.ts#:~:text=CloudExperimentsPluginStart), [plugin_contract.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin_contract.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/types.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/types.ts#:~:text=CloudExperimentsPluginStart) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/utils.ts#:~:text=getVariation), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=getVariation), [utils.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/utils.test.ts#:~:text=getVariation) | - | | | [wrap_search_source_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.ts#:~:text=create) | - | | | [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch) | - | | | [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion)+ 12 more | - | @@ -1361,6 +1382,15 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## securitySolutionEss + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/types.ts#:~:text=CloudExperimentsPluginStart), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/types.ts#:~:text=CloudExperimentsPluginStart), [use_variation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts#:~:text=CloudExperimentsPluginStart), [use_variation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts#:~:text=CloudExperimentsPluginStart), [use_variation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts#:~:text=CloudExperimentsPluginStart) | - | +| | [use_variation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.ts#:~:text=getVariation), [use_variation.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution_ess/public/common/hooks/use_variation.test.ts#:~:text=getVariation) | - | + + + ## serverlessSearch | Deprecated API | Reference location(s) | Remove By | @@ -1399,6 +1429,8 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [is_solution_nav_enabled.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/experiments/is_solution_nav_enabled.ts#:~:text=CloudExperimentsPluginStart), [is_solution_nav_enabled.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/experiments/is_solution_nav_enabled.ts#:~:text=CloudExperimentsPluginStart), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/plugin.tsx#:~:text=CloudExperimentsPluginStart), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/plugin.tsx#:~:text=CloudExperimentsPluginStart) | - | +| | [is_solution_nav_enabled.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/experiments/is_solution_nav_enabled.ts#:~:text=getVariation) | - | | | [on_post_auth_interceptor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.ts#:~:text=getKibanaFeatures), [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=getKibanaFeatures), [on_post_auth_interceptor.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.test.ts#:~:text=getKibanaFeatures) | 8.8.0 | | | [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24) | 8.8.0 | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/legacy_urls/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/legacy_urls/types.ts#:~:text=ResolvedSimpleSavedObject) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 995499eb7b72d7..8ea18fff4d6ee8 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -79,6 +79,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Plugin | Deprecated API | Reference location(s) | Remove By | | --------|-------|-----------|-----------| +| spaces | | [on_post_auth_interceptor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.ts#:~:text=getKibanaFeatures), [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=getKibanaFeatures), [on_post_auth_interceptor.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.test.ts#:~:text=getKibanaFeatures), [app_authorization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 27 more | 8.8.0 | +| spaces | | [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | 8.8.0 | | security | | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | 8.8.0 This is relied on by the reporting feature, and should be removed once reporting @@ -87,12 +89,10 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ This is relied on by the reporting feature, and should be removed once reporting migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/issues/19914 | -| security | | [app_authorization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 27 more | 8.8.0 | | security | | [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getElasticsearchFeatures) | 8.8.0 | | security | | [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | 8.8.0 | | security | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=license%24) | 8.8.0 | | security | | [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | 8.8.0 | -| security | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24) | 8.8.0 | | security | | [logout_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=appBasePath) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index c4cec9086a33bc..8b8496c49722a9 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-07-10 +date: 2024-07-16 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 a41a75aa111def..e30f8966dd8af5 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-07-10 +date: 2024-07-16 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 38b90b7b8cf23f..1326a8ce345c4d 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-07-10 +date: 2024-07-16 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 58256861789601..c9b51d6ea11fbf 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-07-10 +date: 2024-07-16 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 8dcfb6b5e7e6fc..6297737342f8ad 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-07-10 +date: 2024-07-16 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 a1059962f6c5ab..ad6d3f08e5890f 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 24ed6961df2c9d..044a01d00fe61e 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -10769,7 +10769,9 @@ "type": "Uncategorized", "tags": [], "label": "input", - "description": [], + "description": [ + "\nFor react embeddables, this input must be runtime state." + ], "signature": [ "object" ], @@ -10805,29 +10807,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "embeddable", - "id": "def-public.EmbeddablePackageState.references", - "type": "Array", - "tags": [], - "label": "references", - "description": [ - "\nCopy dashboard panel transfers serialized panel state for React embeddables.\nThe rawState will be passed into the input and references are passed separately\nso the container can update its references array and the updated references\nare correctly passed to the factory's deserialize method.\n\nLegacy embeddables have already injected the references\ninto the input state, so they will not pass references." - ], - "signature": [ - { - "pluginId": "@kbn/content-management-utils", - "scope": "common", - "docId": "kibKbnContentManagementUtilsPluginApi", - "section": "def-common.Reference", - "text": "Reference" - }, - "[] | undefined" - ], - "path": "src/plugins/embeddable/public/lib/state_transfer/types.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "embeddable", "id": "def-public.EmbeddablePackageState.searchSessionId", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 3bc3433fb2d123..01244897124ded 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 571 | 1 | 461 | 9 | +| 570 | 1 | 460 | 9 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 452beb639c4d64..a340d4474e223a 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-07-10 +date: 2024-07-16 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 fb85d36c29136f..536dfc8dea4be4 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-07-10 +date: 2024-07-16 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 4ae1a33d050c8a..14bf0058f49f8c 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entity_manager.devdocs.json b/api_docs/entity_manager.devdocs.json index f8f2a8dde90aa1..145b8f97ff63a0 100644 --- a/api_docs/entity_manager.devdocs.json +++ b/api_docs/entity_manager.devdocs.json @@ -77,6 +77,96 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_API_KEY_NOT_FOUND", + "type": "string", + "tags": [], + "label": "ERROR_API_KEY_NOT_FOUND", + "description": [], + "signature": [ + "\"api_key_not_found\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_API_KEY_NOT_VALID", + "type": "string", + "tags": [], + "label": "ERROR_API_KEY_NOT_VALID", + "description": [], + "signature": [ + "\"api_key_not_valid\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_API_KEY_SERVICE_DISABLED", + "type": "string", + "tags": [], + "label": "ERROR_API_KEY_SERVICE_DISABLED", + "description": [], + "signature": [ + "\"api_key_service_disabled\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_DEFINITION_STOPPED", + "type": "string", + "tags": [], + "label": "ERROR_DEFINITION_STOPPED", + "description": [], + "signature": [ + "\"error_definition_stopped\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_PARTIAL_BUILTIN_INSTALLATION", + "type": "string", + "tags": [], + "label": "ERROR_PARTIAL_BUILTIN_INSTALLATION", + "description": [], + "signature": [ + "\"partial_builtin_installation\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_USER_NOT_AUTHORIZED", + "type": "string", + "tags": [], + "label": "ERROR_USER_NOT_AUTHORIZED", + "description": [], + "signature": [ + "\"user_not_authorized\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 65803da229e882..553349c4c5d1aa 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 8 | 0 | 8 | 1 | +| 14 | 0 | 14 | 1 | ## Client diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 59bdc7a01f9256..6f848e8afa206b 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-07-10 +date: 2024-07-16 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 447a914e099b70..4a7ee6bda51244 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-07-10 +date: 2024-07-16 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 7c87152fde9f7f..f9caedb2075d0d 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-07-10 +date: 2024-07-16 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 8fb24e06e94162..f176428287e2a1 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-07-10 +date: 2024-07-16 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 c73d5f0e92f685..b7bb3eb920c39e 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-07-10 +date: 2024-07-16 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 bc1e9181691d2b..f34dd64448a7a9 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-07-10 +date: 2024-07-16 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 cab6253f892060..19a5ab7d244636 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-07-10 +date: 2024-07-16 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 95e5b3c81624b6..dae31e55fa8719 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-07-10 +date: 2024-07-16 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 58efbcc9484171..96bde07a29ccc6 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-07-10 +date: 2024-07-16 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 a295c8a8243e7b..980f4782985bc3 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-07-10 +date: 2024-07-16 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 cd4aef9931b14f..4ed46ac2802c07 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-07-10 +date: 2024-07-16 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 49ef48ead111d1..7ec064a7dff9eb 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-07-10 +date: 2024-07-16 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 2ff72cba1fb0a0..525dab7a555ac2 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-07-10 +date: 2024-07-16 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 5bc7e3f71791be..9d7b39c78ce377 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-07-10 +date: 2024-07-16 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 9a13222ea8881e..df7c9fafd98934 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-07-10 +date: 2024-07-16 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 e66da6d59b9e52..ee2cc1f079c91f 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-07-10 +date: 2024-07-16 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 cb683edbaae50a..6e1581926e9752 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-07-10 +date: 2024-07-16 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 74c9fbe913ab7b..9090071524ed6c 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-07-10 +date: 2024-07-16 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 baf2e18810dc45..877dd9166c7c8f 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-07-10 +date: 2024-07-16 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 9ba2df560cd901..f25723b4b4d746 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-07-10 +date: 2024-07-16 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 bcf331fcaea877..65984ed4ab4b73 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-07-10 +date: 2024-07-16 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 98d623a0718dcf..2e9abd15f53039 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-07-10 +date: 2024-07-16 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 315f282888a626..d6cd7bf889e62a 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-07-10 +date: 2024-07-16 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 f1f73851b4e032..df6ca1a929939b 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-07-10 +date: 2024-07-16 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 3e7c2f343df8ab..bc2453ad0c862d 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-07-10 +date: 2024-07-16 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 2ce43154bd9019..63c4be0e57883c 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-07-10 +date: 2024-07-16 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 319a8d826876e4..a83351c7c01324 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index fec8ffac9edc52..b0da7aab437216 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -25871,6 +25871,20 @@ "path": "x-pack/plugins/fleet/common/types/models/epm.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.RegistryVarsEntry.RegistryVarsEntryKeys.full_width", + "type": "CompoundType", + "tags": [], + "label": "[RegistryVarsEntryKeys.full_width]", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index dae9096e934917..d1d0ab33b3bdf3 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1348 | 5 | 1226 | 72 | +| 1349 | 5 | 1227 | 72 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 4deccbece2ccb8..0a023eb429d7fe 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-07-10 +date: 2024-07-16 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 4ce7402a8af27a..364a27be322884 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-07-10 +date: 2024-07-16 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 c36206ccfa0db9..9273c5bddd2201 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-07-10 +date: 2024-07-16 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 2a2aea8bbd1675..260d17f59b391a 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-07-10 +date: 2024-07-16 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 b94c808b00a1c1..3ea52ab274cfd6 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-07-10 +date: 2024-07-16 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 2b9c65a69a7625..17e6db1bf3e0ab 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.devdocs.json b/api_docs/infra.devdocs.json index c4dd0ffb4ba2b0..e15dee2fa1f697 100644 --- a/api_docs/infra.devdocs.json +++ b/api_docs/infra.devdocs.json @@ -12,7 +12,7 @@ "tags": [], "label": "InfraFormatterType", "description": [], - "path": "x-pack/plugins/observability_solution/infra/public/lib/lib.ts", + "path": "x-pack/plugins/observability_solution/infra/public/common/inventory/types.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index dd9cea8435c0cd..093f79db11c0f4 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-07-10 +date: 2024-07-16 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 888aeb53975b99..5b0144a2fc5ac4 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-07-10 +date: 2024-07-16 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 19aeeacae8fb75..228b33617de084 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-07-10 +date: 2024-07-16 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 f854290a8e46d4..deb61ca6a2cd74 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-07-10 +date: 2024-07-16 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 bfed0056159518..0ec3077a533a60 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-07-10 +date: 2024-07-16 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 1297a4e4a49c30..10320aa4f6b5bc 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; -Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) for questions regarding this plugin. +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 4e19d3760cbe76..c00bfdfb34ea44 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-07-10 +date: 2024-07-16 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 eed3dae813b411..c5988efbe3c80e 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-07-10 +date: 2024-07-16 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 f0fe73b3dc7c3b..9bf92065baacc8 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-07-10 +date: 2024-07-16 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 10ec613aaa5846..0875c3d7ec2564 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-07-10 +date: 2024-07-16 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 3cb4e7842beb22..f3912d7707a428 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-07-10 +date: 2024-07-16 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 8b77837af86e9b..ffbc5368bcae17 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-07-10 +date: 2024-07-16 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 df854a85297b1b..0230f6825413f4 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-07-10 +date: 2024-07-16 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 f1fa88189271dd..78880d3dcc51ae 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-07-10 +date: 2024-07-16 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 0b00923d69f536..82a11f2421fb4a 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-07-10 +date: 2024-07-16 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 8258b4fb967f3f..d1805361b99869 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-07-10 +date: 2024-07-16 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 50d4f1bd7ceded..b7a0ed3f740c4d 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-07-10 +date: 2024-07-16 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 ce145ff3877d14..89939b1468805f 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-07-10 +date: 2024-07-16 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 736cd4795a2ba6..35169cceb24aba 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-07-10 +date: 2024-07-16 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 1f5b0b1a14c5d1..ac51cbb2520252 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-07-10 +date: 2024-07-16 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 607b5dc80ad404..1729863cecf198 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-07-10 +date: 2024-07-16 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 1569c9f838b352..3e84cd09e3953a 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-07-10 +date: 2024-07-16 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 40a798b29cb84a..55354e8fd5ded1 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-07-10 +date: 2024-07-16 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 2217f8afe67faf..25195c581e3879 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 2f6c7452458493..a97f4ec1d1aaf5 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index e9d0d7b94a8111..b86837d18abb29 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-07-10 +date: 2024-07-16 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 57a414c2e6a96b..248e6a1b3a52c2 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-07-10 +date: 2024-07-16 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 cee6fda7b11f25..0b9bdad24efd99 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-07-10 +date: 2024-07-16 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 aa375bc54d8ce2..5903e493d0ba51 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-07-10 +date: 2024-07-16 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 dd2d4cc67ff9cb..93a53f65a5b76d 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 8b9f911f3c2e49..c2994f14778854 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-07-10 +date: 2024-07-16 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 ab062d7aacab65..7e505152e7e18c 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-07-10 +date: 2024-07-16 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 6c2278cc5c26ca..0dc70be0a99530 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-07-10 +date: 2024-07-16 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 b59a2000ddd5ed..c1045e46c107b3 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-07-10 +date: 2024-07-16 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 dca01b8e5534e0..84800173d67b25 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-07-10 +date: 2024-07-16 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 c7e7d48d429538..5f624029f0e3dd 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-07-10 +date: 2024-07-16 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 1735337e2d9a46..587674fb20cb72 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index e7e3677c0f03c4..31fbac15357144 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-07-10 +date: 2024-07-16 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 bd271acb335cc5..57474f5441404a 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-07-10 +date: 2024-07-16 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 6d9a8f8321992d..103db939c3d651 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-07-10 +date: 2024-07-16 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 1c25a103149959..a3df149b4bd641 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-07-10 +date: 2024-07-16 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 42a189cc367239..7c6240afd81d08 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-07-10 +date: 2024-07-16 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 12456f1ab6a0f7..9e6f1253c90139 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-07-10 +date: 2024-07-16 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 81633a93e69bac..08f5ebed708185 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-07-10 +date: 2024-07-16 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 6dec8394e07270..6ab6b604e5d638 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index fd9ae186bc217e..c40344110afa8f 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-07-10 +date: 2024-07-16 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 1be41f9b757d78..c4178245e7137e 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-07-10 +date: 2024-07-16 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 704cbfbb1c73dd..18e380dca8b213 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-07-10 +date: 2024-07-16 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 ebb114e7b287d7..0d269043c4c560 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-07-10 +date: 2024-07-16 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 9125238ffbf9a1..a3577d53468654 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-07-10 +date: 2024-07-16 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 5e93e81da185aa..af420894f14d5d 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-07-10 +date: 2024-07-16 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 74d8ac8a69aaa6..b5480ba2a52a35 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-07-10 +date: 2024-07-16 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 31198a58c5d299..85c94c966c7fd7 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-07-10 +date: 2024-07-16 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 dd32608997acc5..aeef95955b153d 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-07-10 +date: 2024-07-16 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 e3918cdf78c32f..77c8d89d1ea47e 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-07-10 +date: 2024-07-16 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 64817a1ced0bbc..9fe4d918d9685a 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-07-10 +date: 2024-07-16 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 ba48c0d6d912b2..695a051fc9a6a4 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-07-10 +date: 2024-07-16 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 d22cc4c43127db..d955aa39b2a489 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-07-10 +date: 2024-07-16 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 2b815d6b948328..e263e9d6c7290e 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-07-10 +date: 2024-07-16 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 34fee76ee5c361..faf36f0778c7c4 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-07-10 +date: 2024-07-16 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 ee76f51d569bf1..95dd8e75892b4f 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-07-10 +date: 2024-07-16 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 5656d0d02eb520..fcdc989dd23e58 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-07-10 +date: 2024-07-16 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 1762ed09c72b9f..42acc97447fd79 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-07-10 +date: 2024-07-16 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 2b4aa6e4593f46..20e6971e22aa31 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-07-10 +date: 2024-07-16 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 a34ef4d8ceb9e7..619413ab6b953b 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-07-10 +date: 2024-07-16 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 e4580bbb89dcb0..b5341ecae8fa2c 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-07-10 +date: 2024-07-16 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 2d5ef1cbda0e9c..2fbb9a158b648b 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-07-10 +date: 2024-07-16 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 fa7602c4113c1d..a1054848256496 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-07-10 +date: 2024-07-16 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 aad00c5dd32470..d867b62c60185a 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-07-10 +date: 2024-07-16 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 755cc577569bb6..9ab8c3ea9267b8 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-07-10 +date: 2024-07-16 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 8e66c47f788797..52e439d2958f81 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-07-10 +date: 2024-07-16 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 5ae4c0b4a07bab..2c3b371f1c3258 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-07-10 +date: 2024-07-16 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 493424c84b150a..2e1ac97234d32f 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-07-10 +date: 2024-07-16 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 e88d9096178e4c..cc56751ed08d18 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-07-10 +date: 2024-07-16 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 8cbbd7d26095e3..c0d8429727d3c5 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-07-10 +date: 2024-07-16 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 70ea4b5dc374a8..a0e45538677874 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-07-10 +date: 2024-07-16 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 078a23e6efa3f4..aa7e2de9b4685e 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-07-10 +date: 2024-07-16 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 3d9e1988958e3b..44028691a47951 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-07-10 +date: 2024-07-16 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 aac7b29574900d..5c4ea60fa8a1c1 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-07-10 +date: 2024-07-16 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 863b10f8b7b9d2..88c16cd775a66c 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-07-10 +date: 2024-07-16 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 ecbbc9243ae4e8..8057a5a3c39d81 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-07-10 +date: 2024-07-16 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 b71725ff3b2aec..0eec897d820e8e 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-07-10 +date: 2024-07-16 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 dd01ec2331d2de..1255efd90308cd 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-07-10 +date: 2024-07-16 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 4edbb3c64da343..d23ff4ecda5c4b 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-07-10 +date: 2024-07-16 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 11b836687315cd..5c73b0f07b879e 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-07-10 +date: 2024-07-16 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 b92429db69761f..24b3d6c731cb83 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-07-10 +date: 2024-07-16 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 d5e1e17da2f2b6..997d8ed573d16f 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-07-10 +date: 2024-07-16 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 0a185cfe29232e..8904cd43e6df93 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-07-10 +date: 2024-07-16 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 75766509858231..dfee86482a6fda 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-07-10 +date: 2024-07-16 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 bf18087d74d2cf..616a430e62ade8 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-07-10 +date: 2024-07-16 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 c615e730a495b2..0958ae448708f4 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-07-10 +date: 2024-07-16 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 5e4434442a073f..a6b56159f9124f 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-07-10 +date: 2024-07-16 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 853b804f99a55c..6dab2670abb770 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-07-10 +date: 2024-07-16 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 acb40a74aa0fc1..9349c66a1ba64f 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-07-10 +date: 2024-07-16 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 dd28589a8219c6..3acd43bcc54131 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-07-10 +date: 2024-07-16 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 468df05588325a..d33044be3ae72c 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-07-10 +date: 2024-07-16 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 31c6d9abee8b94..9990dc6e53d43b 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-07-10 +date: 2024-07-16 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 61f74a13f0e680..0966c005a06698 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-07-10 +date: 2024-07-16 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 a99628a5feb285..ee75cc5165156d 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-07-10 +date: 2024-07-16 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 139c7d6f533cae..e773ba32b6f3f9 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-07-10 +date: 2024-07-16 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 b7f710f7e048d9..0e39c18d007422 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-07-10 +date: 2024-07-16 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 a04dabf41596de..3bdf686749a92f 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-07-10 +date: 2024-07-16 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 7300d7f4befad5..59f4e85d3bcd9e 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-07-10 +date: 2024-07-16 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 cd45ea1a09ee3c..29f8cbd6b3507f 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-07-10 +date: 2024-07-16 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 024a8076e810c6..b9138383bbc64b 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-07-10 +date: 2024-07-16 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 3acd65471f5f39..4ce533566446a7 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-07-10 +date: 2024-07-16 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 042a1ca06100d6..d452ec14a8ba6f 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-07-10 +date: 2024-07-16 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 a3731a178b6718..7ba2d1d5a62da2 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-07-10 +date: 2024-07-16 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 0b7dbf9b8af591..dda1705f04aa85 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-07-10 +date: 2024-07-16 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 10b55c9a7963ef..12214cdb29e00e 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-07-10 +date: 2024-07-16 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 62df39457ebbf9..a312d0033fe32a 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-07-10 +date: 2024-07-16 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 aa625c1430ef57..5fe9771e656d6f 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-07-10 +date: 2024-07-16 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 c712c870c39edd..7323472643b5b8 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-07-10 +date: 2024-07-16 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 e9702014d9cb43..e8400457060d86 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-07-10 +date: 2024-07-16 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 d472cafb7def1e..61aad78ad2f16c 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-07-10 +date: 2024-07-16 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 301bf37a89c5ad..0e83d41c08fa73 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-07-10 +date: 2024-07-16 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 d677d7278ee77e..22feb29f62eced 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-07-10 +date: 2024-07-16 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 e751633cab599e..9b15f60d3a2519 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-07-10 +date: 2024-07-16 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 fc96eb6839be22..c12ef47de02859 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-07-10 +date: 2024-07-16 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 8e56ceb6a2d676..574aeb8cd4306d 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 6a882bc634e549..4b7641161dba2b 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -14342,6 +14342,10 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/trained_models.ts" }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/server/routes/trained_models.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/data_frame_analytics.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index c931520b056aaf..61f0b2a37e3f8f 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-07-10 +date: 2024-07-16 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 9759c12e3d3753..0d668e57e2ad0e 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-07-10 +date: 2024-07-16 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 52194d1e3ba22a..41e9aa125e69a2 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-07-10 +date: 2024-07-16 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 35b2cca10f6266..31d7d1b8a832ea 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-07-10 +date: 2024-07-16 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 2644102b52276f..c528f4469e0165 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-07-10 +date: 2024-07-16 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 b2f26ad7f762a6..a23ece5a5cb20f 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-07-10 +date: 2024-07-16 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 e49c256c48da4e..494c0cec79d866 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-07-10 +date: 2024-07-16 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 29622e5b8cfce8..3dc1d6ac17cd13 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-07-10 +date: 2024-07-16 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 80c612eed5595a..ad9e1d137ebaaa 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-07-10 +date: 2024-07-16 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 c92d1b62d82f99..4333020df7ef25 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-07-10 +date: 2024-07-16 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 b173cfa0a04cec..a8de429f5a453e 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-07-10 +date: 2024-07-16 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 43c26797343272..ae5317eefa7b40 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-07-10 +date: 2024-07-16 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 7da2b4413e8dc6..f02858852a1e75 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-07-10 +date: 2024-07-16 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 7ba907b57a4e04..d4740caace13ba 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-07-10 +date: 2024-07-16 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 da470e8c5d7033..9a9343af100693 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-07-10 +date: 2024-07-16 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 00fb9dd2ebcec8..a839193c988547 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-07-10 +date: 2024-07-16 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 42a0e8343c5f61..16442c0eb6b314 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-07-10 +date: 2024-07-16 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 910f2873610ad6..c600d79bec6b87 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-07-10 +date: 2024-07-16 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 8590695194b429..c7afa414da645a 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-07-10 +date: 2024-07-16 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 d512ae1f0b0037..08c7b345f8a534 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json b/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json index 1b1432f0c3ad30..07e04a0b4be75d 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json +++ b/api_docs/kbn_core_metrics_collectors_server_internal.devdocs.json @@ -318,8 +318,8 @@ "pluginId": "@kbn/core-metrics-collectors-server-internal", "scope": "common", "docId": "kibKbnCoreMetricsCollectorsServerInternalPluginApi", - "section": "def-common.OpsMetricsCollectorOptions", - "text": "OpsMetricsCollectorOptions" + "section": "def-common.OsMetricsCollectorOptions", + "text": "OsMetricsCollectorOptions" } ], "path": "packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts", @@ -625,10 +625,10 @@ "interfaces": [ { "parentPluginId": "@kbn/core-metrics-collectors-server-internal", - "id": "def-common.OpsMetricsCollectorOptions", + "id": "def-common.OsMetricsCollectorOptions", "type": "Interface", "tags": [], - "label": "OpsMetricsCollectorOptions", + "label": "OsMetricsCollectorOptions", "description": [], "path": "packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts", "deprecated": false, @@ -636,7 +636,7 @@ "children": [ { "parentPluginId": "@kbn/core-metrics-collectors-server-internal", - "id": "def-common.OpsMetricsCollectorOptions.logger", + "id": "def-common.OsMetricsCollectorOptions.logger", "type": "Object", "tags": [], "label": "logger", @@ -656,7 +656,7 @@ }, { "parentPluginId": "@kbn/core-metrics-collectors-server-internal", - "id": "def-common.OpsMetricsCollectorOptions.cpuPath", + "id": "def-common.OsMetricsCollectorOptions.cpuPath", "type": "string", "tags": [], "label": "cpuPath", @@ -670,7 +670,7 @@ }, { "parentPluginId": "@kbn/core-metrics-collectors-server-internal", - "id": "def-common.OpsMetricsCollectorOptions.cpuAcctPath", + "id": "def-common.OsMetricsCollectorOptions.cpuAcctPath", "type": "string", "tags": [], "label": "cpuAcctPath", diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 81edad85cffac7..a859d36f6b657b 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-07-10 +date: 2024-07-16 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 fefa72fd3b6668..413935d4515adb 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-07-10 +date: 2024-07-16 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 9d6f8be46e00b7..8eb058702d6113 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-07-10 +date: 2024-07-16 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 2daf307ef4f4f3..3235d466a03343 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-07-10 +date: 2024-07-16 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 64a7b50c476087..b448d1cbea745f 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-07-10 +date: 2024-07-16 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 46374089703e0e..eff822d1491c44 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-07-10 +date: 2024-07-16 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 152930feda4112..6488855aad8656 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-07-10 +date: 2024-07-16 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 12522b90f06f2a..4d194e0c548b01 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-07-10 +date: 2024-07-16 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 8c8c3b805224aa..28026efe44eec9 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-07-10 +date: 2024-07-16 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 d232bafe0fa825..74232da5eb81c7 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-07-10 +date: 2024-07-16 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 3c30b302f76f9c..ae0259ef1af1bf 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-07-10 +date: 2024-07-16 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 5dc7556ad8bf93..9da6d997e7a586 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-07-10 +date: 2024-07-16 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 a19c448fcc3457..fcc0e9be5563da 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-07-10 +date: 2024-07-16 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 ad9a4f45df10d6..624f970bd0309d 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-07-10 +date: 2024-07-16 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 66c479cb3a4c2d..bc5aed6c16a323 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-07-10 +date: 2024-07-16 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 dc6502ea5f1fef..f8469b2c99caea 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-07-10 +date: 2024-07-16 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 309d207ba9c512..c603e6905b5a8b 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-07-10 +date: 2024-07-16 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 aea6137d6b2f64..e9d951cb7ab747 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-07-10 +date: 2024-07-16 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 0138ec86854929..25dadc9dfc6614 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-07-10 +date: 2024-07-16 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 45e7b983181e70..a19d7aaccd66b3 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-07-10 +date: 2024-07-16 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 fb8e18373612af..cb005cfbb562e4 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-07-10 +date: 2024-07-16 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 4c8f4bedf0b628..1ad8e8f50801cc 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-07-10 +date: 2024-07-16 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 3b1283d55ff632..35dc73361cea30 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-07-10 +date: 2024-07-16 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 63648a80c8df25..7773363876d5e3 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-07-10 +date: 2024-07-16 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 85402f60a8cd4a..69ba87f965b1f6 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-07-10 +date: 2024-07-16 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 bd24e8b6521dea..1b9be8fd858db5 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-07-10 +date: 2024-07-16 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 dc8ed6970a5a30..72815e76cc0f92 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-07-10 +date: 2024-07-16 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 2be2c17cd383dd..80ed5d447553a6 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-07-10 +date: 2024-07-16 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 02238a9b756851..c1e36b91685612 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-07-10 +date: 2024-07-16 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 e22c55d5cbd2d1..ee085b6f0f40b2 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-07-10 +date: 2024-07-16 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 1f9e3651952aff..551d9e7d99e1dc 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-07-10 +date: 2024-07-16 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 1705bf294d5ddb..aceea904048eaf 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-07-10 +date: 2024-07-16 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 71c5bd38274409..0b1cd0d68df390 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-07-10 +date: 2024-07-16 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 e778e345e2eef3..c7f0cbd913ab76 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-07-10 +date: 2024-07-16 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 cc080a849348a2..f8ffecbf4858f2 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-07-10 +date: 2024-07-16 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 f749372d27e69a..08ea4504ae0561 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-07-10 +date: 2024-07-16 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 e4e89e985e55a9..35d311b811539a 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-07-10 +date: 2024-07-16 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 18ab4d127f0942..8796c4c6718dd7 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-07-10 +date: 2024-07-16 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 adefadd41522ad..9589c6282a904c 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-07-10 +date: 2024-07-16 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 bef401cec68d06..412f0d3efe9bf1 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-07-10 +date: 2024-07-16 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 aa02f2c204c336..b980e842353f1e 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-07-10 +date: 2024-07-16 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 365461b782a273..0aa26d6fce0de1 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-07-10 +date: 2024-07-16 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 864cfb892c1e55..622397aa9bf0b1 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-07-10 +date: 2024-07-16 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 0b0b7e49ce06ae..f1b4db51e30d02 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-07-10 +date: 2024-07-16 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 d501f71665274d..945a476d4b6d90 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-07-10 +date: 2024-07-16 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 60a4bfc184eade..17b8a6c3dba6bc 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-07-10 +date: 2024-07-16 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 08455631e32c63..2ded2e16b28de8 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-07-10 +date: 2024-07-16 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 0ee6a3841131f5..15327e540d226b 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-07-10 +date: 2024-07-16 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 6a08b94c80e040..a1a0d476b636dd 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-07-10 +date: 2024-07-16 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 804cabb86c0460..a38ed6a151c73c 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-07-10 +date: 2024-07-16 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 ae701990499aff..d34f5832d85bd5 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-07-10 +date: 2024-07-16 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 70a3d735210f25..0ec41a19ac869e 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-07-10 +date: 2024-07-16 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 50fc2868a81146..b0623a88cb07d7 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-07-10 +date: 2024-07-16 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 3ea24300b04bfb..cb065d746302a3 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-07-10 +date: 2024-07-16 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 c0c9aea180781c..52e78dc950d0e2 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-07-10 +date: 2024-07-16 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 8d92cb58d7dff1..e28c464c6f1572 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-07-10 +date: 2024-07-16 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 790d150256c1df..0183b61d2316ac 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-07-10 +date: 2024-07-16 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 52ee66138de128..ab1646b29579fd 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-07-10 +date: 2024-07-16 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 7a7f7d25c8c48d..a3aeca2b1e37d9 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-07-10 +date: 2024-07-16 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 487a34b3ef4c90..9fee5ee1ae727a 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-07-10 +date: 2024-07-16 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 dee2943242a7fe..c6077ebf66d8ac 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-07-10 +date: 2024-07-16 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 f2c36574705f38..a6f598a82a738a 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-07-10 +date: 2024-07-16 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 37914f9a0f76e6..91a3ddd3bc6fc5 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-07-10 +date: 2024-07-16 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 1494ef582037c1..0e54dfb75d1d63 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-07-10 +date: 2024-07-16 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 f48fda3b2d940b..8605bc4c1d1518 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-07-10 +date: 2024-07-16 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 87b9a14ed0bd8f..5989b74f84334b 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-07-10 +date: 2024-07-16 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 89df44e037de5a..2ca26795df19ff 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-07-10 +date: 2024-07-16 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 61cf393dc5b220..09b15990b0b85b 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-07-10 +date: 2024-07-16 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 3bd7e6978e4292..54a22f933ed54c 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-07-10 +date: 2024-07-16 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 ee4c1be1132443..af3a597986bfce 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-07-10 +date: 2024-07-16 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 71e9fdb216c661..ea49a48624e17e 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-07-10 +date: 2024-07-16 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 837180b140b680..f92d0696052545 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-07-10 +date: 2024-07-16 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 651f8f3b04c405..2d9e92b954498e 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-07-10 +date: 2024-07-16 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 e117c9b70b1b9b..1fc4fe2906beec 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-07-10 +date: 2024-07-16 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 cf88f775fb2286..556194b84e33ad 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-07-10 +date: 2024-07-16 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 10dafaded4540a..1980b4982df70d 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-07-10 +date: 2024-07-16 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 2a3f26390cb3f7..19c6664ff8acc4 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-07-10 +date: 2024-07-16 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 a9f16e272eec7b..8f2cb259fe5dcd 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-07-10 +date: 2024-07-16 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 520109e83ebfd9..c86c247a5367ab 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-07-10 +date: 2024-07-16 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 88ea1fc2cdf9c3..20b2cec3631596 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-07-10 +date: 2024-07-16 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 ebe45ba4fb7e92..80d97fb2d5b017 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-07-10 +date: 2024-07-16 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 04f0ef9bb29499..1e4fd4a4981ccf 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-07-10 +date: 2024-07-16 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 69cf0df1e043c2..924a103a9b9016 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-07-10 +date: 2024-07-16 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 c5b4476e389178..96dd7deafec787 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-07-10 +date: 2024-07-16 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 c1465d219dd7b0..601dca0b15ab96 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-07-10 +date: 2024-07-16 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 6408d98650279c..70464ca10ed4b5 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-07-10 +date: 2024-07-16 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 1adaa5c99a61b7..676f2bff1fa8be 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-07-10 +date: 2024-07-16 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 1fe60a7a662b77..cbc109e89f2e4f 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.devdocs.json b/api_docs/kbn_data_forge.devdocs.json index 232f42faa35b79..a63fbed88a4d50 100644 --- a/api_docs/kbn_data_forge.devdocs.json +++ b/api_docs/kbn_data_forge.devdocs.json @@ -29,7 +29,7 @@ "signature": [ "({\n client,\n config: partialConfig,\n logger,\n}: { client: ", "default", - "; config: { elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }; logger: ", + "; config: { elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }; logger: ", { "pluginId": "@kbn/tooling-log", "scope": "common", @@ -76,7 +76,7 @@ "label": "config", "description": [], "signature": [ - "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" + "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" ], "path": "x-pack/packages/kbn-data-forge/src/cleanup.ts", "deprecated": false, @@ -152,7 +152,7 @@ "label": "createConfig", "description": [], "signature": [ - "(partialConfig: { elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }) => { elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }" + "(partialConfig: { elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }) => { elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; artificialIndexDelay: number; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }" ], "path": "x-pack/packages/kbn-data-forge/src/lib/create_config.ts", "deprecated": false, @@ -166,7 +166,7 @@ "label": "partialConfig", "description": [], "signature": [ - "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" + "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" ], "path": "x-pack/packages/kbn-data-forge/src/lib/create_config.ts", "deprecated": false, @@ -187,7 +187,7 @@ "signature": [ "({ client, config: partialConfig, logger, }: { client: ", "default", - "; config: { elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }; logger: ", + "; config: { elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }; logger: ", { "pluginId": "@kbn/tooling-log", "scope": "common", @@ -234,7 +234,7 @@ "label": "config", "description": [], "signature": [ - "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" + "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" ], "path": "x-pack/packages/kbn-data-forge/src/generate.ts", "deprecated": false, @@ -274,7 +274,7 @@ "label": "readConfig", "description": [], "signature": [ - "(filePath: string) => Promise<{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }>" + "(filePath: string) => Promise<{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }>" ], "path": "x-pack/packages/kbn-data-forge/src/lib/create_config.ts", "deprecated": false, @@ -307,7 +307,7 @@ "label": "run", "description": [], "signature": [ - "(config: { elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }, client: ", + "(config: { elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; artificialIndexDelay: number; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }, client: ", "default", ", logger: ", { @@ -331,7 +331,7 @@ "label": "config", "description": [], "signature": [ - "{ elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }" + "{ elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; artificialIndexDelay: number; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }" ], "path": "x-pack/packages/kbn-data-forge/src/run.ts", "deprecated": false, @@ -390,7 +390,7 @@ "label": "Config", "description": [], "signature": [ - "{ elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }" + "{ elasticsearch: { host: string; username: string; password: string; apiKey: string; installKibanaUser: boolean; }; kibana: { host: string; username: string; password: string; installAssets: boolean; }; indexing: { dataset: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\"; scenario: string; interval: number; eventsPerCycle: number; payloadSize: number; concurrency: number; reduceWeekendTrafficBy: number; ephemeralProjectIds: number; alignEventsToInterval: boolean; artificialIndexDelay: number; }; schedule: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[]; }" ], "path": "x-pack/packages/kbn-data-forge/src/types/index.ts", "deprecated": false, @@ -450,7 +450,7 @@ "label": "PartialConfig", "description": [], "signature": [ - "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" + "{ elasticsearch?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; apiKey?: string | undefined; installKibanaUser?: boolean | undefined; } | undefined; kibana?: { host?: string | undefined; username?: string | undefined; password?: string | undefined; installAssets?: boolean | undefined; } | undefined; indexing?: { dataset?: \"fake_hosts\" | \"fake_logs\" | \"fake_stack\" | undefined; scenario?: string | undefined; interval?: number | undefined; eventsPerCycle?: number | undefined; payloadSize?: number | undefined; concurrency?: number | undefined; reduceWeekendTrafficBy?: number | undefined; ephemeralProjectIds?: number | undefined; alignEventsToInterval?: boolean | undefined; artificialIndexDelay?: number | undefined; } | undefined; schedule?: ({ template: string; start: string; end: string | boolean; } & { eventsPerCycle?: number | ({ start: number; end: number; method: \"linear\" | \"exp\" | \"sine\"; } & { options?: { period?: number | undefined; } | undefined; }) | undefined; interval?: number | undefined; delayInMinutes?: number | undefined; delayEveryMinutes?: number | undefined; randomness?: number | undefined; metrics?: ({ name: string; method: \"linear\" | \"exp\" | \"sine\"; start: number; end: number; } & { period?: number | undefined; randomness?: number | undefined; })[] | undefined; })[] | undefined; }" ], "path": "x-pack/packages/kbn-data-forge/src/types/index.ts", "deprecated": false, diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 5ae49ee44b2c7e..57ee8e19aec44a 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-07-10 +date: 2024-07-16 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 5a572d6760ccb3..f0c83938a22007 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-07-10 +date: 2024-07-16 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 2ce275aabd524f..6b9ba5f64fd58a 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-07-10 +date: 2024-07-16 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 9c77d0b2f7f14c..8f3a7d029dfbb4 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-07-10 +date: 2024-07-16 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 c004445a6d6df2..7ae3befb154178 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-07-10 +date: 2024-07-16 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 ead9a6580c1fc6..d3612103e8a117 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-07-10 +date: 2024-07-16 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 5e49e88e152293..29615713ad67ba 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-07-10 +date: 2024-07-16 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 85ca3b08993de6..97f9707f790131 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-07-10 +date: 2024-07-16 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 3bcb897c161c48..87bc8148a3e71a 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-07-10 +date: 2024-07-16 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 784d7b561bd15a..b94baded46e4a7 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-07-10 +date: 2024-07-16 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 e6a307fa8b6465..323802bae27796 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-07-10 +date: 2024-07-16 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 8a8806d97c2449..8d9aa1b0dec20f 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-07-10 +date: 2024-07-16 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 32002cd4fabaa4..609c1c0fed55b0 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-07-10 +date: 2024-07-16 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 1230f5cd39b947..13b083a3450ec5 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-07-10 +date: 2024-07-16 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 3d4837d7f869d4..bec4a4aa7385b8 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-07-10 +date: 2024-07-16 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 fd9f605ebfa8ff..42db89d5318957 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-07-10 +date: 2024-07-16 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 1bb36ed0a2d57d..11ceedcaa7d0f3 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-07-10 +date: 2024-07-16 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 17b6385fcb5104..cd3b95c066c8cf 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-07-10 +date: 2024-07-16 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 e12d1fb934996b..995fc84d743ac9 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-07-10 +date: 2024-07-16 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 1ae344ef56f127..59d1dcd7c78bbd 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-07-10 +date: 2024-07-16 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 01cc6e54a6d09a..c17207d374ef5f 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-07-10 +date: 2024-07-16 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 378560e2f9dbb3..44f07a42b1c494 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-07-10 +date: 2024-07-16 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 6777a3f093a666..43df0473e2c6bf 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -977,6 +977,159 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelCoalescedValue", + "type": "Function", + "tags": [], + "label": "getLogLevelCoalescedValue", + "description": [], + "signature": [ + "(logLevel: unknown) => ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.LogLevelCoalescedValue", + "text": "LogLevelCoalescedValue" + }, + " | undefined" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelCoalescedValue.$1", + "type": "Unknown", + "tags": [], + "label": "logLevel", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelCoalescedValueLabel", + "type": "Function", + "tags": [], + "label": "getLogLevelCoalescedValueLabel", + "description": [], + "signature": [ + "(coalescedValue: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.LogLevelCoalescedValue", + "text": "LogLevelCoalescedValue" + }, + ") => string" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelCoalescedValueLabel.$1", + "type": "Enum", + "tags": [], + "label": "coalescedValue", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.LogLevelCoalescedValue", + "text": "LogLevelCoalescedValue" + } + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelColor", + "type": "Function", + "tags": [], + "label": "getLogLevelColor", + "description": [], + "signature": [ + "(logLevelCoalescedValue: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.LogLevelCoalescedValue", + "text": "LogLevelCoalescedValue" + }, + ", euiTheme: ", + "EuiThemeComputed", + "<{}>) => string | undefined" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelColor.$1", + "type": "Enum", + "tags": [], + "label": "logLevelCoalescedValue", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.LogLevelCoalescedValue", + "text": "LogLevelCoalescedValue" + } + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.getLogLevelColor.$2", + "type": "CompoundType", + "tags": [], + "label": "euiTheme", + "description": [], + "signature": [ + "EuiThemeComputed", + "<{}>" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.getMessageFieldWithFallbacks", @@ -1951,6 +2104,18 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.LogLevelCoalescedValue", + "type": "Enum", + "tags": [], + "label": "LogLevelCoalescedValue", + "description": [], + "path": "packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "misc": [ diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index c790db3a17d388..ad51df2621ea94 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-07-10 +date: 2024-07-16 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 | |-------------------|-----------|------------------------|-----------------| -| 120 | 0 | 94 | 1 | +| 128 | 0 | 102 | 1 | ## Common diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index f852d7ecbf7329..e204ee3a183b54 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -546,7 +546,7 @@ "label": "securitySolution", "description": [], "signature": [ - "{ readonly artifactControl: string; readonly avcResults: string; readonly trustedApps: string; readonly eventFilters: string; readonly blocklist: string; readonly endpointArtifacts: string; readonly policyResponseTroubleshooting: { full_disk_access: string; macos_system_ext: string; linux_deadlock: string; }; readonly packageActionTroubleshooting: { es_connection: string; }; readonly threatIntelInt: string; readonly responseActions: string; readonly configureEndpointIntegrationPolicy: string; readonly exceptions: { value_lists: string; }; readonly privileges: string; readonly manageDetectionRules: string; readonly createDetectionRules: string; readonly createEsqlRuleType: string; readonly ruleUiAdvancedParams: string; readonly entityAnalytics: { readonly riskScorePrerequisites: string; readonly hostRiskScore: string; readonly userRiskScore: string; readonly entityRiskScoring: string; readonly assetCriticality: string; }; readonly detectionEngineOverview: string; }" + "{ readonly artifactControl: string; readonly avcResults: string; readonly trustedApps: string; readonly eventFilters: string; readonly blocklist: string; readonly endpointArtifacts: string; readonly policyResponseTroubleshooting: { full_disk_access: string; macos_system_ext: string; linux_deadlock: string; }; readonly packageActionTroubleshooting: { es_connection: string; }; readonly threatIntelInt: string; readonly responseActions: string; readonly configureEndpointIntegrationPolicy: string; readonly exceptions: { value_lists: string; }; readonly privileges: string; readonly manageDetectionRules: string; readonly createDetectionRules: string; readonly createEsqlRuleType: string; readonly ruleUiAdvancedParams: string; readonly entityAnalytics: { readonly riskScorePrerequisites: string; readonly entityRiskScoring: string; readonly assetCriticality: string; }; readonly detectionEngineOverview: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 03b4b3317e082e..a45bcf65dcc4d9 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-07-10 +date: 2024-07-16 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 7bf4159ded7fed..c4859d20d5cae2 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-07-10 +date: 2024-07-16 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 9c93ea2205a55a..f36310748fc5b7 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-07-10 +date: 2024-07-16 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.mdx b/api_docs/kbn_ebt.mdx index 499e44b7202cad..a9e2eb50133169 100644 --- a/api_docs/kbn_ebt.mdx +++ b/api_docs/kbn_ebt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt title: "@kbn/ebt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt plugin -date: 2024-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt'] --- import kbnEbtObj from './kbn_ebt.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 602bef774c217b..fbeeef914c430f 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-07-10 +date: 2024-07-16 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 b9ffb6f6e264f6..32043f0d17d1f1 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-07-10 +date: 2024-07-16 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 c2ce5f9f909ca8..9c240062013159 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index bc572016322d8e..825dab69eee2b7 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index 8de92399115d64..594422ba52ead6 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -1892,6 +1892,18 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.ELASTIC_AI_ASSISTANT_INTERNAL_CONVERSATIONS_URL", + "type": "string", + "tags": [], + "label": "ELASTIC_AI_ASSISTANT_INTERNAL_CONVERSATIONS_URL", + "description": [], + "path": "x-pack/packages/kbn-elastic-assistant-common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.ELASTIC_AI_ASSISTANT_INTERNAL_URL", diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index b75806470bb969..5be62ec7672fa5 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.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 | |-------------------|-----------|------------------------|-----------------| -| 362 | 0 | 336 | 0 | +| 363 | 0 | 337 | 0 | ## Common diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index db23747c07d579..79d3a0e194eef6 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-07-10 +date: 2024-07-16 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 74e15499c98c8c..e0f192171a192a 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-07-10 +date: 2024-07-16 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 e0bdec105a323b..3896e8f3de0472 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-07-10 +date: 2024-07-16 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 bb67567945bfc4..081144eef73203 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-07-10 +date: 2024-07-16 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 09fa30e6660648..d304daad7e2007 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-07-10 +date: 2024-07-16 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 bd52515236889a..da7d1bcc3abd5f 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-07-10 +date: 2024-07-16 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 996cdd292a3c29..19d6f2145efece 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-07-10 +date: 2024-07-16 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 c26af5141e0d24..2d04cf454ce3ff 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index d4ce11a10185b3..2616cc8b1db21d 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-07-10 +date: 2024-07-16 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 56830eaa4f756d..79731569d6c759 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -1151,7 +1151,15 @@ "section": "def-common.ESQLCallbacks", "text": "ESQLCallbacks" }, - " | undefined) => { getFieldsByType: (expectedType?: string | string[], ignored?: string[]) => Promise; getFieldsMap: () => Promise { getFieldsByType: (expectedType?: string | string[], ignored?: string[]) => Promise<", + { + "pluginId": "@kbn/esql-validation-autocomplete", + "scope": "common", + "docId": "kibKbnEsqlValidationAutocompletePluginApi", + "section": "def-common.ESQLRealField", + "text": "ESQLRealField" + }, + "[]>; getFieldsMap: () => Promise | undefined" + "CallbackFn<{ query: string; }, ", + { + "pluginId": "@kbn/esql-validation-autocomplete", + "scope": "common", + "docId": "kibKbnEsqlValidationAutocompletePluginApi", + "section": "def-common.ESQLRealField", + "text": "ESQLRealField" + }, + "> | undefined" ], "path": "packages/kbn-esql-validation-autocomplete/src/shared/types.ts", "deprecated": false, @@ -3125,6 +3141,20 @@ "path": "packages/kbn-esql-validation-autocomplete/src/validation/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-validation-autocomplete", + "id": "def-common.ESQLRealField.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ description?: string | undefined; type?: string | undefined; } | undefined" + ], + "path": "packages/kbn-esql-validation-autocomplete/src/validation/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 6005c598f97986..6d05b3f9e28a65 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 193 | 0 | 182 | 10 | +| 194 | 0 | 183 | 10 | ## Common diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 9e6436015f568c..123e31f26421c3 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-07-10 +date: 2024-07-16 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 675787e44b4857..0679bcac87bc05 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-07-10 +date: 2024-07-16 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 7c31260958bbf6..3dd58e1df0e416 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-07-10 +date: 2024-07-16 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 6c08526725b10e..83c28ffa1ab9fd 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-07-10 +date: 2024-07-16 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 7dd29ed4b3ee65..db900adfb166af 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-07-10 +date: 2024-07-16 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 421592b70fbe87..b028cc17fd93b1 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-07-10 +date: 2024-07-16 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 1a6c7b6f84ffee..e18641e17c52d3 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-07-10 +date: 2024-07-16 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 bbe87749889cfd..ce9c686fe97645 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-07-10 +date: 2024-07-16 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 2a0ffa26fcef86..872e245c99883b 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-07-10 +date: 2024-07-16 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 774fe7fb04566e..a3162e97036b39 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-07-10 +date: 2024-07-16 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 6e8b03b0915968..d8cf199331776d 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-07-10 +date: 2024-07-16 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 fdcf2f4d89afae..9a06b73bd9028e 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index a495ad1c6d2e07..8d08b5118d0201 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-07-10 +date: 2024-07-16 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 34e162a443d281..bc71baade7dcbc 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-07-10 +date: 2024-07-16 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 094412e8b5682b..dd8af7429053c5 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-07-10 +date: 2024-07-16 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 c34e4c3ea3f072..c2a4e939f65aea 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-07-10 +date: 2024-07-16 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 12426866b6e814..1a7b03e12714c8 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-07-10 +date: 2024-07-16 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 8a5f9c1afce587..ccc378fa66ff74 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-07-10 +date: 2024-07-16 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 e08496320d2a2d..b11bb89c4e348b 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-07-10 +date: 2024-07-16 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 9a5a1047820c99..2ae171a1f06fe5 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-07-10 +date: 2024-07-16 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 b060a6760686e3..dd90e4522d9e65 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-07-10 +date: 2024-07-16 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 c47b58d8e3bf94..fc36e8f170f136 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-07-10 +date: 2024-07-16 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 85e08645d57796..a43510319ecec6 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-07-10 +date: 2024-07-16 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 1e743744d845d2..c54ca62798901d 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-07-10 +date: 2024-07-16 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 8b4de71f7ddbeb..3a66af8c20c618 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-07-10 +date: 2024-07-16 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 64123585efa901..1faf2af543c80b 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index e4ab643d9af9d1..6cb950d2fad49e 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-07-10 +date: 2024-07-16 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 b23b257e4101c5..c1dbf2200911fe 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-07-10 +date: 2024-07-16 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 a3f7c879315190..9a76150952e433 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-07-10 +date: 2024-07-16 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 9e177417e52a5d..b36565410a6588 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-07-10 +date: 2024-07-16 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 5f427ab32ad72e..53c8fbf41da6fb 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-07-10 +date: 2024-07-16 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 f5453b314c11a1..352e9613249aa9 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-07-10 +date: 2024-07-16 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 1ea1f37beabe67..0e36974ed426a8 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-07-10 +date: 2024-07-16 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 1b47ad998cf41b..a6692c387c4481 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-07-10 +date: 2024-07-16 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 96583dd6dcac96..b47ee86bbc784d 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-07-10 +date: 2024-07-16 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 b7c542d83bb2fd..5d101692b2a3e0 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-07-10 +date: 2024-07-16 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 5091928b667783..2ec335008cb0ff 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-07-10 +date: 2024-07-16 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 12b7a262dd653c..46d081b3fc1581 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-07-10 +date: 2024-07-16 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 77c4bac2298289..6685644aefbc9c 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-07-10 +date: 2024-07-16 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 a1dab6d429a7d1..2b1eb17c8504a2 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-07-10 +date: 2024-07-16 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 1f3a24ca873555..754c6c555828c2 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-07-10 +date: 2024-07-16 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 1718efdec3a87f..24e83478e1c07e 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-07-10 +date: 2024-07-16 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 db9cee8230a0dc..d8cea4896bb2b2 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-07-10 +date: 2024-07-16 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 8a805df3d3a399..d6a59605f304b8 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-07-10 +date: 2024-07-16 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 db8386221e3356..2bb7d4e8414c23 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-07-10 +date: 2024-07-16 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 02363df9d634b7..45f74db63e01df 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-07-10 +date: 2024-07-16 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 7aebba70952172..6311a277394efd 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.devdocs.json b/api_docs/kbn_management_settings_ids.devdocs.json index 5ba648240dcd57..516e6a7f6bade7 100644 --- a/api_docs/kbn_management_settings_ids.devdocs.json +++ b/api_docs/kbn_management_settings_ids.devdocs.json @@ -1162,21 +1162,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/management-settings-ids", - "id": "def-common.OBSERVABILITY_APM_ENABLE_MULTI_SIGNAL", - "type": "string", - "tags": [], - "label": "OBSERVABILITY_APM_ENABLE_MULTI_SIGNAL", - "description": [], - "signature": [ - "\"observability:apmEnableMultiSignal\"" - ], - "path": "packages/kbn-management/settings/setting_ids/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/management-settings-ids", "id": "def-common.OBSERVABILITY_APM_ENABLE_PROFILING_INTEGRATION_ID", @@ -1402,6 +1387,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_ENTITY_CENTRIC_EXPERIENCE", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_ENTITY_CENTRIC_EXPERIENCE", + "description": [], + "signature": [ + "\"observability:entityCentricExperience\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/management-settings-ids", "id": "def-common.OBSERVABILITY_LOGS_DATA_ACCESS_LOG_SOURCES_ID", diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 71eb1446f75b90..e95ec6e9771ecf 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-07-10 +date: 2024-07-16 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 7c1e5e14dcc2ab..725506c1774b1a 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-07-10 +date: 2024-07-16 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 45119a3317a4b6..164678343eaa91 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-07-10 +date: 2024-07-16 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 e048b8839f2a2d..c84623b9df7de4 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-07-10 +date: 2024-07-16 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 5002ea91da03fd..6740b53f9dab56 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-07-10 +date: 2024-07-16 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 85b4d01c8731d3..37c477702f13a5 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-07-10 +date: 2024-07-16 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 bfccdc8d37f70f..cf61ec00abbcdd 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-07-10 +date: 2024-07-16 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 daf0cea9ed7a21..1164c500d6ee56 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-07-10 +date: 2024-07-16 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 1dc34236ad32ef..bcc9e4853fe4f6 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-07-10 +date: 2024-07-16 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 1e8a952d479270..a2f355f9e73be6 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-07-10 +date: 2024-07-16 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 363be1682f841c..98e931bdc2d445 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-07-10 +date: 2024-07-16 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 632420bf2fad9d..2c963dace17c1c 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-07-10 +date: 2024-07-16 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 7cdc4e877f2cf0..723910a375406b 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-07-10 +date: 2024-07-16 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 da8839726a1766..8ec614da4f108b 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-07-10 +date: 2024-07-16 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 606ce4780c7017..a03c44700c87a8 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-07-10 +date: 2024-07-16 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 0bbdd8a7357e6f..8bb9e7ae407e94 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-07-10 +date: 2024-07-16 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 730aebc4e40934..0a59fb38c03533 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-07-10 +date: 2024-07-16 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 ab23d4ca1a5c91..f872a61e99fa48 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-07-10 +date: 2024-07-16 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 9091ae8ebd0d0e..59cabbddea4ba5 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-07-10 +date: 2024-07-16 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 bf66b55a15af06..75e3e60f39bdf9 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-07-10 +date: 2024-07-16 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 527409b93aa1e9..0e0f2b8ed1d0f1 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-07-10 +date: 2024-07-16 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 ade93f4976d2dd..a86844cfa0280c 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-07-10 +date: 2024-07-16 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 e8b45372798bec..e46dfa3d4c7690 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-07-10 +date: 2024-07-16 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 39db829036539a..9db93a827df343 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-07-10 +date: 2024-07-16 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 569858f1cca626..02563bc7641184 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-07-10 +date: 2024-07-16 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 c80056ab85de0e..dac8a063ceff63 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-07-10 +date: 2024-07-16 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 a5355d0238ee7b..d7ece39a953c13 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-07-10 +date: 2024-07-16 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 06e09a80c911a6..794ed187d51701 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-07-10 +date: 2024-07-16 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 5f357c296b7942..38b087a1ab5dcb 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-07-10 +date: 2024-07-16 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 c0c8dd81f22094..95c77a8000bfc1 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-07-10 +date: 2024-07-16 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.devdocs.json b/api_docs/kbn_ml_trained_models_utils.devdocs.json index 2a26c0d6bcd6d9..ae77700bbd77e1 100644 --- a/api_docs/kbn_ml_trained_models_utils.devdocs.json +++ b/api_docs/kbn_ml_trained_models_utils.devdocs.json @@ -286,6 +286,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.E5_LINUX_OPTIMIZED_MODEL_ID", + "type": "string", + "tags": [], + "label": "E5_LINUX_OPTIMIZED_MODEL_ID", + "description": [], + "signature": [ + "\".multilingual-e5-small_linux-x86_64\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.E5_MODEL_ID", + "type": "string", + "tags": [], + "label": "E5_MODEL_ID", + "description": [], + "signature": [ + "\".multilingual-e5-small\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/ml-trained-models-utils", "id": "def-common.ELASTIC_MODEL_TAG", @@ -361,6 +391,51 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.ELSER_LINUX_OPTIMIZED_MODEL_ID", + "type": "string", + "tags": [], + "label": "ELSER_LINUX_OPTIMIZED_MODEL_ID", + "description": [], + "signature": [ + "\".elser_model_2_linux-x86_64\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.ELSER_MODEL_ID", + "type": "string", + "tags": [], + "label": "ELSER_MODEL_ID", + "description": [], + "signature": [ + "\".elser_model_2\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.ElserModels", + "type": "Array", + "tags": [], + "label": "ElserModels", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/ml-trained-models-utils", "id": "def-common.ElserVersion", @@ -392,6 +467,66 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.LANG_IDENT_MODEL_ID", + "type": "string", + "tags": [], + "label": "LANG_IDENT_MODEL_ID", + "description": [], + "signature": [ + "\"lang_ident_model_1\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.LATEST_E5_MODEL_ID", + "type": "string", + "tags": [], + "label": "LATEST_E5_MODEL_ID", + "description": [], + "signature": [ + "\".multilingual-e5-small_linux-x86_64\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.LATEST_ELSER_MODEL_ID", + "type": "string", + "tags": [], + "label": "LATEST_ELSER_MODEL_ID", + "description": [], + "signature": [ + "\".elser_model_2_linux-x86_64\"" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.LATEST_ELSER_VERSION", + "type": "CompoundType", + "tags": [], + "label": "LATEST_ELSER_VERSION", + "description": [], + "signature": [ + "2 | 1" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/ml-trained-models-utils", "id": "def-common.ModelDefinitionResponse", diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 6b6707e0a21e91..3d53a209f982ce 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 34 | 0 | 29 | 1 | +| 43 | 0 | 38 | 1 | ## Common diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 0db0964faef93b..3df1319d593294 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-07-10 +date: 2024-07-16 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 7ca46a3d4ede88..6e4c1bdf88e1ca 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-07-10 +date: 2024-07-16 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 c5fdd3a40296ae..e9aeadb3afd684 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-07-10 +date: 2024-07-16 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.devdocs.json b/api_docs/kbn_monaco.devdocs.json index be1438d460f190..0b994bcbe89f28 100644 --- a/api_docs/kbn_monaco.devdocs.json +++ b/api_docs/kbn_monaco.devdocs.json @@ -496,7 +496,15 @@ "label": "getFieldsFor", "description": [], "signature": [ - "CallbackFn<{ query: string; }, { name: string; type: string; }> | undefined" + "CallbackFn<{ query: string; }, ", + { + "pluginId": "@kbn/esql-validation-autocomplete", + "scope": "common", + "docId": "kibKbnEsqlValidationAutocompletePluginApi", + "section": "def-common.ESQLRealField", + "text": "ESQLRealField" + }, + "> | undefined" ], "path": "packages/kbn-esql-validation-autocomplete/src/shared/types.ts", "deprecated": false, diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index b535d75a8af009..8e1558e7796b47 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-07-10 +date: 2024-07-16 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 c096003007485c..7f7f9bf6199c7f 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index e35bff754e051b..a3ffb99d448438 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 7f044e2b150b17..9b7f7a7d89ab63 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-07-10 +date: 2024-07-16 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 dfe0d2671b37cd..0abeb661be8346 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-07-10 +date: 2024-07-16 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 c245d9a606f1ea..3c7a2d9e22892d 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-07-10 +date: 2024-07-16 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 aec8f452011b94..9068ea7e6231ac 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-07-10 +date: 2024-07-16 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 6d9e606ebd8eb4..6dd252f7c22acf 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-07-10 +date: 2024-07-16 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 8a70b608998e2f..8b195ee40773c0 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-07-10 +date: 2024-07-16 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 eee329fa9599bb..62f5224e554efe 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-07-10 +date: 2024-07-16 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 1a08570e9a5032..63b2b877b095c1 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-07-10 +date: 2024-07-16 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 910dc86ec01c80..9cf78080892a6c 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-07-10 +date: 2024-07-16 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 71f2af8f818f96..47735ca0e39020 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-07-10 +date: 2024-07-16 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 54fcf8a30cdc30..51eb781613f132 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-07-10 +date: 2024-07-16 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 9e208e0540f25c..5d86bbf374e3b3 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-07-10 +date: 2024-07-16 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 846d4679f21df5..d74ebcd5f2153b 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-07-10 +date: 2024-07-16 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 275699efbbedbb..8be3d9979012d9 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-07-10 +date: 2024-07-16 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 33627894827402..71067a26edcdb9 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-07-10 +date: 2024-07-16 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 5328846f12fe30..4d6afff1c0c9ba 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-07-10 +date: 2024-07-16 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 6ef174063cebdd..2a60c10a089530 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-07-10 +date: 2024-07-16 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 7ea167bd57b8eb..bea021f943d10b 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-07-10 +date: 2024-07-16 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 769ead4b28a350..cd63d0d5b94917 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-07-10 +date: 2024-07-16 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 e87259ceaaf007..aa9709f60ca913 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-07-10 +date: 2024-07-16 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 469defcaff4d39..5db54a4c8f783c 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-07-10 +date: 2024-07-16 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 4525093694536a..2e7282a9fce6b1 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-07-10 +date: 2024-07-16 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 9c7c73a5f7eb10..9772313924e847 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-07-10 +date: 2024-07-16 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 e10de0f6f30561..b63b4e87acfc52 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-07-10 +date: 2024-07-16 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 ecdd49ce284cb0..40ecc3a2703a91 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-07-10 +date: 2024-07-16 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 9e448cd5df8d95..526552a5c157fe 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-07-10 +date: 2024-07-16 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 63f06084fc55ac..85722dc7c4dd7f 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-07-10 +date: 2024-07-16 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 fcd60fbf614172..dc5e3f7d0b3122 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-07-10 +date: 2024-07-16 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 19302432908614..137f5e27551713 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-07-10 +date: 2024-07-16 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 a7901d9ecdf417..0e075bc9757631 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-07-10 +date: 2024-07-16 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 8013b2c5852860..07f1f7bd519086 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-07-10 +date: 2024-07-16 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 a7e19c8f8815ca..c93aafa745fbc0 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-07-10 +date: 2024-07-16 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 0311edc4a85542..0a09dd96a2991d 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-07-10 +date: 2024-07-16 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 e6dce93a89500f..3bd25432240f10 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-07-10 +date: 2024-07-16 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 a570271c52a7dd..b06874f7f3a6ee 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-07-10 +date: 2024-07-16 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 48a3dd740958a7..a5f1546c4335e7 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-07-10 +date: 2024-07-16 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 d886a858f369e1..6adce97d0f0fab 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-07-10 +date: 2024-07-16 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 cd5bd0462b4038..328b8bb5a865b4 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-07-10 +date: 2024-07-16 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 9365b7b86b4f7b..5f6606e65a4d3a 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-07-10 +date: 2024-07-16 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 d52b51314d80e6..09006d72e34edb 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-07-10 +date: 2024-07-16 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 86aa9a218ab137..b76dc5e9e9082e 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-07-10 +date: 2024-07-16 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 88a57b7b4635d1..5132717075dde2 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-07-10 +date: 2024-07-16 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 f8f10883aa8061..e7caa84c16f2c9 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-07-10 +date: 2024-07-16 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 2a815b0d45a475..3646bd91e8c097 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-07-10 +date: 2024-07-16 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 68054b59c5003d..419c37fee8b8c4 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-07-10 +date: 2024-07-16 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 418bb52e19f8cc..2eaa760f69f5f2 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-07-10 +date: 2024-07-16 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 11286b6e453a15..7d3e61d0c7ceca 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-07-10 +date: 2024-07-16 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 21340cf60f9b9a..0301512287229e 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-07-10 +date: 2024-07-16 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 96958af47e9eba..dee8eec73fae69 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2e038b0b4f076b..27eef28cea9e79 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-07-10 +date: 2024-07-16 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 aeef4d14be70bc..0e4a32f67aa4ca 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-07-10 +date: 2024-07-16 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 ad3f912e30ba83..766087c9f52ef1 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-07-10 +date: 2024-07-16 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 4b91e9d44176aa..139b04af74d70d 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-07-10 +date: 2024-07-16 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 81fd7b1d386ea1..7cfc9b72aa3555 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-07-10 +date: 2024-07-16 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 26ff8eb125c384..7db0de44717ba5 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-07-10 +date: 2024-07-16 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 398771a54e6eb7..154cdd6d6c6c19 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-07-10 +date: 2024-07-16 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_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 8339f1657ea663..b8a069c4c8eebd 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-07-10 +date: 2024-07-16 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 67ea2e26e27322..b912a2173464de 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-07-10 +date: 2024-07-16 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 cbf7d1e0325c62..f5fa51ab38b32c 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-07-10 +date: 2024-07-16 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 2b9bf0f8a94c88..23f5385ab0d37c 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-07-10 +date: 2024-07-16 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 6fb35919dcbb73..41133b132f77c8 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 6fccd11ffda47e..74f99d69387295 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-07-10 +date: 2024-07-16 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 22a52c912f52ae..6f075788382c17 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-07-10 +date: 2024-07-16 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 4061b2105608cc..fa7861bb198f12 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-07-10 +date: 2024-07-16 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 94b036a30f18d5..a232e71491d1e1 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 5b89ab28fc2deb..134c0580f8e3cd 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-07-10 +date: 2024-07-16 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 7627255900a2c2..70a0401b890ff8 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-07-10 +date: 2024-07-16 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 b03df41ad2bd0b..5ea7d251c6404a 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-07-10 +date: 2024-07-16 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 4ecb54c33c0250..2734889e1608cc 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-07-10 +date: 2024-07-16 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 673d2bb6967b2e..3191cbee3844af 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-07-10 +date: 2024-07-16 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 fa6b4d00e19d3e..d0f97c3505320b 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-07-10 +date: 2024-07-16 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 f686d368ed6e27..16409eb4262cfe 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json index 0ebe5a949c24b7..1a57b339887c8c 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json @@ -18,74 +18,7 @@ }, "common": { "classes": [], - "functions": [ - { - "parentPluginId": "@kbn/securitysolution-io-ts-list-types", - "id": "def-common.updateExceptionListItemValidate", - "type": "Function", - "tags": [], - "label": "updateExceptionListItemValidate", - "description": [], - "signature": [ - "(schema: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; expire_time?: string | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => string[]" - ], - "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/securitysolution-io-ts-list-types", - "id": "def-common.updateExceptionListItemValidate.$1", - "type": "CompoundType", - "tags": [], - "label": "schema", - "description": [], - "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; expire_time?: string | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" - ], - "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/securitysolution-io-ts-list-types", - "id": "def-common.validateComments", - "type": "Function", - "tags": [], - "label": "validateComments", - "description": [], - "signature": [ - "(item: { description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; expire_time?: string | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }) => string[]" - ], - "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/securitysolution-io-ts-list-types", - "id": "def-common.validateComments.$1", - "type": "CompoundType", - "tags": [], - "label": "item", - "description": [], - "signature": [ - "{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; name: string; type: \"simple\"; } & { _version?: string | undefined; comments?: ({ comment: string; } & { id?: string | undefined; })[] | undefined; expire_time?: string | undefined; id?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }" - ], - "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - } - ], + "functions": [], "interfaces": [ { "parentPluginId": "@kbn/securitysolution-io-ts-list-types", @@ -5495,7 +5428,7 @@ "label": "UpdateExceptionListItemSchemaDecoded", "description": [], "signature": [ - "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; name: string; type: \"simple\"; _version: string | undefined; comments: ({ comment: string; } & { id?: string | undefined; })[] | undefined; expire_time: string | undefined; id: string | undefined; item_id: string | undefined; meta: object | undefined; namespace_type: \"single\" | \"agnostic\" | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"entries\" | \"tags\" | \"comments\" | \"expire_time\" | \"namespace_type\" | \"os_types\"> & { comments: ({ comment: string; } & { id?: string | undefined; })[]; tags: string[]; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; expire_time: string | undefined; }" + "Omit<{ description: string; entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; operator: \"excluded\" | \"included\"; type: \"list\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; } | { entries: ({ field: string; operator: \"excluded\" | \"included\"; type: \"match\"; value: string; } | { field: string; operator: \"excluded\" | \"included\"; type: \"match_any\"; value: string[]; } | { field: string; operator: \"excluded\" | \"included\"; type: \"exists\"; })[]; field: string; type: \"nested\"; } | { field: string; operator: \"excluded\" | \"included\"; type: \"wildcard\"; value: string; })[]; name: string; type: \"simple\"; _version: string | undefined; comments: ({ comment: string; } & { id?: string | undefined; })[] | undefined; expire_time: string | undefined; id: string | undefined; item_id: string | undefined; meta: object | undefined; namespace_type: \"single\" | \"agnostic\" | undefined; os_types: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags: string[] | undefined; }, \"entries\" | \"tags\" | \"comments\" | \"expire_time\" | \"namespace_type\" | \"os_types\"> & { comments: ({ comment: string; } & { id?: string | undefined; })[]; tags: string[]; entries: ({ value: string; type: \"match\"; field: string; operator: \"excluded\" | \"included\"; } | { value: string[]; type: \"match_any\"; field: string; operator: \"excluded\" | \"included\"; } | { type: \"list\"; list: { id: string; type: \"boolean\" | \"geo_point\" | \"geo_shape\" | \"ip\" | \"binary\" | \"keyword\" | \"text\" | \"date\" | \"date_nanos\" | \"integer\" | \"long\" | \"short\" | \"byte\" | \"float\" | \"half_float\" | \"double\" | \"integer_range\" | \"float_range\" | \"long_range\" | \"double_range\" | \"date_range\" | \"ip_range\" | \"shape\"; }; field: string; operator: \"excluded\" | \"included\"; } | { type: \"exists\"; field: string; operator: \"excluded\" | \"included\"; } | { type: \"nested\"; entries: ({ value: string; type: \"match\"; field: string; operator: \"excluded\" | \"included\"; } | { value: string[]; type: \"match_any\"; field: string; operator: \"excluded\" | \"included\"; } | { type: \"exists\"; field: string; operator: \"excluded\" | \"included\"; })[]; field: string; } | { value: string; type: \"wildcard\"; field: string; operator: \"excluded\" | \"included\"; })[]; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; expire_time: string | undefined; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 9be381985de487..eb664ac85c800d 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; @@ -21,16 +21,13 @@ Contact [@elastic/security-detection-engine](https://github.com/orgs/elastic/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 538 | 0 | 525 | 0 | +| 534 | 0 | 521 | 0 | ## Common ### Objects -### Functions - - ### Interfaces diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index ec4eee272f4244..51135bbcc9425c 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-07-10 +date: 2024-07-16 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 8f4665c8344a80..69e90633f84670 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-07-10 +date: 2024-07-16 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 462ee376ae04dd..01cc6ede04deb8 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index efacc5115aead2..aa92001d205bc3 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-07-10 +date: 2024-07-16 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 52c0b338efc78c..f6b2922ce1edd3 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-07-10 +date: 2024-07-16 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 935ba90bb1416f..b9f366974b0fc8 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-07-10 +date: 2024-07-16 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 0bc1f725c5e351..0a56930b4b02af 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-07-10 +date: 2024-07-16 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 0f604c0b5d5af4..1864f1d7d370da 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-07-10 +date: 2024-07-16 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 77f52b193a9e4e..8a69b30aebf76f 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-07-10 +date: 2024-07-16 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 f5ec57b43def95..31d27ab365c0c8 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-07-10 +date: 2024-07-16 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 aa4b39ab8955f3..8cb430f5669362 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index be90ae8a969f37..29b5e65ecde0b0 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-07-10 +date: 2024-07-16 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 9c26e99f4e3ac4..bef7128f6d1c83 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-07-10 +date: 2024-07-16 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 28bc7f0f7e5c55..85851266d8fbf7 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-07-10 +date: 2024-07-16 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 9617cb297fbbde..a4c88c2bd7b203 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-07-10 +date: 2024-07-16 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 a8763cbf46030a..dfa6bcf2db83e5 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-07-10 +date: 2024-07-16 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 ed25b3fc9e73ea..69c9981a15df8b 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-07-10 +date: 2024-07-16 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 4424874cd02a6f..86f087f4298f3c 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-07-10 +date: 2024-07-16 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 5b673495bc8ae6..e1055e776b70a8 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-07-10 +date: 2024-07-16 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 9884b2d1ce6dde..d8e2fde133065c 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-07-10 +date: 2024-07-16 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 43f7f939640c61..b389896fe26fe0 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-07-10 +date: 2024-07-16 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 d9a4e5f49d6fd8..08c49ca50c4eb7 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-07-10 +date: 2024-07-16 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 ea4cf0b64ae9e7..444cbeeced1538 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-07-10 +date: 2024-07-16 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 f5795800ff1fe5..d15d1046565065 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-07-10 +date: 2024-07-16 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 bca4b029bd2d82..5221a93e065bf4 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-07-10 +date: 2024-07-16 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 878b30b25aae98..a48c7026a9e5e4 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-07-10 +date: 2024-07-16 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 35787edd06aa51..5a1b191664c8b1 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-07-10 +date: 2024-07-16 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 f50cb79d2e939a..9e050d9c5a38e9 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-07-10 +date: 2024-07-16 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 d5c4844146ddf6..4451a9845df706 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-07-10 +date: 2024-07-16 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 d643ac3730a450..8e65bd294bd45e 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-07-10 +date: 2024-07-16 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 bd27c66bec82d1..91bf7bb9e8a9f4 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-07-10 +date: 2024-07-16 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 cb6953a271a929..24b92daeae7208 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-07-10 +date: 2024-07-16 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 82c14e1e5f4f51..df95a6529c928a 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-07-10 +date: 2024-07-16 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 4700851eda9388..fa95d184a4e7a3 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-07-10 +date: 2024-07-16 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 47d635c6aedabd..a1abe5c06f454b 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-07-10 +date: 2024-07-16 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 1ac01342d945d7..279de7d2719cdf 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-07-10 +date: 2024-07-16 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 62a4db0f57045a..2e67da4d91d0cd 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-07-10 +date: 2024-07-16 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 3bee76770978da..3862bc22491bcd 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-07-10 +date: 2024-07-16 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 d6d6eb0d2b608d..ec38ff9a62ba82 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-07-10 +date: 2024-07-16 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 6743c0370d0287..f0895228b7a13d 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-07-10 +date: 2024-07-16 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 b82e0ad2249df9..46c53133f3f9fc 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-07-10 +date: 2024-07-16 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 d46cb4f512a150..345ce2ca3ba048 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-07-10 +date: 2024-07-16 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 f6bf13ff3deea9..d0a1856cf1192c 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-07-10 +date: 2024-07-16 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 2c280356ae0802..d6d7cf540a4310 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-07-10 +date: 2024-07-16 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 cba88a3bc13b30..3318763aa8f37c 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-07-10 +date: 2024-07-16 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 f47914382acfcf..b671b45ba1996c 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-07-10 +date: 2024-07-16 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 a9ada0e17b0bc3..597cbf6b68f736 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-07-10 +date: 2024-07-16 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 b288e58eac4ca2..204ba9269b32c6 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-07-10 +date: 2024-07-16 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 09eb7da739fd20..912baa09626546 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-07-10 +date: 2024-07-16 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 c39e05952056eb..ef00cdeee8523a 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-07-10 +date: 2024-07-16 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 edb04f116aedba..9c62514a103433 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-07-10 +date: 2024-07-16 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 5a0e6f853368a5..264f33aa3416b8 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-07-10 +date: 2024-07-16 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 cefea5217586b3..b4dcceaf9b3ffe 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-07-10 +date: 2024-07-16 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 cbb8e21ada263c..98cdcab7f8af0f 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-07-10 +date: 2024-07-16 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 f66ce28c9d6f66..1eb8de44193515 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-07-10 +date: 2024-07-16 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 6cdc1785c89842..a2684dd2f9cbde 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 32a43d0fb70928..ecbe6e34e409a2 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-07-10 +date: 2024-07-16 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 3cfe5369312536..3a10268c51f0cb 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-07-10 +date: 2024-07-16 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 a0ef1f4ffc40cb..a494a5afab57dd 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-07-10 +date: 2024-07-16 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 eaaee1a53d074a..8cb6eeacc66353 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-07-10 +date: 2024-07-16 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 9f6a46ac3272de..5fd1eaf731f25c 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-07-10 +date: 2024-07-16 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 4209b964ab11d1..1796858920f76c 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-07-10 +date: 2024-07-16 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 6e5c89a25a3cbc..7dcf9deb822b11 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 4cb600291c5fbf..fa9ae6930f07e7 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-07-10 +date: 2024-07-16 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 f11108590ac7d6..a66ea168d38501 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-07-10 +date: 2024-07-16 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 5099ea7eb04137..9f0872e047bf6d 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-07-10 +date: 2024-07-16 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 4f82466404486d..6feaed476abee7 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-07-10 +date: 2024-07-16 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 8f2c2bcb8f4424..09aef001a09232 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-07-10 +date: 2024-07-16 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 a889d2a241ffbf..de6690e6595ee4 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-07-10 +date: 2024-07-16 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 91a3eecc08f459..58281ee7bcb7c1 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-07-10 +date: 2024-07-16 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 c3f6006e3fcad8..66e32b39503265 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-07-10 +date: 2024-07-16 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 5ca83bdf1a6ece..7939cfc23e7369 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-07-10 +date: 2024-07-16 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 cddcb821d229ee..5c68703fbd75cb 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-07-10 +date: 2024-07-16 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 990674c0960cc0..5984d6d5e9df2f 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-07-10 +date: 2024-07-16 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 90f571914c374f..f0a71c6ca8a93c 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-07-10 +date: 2024-07-16 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 fe5a4f694bb40b..96dd415f43a2df 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-07-10 +date: 2024-07-16 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.devdocs.json b/api_docs/kbn_ui_shared_deps_src.devdocs.json index cdcc1a191f022c..d80ea1cd158c85 100644 --- a/api_docs/kbn_ui_shared_deps_src.devdocs.json +++ b/api_docs/kbn_ui_shared_deps_src.devdocs.json @@ -342,6 +342,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/ui-shared-deps-src", + "id": "def-common.externals.fastestlevenshtein", + "type": "string", + "tags": [], + "label": "'fastest-levenshtein'", + "description": [], + "path": "packages/kbn-ui-shared-deps-src/src/definitions.js", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/ui-shared-deps-src", "id": "def-common.externals.rxjs", diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 5de7a71863db8d..0ddb0e51591474 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 56 | 0 | 47 | 0 | +| 57 | 0 | 48 | 0 | ## Common diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index b2aeefbd8b4cac..55438d126aaba3 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-07-10 +date: 2024-07-16 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 56275124e99d88..72e1333492b3a7 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -532,7 +532,7 @@ "label": "UnifiedDataTable", "description": [], "signature": [ - "({ ariaLabelledBy, columns, columnsMeta, showColumnTokens, configHeaderRowHeight, headerRowHeightState, onUpdateHeaderRowHeight, controlColumnIds, dataView, loadingState, onFilter, onResize, onSetColumns, onSort, rows, searchDescription, searchTitle, settings, showTimeCol, showFullScreenButton, sort, useNewFieldsApi, isSortEnabled, isPaginationEnabled, cellActionsTriggerId, className, rowHeightState, onUpdateRowHeight, maxAllowedSampleSize, sampleSizeState, onUpdateSampleSize, isPlainRecord, rowsPerPageState, onUpdateRowsPerPage, onFieldEdited, services, renderCustomGridBody, renderCustomToolbar, trailingControlColumns, totalHits, onFetchMoreRecords, renderDocumentView, setExpandedDoc, expandedDoc, configRowHeight, showMultiFields, maxDocFieldsDisplayed, externalControlColumns, externalAdditionalControls, rowsPerPageOptions, visibleCellActions, externalCustomRenderers, additionalFieldGroups, consumer, componentsTourSteps, gridStyleOverride, rowLineHeightOverride, cellActionsMetadata, customGridColumnsConfiguration, customControlColumnsConfiguration, enableComparisonMode, cellContext, renderCellPopover, }: ", + "({ ariaLabelledBy, columns, columnsMeta, showColumnTokens, configHeaderRowHeight, headerRowHeightState, onUpdateHeaderRowHeight, controlColumnIds, dataView, loadingState, onFilter, onResize, onSetColumns, onSort, rows, searchDescription, searchTitle, settings, showTimeCol, showFullScreenButton, sort, useNewFieldsApi, isSortEnabled, isPaginationEnabled, cellActionsTriggerId, className, rowHeightState, onUpdateRowHeight, maxAllowedSampleSize, sampleSizeState, onUpdateSampleSize, isPlainRecord, rowsPerPageState, onUpdateRowsPerPage, onFieldEdited, services, renderCustomGridBody, renderCustomToolbar, trailingControlColumns, totalHits, onFetchMoreRecords, renderDocumentView, setExpandedDoc, expandedDoc, configRowHeight, showMultiFields, maxDocFieldsDisplayed, externalControlColumns, externalAdditionalControls, rowsPerPageOptions, visibleCellActions, externalCustomRenderers, additionalFieldGroups, consumer, componentsTourSteps, gridStyleOverride, rowLineHeightOverride, cellActionsMetadata, customGridColumnsConfiguration, customControlColumnsConfiguration, enableComparisonMode, cellContext, renderCellPopover, getRowIndicator, }: ", { "pluginId": "@kbn/unified-data-table", "scope": "common", @@ -551,7 +551,7 @@ "id": "def-common.UnifiedDataTable.$1", "type": "Object", "tags": [], - "label": "{\n ariaLabelledBy,\n columns,\n columnsMeta,\n showColumnTokens,\n configHeaderRowHeight,\n headerRowHeightState,\n onUpdateHeaderRowHeight,\n controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT,\n dataView,\n loadingState,\n onFilter,\n onResize,\n onSetColumns,\n onSort,\n rows,\n searchDescription,\n searchTitle,\n settings,\n showTimeCol,\n showFullScreenButton = true,\n sort,\n useNewFieldsApi,\n isSortEnabled = true,\n isPaginationEnabled = true,\n cellActionsTriggerId,\n className,\n rowHeightState,\n onUpdateRowHeight,\n maxAllowedSampleSize,\n sampleSizeState,\n onUpdateSampleSize,\n isPlainRecord = false,\n rowsPerPageState,\n onUpdateRowsPerPage,\n onFieldEdited,\n services,\n renderCustomGridBody,\n renderCustomToolbar,\n trailingControlColumns,\n totalHits,\n onFetchMoreRecords,\n renderDocumentView,\n setExpandedDoc,\n expandedDoc,\n configRowHeight,\n showMultiFields = true,\n maxDocFieldsDisplayed = 50,\n externalControlColumns,\n externalAdditionalControls,\n rowsPerPageOptions,\n visibleCellActions,\n externalCustomRenderers,\n additionalFieldGroups,\n consumer = 'discover',\n componentsTourSteps,\n gridStyleOverride,\n rowLineHeightOverride,\n cellActionsMetadata,\n customGridColumnsConfiguration,\n customControlColumnsConfiguration,\n enableComparisonMode,\n cellContext,\n renderCellPopover,\n}", + "label": "{\n ariaLabelledBy,\n columns,\n columnsMeta,\n showColumnTokens,\n configHeaderRowHeight,\n headerRowHeightState,\n onUpdateHeaderRowHeight,\n controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT,\n dataView,\n loadingState,\n onFilter,\n onResize,\n onSetColumns,\n onSort,\n rows,\n searchDescription,\n searchTitle,\n settings,\n showTimeCol,\n showFullScreenButton = true,\n sort,\n useNewFieldsApi,\n isSortEnabled = true,\n isPaginationEnabled = true,\n cellActionsTriggerId,\n className,\n rowHeightState,\n onUpdateRowHeight,\n maxAllowedSampleSize,\n sampleSizeState,\n onUpdateSampleSize,\n isPlainRecord = false,\n rowsPerPageState,\n onUpdateRowsPerPage,\n onFieldEdited,\n services,\n renderCustomGridBody,\n renderCustomToolbar,\n trailingControlColumns,\n totalHits,\n onFetchMoreRecords,\n renderDocumentView,\n setExpandedDoc,\n expandedDoc,\n configRowHeight,\n showMultiFields = true,\n maxDocFieldsDisplayed = 50,\n externalControlColumns,\n externalAdditionalControls,\n rowsPerPageOptions,\n visibleCellActions,\n externalCustomRenderers,\n additionalFieldGroups,\n consumer = 'discover',\n componentsTourSteps,\n gridStyleOverride,\n rowLineHeightOverride,\n cellActionsMetadata,\n customGridColumnsConfiguration,\n customControlColumnsConfiguration,\n enableComparisonMode,\n cellContext,\n renderCellPopover,\n getRowIndicator,\n}", "description": [], "signature": [ { @@ -2374,6 +2374,32 @@ "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-common.UnifiedDataTableProps.getRowIndicator", + "type": "Function", + "tags": [], + "label": "getRowIndicator", + "description": [ + "\nWhen specified, this function will be called to determine the color of the row indicator." + ], + "signature": [ + "((row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + ", euiTheme: ", + "EuiThemeComputed", + "<{}>) => { color: string; label: string; } | undefined) | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 23f6481b3b6ba8..17fe3c50e1b6d0 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-07-10 +date: 2024-07-16 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 | |-------------------|-----------|------------------------|-----------------| -| 153 | 0 | 81 | 1 | +| 154 | 0 | 81 | 1 | ## Common diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 0ec1e020d9a494..6ea966b5deb2f1 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-07-10 +date: 2024-07-16 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 5d9f33596721d1..7d0006a89955e9 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-07-10 +date: 2024-07-16 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 ea1be4f0240a82..fbaac6cc1ebc43 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-07-10 +date: 2024-07-16 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 c9d96e19e8089f..6cda5834d6c150 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-07-10 +date: 2024-07-16 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 ed43dfa3580b38..da5a5b1a42fea0 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-07-10 +date: 2024-07-16 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 da98e9e683b05e..09c0587a6d281a 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-07-10 +date: 2024-07-16 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 0d23d9d6e3ddb6..d42cb3e9c252ae 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-07-10 +date: 2024-07-16 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 c154ac78aff316..1209fbf4edec65 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-07-10 +date: 2024-07-16 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 2760fb6498ffc0..30eb71cfc0adce 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-07-10 +date: 2024-07-16 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 2ffdc37c2f3625..dfa89eb63ca378 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-07-10 +date: 2024-07-16 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 6d48065cf5a6fc..1f966fb2b30fca 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-07-10 +date: 2024-07-16 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 bc8ac208631811..e82b8f53ce741d 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-07-10 +date: 2024-07-16 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 e20d7586b76618..d8deb091deaa55 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index e2b68abc0a3245..0cf86a7c036d4d 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-07-10 +date: 2024-07-16 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 b211d3d85375e9..625573339c7daa 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-07-10 +date: 2024-07-16 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 edfac50200b65a..ae2c7ff93180be 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-07-10 +date: 2024-07-16 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 6879db37872f56..7f657e2a207b80 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-07-10 +date: 2024-07-16 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 cb0b3d58dda461..642ed202341103 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 0534b92e8b64c1..f55fa47f03c8ae 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -494,10 +494,10 @@ }, { "parentPluginId": "lens", - "id": "def-public.Embeddable.openConfingPanel", + "id": "def-public.Embeddable.openConfigPanel", "type": "Function", "tags": [], - "label": "openConfingPanel", + "label": "openConfigPanel", "description": [], "signature": [ "(startDependencies: ", @@ -510,7 +510,7 @@ "children": [ { "parentPluginId": "lens", - "id": "def-public.Embeddable.openConfingPanel.$1", + "id": "def-public.Embeddable.openConfigPanel.$1", "type": "Object", "tags": [], "label": "startDependencies", @@ -525,7 +525,7 @@ }, { "parentPluginId": "lens", - "id": "def-public.Embeddable.openConfingPanel.$2", + "id": "def-public.Embeddable.openConfigPanel.$2", "type": "CompoundType", "tags": [], "label": "isNewPanel", @@ -540,7 +540,7 @@ }, { "parentPluginId": "lens", - "id": "def-public.Embeddable.openConfingPanel.$3", + "id": "def-public.Embeddable.openConfigPanel.$3", "type": "Function", "tags": [], "label": "deletePanel", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 2f8b8605a7eb77..dad1c229050819 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-07-10 +date: 2024-07-16 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 5bc44e9854e706..54604648ff77e1 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-07-10 +date: 2024-07-16 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 9ecd9d9bd5811b..7d1203e9077dea 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-07-10 +date: 2024-07-16 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 ca13a48f61e326..20905538e2b753 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-07-10 +date: 2024-07-16 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 41ee754c5045d4..85579d2677dbe3 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-07-10 +date: 2024-07-16 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 5e1b2229e8f720..798807ecf89f3c 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-07-10 +date: 2024-07-16 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 b09764d682764d..892bc914b834e2 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-07-10 +date: 2024-07-16 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 586cf3c3419fee..58cae6b1ffc021 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-07-10 +date: 2024-07-16 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 b5d4e58649f4a1..9051fbf255beb1 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-07-10 +date: 2024-07-16 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 e58e039bb493f5..7ad2447ef77fb7 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-07-10 +date: 2024-07-16 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 b3620ad0311327..c77c4eb4af4772 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-07-10 +date: 2024-07-16 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 e292b96e8f1287..49fd392572951c 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-07-10 +date: 2024-07-16 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 b852e1b255fbb5..c1b663e17d9f3f 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index 4a7428c3c49bdd..5e5500a6d90be4 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -1660,7 +1660,23 @@ "IngestPipeline", "): Promise<", "IngestSimulateResponse", - ">; deleteTrainedModel(modelId: string, options?: { with_pipelines?: boolean | undefined; force?: boolean | undefined; }): Promise<{ acknowledge: boolean; }>; getTrainedModelsNodesOverview(): Promise<", + ">; deleteTrainedModel(modelId: string, options?: { with_pipelines?: boolean | undefined; force?: boolean | undefined; }): Promise<{ acknowledge: boolean; }>; getCuratedModelConfig(modelName: string, options?: ", + { + "pluginId": "@kbn/ml-trained-models-utils", + "scope": "common", + "docId": "kibKbnMlTrainedModelsUtilsPluginApi", + "section": "def-common.GetModelDownloadConfigOptions", + "text": "GetModelDownloadConfigOptions" + }, + " | undefined): Promise<", + { + "pluginId": "@kbn/ml-trained-models-utils", + "scope": "common", + "docId": "kibKbnMlTrainedModelsUtilsPluginApi", + "section": "def-common.ModelDefinitionResponse", + "text": "ModelDefinitionResponse" + }, + ">; getTrainedModelsNodesOverview(): Promise<", "NodesOverviewResponse", ">; startModelAllocation(modelId: string, queryParams?: { number_of_allocations: number; threads_per_allocation: number; priority: \"normal\" | \"low\"; deployment_id?: string | undefined; } | undefined): Promise<{ acknowledge: boolean; }>; stopModelAllocation(modelId: string, deploymentsIds: string[], options?: { force: boolean; }): Promise public API | Number of teams | |--------------|----------|------------------------| -| 812 | 696 | 42 | +| 813 | 696 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 49918 | 239 | 38033 | 1897 | +| 49926 | 239 | 38046 | 1898 | ## Plugin Directory @@ -32,7 +32,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 74 | 0 | 9 | 2 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 871 | 1 | 839 | 52 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 123 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 124 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | @@ -70,11 +70,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A stateful layer to register shared features and provide an access point to discover without a direct dependency | 16 | 0 | 15 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 48 | 0 | 34 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 571 | 1 | 461 | 9 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 570 | 1 | 460 | 9 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Entity manager plugin for entity assets (inventory, topology, etc) | 8 | 0 | 8 | 1 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Entity manager plugin for entity assets (inventory, topology, etc) | 14 | 0 | 14 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 99 | 3 | 97 | 3 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 10 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 2 | 0 | 2 | 0 | @@ -102,7 +102,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 84 | 0 | 84 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 3 | 0 | 3 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1348 | 5 | 1226 | 72 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1349 | 5 | 1227 | 72 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -120,7 +120,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 127 | 2 | 100 | 4 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Plugin implementing the Integration Assistant API and UI | 47 | 0 | 40 | 3 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 95 | 0 | 95 | 4 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 95 | 0 | 95 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 153 | 0 | 121 | 3 | | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -168,7 +168,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 24 | 0 | 19 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 132 | 2 | 121 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 25 | 0 | 25 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 164 | 0 | 150 | 2 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 148 | 0 | 139 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 89 | 0 | 83 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 105 | 0 | 57 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 80 | 0 | 79 | 4 | @@ -178,7 +178,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 10 | 0 | 6 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 8 | 0 | 8 | 1 | -| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 1 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 15 | 0 | 9 | 1 | | searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 438 | 0 | 222 | 1 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 191 | 0 | 121 | 37 | @@ -186,7 +186,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 25 | 0 | 24 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | Serverless customizations for observability. | 6 | 0 | 6 | 0 | -| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Serverless customizations for search. | 6 | 0 | 6 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Serverless customizations for search. | 7 | 0 | 7 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 121 | 0 | 60 | 12 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 65 | 0 | 65 | 1 | @@ -207,7 +207,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 588 | 1 | 562 | 52 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 156 | 0 | 110 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 212 | 0 | 145 | 11 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 12 | 0 | 8 | 3 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 15 | 0 | 10 | 3 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display. | 71 | 0 | 36 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 152 | 2 | 113 | 23 | | upgradeAssistant | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | @@ -480,7 +480,7 @@ 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) | - | 120 | 0 | 94 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 128 | 0 | 102 | 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) | - | 41 | 0 | 27 | 6 | @@ -489,7 +489,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 13 | 0 | 5 | 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) | - | 160 | 0 | 134 | 9 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 362 | 0 | 336 | 0 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 363 | 0 | 337 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 19 | 0 | 19 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 37 | 7 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | @@ -499,7 +499,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 104 | 1 | 101 | 10 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 53 | 0 | 51 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 193 | 0 | 182 | 10 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 183 | 10 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 39 | 0 | 14 | 1 | @@ -577,7 +577,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 8 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 2 | 0 | 1 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 34 | 0 | 0 | 0 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 34 | 0 | 29 | 1 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 43 | 0 | 38 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 18 | 0 | 18 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 31 | 1 | 24 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 22 | 0 | 16 | 0 | @@ -656,7 +656,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 106 | 0 | 95 | 1 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 15 | 0 | 7 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 147 | 0 | 125 | 0 | -| | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 538 | 0 | 525 | 0 | +| | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 534 | 0 | 521 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 68 | 0 | 38 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 28 | 0 | 21 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 103 | 0 | 99 | 0 | @@ -733,9 +733,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 1 | | | [@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) | - | 56 | 0 | 47 | 0 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 57 | 0 | 48 | 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 | 153 | 0 | 81 | 1 | +| | [@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 | 154 | 0 | 81 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 313 | 0 | 284 | 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 044039be72e2f8..eafe060da0d2d6 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-07-10 +date: 2024-07-16 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 8a4f3cf4f1d1e8..5773775ae50d1c 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-07-10 +date: 2024-07-16 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 66b8099faa64b5..cedb3f5d185fa8 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-07-10 +date: 2024-07-16 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 2d1fb75fa9ebce..b8e0c33824f5bf 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-07-10 +date: 2024-07-16 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 1332a6bbe1307c..d50c1f175e4b7d 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-07-10 +date: 2024-07-16 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 aaf34bf8ec7ca1..71a64424b5cb48 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-07-10 +date: 2024-07-16 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 a85cd6355abed9..265793ae0f8753 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-07-10 +date: 2024-07-16 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 3c0bac39f60e8d..2b426a9819e5c3 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-07-10 +date: 2024-07-16 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 469dd74c891714..143a4941f29c2c 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-07-10 +date: 2024-07-16 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 46bf950d7cc7cd..54d0193106adb2 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-07-10 +date: 2024-07-16 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 27f188c099000a..6216fdd75a9ca6 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.devdocs.json b/api_docs/saved_objects_management.devdocs.json index 960c3f2389b2ba..978ee22c3d5143 100644 --- a/api_docs/saved_objects_management.devdocs.json +++ b/api_docs/saved_objects_management.devdocs.json @@ -1096,244 +1096,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceSetup", - "type": "Interface", - "tags": [], - "label": "SavedObjectsManagementActionServiceSetup", - "description": [], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceSetup.register", - "type": "Function", - "tags": [], - "label": "register", - "description": [ - "\nregister given action in the registry." - ], - "signature": [ - "(action: ", - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementAction", - "text": "SavedObjectsManagementAction" - }, - ") => void" - ], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceSetup.register.$1", - "type": "Object", - "tags": [], - "label": "action", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementAction", - "text": "SavedObjectsManagementAction" - } - ], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceStart", - "type": "Interface", - "tags": [], - "label": "SavedObjectsManagementActionServiceStart", - "description": [], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceStart.has", - "type": "Function", - "tags": [], - "label": "has", - "description": [ - "\nreturn true if the registry contains given action, false otherwise." - ], - "signature": [ - "(actionId: string) => boolean" - ], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceStart.has.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementActionServiceStart.getAll", - "type": "Function", - "tags": [], - "label": "getAll", - "description": [ - "\nreturn all {@link SavedObjectsManagementAction | actions} currently registered." - ], - "signature": [ - "() => ", - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementAction", - "text": "SavedObjectsManagementAction" - }, - "[]" - ], - "path": "src/plugins/saved_objects_management/public/services/action_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementColumnServiceSetup", - "type": "Interface", - "tags": [], - "label": "SavedObjectsManagementColumnServiceSetup", - "description": [], - "path": "src/plugins/saved_objects_management/public/services/column_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementColumnServiceSetup.register", - "type": "Function", - "tags": [], - "label": "register", - "description": [ - "\nregister given column in the registry." - ], - "signature": [ - "(column: ", - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementColumn", - "text": "SavedObjectsManagementColumn" - }, - ") => void" - ], - "path": "src/plugins/saved_objects_management/public/services/column_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementColumnServiceSetup.register.$1", - "type": "Object", - "tags": [], - "label": "column", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementColumn", - "text": "SavedObjectsManagementColumn" - } - ], - "path": "src/plugins/saved_objects_management/public/services/column_service.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementColumnServiceStart", - "type": "Interface", - "tags": [], - "label": "SavedObjectsManagementColumnServiceStart", - "description": [], - "path": "src/plugins/saved_objects_management/public/services/column_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementColumnServiceStart.getAll", - "type": "Function", - "tags": [], - "label": "getAll", - "description": [ - "\nreturn all {@link SavedObjectsManagementColumn | columns} currently registered." - ], - "signature": [ - "() => ", - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementColumn", - "text": "SavedObjectsManagementColumn" - }, - "[]" - ], - "path": "src/plugins/saved_objects_management/public/services/column_service.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "savedObjectsManagement", "id": "def-public.SavedObjectsManagementRecord", @@ -1617,48 +1379,7 @@ "path": "src/plugins/saved_objects_management/public/plugin.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementPluginSetup.actions", - "type": "Object", - "tags": [], - "label": "actions", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementActionServiceSetup", - "text": "SavedObjectsManagementActionServiceSetup" - } - ], - "path": "src/plugins/saved_objects_management/public/plugin.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementPluginSetup.columns", - "type": "Object", - "tags": [], - "label": "columns", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementColumnServiceSetup", - "text": "SavedObjectsManagementColumnServiceSetup" - } - ], - "path": "src/plugins/saved_objects_management/public/plugin.ts", - "deprecated": false, - "trackAdoption": false - } - ], + "children": [], "lifecycle": "setup", "initialIsOpen": true }, @@ -1673,46 +1394,6 @@ "deprecated": false, "trackAdoption": false, "children": [ - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementPluginStart.actions", - "type": "Object", - "tags": [], - "label": "actions", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementActionServiceStart", - "text": "SavedObjectsManagementActionServiceStart" - } - ], - "path": "src/plugins/saved_objects_management/public/plugin.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsManagement", - "id": "def-public.SavedObjectsManagementPluginStart.columns", - "type": "Object", - "tags": [], - "label": "columns", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsManagement", - "scope": "public", - "docId": "kibSavedObjectsManagementPluginApi", - "section": "def-public.SavedObjectsManagementColumnServiceStart", - "text": "SavedObjectsManagementColumnServiceStart" - } - ], - "path": "src/plugins/saved_objects_management/public/plugin.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "savedObjectsManagement", "id": "def-public.SavedObjectsManagementPluginStart.getAllowedTypes", diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index c59950e900de12..0486685408d539 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 164 | 0 | 150 | 2 | +| 148 | 0 | 139 | 2 | ## Client diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 4511c56481e6bc..5ada6c781c6674 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-07-10 +date: 2024-07-16 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 a4e7160e19728f..d7cd5c07df3f09 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-07-10 +date: 2024-07-16 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 bfcdcd6c94b374..bdd1f9dbdc8a8d 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-07-10 +date: 2024-07-16 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 68ce1ae4d60228..aee1c46e4f9928 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-07-10 +date: 2024-07-16 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 d338a09e37e070..ec37acb0ebff44 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 379fd5ffceb98b..625aaf4404dbd0 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-07-10 +date: 2024-07-16 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 e4cd144d11b561..ce6b66a58735f8 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 2e7befc9dd3651..c35ca83ad95c48 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-07-10 +date: 2024-07-16 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 3047177c85e7e5..385cfa942540b5 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.devdocs.json b/api_docs/search_playground.devdocs.json index 0306aa3c5780a3..9acc1abcd944f5 100644 --- a/api_docs/search_playground.devdocs.json +++ b/api_docs/search_playground.devdocs.json @@ -40,9 +40,7 @@ "label": "PlaygroundProvider", "description": [], "signature": [ - "React.FunctionComponent<", - "PlaygroundProviderProps", - " & { children?: React.ReactNode; }>" + "React.FunctionComponent<{ children?: React.ReactNode; }>" ], "path": "x-pack/plugins/search_playground/public/types.ts", "deprecated": false, @@ -79,51 +77,6 @@ } ] }, - { - "parentPluginId": "searchPlayground", - "id": "def-public.SearchPlaygroundPluginStart.PlaygroundToolbar", - "type": "Function", - "tags": [], - "label": "PlaygroundToolbar", - "description": [], - "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" - ], - "path": "x-pack/plugins/search_playground/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "searchPlayground", - "id": "def-public.SearchPlaygroundPluginStart.PlaygroundToolbar.$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": "searchPlayground", - "id": "def-public.SearchPlaygroundPluginStart.PlaygroundToolbar.$2", - "type": "Any", - "tags": [], - "label": "context", - "description": [], - "signature": [ - "any" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, { "parentPluginId": "searchPlayground", "id": "def-public.SearchPlaygroundPluginStart.Playground", @@ -132,7 +85,9 @@ "label": "Playground", "description": [], "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" + "React.FunctionComponent<", + "AppProps", + " & { children?: React.ReactNode; }>" ], "path": "x-pack/plugins/search_playground/public/types.ts", "deprecated": false, diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index c75eeb689a0d59..18004569c850ba 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-ki | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 18 | 0 | 10 | 1 | +| 15 | 0 | 9 | 1 | ## Client diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 6fe96f75244440..c4860f95215143 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index b5d8334c5d5b0d..68edff02d75da9 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3071,7 +3071,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3247,7 +3247,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3313,7 +3313,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutDisabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewEnabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly AIAssistantOnRuleCreationFormEnabled: false; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly alertSuppressionForMachineLearningRuleEnabled: false; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly jamfDataInAnalyzerEnabled: false; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewEnabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly AIAssistantOnRuleCreationFormEnabled: false; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly alertSuppressionForMachineLearningRuleEnabled: false; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly jamfDataInAnalyzerEnabled: false; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index b7b2be2be7482e..e3fea9b4b459b2 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-07-10 +date: 2024-07-16 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 ebb118cace66db..ccc9c6677e085d 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-07-10 +date: 2024-07-16 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 9553b08dccff10..b842927153e180 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-07-10 +date: 2024-07-16 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 57a0aa2229dee7..e5b45a581fdd17 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-07-10 +date: 2024-07-16 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 bff2ac08d57f2f..daf715e559d80d 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.devdocs.json b/api_docs/serverless_search.devdocs.json index 0dda44c3607afc..3270aeb28c2d9d 100644 --- a/api_docs/serverless_search.devdocs.json +++ b/api_docs/serverless_search.devdocs.json @@ -78,6 +78,21 @@ "interfaces": [], "enums": [], "misc": [ + { + "parentPluginId": "serverlessSearch", + "id": "def-common.DEFAULT_INGESTION_PIPELINE", + "type": "string", + "tags": [], + "label": "DEFAULT_INGESTION_PIPELINE", + "description": [], + "signature": [ + "\"search-default-ingestion\"" + ], + "path": "x-pack/plugins/serverless_search/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "serverlessSearch", "id": "def-common.PLUGIN_ID", diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 7b7a7522bea8c2..7672c2e692215a 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-ki | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 6 | 0 | 6 | 0 | +| 7 | 0 | 7 | 0 | ## Client diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index c9f4cec316f79c..3b0c122d53c8fc 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-07-10 +date: 2024-07-16 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 1ff559bbbd72b3..702689af662488 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-07-10 +date: 2024-07-16 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 e70711708aece3..082b9d578b4d75 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-07-10 +date: 2024-07-16 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 145d3e958e8196..f0d47920d79c15 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-07-10 +date: 2024-07-16 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 ed9a8c59472727..375f328417f64f 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-07-10 +date: 2024-07-16 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 1293d7b86b30b8..f3b325632e7c59 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-07-10 +date: 2024-07-16 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 087f7d8ac7ccab..735c1cf29cc139 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-07-10 +date: 2024-07-16 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 79ed70ae22e348..74d141b179f300 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-07-10 +date: 2024-07-16 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 a4b2e92dba1520..492412001ec0d5 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-07-10 +date: 2024-07-16 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 05150e6ac611e1..4acfee83aab967 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-07-10 +date: 2024-07-16 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 0db1faf7d8cb42..e5516d393d9746 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-07-10 +date: 2024-07-16 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 0e37f1419e1643..f6e98bbb3b336b 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-07-10 +date: 2024-07-16 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 bccc09ec31398a..aedefa302e9bc1 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-07-10 +date: 2024-07-16 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 42ae21461db928..e7b2438f8b5156 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-07-10 +date: 2024-07-16 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 7570d1d8f78398..389a5057e5680f 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-07-10 +date: 2024-07-16 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 d461dc87124a54..1721b0f482dea8 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-07-10 +date: 2024-07-16 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 5fd2c4e8ccc02c..0d51faae696b02 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-07-10 +date: 2024-07-16 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 fce6bfd75d2508..14e22f4e0a60e2 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.devdocs.json b/api_docs/unified_doc_viewer.devdocs.json index 76a3e2a3d32fff..f2f0db27d707e7 100644 --- a/api_docs/unified_doc_viewer.devdocs.json +++ b/api_docs/unified_doc_viewer.devdocs.json @@ -129,6 +129,48 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "unifiedDocViewer", + "id": "def-public.UnifiedDocViewerLogsOverview", + "type": "Function", + "tags": [], + "label": "UnifiedDocViewerLogsOverview", + "description": [], + "signature": [ + "React.ForwardRefExoticComponent<", + "DocViewRenderProps", + " & { renderAIAssistant?: ((deps: ", + { + "pluginId": "discoverShared", + "scope": "public", + "docId": "kibDiscoverSharedPluginApi", + "section": "def-public.ObservabilityLogsAIAssistantFeatureRenderDeps", + "text": "ObservabilityLogsAIAssistantFeatureRenderDeps" + }, + ") => JSX.Element) | undefined; } & React.RefAttributes<{}>>" + ], + "path": "src/plugins/unified_doc_viewer/public/components/lazy_doc_viewer_logs_overview.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "unifiedDocViewer", + "id": "def-public.UnifiedDocViewerLogsOverview.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "unifiedDocViewer", "id": "def-public.useEsDocSearch", @@ -185,7 +227,32 @@ ], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "unifiedDocViewer", + "id": "def-public.LogsOverviewProps", + "type": "Type", + "tags": [], + "label": "LogsOverviewProps", + "description": [], + "signature": [ + "DocViewRenderProps", + " & { renderAIAssistant?: ((deps: ", + { + "pluginId": "discoverShared", + "scope": "public", + "docId": "kibDiscoverSharedPluginApi", + "section": "def-public.ObservabilityLogsAIAssistantFeatureRenderDeps", + "text": "ObservabilityLogsAIAssistantFeatureRenderDeps" + }, + ") => JSX.Element) | undefined; }" + ], + "path": "src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [], "setup": { "parentPluginId": "unifiedDocViewer", diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 4fe43ee8c187e1..118475a1db1263 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.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 | |-------------------|-----------|------------------------|-----------------| -| 12 | 0 | 8 | 3 | +| 15 | 0 | 10 | 3 | ## Client @@ -34,3 +34,6 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k ### Functions +### Consts, variables and types + + diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 079600b222919e..34170a24c36866 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-07-10 +date: 2024-07-16 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 d0be2830ce3ba1..341e8cf44aefcf 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-07-10 +date: 2024-07-16 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 85e0450ad4b93f..103275f9d6e80a 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-07-10 +date: 2024-07-16 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 ff2be9d4589cae..bcafa05f880565 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-07-10 +date: 2024-07-16 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 411863237c3737..d3cc065b63321a 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-07-10 +date: 2024-07-16 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 826632b661f6eb..428eb8b1440e0a 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-07-10 +date: 2024-07-16 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 2590939f79170b..19a8ed8f5128c4 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-07-10 +date: 2024-07-16 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 ed8c293707c3a8..d4b0753797412c 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-07-10 +date: 2024-07-16 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 82e9d4bb264946..b8206219ceda0a 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-07-10 +date: 2024-07-16 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 ef2b0c31508117..5cf1b2c1ea1ef3 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-07-10 +date: 2024-07-16 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 6fde86032473ed..b0ef6c82a47d39 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-07-10 +date: 2024-07-16 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 05412076e4ccdb..1111217dcfb986 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-07-10 +date: 2024-07-16 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 f39474618a0835..c9b31ecc6ff9c6 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-07-10 +date: 2024-07-16 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 9263d0a13bed51..e3320f2b250db5 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-07-10 +date: 2024-07-16 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 fcff5b44cd7b42..1388f2f33ce372 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-07-10 +date: 2024-07-16 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 f128139595729d..7891f148e69aca 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-07-10 +date: 2024-07-16 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 959b152aca56af..4d6d3b014583b3 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-07-10 +date: 2024-07-16 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 f45a58c6bfa54e..75443e2d7e90b2 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-07-10 +date: 2024-07-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/catalog-info.yaml b/catalog-info.yaml index aae8fc1af81d83..4af2698ca6cca4 100644 --- a/catalog-info.yaml +++ b/catalog-info.yaml @@ -97,34 +97,6 @@ spec: # yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json apiVersion: backstage.io/v1alpha1 kind: Resource -metadata: - name: buildkite-pipeline-kibana-kme-test -spec: - implementation: - apiVersion: buildkite.elastic.dev/v1 - kind: Pipeline - metadata: - description: Temporary pipeline for testing Kibana KME work - name: kibana-kme-test - spec: - pipeline_file: .buildkite/scripts/pipelines/pull_request/pipeline.sh - provider_settings: - build_branches: false - build_pull_requests: true - publish_commit_status: false - trigger_mode: none - repository: elastic/kibana - teams: - kibana-operations: - access_level: MANAGE_BUILD_AND_READ - everyone: - access_level: READ_ONLY - owner: group:kibana-operations - type: buildkite-pipeline ---- -# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json -apiVersion: backstage.io/v1alpha1 -kind: Resource metadata: name: buildkite-pipeline-kibana-sonarqube description: Run a SonarQube scan diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 6d42b25d4bce41..c5a1dd2798fbbe 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -10,6 +10,7 @@ Review important information about the {kib} 8.x releases. +* <> * <> * <> * <> @@ -69,6 +70,21 @@ Review important information about the {kib} 8.x releases. -- +[[release-notes-8.14.3]] +== {kib} 8.14.3 + +The 8.14.3 release includes the following bug fixes. + +[float] +[[fixes-v8.14.3]] +=== Bug Fixes +Dashboard:: +* Fixes controls getting overwritten on navigation ({kibana-pull}187509[#187509]). +Elastic Security:: +For the Elastic Security 8.14.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +Logs:: +* Fixes log entry fly-out when response is slow ({kibana-pull}187303[#187303]). + [[release-notes-8.14.2]] == {kib} 8.14.2 diff --git a/docs/api/data-views/create.asciidoc b/docs/api/data-views/create.asciidoc index 2164983db11eae..32372639d2dbfc 100644 --- a/docs/api/data-views/create.asciidoc +++ b/docs/api/data-views/create.asciidoc @@ -231,10 +231,13 @@ The API returns the {data-source} object: .Properties of the fieldAttrs[fieldName] objects: [%collapsible%open] ===== -`customLabel`::: +`customLabel`:: (Optional, string) Custom label for the field. -`count`::: +`customDescription`:: +(Optional, string) Custom description for the field. Max length is 300 characters. + +`count`:: (Optional, number) Popularity count for the field. ===== diff --git a/docs/api/data-views/update-fields.asciidoc b/docs/api/data-views/update-fields.asciidoc index 9b0b044238f367..0feacccb81863b 100644 --- a/docs/api/data-views/update-fields.asciidoc +++ b/docs/api/data-views/update-fields.asciidoc @@ -5,7 +5,7 @@ ++++ experimental[] Update fields presentation metadata, such as `count`, -`customLabel`, and `format`. You can update multiple fields in one request. Updates +`customLabel`, `customDescription`, and `format`. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify `null` as the value. @@ -119,7 +119,8 @@ $ curl -X POST api/data_views/data_view/my-view/fields "customLabel": "Foo" }, "bar": { - "customLabel": "Bar" + "customLabel": "Bar", + "customDescription": "Bar Custom description" } } } diff --git a/docs/developer/advanced/upgrading-nodejs.asciidoc b/docs/developer/advanced/upgrading-nodejs.asciidoc index bd9b0ee23ac893..566bfd2ea5dd2b 100644 --- a/docs/developer/advanced/upgrading-nodejs.asciidoc +++ b/docs/developer/advanced/upgrading-nodejs.asciidoc @@ -19,7 +19,7 @@ These files must be updated when upgrading Node.js: - {kib-repo}blob/{branch}/WORKSPACE.bazel[`WORKSPACE.bazel`] - The version is specified in the `node_version` property. Besides this property, the list of files under `node_repositories` must be updated along with their respective SHA256 hashes. These can be found in the `SHASUMS256.txt` file inside the public `kibana-custom-node-artifacts` GCP bucket. - Example for Node.js v20.13.1: https://storage.googleapis.com/kibana-custom-node-artifacts/node-glibc-217/dist/v20.13.1/SHASUMS256.txt[kibana-custom-node-artifacts/node-glibc-217/dist/v20.13.1/SHASUMS256.txt] + Example for Node.js v20.15.1: https://storage.googleapis.com/kibana-custom-node-artifacts/node-glibc-217/dist/v20.15.1/SHASUMS256.txt[kibana-custom-node-artifacts/node-glibc-217/dist/v20.15.1/SHASUMS256.txt] See PR {kib-repo}pull/128123[#128123] for an example of how the Node.js version has been upgraded previously. @@ -43,7 +43,7 @@ The only difference between the offical Node.js build and our custom build, is t ==== How to start a new build To generate a new custom Node.js build, https://buildkite.com/elastic/kibana-custom-node-dot-js-builds#new[start a new build] on our dedicated Buildkite pipeline (requires Elastic employee permissions). -Give it a clear name (e.g. `Node 20.13.1`) and remember so set the custom `OVERRIDE_TARGET_VERSION` environment variable to the desired Node.js version - e.g. `OVERRIDE_TARGET_VERSION=20.13.1`. +Give it a clear name (e.g. `Node 20.15.1`) and remember so set the custom `OVERRIDE_TARGET_VERSION` environment variable to the desired Node.js version - e.g. `OVERRIDE_TARGET_VERSION=20.15.1`. You find the "Environment Variables" field by expanding "Options >" in the "New Build" dialog. === Backporting diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 0f20d331118ccb..7c52908cc4e437 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -503,7 +503,8 @@ The plugin exposes the static DefaultEditorController class to consume. |{kib-repo}blob/{branch}/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx[cloudExperiments] -|The Cloud Experiments Service provides the necessary APIs to implement A/B testing scenarios, fetching the variations in configuration and reporting back metrics to track conversion rates of the experiments. +|[!WARNING] +These APIs are deprecated and should not be used as we're working on a replacement Core Feature Flags Service that will arrive soon. |{kib-repo}blob/{branch}/x-pack/plugins/cloud_integrations/cloud_full_story/README.md[cloudFullStory] diff --git a/docs/discover/images/esql-full-query.png b/docs/discover/images/esql-full-query.png index 1d4a37af23a607..e4f5faeef3cf7f 100644 Binary files a/docs/discover/images/esql-full-query.png and b/docs/discover/images/esql-full-query.png differ diff --git a/docs/discover/images/esql-limit.png b/docs/discover/images/esql-limit.png index dbc9edc3cdc13b..b03ecdcc091e68 100644 Binary files a/docs/discover/images/esql-limit.png and b/docs/discover/images/esql-limit.png differ diff --git a/docs/discover/images/esql-machine-os-ram.png b/docs/discover/images/esql-machine-os-ram.png index 2c936cecb9498c..ad46d88b219ff0 100644 Binary files a/docs/discover/images/esql-machine-os-ram.png and b/docs/discover/images/esql-machine-os-ram.png differ diff --git a/docs/discover/try-esql.asciidoc b/docs/discover/try-esql.asciidoc index 32718d87c955a9..53862be75f010b 100644 --- a/docs/discover/try-esql.asciidoc +++ b/docs/discover/try-esql.asciidoc @@ -78,7 +78,7 @@ FROM kibana_sample_data_logs . Click **▶Run**. + [role="screenshot"] -image:images/esql-full-query.png[] +image:images/esql-full-query.png[An image of the full query result] + . Click **Save** to save the query and visualization to a dashboard. diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index 98886aedd5535a..73789c750e015b 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -43,8 +43,11 @@ Change the settings that apply only to {kib} spaces. [[auto-complete-use-time-tange]]`autocomplete:useTimeRange`:: When disabled, autocompletes the suggestions from your data set instead of the time range. +[[bfetch-disable]]`bfetch:disable`:: +deprecated:[8.15.0] When disabled, search requests from Kibana will be made in individual HTTP requests rather than bundled together. + [[bfetch-disable-compression]]`bfetch:disableCompression`:: -When disabled, allows you to debug individual requests, but increases the response size. +deprecated:[8.15.0] When disabled, allows you to debug individual requests, but increases the response size. [[csv-quotevalues]]`csv:quoteValues`:: Set this property to `true` to quote exported values. diff --git a/docs/playground/index.asciidoc b/docs/playground/index.asciidoc index 426aa181fe0e66..a21728942e80e8 100644 --- a/docs/playground/index.asciidoc +++ b/docs/playground/index.asciidoc @@ -63,10 +63,9 @@ To use {x}, you'll need the following: | *Amazon Bedrock* a| -* Anthropic: Claude 3 Sonnet +* Anthropic: Claude 3.5 Sonnet * Anthropic: Claude 3 Haiku a| -Does not currently support streaming. | *OpenAI* a| @@ -80,6 +79,13 @@ a| * GPT-3 turbo * GPT-4 turbo a| +Buffers responses in large chunks + +| *Google* +a| +* Google Gemini 1.5 Pro +* Google Gemini 1.5 Flash +a| |=== @@ -200,5 +206,4 @@ Once you've got {x} up and running, and you've tested out the chat interface, yo include::playground-context.asciidoc[] include::playground-query.asciidoc[] -include::playground-troubleshooting.asciidoc[] - +include::playground-troubleshooting.asciidoc[] \ No newline at end of file diff --git a/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx b/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx index eaaa607f76001e..6089be2fefeab1 100644 --- a/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx +++ b/examples/embeddable_examples/public/react_embeddables/saved_book/create_saved_book_action.tsx @@ -21,11 +21,7 @@ import { import { ADD_SAVED_BOOK_ACTION_ID, SAVED_BOOK_ID } from './constants'; import { openSavedBookEditor } from './saved_book_editor'; import { saveBookAttributes } from './saved_book_library'; -import { - BookByReferenceSerializedState, - BookByValueSerializedState, - BookSerializedState, -} from './types'; +import { BookRuntimeState } from './types'; export const registerCreateSavedBookAction = (uiActions: UiActionsPublicStart, core: CoreStart) => { uiActions.registerAction({ @@ -43,21 +39,17 @@ export const registerCreateSavedBookAction = (uiActions: UiActionsPublicStart, c parentApi: embeddable, }); - const initialState: BookSerializedState = await (async () => { + const initialState: BookRuntimeState = await (async () => { + const bookAttributes = serializeBookAttributes(newPanelStateManager); // if we're adding this to the library, we only need to return the by reference state. if (addToLibrary) { - const savedBookId = await saveBookAttributes( - undefined, - serializeBookAttributes(newPanelStateManager) - ); - return { savedBookId } as BookByReferenceSerializedState; + const savedBookId = await saveBookAttributes(undefined, bookAttributes); + return { savedBookId, ...bookAttributes }; } - return { - attributes: serializeBookAttributes(newPanelStateManager), - } as BookByValueSerializedState; + return bookAttributes; })(); - embeddable.addNewPanel({ + embeddable.addNewPanel({ panelType: SAVED_BOOK_ID, initialState, }); diff --git a/kbn_pm/src/commands/reset_command.mjs b/kbn_pm/src/commands/reset_command.mjs index 7331343a0f13e7..4209221b8be19c 100644 --- a/kbn_pm/src/commands/reset_command.mjs +++ b/kbn_pm/src/commands/reset_command.mjs @@ -36,6 +36,7 @@ export const command = { await cleanPaths(log, [ Path.resolve(REPO_ROOT, 'node_modules'), Path.resolve(REPO_ROOT, 'x-pack/node_modules'), + Path.resolve(REPO_ROOT, 'data'), ...readCleanPatterns(REPO_ROOT), ...(await findPluginCleanPaths(log)), ]); diff --git a/kbn_pm/src/lib/bazel.mjs b/kbn_pm/src/lib/bazel.mjs index 022447ded129c1..481a0fd66aa572 100644 --- a/kbn_pm/src/lib/bazel.mjs +++ b/kbn_pm/src/lib/bazel.mjs @@ -149,10 +149,6 @@ export async function installYarnDeps(log, opts = undefined) { await runBazel(log, ['run', '@nodejs//:yarn'], { offline: opts?.offline, quiet: opts?.quiet, - env: { - RE2_DOWNLOAD_MIRROR: - 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2', - }, }); log.success('yarn deps installed'); diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index 1dfcdd50639b3c..5ccacb4c8acfb5 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -12,33 +12,14 @@ "additionalProperties": false, "properties": { "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" } }, "required": [ @@ -129,33 +110,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -186,33 +148,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -250,33 +193,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -308,33 +232,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -376,21 +281,12 @@ "type": "string" }, "build_flavor": { - "anyOf": [ - { - "enum": [ - "serverless" - ], - "type": "string" - }, - { - "enum": [ - "traditional" - ], - "type": "string" - } + "description": "The build flavour determines configuration and behavior of Kibana. On premise users will almost always run the \"traditional\" flavour, while other flavours are reserved for Elastic-specific use cases.", + "enum": [ + "serverless", + "traditional" ], - "description": "The build flavour determines configuration and behavior of Kibana. On premise users will almost always run the \"traditional\" flavour, while other flavours are reserved for Elastic-specific use cases." + "type": "string" }, "build_hash": { "description": "A unique hash value representing the git commit of this Kibana build.", diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index 1dfcdd50639b3c..5ccacb4c8acfb5 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -12,33 +12,14 @@ "additionalProperties": false, "properties": { "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" } }, "required": [ @@ -129,33 +110,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -186,33 +148,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -250,33 +193,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -308,33 +232,14 @@ "type": "string" }, "level": { - "anyOf": [ - { - "enum": [ - "available" - ], - "type": "string" - }, - { - "enum": [ - "degraded" - ], - "type": "string" - }, - { - "enum": [ - "unavailable" - ], - "type": "string" - }, - { - "enum": [ - "critical" - ], - "type": "string" - } + "description": "Service status levels as human and machine readable values.", + "enum": [ + "available", + "degraded", + "unavailable", + "critical" ], - "description": "Service status levels as human and machine readable values." + "type": "string" }, "meta": { "additionalProperties": {}, @@ -376,21 +281,12 @@ "type": "string" }, "build_flavor": { - "anyOf": [ - { - "enum": [ - "serverless" - ], - "type": "string" - }, - { - "enum": [ - "traditional" - ], - "type": "string" - } + "description": "The build flavour determines configuration and behavior of Kibana. On premise users will almost always run the \"traditional\" flavour, while other flavours are reserved for Elastic-specific use cases.", + "enum": [ + "serverless", + "traditional" ], - "description": "The build flavour determines configuration and behavior of Kibana. On premise users will almost always run the \"traditional\" flavour, while other flavours are reserved for Elastic-specific use cases." + "type": "string" }, "build_hash": { "description": "A unique hash value representing the git commit of this Kibana build.", diff --git a/package.json b/package.json index 845c3432a2decd..2467646616f9de 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "url": "https://github.com/elastic/kibana.git" }, "engines": { - "node": "20.13.1", + "node": "20.15.1", "yarn": "^1.22.19" }, "resolutions": { @@ -108,8 +108,8 @@ "@elastic/datemath": "5.0.3", "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.14.0", - "@elastic/ems-client": "8.5.1", - "@elastic/eui": "95.2.0", + "@elastic/ems-client": "8.5.3", + "@elastic/eui": "95.3.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", @@ -762,6 +762,7 @@ "@kbn/securitysolution-ecs": "link:packages/kbn-securitysolution-ecs", "@kbn/securitysolution-es-utils": "link:packages/kbn-securitysolution-es-utils", "@kbn/securitysolution-exception-list-components": "link:packages/kbn-securitysolution-exception-list-components", + "@kbn/securitysolution-exceptions-common": "link:packages/kbn-securitysolution-exceptions-common", "@kbn/securitysolution-hook-utils": "link:packages/kbn-securitysolution-hook-utils", "@kbn/securitysolution-io-ts-alerting-types": "link:packages/kbn-securitysolution-io-ts-alerting-types", "@kbn/securitysolution-io-ts-list-types": "link:packages/kbn-securitysolution-io-ts-list-types", @@ -1035,6 +1036,7 @@ "extract-zip": "^2.0.1", "fast-deep-equal": "^3.1.1", "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.12", "fflate": "^0.6.9", "file-saver": "^1.3.8", "flat": "5", @@ -1064,7 +1066,6 @@ "joi": "^17.13.3", "joi-to-json": "^4.3.0", "jquery": "^3.5.0", - "js-levenshtein": "^1.1.6", "js-search": "^1.4.3", "js-sha256": "^0.9.0", "js-yaml": "^3.14.1", @@ -1125,7 +1126,7 @@ "query-string": "^6.13.2", "rbush": "^3.0.1", "re-resizable": "^6.9.9", - "re2": "1.20.9", + "re2js": "0.4.1", "react": "^17.0.2", "react-ace": "^7.0.5", "react-diff-view": "^3.2.0", @@ -1403,7 +1404,7 @@ "@mapbox/vector-tile": "1.3.1", "@octokit/rest": "^17.11.2", "@parcel/watcher": "^2.1.0", - "@redocly/cli": "^1.17.0", + "@redocly/cli": "^1.17.1", "@statoscope/webpack-plugin": "^5.28.2", "@storybook/addon-a11y": "^6.5.16", "@storybook/addon-actions": "^6.5.16", @@ -1484,7 +1485,6 @@ "@types/inquirer": "^7.3.1", "@types/jest": "^29.5.3", "@types/jquery": "^3.3.31", - "@types/js-levenshtein": "^1.1.0", "@types/js-search": "^1.4.0", "@types/js-yaml": "^3.11.1", "@types/jsdom": "^20.0.1", diff --git a/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts b/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts index 6050d86ded3576..3123fe8bba06c0 100644 --- a/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts +++ b/packages/core/http/core-http-server-internal/src/https_redirect_server.test.ts @@ -96,3 +96,14 @@ test('forwards http requests to https', async () => { expect(res.header.location).toEqual(`https://${config.host}:${config.port}/`); }); }); + +test('keeps the request host when redirecting', async () => { + await server.start(config); + + await supertest(`http://localhost:${config.ssl.redirectHttpFromPort}`) + .get('/') + .expect(302) + .then((res) => { + expect(res.header.location).toEqual(`https://localhost:${config.port}/`); + }); +}); diff --git a/packages/core/http/core-http-server-internal/src/https_redirect_server.ts b/packages/core/http/core-http-server-internal/src/https_redirect_server.ts index 2999c4aaf734e2..e621b864fa075d 100644 --- a/packages/core/http/core-http-server-internal/src/https_redirect_server.ts +++ b/packages/core/http/core-http-server-internal/src/https_redirect_server.ts @@ -40,7 +40,7 @@ export class HttpsRedirectServer { return responseToolkit .redirect( formatUrl({ - hostname: config.host, + hostname: request.url.hostname, pathname: request.url.pathname, port: config.port, protocol: 'https', diff --git a/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap b/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap index 67fe5f2a462215..51caec4b95289a 100644 --- a/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap +++ b/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap @@ -140,10 +140,10 @@ exports[`#start() returns \`Context\` component 1`] = ` "euiExternalLinkIcon.newTarget.screenReaderOnlyText": "(opens in a new tab or window)", "euiFieldPassword.maskPassword": "Mask password", "euiFieldPassword.showPassword": "Show password as plain text. Note: this will visually expose your password on the screen.", - "euiFilePicker.clearSelectedFiles": "Clear selected files", "euiFilePicker.filesSelected": [Function], "euiFilePicker.promptText": "Select or drag and drop a file", "euiFilePicker.removeSelected": "Remove", + "euiFilePicker.removeSelectedAriaLabel": "Remove selected files", "euiFilterButton.filterBadgeActiveAriaLabel": [Function], "euiFilterButton.filterBadgeAvailableAriaLabel": [Function], "euiFlyout.screenReaderFixedHeaders": "You can still continue tabbing through the page headers in addition to the dialog.", diff --git a/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx b/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx index 151a94bd3ce228..df6071e9d14ed6 100644 --- a/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx +++ b/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx @@ -725,9 +725,12 @@ export const getEuiContextMapping = (): EuiTokensObject => { 'euiFieldPassword.maskPassword': i18n.translate('core.euiFieldPassword.maskPassword', { defaultMessage: 'Mask password', }), - 'euiFilePicker.clearSelectedFiles': i18n.translate('core.euiFilePicker.clearSelectedFiles', { - defaultMessage: 'Clear selected files', - }), + 'euiFilePicker.removeSelectedAriaLabel': i18n.translate( + 'core.euiFilePicker.removeSelectedAriaLabel', + { + defaultMessage: 'Remove selected files', + } + ), 'euiFilePicker.filesSelected': ({ fileCount }: EuiValues) => i18n.translate('core.euiFilePicker.filesSelected', { defaultMessage: '{fileCount} files selected', diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/index.ts b/packages/core/metrics/core-metrics-collectors-server-internal/index.ts index 351129cdc8ba30..d726b0339a0bf4 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/index.ts +++ b/packages/core/metrics/core-metrics-collectors-server-internal/index.ts @@ -6,8 +6,7 @@ * Side Public License, v 1. */ -export { OsMetricsCollector } from './src/os'; -export type { OpsMetricsCollectorOptions } from './src/os'; +export { OsMetricsCollector, type OsMetricsCollectorOptions } from './src/os'; export { ProcessMetricsCollector } from './src/process'; export { ServerMetricsCollector } from './src/server'; export { EventLoopDelaysMonitor } from './src/event_loop_delays_monitor'; diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts b/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts index 350b01a8100eb3..049597cfa1f125 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts +++ b/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts @@ -15,7 +15,7 @@ import { OsCgroupMetricsCollector } from './cgroup'; const getos = promisify(getosAsync); -export interface OpsMetricsCollectorOptions { +export interface OsMetricsCollectorOptions { logger: Logger; cpuPath?: string; cpuAcctPath?: string; @@ -24,7 +24,7 @@ export interface OpsMetricsCollectorOptions { export class OsMetricsCollector implements MetricsCollector { private readonly cgroupCollector: OsCgroupMetricsCollector; - constructor(options: OpsMetricsCollectorOptions) { + constructor(options: OsMetricsCollectorOptions) { this.cgroupCollector = new OsCgroupMetricsCollector({ ...options, logger: options.logger.get('cgroup'), diff --git a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts index 2e358fc121bce6..f35213a0e04802 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts @@ -7,16 +7,22 @@ */ import { Server as HapiServer } from '@hapi/hapi'; +import type { Logger } from '@kbn/logging'; import type { OpsMetrics, MetricsCollector } from '@kbn/core-metrics-server'; import type { AgentStatsProvider } from '@kbn/core-elasticsearch-client-server-internal'; import { ProcessMetricsCollector, OsMetricsCollector, - type OpsMetricsCollectorOptions, ServerMetricsCollector, ElasticsearchClientsMetricsCollector, } from '@kbn/core-metrics-collectors-server-internal'; +export interface OpsMetricsCollectorOptions { + logger: Logger; + cpuPath?: string; + cpuAcctPath?: string; +} + export class OpsMetricsCollector implements MetricsCollector { private readonly processCollector: ProcessMetricsCollector; private readonly osCollector: OsMetricsCollector; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts index 117a36d3960cf0..a812c1686b060b 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/update.test.ts @@ -149,7 +149,7 @@ describe('#update', () => { it(`should use the ES get action then index action when type is not multi-namespace for existing objects`, async () => { const type = 'index-pattern'; const id = 'logstash-*'; - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, type, id, attributes, { namespace }); expect(client.get).toHaveBeenCalledTimes(1); expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); @@ -157,7 +157,7 @@ describe('#update', () => { }); it(`should use the ES get action then index action when type is multi-namespace for existing objects`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess( client, repository, @@ -172,7 +172,7 @@ describe('#update', () => { }); it(`should use the ES get action then index action when type is namespace agnostic for existing objects`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, NAMESPACE_AGNOSTIC_TYPE, id, attributes); expect(client.get).toHaveBeenCalledTimes(1); expect(mockPreflightCheckForCreate).not.toHaveBeenCalled(); @@ -180,7 +180,7 @@ describe('#update', () => { }); it(`should use the ES index action with the merged attributes when mergeAttributes is not false`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, NAMESPACE_AGNOSTIC_TYPE, id, { foo: 'bar', @@ -201,7 +201,7 @@ describe('#update', () => { }); it(`should use the ES index action only with the provided attributes when mergeAttributes is false`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess( client, @@ -229,7 +229,7 @@ describe('#update', () => { }); it(`should check for alias conflicts if a new multi-namespace object before create action would be created then create action to create the object`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess( client, repository, @@ -246,7 +246,7 @@ describe('#update', () => { }); it(`defaults to empty array with no input references`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, type, id, attributes); expect( (client.index.mock.calls[0][0] as estypes.CreateRequest).body! @@ -256,7 +256,7 @@ describe('#update', () => { it(`accepts custom references array 1`, async () => { const test = async (references: SavedObjectReference[]) => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, type, id, attributes, { references, }); @@ -271,7 +271,7 @@ describe('#update', () => { it(`accepts custom references array 2`, async () => { const test = async (references: SavedObjectReference[]) => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, type, id, attributes, { references, }); @@ -286,7 +286,7 @@ describe('#update', () => { it(`accepts custom references array 3`, async () => { const test = async (references: SavedObjectReference[]) => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, type, id, attributes, { references, }); @@ -300,7 +300,7 @@ describe('#update', () => { }); it(`uses the 'upsertAttributes' option when specified for a single-namespace type that does not exist`, async () => { - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess( client, repository, @@ -329,7 +329,7 @@ describe('#update', () => { it(`uses the 'upsertAttributes' option when specified for a multi-namespace type that does not exist`, async () => { const options = { upsert: { title: 'foo', description: 'bar' } }; - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess( client, repository, @@ -363,7 +363,7 @@ describe('#update', () => { it(`ignores the 'upsertAttributes' option when specified for a multi-namespace type that already exists`, async () => { // attributes don't change const options = { upsert: { title: 'foo', description: 'bar' } }; - migrator.migrateDocument.mockImplementation((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementation((doc) => ({ ...doc })); await updateSuccess( client, repository, @@ -700,7 +700,7 @@ describe('#update', () => { it('migrates the fetched document from get', async () => { const type = 'index-pattern'; const id = 'logstash-*'; - migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc, migrated: true })); + migrator.migrateDocument.mockImplementationOnce((doc) => ({ ...doc })); await updateSuccess(client, repository, registry, type, id, attributes); expect(migrator.migrateDocument).toHaveBeenCalledTimes(2); expectMigrationArgs({ diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.encryption_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.encryption_extension.test.ts index ecaefe05d65e00..1e2232de0a2e53 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.encryption_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.encryption_extension.test.ts @@ -116,6 +116,7 @@ describe('SavedObjectsRepository Encryption Extension', () => { // create a mock saved objects encryption extension mockEncryptionExt = savedObjectsExtensionsMock.createEncryptionExtension(); + mockEncryptionExt.encryptAttributes.mockImplementation((desc, attrs) => Promise.resolve(attrs)); mockGetCurrentTime.mockReturnValue(mockTimestamp); mockGetSearchDsl.mockClear(); @@ -247,7 +248,6 @@ describe('SavedObjectsRepository Encryption Extension', () => { expect.objectContaining({ ...encryptedSO, id: expect.objectContaining(/index-pattern:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}/), - attributes: undefined, }), encryptedSO.attributes // original attributes ); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts index 9db7049e39c77f..ed1f967d224a79 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts @@ -1259,6 +1259,9 @@ describe('SavedObjectsRepository Spaces Extension', () => { serializer = createSpySerializer(registry); mockSpacesExt = savedObjectsExtensionsMock.createSpacesExtension(); mockEncryptionExt = savedObjectsExtensionsMock.createEncryptionExtension(); + mockEncryptionExt.encryptAttributes.mockImplementation((desc, attributes) => + Promise.resolve(attributes) + ); mockGetCurrentTime.mockReturnValue(mockTimestamp); mockGetSearchDsl.mockClear(); repository = instantiateRepository(); diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.test.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.test.ts index 42d33c67587ada..65169082c4f742 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.test.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.test.ts @@ -42,6 +42,15 @@ describe('Saved Objects type validation schema', () => { ); }); + it('should fail if invalid id is provided', () => { + const objectSchema = createSavedObjectSanitizedDocSchema(validationMap['1.0.0']); + const data = createMockObject({ foo: 'bar' }); + data.id = ''; + expect(() => objectSchema.validate(data)).toThrowErrorMatchingInlineSnapshot( + `"[id]: value has length [0] but it must have a minimum length of [1]."` + ); + }); + it('should validate top-level properties', () => { const objectSchema = createSavedObjectSanitizedDocSchema(validationMap['1.0.0']); const data = createMockObject({ foo: 'heya' }); @@ -78,4 +87,31 @@ describe('Saved Objects type validation schema', () => { `"[id]: expected value of type [string] but got [boolean]"` ); }); + + describe('default schema', () => { + it('validates a record of attributes', () => { + const objectSchema = createSavedObjectSanitizedDocSchema(undefined); + const data = createMockObject({ foo: 'heya' }); + + expect(() => objectSchema.validate(data)).not.toThrowError(); + }); + + it('fails validation on undefined attributes', () => { + const objectSchema = createSavedObjectSanitizedDocSchema(undefined); + const data = createMockObject(undefined); + + expect(() => objectSchema.validate(data)).toThrowErrorMatchingInlineSnapshot( + `"[attributes]: expected value of type [object] but got [undefined]"` + ); + }); + + it('fails validation on primitive attributes', () => { + const objectSchema = createSavedObjectSanitizedDocSchema(undefined); + const data = createMockObject(42); + + expect(() => objectSchema.validate(data)).toThrowErrorMatchingInlineSnapshot( + `"[attributes]: expected value of type [object] but got [number]"` + ); + }); + }); }); diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts index 952aff1d221ce5..9673267e510bc2 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts @@ -20,7 +20,7 @@ type SavedObjectSanitizedDocSchema = { }; const baseSchema = schema.object({ - id: schema.string(), + id: schema.string({ minLength: 1 }), type: schema.string(), references: schema.arrayOf( schema.object({ @@ -42,7 +42,7 @@ const baseSchema = schema.object({ version: schema.maybe(schema.string()), originId: schema.maybe(schema.string()), managed: schema.maybe(schema.boolean()), - attributes: schema.maybe(schema.any()), + attributes: schema.recordOf(schema.string(), schema.maybe(schema.any())), }); /** @@ -52,9 +52,13 @@ const baseSchema = schema.object({ * @internal */ export const createSavedObjectSanitizedDocSchema = ( - attributesSchema: SavedObjectsValidationSpec + attributesSchema: SavedObjectsValidationSpec | undefined ) => { - return baseSchema.extends({ - attributes: attributesSchema, - }); + if (attributesSchema) { + return baseSchema.extends({ + attributes: attributesSchema, + }); + } else { + return baseSchema; + } }; diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts index 37ced142364daf..bccfc641e96d5f 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts @@ -88,6 +88,34 @@ describe('Saved Objects type validator', () => { const data = createMockObject({ attributes: { foo: 'hi' } }); expect(() => validator.validate(data)).not.toThrowError(); }); + + it('validates attributes for types without defined schemas', () => { + validator = new SavedObjectsTypeValidator({ + logger, + type, + validationMap: {}, + defaultVersion, + }); + const data = createMockObject({ attributes: undefined }); + expect(() => validator.validate(data)).toThrowErrorMatchingInlineSnapshot( + `"[attributes]: expected value of type [object] but got [undefined]"` + ); + }); + + it('validates top level properties for types without defined schemas', () => { + validator = new SavedObjectsTypeValidator({ + logger, + type, + validationMap: {}, + defaultVersion, + }); + const data = createMockObject({ attributes: { foo: 'bar' } }); + // @ts-expect-error Intentionally malformed object + data.updated_at = false; + expect(() => validator.validate(data)).toThrowErrorMatchingInlineSnapshot( + `"[updated_at]: expected value of type [string] but got [boolean]"` + ); + }); }); describe('schema selection', () => { diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts index e8344de7bc2f07..011c8240de0301 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts @@ -9,6 +9,7 @@ import Semver from 'semver'; import type { Logger } from '@kbn/logging'; import type { + SavedObjectsValidationSpec, SavedObjectsValidationMap, SavedObjectSanitizedDoc, } from '@kbn/core-saved-objects-server'; @@ -56,10 +57,10 @@ export class SavedObjectsTypeValidator { } const schemaVersion = previousVersionWithSchema(this.orderedVersions, usedVersion); - if (!schemaVersion || !this.validationMap[schemaVersion]) { - return; + let validationRule: SavedObjectsValidationSpec | undefined; + if (schemaVersion && this.validationMap[schemaVersion]) { + validationRule = this.validationMap[schemaVersion]; } - const validationRule = this.validationMap[schemaVersion]; try { const validationSchema = createSavedObjectSanitizedDocSchema(validationRule); diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 59cd87288e8ece..31a4b111b69d01 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -480,6 +480,7 @@ "status", "uuid" ], + "fleet-space-settings": [], "fleet-uninstall-tokens": [ "policy_id", "token_plain" diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 47602ca181b5e4..6a9e57fa1a05bd 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -1612,6 +1612,10 @@ } } }, + "fleet-space-settings": { + "dynamic": false, + "properties": {} + }, "fleet-uninstall-tokens": { "dynamic": false, "properties": { diff --git a/packages/kbn-config-schema/README.md b/packages/kbn-config-schema/README.md index 10d96578d4689d..2074ab7698e638 100644 --- a/packages/kbn-config-schema/README.md +++ b/packages/kbn-config-schema/README.md @@ -138,6 +138,7 @@ __Options:__ * `validate: (value: number) => string | void` - defines a custom validator function, see [Custom validation](#custom-validation) section for more details. * `min: number` - defines a minimum value the number should have. * `max: number` - defines a maximum value the number should have. + * `unsafe: boolean` - if true, will accept unsafe numbers (integers > 2^53). __Usage:__ ```typescript @@ -460,8 +461,12 @@ const valueSchema = schema.duration({ defaultValue: '70ms' }); ``` __Notes:__ -* The string value for `schema.duration()` supports the following optional suffixes: `ms`, `s`, `m`, `h`, `d`, `w`, `M` and `Y`. The default suffix is `ms`. +* The string value for `schema.duration()` supports the following optional suffixes: `ms`, `s`, `m`, `h`, `d`, `w`, `M` and `y`. The default suffix is `ms`. * The number value is treated as a number of milliseconds and hence should be a positive integer, e.g. `100` is equal to `'100ms'`. +* Multi-unit duration strings are supported (`1m30s`). + * Spaces are not allowed. + * It allows any order in the units (`1m30s1d`). + * It allows the same unit to be specified multiple times (`1m30s50m` is the same as `51m30s`). #### `schema.conditional()` diff --git a/packages/kbn-config-schema/src/duration/index.ts b/packages/kbn-config-schema/src/duration/index.ts index 1b1d47a24abd35..5111a603bfbdc3 100644 --- a/packages/kbn-config-schema/src/duration/index.ts +++ b/packages/kbn-config-schema/src/duration/index.ts @@ -6,29 +6,36 @@ * Side Public License, v 1. */ -import { Duration, duration as momentDuration, DurationInputArg2, isDuration } from 'moment'; +import { Duration, duration as momentDuration, isDuration } from 'moment'; export type { Duration }; export { isDuration }; -const timeFormatRegex = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|M|Y)$/; +const timeFormatRegex = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|M|y|Y)(.*)$/; +type TimeUnitString = 'ms' | 's' | 'm' | 'h' | 'd' | 'w' | 'M' | 'y' | 'Y'; // Moment officially supports lowercased 'y', but keeping 'Y' for BWC -function stringToDuration(text: string) { +function stringToDuration(text: string): Duration { const result = timeFormatRegex.exec(text); if (!result) { const number = Number(text); if (typeof number !== 'number' || isNaN(number)) { throw new Error( `Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format ` + - `[ms|s|m|h|d|w|M|Y] (e.g. '70ms', '5s', '3d', '1Y'), where the duration is a safe positive integer.` + `[ms|s|m|h|d|w|M|y] (e.g. '70ms', '5s', '3d', '1y', '1m30s'), where the duration is a safe positive integer.` ); } return numberToDuration(number); } const count = parseInt(result[1], 10); - const unit = result[2] as DurationInputArg2; + const unit = result[2] as TimeUnitString; + const rest = result[3]; - return momentDuration(count, unit); + const duration = momentDuration(count, unit as Exclude); // Moment still supports capital 'Y', but officially (and type-wise), it doesn't. + + if (rest) { + return duration.add(stringToDuration(rest)); + } + return duration; } function numberToDuration(numberMs: number) { diff --git a/packages/kbn-config-schema/src/types/duration_type.test.ts b/packages/kbn-config-schema/src/types/duration_type.test.ts index 18327b65cd1f63..779962b6354b80 100644 --- a/packages/kbn-config-schema/src/types/duration_type.test.ts +++ b/packages/kbn-config-schema/src/types/duration_type.test.ts @@ -24,6 +24,22 @@ test('handles number', () => { expect(duration().validate(123000)).toEqual(momentDuration(123000)); }); +test('handles multi-unit', () => { + expect(duration().validate('1m30s')).toEqual(momentDuration(90000)); + expect(duration().validate('1m30s70ms')).toEqual(momentDuration(90070)); +}); + +test.each([60000, '60000', '60000ms', '60s', '1m', '1m0s'])( + 'multiple ways of introducing 1 minute: %p', + (d) => { + expect(duration().validate(d)).toEqual(momentDuration(60000)); + } +); + +test('it supports years as Y and y', () => { + expect(duration().validate('1y')).toEqual(duration().validate('1Y')); +}); + test('is required by default', () => { expect(() => duration().validate(undefined)).toThrowErrorMatchingInlineSnapshot( `"expected value of type [moment.Duration] but got [undefined]"` @@ -184,10 +200,10 @@ test('returns error when not valid string or non-safe positive integer', () => { ); expect(() => duration().validate('123foo')).toThrowErrorMatchingInlineSnapshot( - `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|Y] (e.g. '70ms', '5s', '3d', '1Y'), where the duration is a safe positive integer."` + `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|y] (e.g. '70ms', '5s', '3d', '1y', '1m30s'), where the duration is a safe positive integer."` ); expect(() => duration().validate('123 456')).toThrowErrorMatchingInlineSnapshot( - `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|Y] (e.g. '70ms', '5s', '3d', '1Y'), where the duration is a safe positive integer."` + `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|y] (e.g. '70ms', '5s', '3d', '1y', '1m30s'), where the duration is a safe positive integer."` ); }); diff --git a/packages/kbn-config-schema/src/types/number_type.test.ts b/packages/kbn-config-schema/src/types/number_type.test.ts index 3077d41d29cc5e..0e1fcdd1dc0282 100644 --- a/packages/kbn-config-schema/src/types/number_type.test.ts +++ b/packages/kbn-config-schema/src/types/number_type.test.ts @@ -64,6 +64,26 @@ describe('#max', () => { }); }); +describe('#unsafe', () => { + it('rejects unsafe numbers when undefined', () => { + expect(() => schema.number().validate(9007199254740992)).toThrowErrorMatchingInlineSnapshot( + `"\\"value\\" must be a safe number"` + ); + }); + + it('rejects unsafe numbers when false', () => { + expect(() => + schema.number({ unsafe: false }).validate(9007199254740992) + ).toThrowErrorMatchingInlineSnapshot(`"\\"value\\" must be a safe number"`); + }); + + it('accepts unsafe numbers when true', () => { + expect(schema.number({ unsafe: true }).validate(9007199254740992)).toBeGreaterThan( + 9007199254740991 + ); + }); +}); + describe('#defaultValue', () => { test('returns default when number is undefined', () => { expect(schema.number({ defaultValue: 2 }).validate(undefined)).toBe(2); diff --git a/packages/kbn-config-schema/src/types/number_type.ts b/packages/kbn-config-schema/src/types/number_type.ts index 6b86fe7e7fc71d..195e3916feb96d 100644 --- a/packages/kbn-config-schema/src/types/number_type.ts +++ b/packages/kbn-config-schema/src/types/number_type.ts @@ -13,6 +13,12 @@ import { Type, TypeOptions } from './type'; export type NumberOptions = TypeOptions & { min?: number; max?: number; + /** + * When set to true, will accept unsafe numbers (integers > 2^53). + * Otherwise, unsafe numbers will fail validation. + * Default: `false` + */ + unsafe?: boolean; }; export class NumberType extends Type { @@ -21,10 +27,12 @@ export class NumberType extends Type { if (options.min !== undefined) { schema = schema.min(options.min); } - if (options.max !== undefined) { schema = schema.max(options.max); } + if (options.unsafe === true) { + schema = schema.unsafe(true); + } super(schema, options); } diff --git a/packages/kbn-discover-utils/index.ts b/packages/kbn-discover-utils/index.ts index 1656a36a91da28..795dd3318702a0 100644 --- a/packages/kbn-discover-utils/index.ts +++ b/packages/kbn-discover-utils/index.ts @@ -43,6 +43,10 @@ export { isNestedFieldParent, isLegacyTableEnabled, usePager, + getLogLevelColor, + getLogLevelCoalescedValue, + getLogLevelCoalescedValueLabel, + LogLevelCoalescedValue, } from './src'; export type { LogsContextService } from './src'; diff --git a/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.test.ts b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.test.ts new file mode 100644 index 00000000000000..5b8a28b102abe7 --- /dev/null +++ b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.test.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + getLogLevelCoalescedValue, + getLogLevelCoalescedValueLabel, + LogLevelCoalescedValue, +} from './get_log_level_coalesed_value'; + +describe('getLogLevelCoalescedValue', () => { + test('should work correctly', () => { + expect(getLogLevelCoalescedValue('trace')).toBe(LogLevelCoalescedValue.trace); + expect(getLogLevelCoalescedValue('debug')).toBe(LogLevelCoalescedValue.debug); + expect(getLogLevelCoalescedValue('info')).toBe(LogLevelCoalescedValue.info); + expect(getLogLevelCoalescedValue('notice')).toBe(LogLevelCoalescedValue.notice); + expect(getLogLevelCoalescedValue('warn')).toBe(LogLevelCoalescedValue.warning); + expect(getLogLevelCoalescedValue('warning')).toBe(LogLevelCoalescedValue.warning); + expect(getLogLevelCoalescedValue('err')).toBe(LogLevelCoalescedValue.error); + expect(getLogLevelCoalescedValue('error')).toBe(LogLevelCoalescedValue.error); + expect(getLogLevelCoalescedValue('ERROR')).toBe(LogLevelCoalescedValue.error); + expect(getLogLevelCoalescedValue('crit')).toBe(LogLevelCoalescedValue.critical); + expect(getLogLevelCoalescedValue('critical')).toBe(LogLevelCoalescedValue.critical); + expect(getLogLevelCoalescedValue('sev')).toBe(LogLevelCoalescedValue.critical); + expect(getLogLevelCoalescedValue('alert')).toBe(LogLevelCoalescedValue.alert); + expect(getLogLevelCoalescedValue('emer')).toBe(LogLevelCoalescedValue.emergency); + expect(getLogLevelCoalescedValue('emergency')).toBe(LogLevelCoalescedValue.emergency); + expect(getLogLevelCoalescedValue('fatal')).toBe(LogLevelCoalescedValue.fatal); + expect(getLogLevelCoalescedValue('other unknown value')).toBe(undefined); + + expect(getLogLevelCoalescedValueLabel(LogLevelCoalescedValue.error)).toBe('Error'); + }); +}); diff --git a/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts new file mode 100644 index 00000000000000..ac863a7c3622c7 --- /dev/null +++ b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_coalesed_value.ts @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export enum LogLevelCoalescedValue { + trace = 'trace', + debug = 'debug', + info = 'info', + notice = 'notice', + warning = 'warning', + error = 'error', + critical = 'critical', + alert = 'alert', + emergency = 'emergency', + fatal = 'fatal', +} + +export const getLogLevelCoalescedValue = ( + logLevel: string | string[] | unknown +): LogLevelCoalescedValue | undefined => { + const logLevelUnfolded = Array.isArray(logLevel) ? logLevel[0] : logLevel; + + if (typeof logLevelUnfolded !== 'string') { + return undefined; + } + + const logLevelLowerCase = logLevelUnfolded.trim().toLowerCase(); + + if (logLevelLowerCase.startsWith('trace')) { + return LogLevelCoalescedValue.trace; + } + + if (logLevelLowerCase.startsWith('deb')) { + return LogLevelCoalescedValue.debug; + } + + if (logLevelLowerCase.startsWith('info')) { + return LogLevelCoalescedValue.info; + } + + if (logLevelLowerCase.startsWith('not')) { + return LogLevelCoalescedValue.notice; + } + + if (logLevelLowerCase.startsWith('warn')) { + return LogLevelCoalescedValue.warning; + } + + if (logLevelLowerCase.startsWith('err')) { + return LogLevelCoalescedValue.error; + } + + if ( + logLevelLowerCase.startsWith('cri') || // critical + logLevelLowerCase.startsWith('sev') // severe + ) { + return LogLevelCoalescedValue.critical; + } + + if (logLevelLowerCase.startsWith('ale')) { + return LogLevelCoalescedValue.alert; + } + + if (logLevelLowerCase.startsWith('emer')) { + return LogLevelCoalescedValue.emergency; + } + + if (logLevelLowerCase.startsWith('fatal')) { + return LogLevelCoalescedValue.fatal; + } +}; + +export const getLogLevelCoalescedValueLabel = (coalescedValue: LogLevelCoalescedValue) => { + switch (coalescedValue) { + case LogLevelCoalescedValue.trace: + return i18n.translate('discover.logLevelLabels.trace', { + defaultMessage: 'Trace', + }); + case LogLevelCoalescedValue.debug: + return i18n.translate('discover.logLevelLabels.debug', { + defaultMessage: 'Debug', + }); + case LogLevelCoalescedValue.info: + return i18n.translate('discover.logLevelLabels.info', { + defaultMessage: 'Info', + }); + case LogLevelCoalescedValue.notice: + return i18n.translate('discover.logLevelLabels.notice', { + defaultMessage: 'Notice', + }); + case LogLevelCoalescedValue.warning: + return i18n.translate('discover.logLevelLabels.warning', { + defaultMessage: 'Warning', + }); + case LogLevelCoalescedValue.error: + return i18n.translate('discover.logLevelLabels.error', { + defaultMessage: 'Error', + }); + case LogLevelCoalescedValue.critical: + return i18n.translate('discover.logLevelLabels.critical', { + defaultMessage: 'Critical', + }); + case LogLevelCoalescedValue.alert: + return i18n.translate('discover.logLevelLabels.alert', { + defaultMessage: 'Alert', + }); + case LogLevelCoalescedValue.emergency: + return i18n.translate('discover.logLevelLabels.emergency', { + defaultMessage: 'Emergency', + }); + case LogLevelCoalescedValue.fatal: + return i18n.translate('discover.logLevelLabels.fatal', { + defaultMessage: 'Fatal', + }); + default: + // If you see a typescript error here, that's a sign that there are missing switch cases ^^ + const _exhaustiveCheck: never = coalescedValue; + return coalescedValue || _exhaustiveCheck; + } +}; diff --git a/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.test.ts b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.test.ts new file mode 100644 index 00000000000000..f6f5b835cac4e5 --- /dev/null +++ b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.test.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { EuiThemeComputed } from '@elastic/eui'; +import { getLogLevelColor } from './get_log_level_color'; +import { LogLevelCoalescedValue } from './get_log_level_coalesed_value'; + +const euiTheme = { + colors: { + lightShade: '#ffffff', + }, +}; + +describe('getLogLevelColor', () => { + test('should work correctly', () => { + expect(getLogLevelColor(LogLevelCoalescedValue.debug, euiTheme as EuiThemeComputed)).toBe( + '#becfe3' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.info, euiTheme as EuiThemeComputed)).toBe( + '#90b0d1' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.notice, euiTheme as EuiThemeComputed)).toBe( + '#6092c0' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.warning, euiTheme as EuiThemeComputed)).toBe( + '#d6bf57' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.error, euiTheme as EuiThemeComputed)).toBe( + '#df9352' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.critical, euiTheme as EuiThemeComputed)).toBe( + '#e7664c' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.alert, euiTheme as EuiThemeComputed)).toBe( + '#da5e47' + ); + expect(getLogLevelColor(LogLevelCoalescedValue.emergency, euiTheme as EuiThemeComputed)).toBe( + '#cc5642' + ); + // other + expect(getLogLevelColor(LogLevelCoalescedValue.trace, euiTheme as EuiThemeComputed)).toBe( + '#ffffff' + ); + }); +}); diff --git a/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.ts b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.ts new file mode 100644 index 00000000000000..090c065be10aaa --- /dev/null +++ b/packages/kbn-discover-utils/src/data_types/logs/utils/get_log_level_color.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { EuiThemeComputed, euiPaletteForTemperature, euiPaletteForStatus } from '@elastic/eui'; +import { LogLevelCoalescedValue } from './get_log_level_coalesed_value'; + +export const getLogLevelColor = ( + logLevelCoalescedValue: LogLevelCoalescedValue, + euiTheme: EuiThemeComputed +): string | undefined => { + const euiPaletteForTemperature6 = euiPaletteForTemperature(6); + const euiPaletteForStatus9 = euiPaletteForStatus(9); + + switch (logLevelCoalescedValue) { + case LogLevelCoalescedValue.debug: + return euiPaletteForTemperature6[2]; // lighter, closer to the default color for all other unknown log levels + case LogLevelCoalescedValue.info: + return euiPaletteForTemperature6[1]; + case LogLevelCoalescedValue.notice: + return euiPaletteForTemperature6[0]; // darker as it has higher importance than "debug" and "info" + case LogLevelCoalescedValue.warning: + return euiPaletteForStatus9[4]; + case LogLevelCoalescedValue.error: + return euiPaletteForStatus9[5]; + case LogLevelCoalescedValue.critical: + return euiPaletteForStatus9[6]; + case LogLevelCoalescedValue.alert: + return euiPaletteForStatus9[7]; + case LogLevelCoalescedValue.emergency: + case LogLevelCoalescedValue.fatal: + return euiPaletteForStatus9[8]; + default: + return euiTheme.colors.lightShade; + } +}; diff --git a/packages/kbn-discover-utils/src/data_types/logs/utils/index.ts b/packages/kbn-discover-utils/src/data_types/logs/utils/index.ts index 1c26d5efff12d9..84de7485e569d2 100644 --- a/packages/kbn-discover-utils/src/data_types/logs/utils/index.ts +++ b/packages/kbn-discover-utils/src/data_types/logs/utils/index.ts @@ -7,3 +7,5 @@ */ export * from './get_field_from_doc'; +export * from './get_log_level_color'; +export * from './get_log_level_coalesed_value'; diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index ba74061778b6d3..d74c28bbdcbc47 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -375,6 +375,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D ilm: `${ELASTICSEARCH_DOCS}index-lifecycle-management.html`, ilmForceMerge: `${ELASTICSEARCH_DOCS}ilm-forcemerge.html`, ilmFreeze: `${ELASTICSEARCH_DOCS}ilm-freeze.html`, + ilmDelete: `${ELASTICSEARCH_DOCS}ilm-delete.html`, ilmPhaseTransitions: `${ELASTICSEARCH_DOCS}ilm-index-lifecycle.html#ilm-phase-transitions`, ilmReadOnly: `${ELASTICSEARCH_DOCS}ilm-readonly.html`, ilmRollover: `${ELASTICSEARCH_DOCS}ilm-rollover.html`, @@ -488,8 +489,6 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D ruleUiAdvancedParams: `${SECURITY_SOLUTION_DOCS}rules-ui-create.html#rule-ui-advanced-params`, entityAnalytics: { riskScorePrerequisites: `${SECURITY_SOLUTION_DOCS}ers-requirements.html`, - hostRiskScore: `${SECURITY_SOLUTION_DOCS}host-risk-score.html`, - userRiskScore: `${SECURITY_SOLUTION_DOCS}user-risk-score.html`, entityRiskScoring: `${SECURITY_SOLUTION_DOCS}entity-risk-scoring.html`, assetCriticality: `${SECURITY_SOLUTION_DOCS}asset-criticality.html`, }, @@ -522,6 +521,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D rollupSettings: `${KIBANA_DOCS}advanced-options.html#kibana-rollups-settings`, visualizationSettings: `${KIBANA_DOCS}advanced-options.html#kibana-visualization-settings`, timelionSettings: `${KIBANA_DOCS}advanced-options.html#kibana-timelion-settings`, + generalSettings: `${KIBANA_DOCS}advanced-options.html#kibana-general-settings`, savedObjectsApiList: `${KIBANA_DOCS}saved-objects-api.html#saved-objects-api`, }, ml: { diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 5586f0f8f201fe..c6b1b753ce8839 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -360,8 +360,6 @@ export interface DocLinks { readonly ruleUiAdvancedParams: string; readonly entityAnalytics: { readonly riskScorePrerequisites: string; - readonly hostRiskScore: string; - readonly userRiskScore: string; readonly entityRiskScoring: string; readonly assetCriticality: string; }; diff --git a/packages/kbn-es/index.ts b/packages/kbn-es/index.ts index b771ff6867fce5..2f241828f400d9 100644 --- a/packages/kbn-es/index.ts +++ b/packages/kbn-es/index.ts @@ -18,6 +18,7 @@ export { maybeCreateDockerNetwork, type ServerlessProjectType, readRolesFromResource, + readRolesDescriptorsFromResource, } from './src/utils'; export type { ArtifactLicense } from './src/artifact'; export { SERVERLESS_ROLES_ROOT_PATH } from './src/paths'; diff --git a/packages/kbn-es/src/utils/read_roles_from_resource.ts b/packages/kbn-es/src/utils/read_roles_from_resource.ts index 27600fd8b63ebf..c52e38308f54c2 100644 --- a/packages/kbn-es/src/utils/read_roles_from_resource.ts +++ b/packages/kbn-es/src/utils/read_roles_from_resource.ts @@ -20,3 +20,15 @@ export const readRolesFromResource = (resourcePath: string) => { throw new Error(`expected ${resourcePath} file to parse to an object`); } }; + +export const readRolesDescriptorsFromResource = (resourcePath: string) => { + if (!fs.existsSync(resourcePath) || extname(resourcePath) !== '.yml') { + throw new Error(`${resourcePath} does not exist or not a yml file`); + } + const data = loadYaml(fs.readFileSync(resourcePath, 'utf8')); + if (typeof data === 'object' && data !== null) { + return data; + } else { + throw new Error(`expected ${resourcePath} file to parse to an object`); + } +}; diff --git a/packages/kbn-esql-validation-autocomplete/BUILD.bazel b/packages/kbn-esql-validation-autocomplete/BUILD.bazel index 07106718615d1b..1e956d1903dca0 100644 --- a/packages/kbn-esql-validation-autocomplete/BUILD.bazel +++ b/packages/kbn-esql-validation-autocomplete/BUILD.bazel @@ -22,7 +22,7 @@ SRCS = glob( SHARED_DEPS = [ "//packages/kbn-i18n", - "@npm//js-levenshtein", + "@npm//fastest-levenshtein", ] js_library( diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts index d50d7cc903fce9..aa92c7bd024d5f 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts @@ -145,6 +145,39 @@ const dateDiffOptions = [ 'ns', ]; +const dateExtractOptions = [ + 'ALIGNED_DAY_OF_WEEK_IN_MONTH', + 'ALIGNED_DAY_OF_WEEK_IN_YEAR', + 'ALIGNED_WEEK_OF_MONTH', + 'ALIGNED_WEEK_OF_YEAR', + 'AMPM_OF_DAY', + 'CLOCK_HOUR_OF_AMPM', + 'CLOCK_HOUR_OF_DAY', + 'DAY_OF_MONTH', + 'DAY_OF_WEEK', + 'DAY_OF_YEAR', + 'EPOCH_DAY', + 'ERA', + 'HOUR_OF_AMPM', + 'HOUR_OF_DAY', + 'INSTANT_SECONDS', + 'MICRO_OF_DAY', + 'MICRO_OF_SECOND', + 'MILLI_OF_DAY', + 'MILLI_OF_SECOND', + 'MINUTE_OF_DAY', + 'MINUTE_OF_HOUR', + 'MONTH_OF_YEAR', + 'NANO_OF_DAY', + 'NANO_OF_SECOND', + 'OFFSET_SECONDS', + 'PROLEPTIC_MONTH', + 'SECOND_OF_DAY', + 'SECOND_OF_MINUTE', + 'YEAR', + 'YEAR_OF_ERA', +]; + /** * Enrichments for function definitions * @@ -168,8 +201,7 @@ const functionEnrichments: Record> date_extract: { signatures: [ { - // override the first param as type chrono_literal - params: [{ type: 'chrono_literal' }], + params: [{ literalOptions: dateExtractOptions }], }, ], }, diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts index 0ace35433b67e3..8d6394fe96af6d 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts @@ -15,7 +15,7 @@ import { statsAggregationFunctionDefinitions } from '../src/definitions/aggs'; import { evalFunctionDefinitions } from '../src/definitions/functions'; import { groupingFunctionDefinitions } from '../src/definitions/grouping'; import { getFunctionSignatures } from '../src/definitions/helpers'; -import { timeUnits, chronoLiterals } from '../src/definitions/literals'; +import { timeUnits } from '../src/definitions/literals'; import { nonNullable } from '../src/shared/helpers'; import { SupportedFieldType, @@ -1045,14 +1045,10 @@ function getFieldName( } const literals = { - chrono_literal: chronoLiterals[0].name, time_literal: timeUnits[0], }; -function getLiteralType(typeString: 'chrono_literal' | 'time_literal') { - if (typeString === 'chrono_literal') { - return literals[typeString]; - } +function getLiteralType(typeString: 'time_literal') { return `1 ${literals[typeString]}`; } @@ -1116,7 +1112,7 @@ function getFieldMapping( } if (/literal$/.test(typeString) && useLiterals) { return { - name: getLiteralType(typeString as 'chrono_literal' | 'time_literal'), + name: getLiteralType(typeString as 'time_literal'), type, ...rest, }; diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 6f0562d7f118e2..495452bed4b085 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -10,7 +10,7 @@ import { suggest } from './autocomplete'; import { evalFunctionDefinitions } from '../definitions/functions'; import { builtinFunctions } from '../definitions/builtin'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; -import { chronoLiterals, timeUnitsToSuggest } from '../definitions/literals'; +import { timeUnitsToSuggest } from '../definitions/literals'; import { commandDefinitions } from '../definitions/commands'; import { getUnitDuration, TRIGGER_SUGGESTION_COMMAND } from './factories'; import { camelCase, partition } from 'lodash'; @@ -53,15 +53,27 @@ const fields: Array<{ name: string; type: string; suggestedAs?: string }> = [ ]; const indexes = ([] as Array<{ name: string; hidden: boolean; suggestedAs?: string }>).concat( - ['a', 'index', 'otherIndex', '.secretIndex', 'my-index'].map((name) => ({ + [ + 'a', + 'index', + 'otherIndex', + '.secretIndex', + 'my-index', + 'my-index$', + 'my_index{}', + 'my-index+1', + 'synthetics-*', + ].map((name) => ({ name, hidden: name.startsWith('.'), })), - ['my-index[quoted]', 'my-index$', 'my_index{}'].map((name) => ({ - name, - hidden: false, - suggestedAs: `\`${name}\``, - })) + ['my-index[quoted]', 'my:index', 'my,index', 'logstash-{now/d{yyyy.MM.dd|+12:00}}'].map( + (name) => ({ + name, + hidden: false, + suggestedAs: `"${name}"`, + }) + ) ); const integrations: Integration[] = ['nginx', 'k8s'].map((name) => ({ @@ -207,9 +219,6 @@ function getLiteralsByType(_type: string | string[]) { // return only singular return timeUnitsToSuggest.map(({ name }) => `1 ${name}`).filter((s) => !/s$/.test(s)); } - if (type.includes('chrono_literal')) { - return chronoLiterals.map(({ name }) => name); - } return []; } @@ -368,8 +377,9 @@ describe('autocomplete', () => { }); describe('from', () => { - const suggestedIndexes = indexes.filter(({ hidden }) => !hidden).map(({ name }) => name); - + const suggestedIndexes = indexes + .filter(({ hidden }) => !hidden) + .map(({ name, suggestedAs }) => suggestedAs || name); // Monaco will filter further down here testSuggestions( 'f', @@ -397,8 +407,7 @@ describe('autocomplete', () => { const dataSources = indexes.concat(integrations); const suggestedDataSources = dataSources .filter(({ hidden }) => !hidden) - .map(({ name }) => name); - + .map(({ name, suggestedAs }) => suggestedAs || name); testSuggestions('from ', suggestedDataSources, '', [undefined, dataSources, undefined]); testSuggestions('from a,', suggestedDataSources, '', [undefined, dataSources, undefined]); testSuggestions('from *,', suggestedDataSources, '', [undefined, dataSources, undefined]); @@ -699,8 +708,8 @@ describe('autocomplete', () => { testSuggestions( 'from a | stats a=min()', [ - ...getFieldNamesByType(['number', 'date']), - ...getFunctionSignaturesByReturnType('stats', ['number', 'date'], { + ...getFieldNamesByType(['number', 'date', 'boolean']), + ...getFunctionSignaturesByReturnType('stats', ['number', 'date', 'boolean'], { evalMath: true, }), ], @@ -722,8 +731,8 @@ describe('autocomplete', () => { testSuggestions( 'from a | stats a=min(b), b=max()', [ - ...getFieldNamesByType(['number', 'date']), - ...getFunctionSignaturesByReturnType('stats', ['number', 'date'], { + ...getFieldNamesByType(['number', 'date', 'boolean']), + ...getFunctionSignaturesByReturnType('stats', ['number', 'date', 'boolean'], { evalMath: true, }), ], diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index add47e4a5547b5..abc750837e16b3 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -70,6 +70,7 @@ import { buildOptionDefinition, buildSettingDefinitions, buildValueDefinitions, + buildFieldsDefinitionsWithMetadata, } from './factories'; import { EDITOR_MARKER, SINGLE_BACKTICK, METADATA_FIELDS } from '../shared/constants'; import { getAstContext, removeMarkerArgFromArgsList } from '../shared/context'; @@ -86,6 +87,7 @@ import { getQueryForFields, getSourcesFromCommands, isAggFunctionUsedAlready, + removeQuoteForSuggestedSources, } from './helper'; import { FunctionParameter } from '../definitions/types'; @@ -291,7 +293,7 @@ function getFieldsByTypeRetriever(queryString: string, resourceRetriever?: ESQLC return { getFieldsByType: async (expectedType: string | string[] = 'any', ignored: string[] = []) => { const fields = await helpers.getFieldsByType(expectedType, ignored); - return buildFieldsDefinitions(fields); + return buildFieldsDefinitionsWithMetadata(fields); }, getFieldsMap: helpers.getFieldsMap, }; @@ -857,19 +859,28 @@ async function getExpressionSuggestionsByType( suggestions.push(...(policies.length ? policies : [buildNoPoliciesAvailableDefinition()])); } else { const index = getSourcesFromCommands(commands, 'index'); + const canRemoveQuote = isNewExpression && innerText.includes('"'); + // This is going to be empty for simple indices, and not empty for integrations if (index && index.text && index.text !== EDITOR_MARKER) { const source = index.text.replace(EDITOR_MARKER, ''); const dataSource = await getDatastreamsForIntegration(source); + const newDefinitions = buildSourcesDefinitions( dataSource?.dataStreams?.map(({ name }) => ({ name, isIntegration: false })) || [] ); - suggestions.push(...newDefinitions); + suggestions.push( + ...(canRemoveQuote ? removeQuoteForSuggestedSources(newDefinitions) : newDefinitions) + ); } else { // FROM // @TODO: filter down the suggestions here based on other existing sources defined const sourcesDefinitions = await getSources(); - suggestions.push(...sourcesDefinitions); + suggestions.push( + ...(canRemoveQuote + ? removeQuoteForSuggestedSources(sourcesDefinitions) + : sourcesDefinitions) + ); } } } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index 53e65c2f95aba4..b80e30f9d8fb09 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -12,16 +12,17 @@ import { groupingFunctionDefinitions } from '../definitions/grouping'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { evalFunctionDefinitions } from '../definitions/functions'; import { getFunctionSignatures, getCommandSignature } from '../definitions/helpers'; -import { chronoLiterals, timeUnitsToSuggest } from '../definitions/literals'; +import { timeUnitsToSuggest } from '../definitions/literals'; import { FunctionDefinition, CommandDefinition, CommandOptionsDefinition, CommandModeDefinition, } from '../definitions/types'; -import { getCommandDefinition, shouldBeQuotedText } from '../shared/helpers'; +import { shouldBeQuotedSource, getCommandDefinition, shouldBeQuotedText } from '../shared/helpers'; import { buildDocumentation, buildFunctionDocumentation } from './documentation_util'; import { DOUBLE_BACKTICK, SINGLE_TICK_REGEX } from '../shared/constants'; +import type { ESQLRealField } from '../validation/types'; const allFunctions = statsAggregationFunctionDefinitions .concat(evalFunctionDefinitions) @@ -37,6 +38,13 @@ function getSafeInsertText(text: string, options: { dashSupported?: boolean } = ? `\`${text.replace(SINGLE_TICK_REGEX, DOUBLE_BACKTICK)}\`` : text; } +export function getQuotedText(text: string) { + return text.startsWith(`"`) && text.endsWith(`"`) ? text : `"${text}"`; +} + +function getSafeInsertSourceText(text: string) { + return shouldBeQuotedSource(text) ? getQuotedText(text) : text; +} export function getSuggestionFunctionDefinition(fn: FunctionDefinition): SuggestionRawDefinition { const fullSignatures = getFunctionSignatures(fn); @@ -118,8 +126,34 @@ export function getSuggestionCommandDefinition( }; } -export const buildFieldsDefinitions = (fields: string[]): SuggestionRawDefinition[] => - fields.map((label) => ({ +export const buildFieldsDefinitionsWithMetadata = ( + fields: ESQLRealField[] +): SuggestionRawDefinition[] => { + return fields.map((field) => { + const description = field.metadata?.description; + + const titleCaseType = field.type.charAt(0).toUpperCase() + field.type.slice(1); + return { + label: field.name, + text: getSafeInsertText(field.name), + kind: 'Variable', + detail: titleCaseType, + documentation: description + ? { + value: ` +--- + +${description}`, + } + : undefined, + // If there is a description, it is a field from ECS, so it should be sorted to the top + sortText: description ? '1D' : 'D', + }; + }); +}; + +export const buildFieldsDefinitions = (fields: string[]): SuggestionRawDefinition[] => { + return fields.map((label) => ({ label, text: getSafeInsertText(label), kind: 'Variable', @@ -128,7 +162,7 @@ export const buildFieldsDefinitions = (fields: string[]): SuggestionRawDefinitio }), sortText: 'D', })); - +}; export const buildVariablesDefinitions = (variables: string[]): SuggestionRawDefinition[] => variables.map((label) => ({ label, @@ -148,7 +182,7 @@ export const buildSourcesDefinitions = ( ): SuggestionRawDefinition[] => sources.map(({ name, isIntegration, title }) => ({ label: title ?? name, - text: name, + text: getSafeInsertSourceText(name), isSnippet: isIntegration, ...(isIntegration && { command: TRIGGER_SUGGESTION_COMMAND }), kind: isIntegration ? 'Class' : 'Issue', @@ -336,9 +370,6 @@ export function getCompatibleLiterals(commandName: string, types: string[], name if (types.includes('time_literal_unit')) { suggestions.push(...buildConstantsDefinitions(timeUnitsToSuggest.map(({ name }) => name))); // i.e. year, month, ... } - if (types.includes('chrono_literal')) { - suggestions.push(...buildConstantsDefinitions(chronoLiterals.map(({ name }) => name))); // i.e. EPOC_DAY, ... - } if (types.includes('string')) { if (names) { const index = types.indexOf('string'); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts index fa6e364c78ca9b..f9586670b29e63 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts @@ -7,8 +7,9 @@ */ import type { ESQLAstItem, ESQLCommand, ESQLFunction, ESQLSource } from '@kbn/esql-ast'; -import { FunctionDefinition } from '../definitions/types'; +import type { FunctionDefinition } from '../definitions/types'; import { getFunctionDefinition, isAssignment, isFunctionItem } from '../shared/helpers'; +import type { SuggestionRawDefinition } from './types'; function extractFunctionArgs(args: ESQLAstItem[]): ESQLFunction[] { return args.flatMap((arg) => (isAssignment(arg) ? arg.args[1] : arg)).filter(isFunctionItem); @@ -71,3 +72,11 @@ export function getSourcesFromCommands(commands: ESQLCommand[], sourceType: 'ind return sources.length === 1 ? sources[0] : undefined; } + +export function removeQuoteForSuggestedSources(suggestions: SuggestionRawDefinition[]) { + return suggestions.map((d) => ({ + ...d, + // "text" -> text + text: d.text.startsWith('"') && d.text.endsWith('"') ? d.text.slice(1, -1) : d.text, + })); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts index 2c8620223ebb35..509b6877b2c8fd 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import { i18n } from '@kbn/i18n'; -import levenshtein from 'js-levenshtein'; +import { distance } from 'fastest-levenshtein'; import type { AstProviderFn, ESQLAst, EditorError, ESQLMessage } from '@kbn/esql-ast'; import { uniqBy } from 'lodash'; import { @@ -90,8 +90,7 @@ function createAction(title: string, solution: string, error: EditorError): Code async function getSpellingPossibilities(fn: () => Promise, errorText: string) { const allPossibilities = await fn(); const allSolutions = allPossibilities.reduce((solutions, item) => { - const distance = levenshtein(item, errorText); - if (distance < 3) { + if (distance(item, errorText) < 3) { solutions.push(item); } return solutions; @@ -113,7 +112,7 @@ async function getSpellingActionForColumns( } // @TODO add variables support const possibleFields = await getSpellingPossibilities(async () => { - const availableFields = await getFieldsByType('any'); + const availableFields = (await getFieldsByType('any')).map(({ name }) => name); const enrichPolicies = ast.filter(({ name }) => name === 'enrich'); if (enrichPolicies.length) { const enrichPolicyNames = enrichPolicies.flatMap(({ args }) => @@ -210,7 +209,7 @@ async function getQuotableActionForColumns( ) ); } else { - const availableFields = new Set(await getFieldsByType('any')); + const availableFields = new Set((await getFieldsByType('any')).map(({ name }) => name)); if (availableFields.has(errorText) || availableFields.has(solution)) { actions.push( createAction( @@ -306,8 +305,8 @@ async function getSpellingActionForMetadata( ) { const errorText = queryString.substring(error.startColumn - 1, error.endColumn - 1); const allSolutions = METADATA_FIELDS.reduce((solutions, item) => { - const distance = levenshtein(item, errorText); - if (distance < 3) { + const dist = distance(item, errorText); + if (dist < 3) { solutions.push(item); } return solutions; diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts index 2cd9264001f3cb..f3540ca6759182 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts @@ -7,9 +7,10 @@ */ import type { EditorError } from '../types'; +import type { ESQLRealField } from '../validation/types'; type GetSourceFn = () => Promise; -type GetFieldsByTypeFn = (type: string | string[], ignored?: string[]) => Promise; +type GetFieldsByTypeFn = (type: string | string[], ignored?: string[]) => Promise; type GetPoliciesFn = () => Promise; type GetPolicyFieldsFn = (name: string) => Promise; diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts index c1b7b5b00b58f1..69f8f76807daf2 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/aggs.ts @@ -108,6 +108,10 @@ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ params: [{ name: 'column', type: 'date', noNestingFunctions: true }], returnType: 'number', }, + { + params: [{ name: 'column', type: 'boolean', noNestingFunctions: true }], + returnType: 'boolean', + }, ], examples: [`from index | stats result = max(field)`, `from index | stats max(field)`], }, @@ -127,6 +131,10 @@ export const statsAggregationFunctionDefinitions: FunctionDefinition[] = [ params: [{ name: 'column', type: 'date', noNestingFunctions: true }], returnType: 'number', }, + { + params: [{ name: 'column', type: 'boolean', noNestingFunctions: true }], + returnType: 'boolean', + }, ], examples: [`from index | stats result = min(field)`, `from index | stats min(field)`], }, diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts index ceb5789e0dd397..5febe5be87c578 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts @@ -668,8 +668,40 @@ const dateExtractDefinition: FunctionDefinition = { params: [ { name: 'datePart', - type: 'chrono_literal', + type: 'string', optional: false, + literalOptions: [ + 'ALIGNED_DAY_OF_WEEK_IN_MONTH', + 'ALIGNED_DAY_OF_WEEK_IN_YEAR', + 'ALIGNED_WEEK_OF_MONTH', + 'ALIGNED_WEEK_OF_YEAR', + 'AMPM_OF_DAY', + 'CLOCK_HOUR_OF_AMPM', + 'CLOCK_HOUR_OF_DAY', + 'DAY_OF_MONTH', + 'DAY_OF_WEEK', + 'DAY_OF_YEAR', + 'EPOCH_DAY', + 'ERA', + 'HOUR_OF_AMPM', + 'HOUR_OF_DAY', + 'INSTANT_SECONDS', + 'MICRO_OF_DAY', + 'MICRO_OF_SECOND', + 'MILLI_OF_DAY', + 'MILLI_OF_SECOND', + 'MINUTE_OF_DAY', + 'MINUTE_OF_HOUR', + 'MONTH_OF_YEAR', + 'NANO_OF_DAY', + 'NANO_OF_SECOND', + 'OFFSET_SECONDS', + 'PROLEPTIC_MONTH', + 'SECOND_OF_DAY', + 'SECOND_OF_MINUTE', + 'YEAR', + 'YEAR_OF_ERA', + ], }, { name: 'date', @@ -1272,7 +1304,7 @@ const locateDefinition: FunctionDefinition = { name: 'locate', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.locate', { defaultMessage: - 'Returns an integer that indicates the position of a keyword substring within another string', + 'Returns an integer that indicates the position of a keyword substring within another string.', }), alias: undefined, signatures: [ @@ -3869,7 +3901,7 @@ const substringDefinition: FunctionDefinition = { name: 'substring', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.substring', { defaultMessage: - 'Returns a substring of a string, specified by a start position and an optional length', + 'Returns a substring of a string, specified by a start position and an optional length.', }), alias: undefined, signatures: [ diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts new file mode 100644 index 00000000000000..87eb31de4d3c9d --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { shouldBeQuotedSource } from './helpers'; + +describe('shouldBeQuotedSource', () => { + it('does not have to be quoted for sources with acceptable characters @-+$', () => { + expect(shouldBeQuotedSource('foo')).toBe(false); + expect(shouldBeQuotedSource('123-test@foo_bar+baz1')).toBe(false); + expect(shouldBeQuotedSource('my-index*')).toBe(false); + expect(shouldBeQuotedSource('my-index$')).toBe(false); + expect(shouldBeQuotedSource('.my-index$')).toBe(false); + }); + it(`should be quoted if containing any of special characters [:"=|,[\]/ \t\r\n]`, () => { + expect(shouldBeQuotedSource('foo\ttest')).toBe(true); + expect(shouldBeQuotedSource('foo\rtest')).toBe(true); + expect(shouldBeQuotedSource('foo\ntest')).toBe(true); + expect(shouldBeQuotedSource('foo:test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo|test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo[test]=bar')).toBe(true); + expect(shouldBeQuotedSource('foo/test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo,test-*,abc')).toBe(true); + expect(shouldBeQuotedSource('foo, test-*, abc, xyz')).toBe(true); + expect(shouldBeQuotedSource('foo, test-*, abc, xyz,test123')).toBe(true); + expect(shouldBeQuotedSource('foo,test,xyz')).toBe(true); + expect( + shouldBeQuotedSource(',') + ).toBe(true); + expect(shouldBeQuotedSource('`backtick`,``multiple`back``ticks```')).toBe(true); + expect(shouldBeQuotedSource('test,metadata,metaata,.metadata')).toBe(true); + expect(shouldBeQuotedSource('cluster:index')).toBe(true); + expect(shouldBeQuotedSource('cluster:index|pattern')).toBe(true); + expect(shouldBeQuotedSource('cluster:.index')).toBe(true); + expect(shouldBeQuotedSource('cluster*:index*')).toBe(true); + expect(shouldBeQuotedSource('cluster*:*')).toBe(true); + expect(shouldBeQuotedSource('*:index*')).toBe(true); + expect(shouldBeQuotedSource('*:index|pattern')).toBe(true); + expect(shouldBeQuotedSource('*:*')).toBe(true); + expect(shouldBeQuotedSource('*:*,cluster*:index|pattern,i|p')).toBe(true); + expect(shouldBeQuotedSource('index-[dd-mm]')).toBe(true); + }); +}); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 32bd23e3934313..9bdb1f4e416a16 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -24,7 +24,7 @@ import { commandDefinitions } from '../definitions/commands'; import { evalFunctionDefinitions } from '../definitions/functions'; import { groupingFunctionDefinitions } from '../definitions/grouping'; import { getFunctionSignatures } from '../definitions/helpers'; -import { timeUnits, chronoLiterals } from '../definitions/literals'; +import { timeUnits } from '../definitions/literals'; import { byOption, metadataOption, @@ -233,9 +233,6 @@ function compareLiteralType(argType: string, item: ESQLLiteral) { return false; } - if (argType === 'chrono_literal') { - return chronoLiterals.some(({ name }) => name === item.text); - } // date-type parameters accept string literals because of ES auto-casting return ['string', 'date'].includes(argType); } @@ -566,6 +563,10 @@ export function isRestartingExpression(text: string) { return getLastCharFromTrimmed(text) === ','; } +export function shouldBeQuotedSource(text: string) { + // Based on lexer `fragment UNQUOTED_SOURCE_PART` + return /[:"=|,[\]\/ \t\r\n]/.test(text); +} export function shouldBeQuotedText( text: string, { dashSupported }: { dashSupported?: boolean } = {} diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts index 8433b95e99b395..3c60e6d4dbed1b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts @@ -26,18 +26,17 @@ export function getFieldsByTypeHelper(queryText: string, resourceRetriever?: ESQ } }; return { - getFieldsByType: async (expectedType: string | string[] = 'any', ignored: string[] = []) => { + getFieldsByType: async ( + expectedType: string | string[] = 'any', + ignored: string[] = [] + ): Promise => { const types = Array.isArray(expectedType) ? expectedType : [expectedType]; await getFields(); return ( - Array.from(cacheFields.values()) - ?.filter(({ name, type }) => { - const ts = Array.isArray(type) ? type : [type]; - return ( - !ignored.includes(name) && ts.some((t) => types[0] === 'any' || types.includes(t)) - ); - }) - .map(({ name }) => name) || [] + Array.from(cacheFields.values())?.filter(({ name, type }) => { + const ts = Array.isArray(type) ? type : [type]; + return !ignored.includes(name) && ts.some((t) => types[0] === 'any' || types.includes(t)); + }) || [] ); }, getFieldsMap: async () => { diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/types.ts b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts index d2ce2e4b104df5..08e1cdccc37a31 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import type { ESQLRealField } from '../validation/types'; + /** @internal **/ type CallbackFn = (ctx?: Options) => Result[] | Promise; @@ -20,7 +22,7 @@ export interface ESQLCallbacks { dataStreams?: Array<{ name: string; title?: string }>; } >; - getFieldsFor?: CallbackFn<{ query: string }, { name: string; type: string }>; + getFieldsFor?: CallbackFn<{ query: string }, ESQLRealField>; getPolicies?: CallbackFn< {}, { name: string; sourceIndices: string[]; matchField: string; enrichFields: string[] } diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index c49f5c7af82dfb..a2cc5bf55ff35d 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -11006,6 +11006,13 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval date_extract(\"SOME_RANDOM_STRING\", now())", + "error": [], + "warning": [ + "Invalid option [\"SOME_RANDOM_STRING\"] for date_extract. Supported options: [\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", \"ALIGNED_DAY_OF_WEEK_IN_YEAR\", \"ALIGNED_WEEK_OF_MONTH\", \"ALIGNED_WEEK_OF_YEAR\", \"AMPM_OF_DAY\", \"CLOCK_HOUR_OF_AMPM\", \"CLOCK_HOUR_OF_DAY\", \"DAY_OF_MONTH\", \"DAY_OF_WEEK\", \"DAY_OF_YEAR\", \"EPOCH_DAY\", \"ERA\", \"HOUR_OF_AMPM\", \"HOUR_OF_DAY\", \"INSTANT_SECONDS\", \"MICRO_OF_DAY\", \"MICRO_OF_SECOND\", \"MILLI_OF_DAY\", \"MILLI_OF_SECOND\", \"MINUTE_OF_DAY\", \"MINUTE_OF_HOUR\", \"MONTH_OF_YEAR\", \"NANO_OF_DAY\", \"NANO_OF_SECOND\", \"OFFSET_SECONDS\", \"PROLEPTIC_MONTH\", \"SECOND_OF_DAY\", \"SECOND_OF_MINUTE\", \"YEAR\", \"YEAR_OF_ERA\"]." + ] + }, { "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", "error": [], @@ -11024,7 +11031,6 @@ { "query": "from a_index | eval date_extract(stringField, stringField)", "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [stringField] type [string]", "Argument of [date_extract] must be [date], found value [stringField] type [string]" ], "warning": [] @@ -11044,7 +11050,7 @@ { "query": "row var = date_extract(true, true)", "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [true] type [boolean]", + "Argument of [date_extract] must be [string], found value [true] type [boolean]", "Argument of [date_extract] must be [date], found value [true] type [boolean]" ], "warning": [] @@ -11057,7 +11063,7 @@ { "query": "from a_index | eval date_extract(booleanField, booleanField)", "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [booleanField] type [boolean]", + "Argument of [date_extract] must be [string], found value [booleanField] type [boolean]", "Argument of [date_extract] must be [date], found value [booleanField] type [boolean]" ], "warning": [] @@ -24116,9 +24122,7 @@ }, { "query": "from a_index | stats max(booleanField)", - "error": [ - "Argument of [max] must be [number], found value [booleanField] type [boolean]" - ], + "error": [], "warning": [] }, { @@ -24143,6 +24147,60 @@ ], "warning": [] }, + { + "query": "from a_index | stats max(cartesianPointField)", + "error": [ + "Argument of [max] must be [number], found value [cartesianPointField] type [cartesian_point]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = max(booleanField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where max(booleanField)", + "error": [ + "WHERE does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | where max(booleanField) > 0", + "error": [ + "WHERE does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = max(booleanField)", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = max(booleanField) > 0", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval max(booleanField)", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, + { + "query": "from a_index | eval max(booleanField) > 0", + "error": [ + "EVAL does not support function max" + ], + "warning": [] + }, { "query": "from a_index | stats var = min(numberField)", "error": [], @@ -24389,9 +24447,7 @@ }, { "query": "from a_index | stats min(booleanField)", - "error": [ - "Argument of [min] must be [number], found value [booleanField] type [boolean]" - ], + "error": [], "warning": [] }, { @@ -24416,6 +24472,60 @@ ], "warning": [] }, + { + "query": "from a_index | stats min(cartesianPointField)", + "error": [ + "Argument of [min] must be [number], found value [cartesianPointField] type [cartesian_point]" + ], + "warning": [] + }, + { + "query": "from a_index | stats var = min(booleanField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where min(booleanField)", + "error": [ + "WHERE does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | where min(booleanField) > 0", + "error": [ + "WHERE does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = min(booleanField)", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = min(booleanField) > 0", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval min(booleanField)", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, + { + "query": "from a_index | eval min(booleanField) > 0", + "error": [ + "EVAL does not support function min" + ], + "warning": [] + }, { "query": "from a_index | stats var = count(stringField)", "error": [], diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/types.ts b/packages/kbn-esql-validation-autocomplete/src/validation/types.ts index 4d9732c0b5b22c..41a0c9b2dfd6fc 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/types.ts @@ -18,6 +18,10 @@ export interface ESQLVariable { export interface ESQLRealField { name: string; type: string; + metadata?: { + description?: string; + type?: string; + }; } export interface ESQLPolicy { diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 14d9c50d5c88c1..a555fb1b835986 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -12,7 +12,7 @@ import { ignoreErrorsMap, validateQuery } from './validation'; import { evalFunctionDefinitions } from '../definitions/functions'; import { getFunctionSignatures } from '../definitions/helpers'; import { FunctionDefinition, SupportedFieldType, supportedFieldTypes } from '../definitions/types'; -import { chronoLiterals, timeUnits, timeUnitsToSuggest } from '../definitions/literals'; +import { timeUnits, timeUnitsToSuggest } from '../definitions/literals'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import capitalize from 'lodash/capitalize'; import { camelCase } from 'lodash'; @@ -58,13 +58,9 @@ const nestedFunctions = { }; const literals = { - chrono_literal: chronoLiterals[0].name, time_literal: timeUnitsToSuggest[0].name, }; -function getLiteralType(typeString: 'chrono_literal' | 'time_literal') { - if (typeString === 'chrono_literal') { - return literals[typeString]; - } +function getLiteralType(typeString: 'time_literal') { return `1 ${literals[typeString]}`; } @@ -144,7 +140,7 @@ function getFieldMapping( } if (/literal$/.test(typeString) && useLiterals) { return { - name: getLiteralType(typeString as 'chrono_literal' | 'time_literal'), + name: getLiteralType(typeString as 'time_literal'), type, ...rest, }; @@ -2610,6 +2606,13 @@ describe('validation logic', () => { describe('date_extract', () => { testErrorsAndWarnings('row var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", now())', []); testErrorsAndWarnings('row date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", now())', []); + testErrorsAndWarnings( + 'from a_index | eval date_extract("SOME_RANDOM_STRING", now())', + [], + [ + 'Invalid option ["SOME_RANDOM_STRING"] for date_extract. Supported options: ["ALIGNED_DAY_OF_WEEK_IN_MONTH", "ALIGNED_DAY_OF_WEEK_IN_YEAR", "ALIGNED_WEEK_OF_MONTH", "ALIGNED_WEEK_OF_YEAR", "AMPM_OF_DAY", "CLOCK_HOUR_OF_AMPM", "CLOCK_HOUR_OF_DAY", "DAY_OF_MONTH", "DAY_OF_WEEK", "DAY_OF_YEAR", "EPOCH_DAY", "ERA", "HOUR_OF_AMPM", "HOUR_OF_DAY", "INSTANT_SECONDS", "MICRO_OF_DAY", "MICRO_OF_SECOND", "MILLI_OF_DAY", "MILLI_OF_SECOND", "MINUTE_OF_DAY", "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "NANO_OF_DAY", "NANO_OF_SECOND", "OFFSET_SECONDS", "PROLEPTIC_MONTH", "SECOND_OF_DAY", "SECOND_OF_MINUTE", "YEAR", "YEAR_OF_ERA"].', + ] + ); testErrorsAndWarnings( 'from a_index | eval var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", dateField)', @@ -2627,7 +2630,6 @@ describe('validation logic', () => { ); testErrorsAndWarnings('from a_index | eval date_extract(stringField, stringField)', [ - 'Argument of [date_extract] must be [chrono_literal], found value [stringField] type [string]', 'Argument of [date_extract] must be [date], found value [stringField] type [string]', ]); @@ -2642,7 +2644,7 @@ describe('validation logic', () => { ); testErrorsAndWarnings('row var = date_extract(true, true)', [ - 'Argument of [date_extract] must be [chrono_literal], found value [true] type [boolean]', + 'Argument of [date_extract] must be [string], found value [true] type [boolean]', 'Argument of [date_extract] must be [date], found value [true] type [boolean]', ]); @@ -2652,7 +2654,7 @@ describe('validation logic', () => { ); testErrorsAndWarnings('from a_index | eval date_extract(booleanField, booleanField)', [ - 'Argument of [date_extract] must be [chrono_literal], found value [booleanField] type [boolean]', + 'Argument of [date_extract] must be [string], found value [booleanField] type [boolean]', 'Argument of [date_extract] must be [date], found value [booleanField] type [boolean]', ]); testErrorsAndWarnings('from a_index | eval date_extract(null, null)', []); @@ -9163,15 +9165,43 @@ describe('validation logic', () => { 'EVAL does not support function max', ]); - testErrorsAndWarnings('from a_index | stats max(booleanField)', [ - 'Argument of [max] must be [number], found value [booleanField] type [boolean]', - ]); + testErrorsAndWarnings('from a_index | stats max(booleanField)', []); testErrorsAndWarnings('from a_index | stats max(null)', []); testErrorsAndWarnings('row nullVar = null | stats max(nullVar)', []); testErrorsAndWarnings('from a_index | stats max("2022")', []); testErrorsAndWarnings('from a_index | stats max(concat("20", "22"))', [ 'Argument of [max] must be [number], found value [concat("20", "22")] type [string]', ]); + + testErrorsAndWarnings('from a_index | stats max(cartesianPointField)', [ + 'Argument of [max] must be [number], found value [cartesianPointField] type [cartesian_point]', + ]); + + testErrorsAndWarnings('from a_index | stats var = max(booleanField)', []); + + testErrorsAndWarnings('from a_index | where max(booleanField)', [ + 'WHERE does not support function max', + ]); + + testErrorsAndWarnings('from a_index | where max(booleanField) > 0', [ + 'WHERE does not support function max', + ]); + + testErrorsAndWarnings('from a_index | eval var = max(booleanField)', [ + 'EVAL does not support function max', + ]); + + testErrorsAndWarnings('from a_index | eval var = max(booleanField) > 0', [ + 'EVAL does not support function max', + ]); + + testErrorsAndWarnings('from a_index | eval max(booleanField)', [ + 'EVAL does not support function max', + ]); + + testErrorsAndWarnings('from a_index | eval max(booleanField) > 0', [ + 'EVAL does not support function max', + ]); }); describe('min', () => { @@ -9307,15 +9337,43 @@ describe('validation logic', () => { 'EVAL does not support function min', ]); - testErrorsAndWarnings('from a_index | stats min(booleanField)', [ - 'Argument of [min] must be [number], found value [booleanField] type [boolean]', - ]); + testErrorsAndWarnings('from a_index | stats min(booleanField)', []); testErrorsAndWarnings('from a_index | stats min(null)', []); testErrorsAndWarnings('row nullVar = null | stats min(nullVar)', []); testErrorsAndWarnings('from a_index | stats min("2022")', []); testErrorsAndWarnings('from a_index | stats min(concat("20", "22"))', [ 'Argument of [min] must be [number], found value [concat("20", "22")] type [string]', ]); + + testErrorsAndWarnings('from a_index | stats min(cartesianPointField)', [ + 'Argument of [min] must be [number], found value [cartesianPointField] type [cartesian_point]', + ]); + + testErrorsAndWarnings('from a_index | stats var = min(booleanField)', []); + + testErrorsAndWarnings('from a_index | where min(booleanField)', [ + 'WHERE does not support function min', + ]); + + testErrorsAndWarnings('from a_index | where min(booleanField) > 0', [ + 'WHERE does not support function min', + ]); + + testErrorsAndWarnings('from a_index | eval var = min(booleanField)', [ + 'EVAL does not support function min', + ]); + + testErrorsAndWarnings('from a_index | eval var = min(booleanField) > 0', [ + 'EVAL does not support function min', + ]); + + testErrorsAndWarnings('from a_index | eval min(booleanField)', [ + 'EVAL does not support function min', + ]); + + testErrorsAndWarnings('from a_index | eval min(booleanField) > 0', [ + 'EVAL does not support function min', + ]); }); describe('count', () => { diff --git a/packages/kbn-event-annotation-common/index.ts b/packages/kbn-event-annotation-common/index.ts index f6df6a02171d12..aab5338c614d4e 100644 --- a/packages/kbn-event-annotation-common/index.ts +++ b/packages/kbn-event-annotation-common/index.ts @@ -30,6 +30,7 @@ export { defaultAnnotationColor, defaultAnnotationRangeColor, defaultAnnotationLabel, + defaultRangeAnnotationLabel, getDefaultManualAnnotation, getDefaultQueryAnnotation, createCopiedAnnotation, diff --git a/packages/kbn-event-annotation-common/util.ts b/packages/kbn-event-annotation-common/util.ts index 40c7a07e626c1b..34d7a13b4cab30 100644 --- a/packages/kbn-event-annotation-common/util.ts +++ b/packages/kbn-event-annotation-common/util.ts @@ -57,6 +57,13 @@ export const defaultAnnotationLabel = i18n.translate( } ); +export const defaultRangeAnnotationLabel = i18n.translate( + 'eventAnnotationCommon.manualAnnotation.defaultRangeAnnotationLabel', + { + defaultMessage: 'Event range', + } +); + export const getDefaultManualAnnotation = ( id: string, timestamp: string diff --git a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx index 1311d1c5bbc2ff..ef9b0572c689da 100644 --- a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx +++ b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { type DataViewField } from '@kbn/data-views-plugin/common'; import { fieldNameWildcardMatcher, getFieldSearchMatchingHighlight, @@ -16,54 +15,107 @@ const name = 'test.this_value.maybe'; describe('fieldNameWildcardMatcher', function () { describe('fieldNameWildcardMatcher()', () => { it('should work correctly with wildcard', async () => { - expect(fieldNameWildcardMatcher({ displayName: 'test' } as DataViewField, 'no')).toBe(false); - expect( - fieldNameWildcardMatcher({ displayName: 'test', name: 'yes' } as DataViewField, 'yes') - ).toBe(true); + expect(fieldNameWildcardMatcher({ displayName: 'test', name: 'test' }, 'no')).toBe(false); + expect(fieldNameWildcardMatcher({ displayName: 'test', name: 'yes' }, 'yes')).toBe(true); const search = 'test*ue'; - expect(fieldNameWildcardMatcher({ displayName: 'test' } as DataViewField, search)).toBe( - false - ); - expect(fieldNameWildcardMatcher({ displayName: 'test.value' } as DataViewField, search)).toBe( - true - ); - expect(fieldNameWildcardMatcher({ name: 'test.this_value' } as DataViewField, search)).toBe( - true - ); - expect(fieldNameWildcardMatcher({ name: 'message.test' } as DataViewField, search)).toBe( - false - ); - expect(fieldNameWildcardMatcher({ name } as DataViewField, search)).toBe(false); - expect(fieldNameWildcardMatcher({ name } as DataViewField, `${search}*`)).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, '*value*')).toBe(true); + expect(fieldNameWildcardMatcher({ displayName: 'test', name: 'test' }, search)).toBe(false); + expect( + fieldNameWildcardMatcher({ displayName: 'test.value', name: 'test.value' }, search) + ).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'test.this_value' }, search)).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'message.test' }, search)).toBe(false); + expect(fieldNameWildcardMatcher({ name }, search)).toBe(false); + expect(fieldNameWildcardMatcher({ name }, `${search}*`)).toBe(true); + expect(fieldNameWildcardMatcher({ name }, '*value*')).toBe(true); }); it('should work correctly with spaces', async () => { - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test maybe ')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test maybe*')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test. this')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'this _value be')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'this')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, ' value ')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'be')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test this here')).toBe(false); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test that')).toBe(false); - expect(fieldNameWildcardMatcher({ name } as DataViewField, ' ')).toBe(false); - expect(fieldNameWildcardMatcher({ name: 'geo.location3' } as DataViewField, '3')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'geo_location3' } as DataViewField, 'geo 3')).toBe( - true - ); + expect(fieldNameWildcardMatcher({ name }, 'test maybe ')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test maybe*')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test. this')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'this _value be')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'this')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, ' value ')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'be')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test this here')).toBe(false); + expect(fieldNameWildcardMatcher({ name }, 'test that')).toBe(false); + expect(fieldNameWildcardMatcher({ name }, ' ')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'geo.location3' }, '3')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'geo_location3' }, 'geo 3')).toBe(true); }); it('should be case-insensitive', async () => { - expect(fieldNameWildcardMatcher({ name: 'Test' } as DataViewField, 'test')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'test' } as DataViewField, 'Test')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 'Tes*')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 'tes*')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 't T')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 't t')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'Test' }, 'test')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'test' }, 'Test')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 'Tes*')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 'tes*')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 't T')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 't t')).toBe(true); + }); + + describe('fuzzy search', () => { + test('only matches strings longer than 3 characters', () => { + expect(fieldNameWildcardMatcher({ name: 'a' }, 'b')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'ab' }, 'cb')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abc' }, 'abb')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcd' }, 'abbd')).toBe(true); + }); + test('is case insensitive', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefg' }, 'AAbcdef')).toBe(true); + }); + test('tests both displayName and name', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefg' }, 'aabcdefg')).toBe(true); + expect( + fieldNameWildcardMatcher({ name: 'abcdefg', displayName: 'irrelevantstring' }, 'bbcdefg') + ).toBe(true); + expect( + fieldNameWildcardMatcher({ name: 'irrelevantstring', displayName: 'abcdefg' }, 'bbcdefg') + ).toBe(true); + }); + test('finds matches with a typo at the beginning of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, '.bcdefghijklmno')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, '.bcde')).toBe(true); + }); + test('finds matches with a typo in the middle of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'abcdefghi.klmno')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'ghi.klm')).toBe(true); + }); + test('finds matches with a typo at the end of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'abcdefghijklmn.')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'klmn.')).toBe(true); + }); + test('finds matches with an additional character at the beginning of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, '.abcdefghijklmn')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, '.abcde')).toBe(true); + }); + test('finds matches with an additional character in the middle of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'abcdefgh.ijklmn')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'fgh.ijklm')).toBe(true); + }); + test('finds matches with an additional character at the end of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'abcdefghijklmn.')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'ghijklmn.')).toBe(true); + }); + test('finds matches with a missing character in the middle of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'abcdefgijklmn')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'gijkl')).toBe(true); + }); + test('does not find matches exceeding edit distance 1', () => { + // swapping edit distance = 2 + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abdcefhghijklm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abdce')).toBe(false); + // 2 char removed + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abcfhghijklm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abcfhg')).toBe(false); + // 2 chars added + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abcfhghijklmmm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'hijklmmm')).toBe(false); + // 2 typos + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'cccdefhghijklm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'cccdefh')).toBe(false); + }); }); }); @@ -74,10 +126,10 @@ describe('fieldNameWildcardMatcher', function () { expect(getFieldSearchMatchingHighlight('test this')).toBe(''); }); - it('should correctly return a full match for a wildcard search', async () => { - expect(getFieldSearchMatchingHighlight('Test this', 'test*')).toBe('Test this'); - expect(getFieldSearchMatchingHighlight('test this', '*this')).toBe('test this'); - expect(getFieldSearchMatchingHighlight('test this', ' te th')).toBe('test this'); + it('should correctly return a match for a wildcard search', async () => { + expect(getFieldSearchMatchingHighlight('Test this', 'test*')).toBe('test'); + expect(getFieldSearchMatchingHighlight('test this', '*this')).toBe(' this'); + expect(getFieldSearchMatchingHighlight('test this', ' te th')).toBe('t th'); }); }); }); diff --git a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts index ba06e36e95c9f6..472f377ccddae9 100644 --- a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts +++ b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts @@ -7,6 +7,7 @@ */ import { escapeRegExp, memoize } from 'lodash'; +import { distance } from 'fastest-levenshtein'; const makeRegEx = memoize(function makeRegEx(glob: string) { const trimmedGlob = glob.trim(); @@ -21,7 +22,7 @@ const makeRegEx = memoize(function makeRegEx(glob: string) { globRegex = '.*' + globRegex + '.*'; } - return new RegExp(globRegex.includes('*') ? `^${globRegex}$` : globRegex, 'i'); + return new RegExp(globRegex.includes('*') ? `^${globRegex}$` : globRegex); }); /** @@ -37,11 +38,61 @@ export const fieldNameWildcardMatcher = ( if (!fieldSearchHighlight?.trim()) { return false; } + const searchLower = fieldSearchHighlight.toLowerCase(); + const displayNameLower = field.displayName?.toLowerCase(); + const nameLower = field.name.toLowerCase(); - const regExp = makeRegEx(fieldSearchHighlight); - return (!!field.displayName && regExp.test(field.displayName)) || regExp.test(field.name); + const regExp = makeRegEx(searchLower); + const doesWildcardMatch = + (!!displayNameLower && regExp.test(displayNameLower)) || regExp.test(nameLower); + if (doesWildcardMatch) { + return true; + } + + if (searchLower.length < FUZZY_STRING_MIN_LENGTH) { + return false; + } + return testFuzzySearch({ name: nameLower, displayName: displayNameLower }, searchLower); }; +const FUZZY_STRING_MIN_LENGTH = 4; +const FUZZY_SEARCH_DISTANCE = 1; + +const testFuzzySearch = (field: { name: string; displayName?: string }, searchValue: string) => { + return ( + Boolean(testFuzzySearchForString(field.displayName, searchValue)) || + (field.name !== field.displayName && Boolean(testFuzzySearchForString(field.name, searchValue))) + ); +}; + +const testFuzzySearchForString = (label: string | undefined, searchValue: string) => { + if (!label || label.length < searchValue.length - 2) { + return false; + } + + const substrLength = Math.max( + Math.min(searchValue.length, label.length), + FUZZY_STRING_MIN_LENGTH + ); + + // performance optimization: instead of building the whole matrix, + // only iterate through the strings of the substring length +- 1 character, + // for example for searchValue = 'test' and label = 'test_value', + // we iterate through 'test', 'est_', 'st_v' (and +- character cases too). + const iterationsCount = label.length - substrLength + 1; + for (let i = 0; i <= iterationsCount; i++) { + for (let j = substrLength - 1; j <= substrLength + 1; j++) { + if (compareLevenshtein(searchValue, label.substring(i, j + i))) { + return label.substring(i, j + i); + } + } + } + return false; +}; + +const compareLevenshtein = (str1: string, str2: string) => + distance(str1, str2) <= FUZZY_SEARCH_DISTANCE; + /** * Adapts fieldNameWildcardMatcher to combobox props. * @param field @@ -64,13 +115,15 @@ export function getFieldSearchMatchingHighlight( displayName: string, fieldSearchHighlight?: string ): string { + if (!fieldSearchHighlight) { + return ''; + } const searchHighlight = (fieldSearchHighlight || '').trim(); - if ( - (searchHighlight.includes('*') || searchHighlight.includes(' ')) && - fieldNameWildcardMatcher({ name: displayName }, searchHighlight) - ) { - return displayName; + if (displayName.toLowerCase().indexOf(searchHighlight.toLowerCase()) > -1) { + return searchHighlight; } - - return searchHighlight; + return ( + testFuzzySearchForString(displayName.toLowerCase(), searchHighlight.toLowerCase()) || + displayName + ); } diff --git a/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts b/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts index 4789a7566756d2..9acb5f547acb92 100644 --- a/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts +++ b/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts @@ -32,26 +32,48 @@ import { preventParallelCalls } from './prevent_parallel_calls'; import { Browsers } from './browsers'; import { NetworkProfile, NETWORK_PROFILES } from './network_profiles'; -const throttleOption: string = process.env.TEST_THROTTLE_NETWORK as string; -const headlessBrowser: string = process.env.TEST_BROWSER_HEADLESS as string; -const browserBinaryPath: string = process.env.TEST_BROWSER_BINARY_PATH as string; -const remoteDebug: string = process.env.TEST_REMOTE_DEBUG as string; -const certValidation: string = process.env.NODE_TLS_REJECT_UNAUTHORIZED as string; -const noCache: string = process.env.TEST_DISABLE_CACHE as string; +interface Configuration { + throttleOption: string; + headlessBrowser: string; + browserBinaryPath: string; + remoteDebug: string; + certValidation: string; + noCache: string; + chromiumUserPrefs: Record; +} + +const now = Date.now(); const SECOND = 1000; const MINUTE = 60 * SECOND; const NO_QUEUE_COMMANDS = ['getLog', 'getStatus', 'newSession', 'quit']; const downloadDir = resolve(REPO_ROOT, 'target/functional-tests/downloads'); -const chromiumUserPrefs = { - 'download.default_directory': downloadDir, - 'download.prompt_for_download': false, - 'profile.content_settings.exceptions.clipboard': { - '[*.],*': { - last_modified: Date.now(), - setting: 1, - }, - }, -}; +let runtimeEnvVariables: Configuration | undefined; + +// ENV variables may be injected dynamically by the test runner CLI script +// so do not read on module load, rather read on demand. +function getConfiguration(): Configuration { + if (!runtimeEnvVariables) { + runtimeEnvVariables = { + throttleOption: process.env.TEST_THROTTLE_NETWORK as string, + headlessBrowser: process.env.TEST_BROWSER_HEADLESS as string, + browserBinaryPath: process.env.TEST_BROWSER_BINARY_PATH as string, + remoteDebug: process.env.TEST_REMOTE_DEBUG as string, + certValidation: process.env.NODE_TLS_REJECT_UNAUTHORIZED as string, + noCache: process.env.TEST_DISABLE_CACHE as string, + chromiumUserPrefs: { + 'download.default_directory': downloadDir, + 'download.prompt_for_download': false, + 'profile.content_settings.exceptions.clipboard': { + '[*.],*': { + last_modified: now, + setting: 1, + }, + }, + }, + }; + } + return runtimeEnvVariables; +} const sleep$ = (ms: number) => Rx.timer(ms).pipe(ignoreElements()); @@ -75,6 +97,14 @@ export interface BrowserConfig { function initChromiumOptions(browserType: Browsers, acceptInsecureCerts: boolean) { const options = browserType === Browsers.Chrome ? new chrome.Options() : new edge.Options(); + const { + headlessBrowser, + certValidation, + remoteDebug, + browserBinaryPath, + noCache, + chromiumUserPrefs, + } = getConfiguration(); options.addArguments( // Disables the sandbox for all process types that are normally sandboxed. @@ -162,6 +192,7 @@ async function attemptToCreateCommand( const attemptId = ++attemptCounter; log.debug('[webdriver] Creating session'); const remoteSessionUrl = process.env.REMOTE_SESSION_URL; + const { headlessBrowser, throttleOption, noCache } = getConfiguration(); const buildDriverInstance = async () => { switch (browserType) { diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index 94d56372a17c44..b914451abdb553 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -141,7 +141,7 @@ export const OBSERVABILITY_APM_ENABLE_SERVICE_INVENTORY_TABLE_SEARCH_BAR = 'observability:apmEnableServiceInventoryTableSearchBar'; export const OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID = 'observability:logsExplorer:allowedDataViews'; -export const OBSERVABILITY_APM_ENABLE_MULTI_SIGNAL = 'observability:apmEnableMultiSignal'; +export const OBSERVABILITY_ENTITY_CENTRIC_EXPERIENCE = 'observability:entityCentricExperience'; export const OBSERVABILITY_LOGS_DATA_ACCESS_LOG_SOURCES_ID = 'observability:logSources'; // Reporting settings diff --git a/packages/kbn-monaco/src/esql/language.ts b/packages/kbn-monaco/src/esql/language.ts index 4e486a5c241882..7c49da41a996e6 100644 --- a/packages/kbn-monaco/src/esql/language.ts +++ b/packages/kbn-monaco/src/esql/language.ts @@ -39,11 +39,13 @@ export const ESQLLang: CustomLangModuleType = { { open: '(', close: ')' }, { open: '[', close: ']' }, { open: `'`, close: `'` }, + { open: '"""', close: '"""' }, { open: '"', close: '"' }, ], surroundingPairs: [ { open: '(', close: ')' }, { open: `'`, close: `'` }, + { open: '"""', close: '"""' }, { open: '"', close: '"' }, ], }, diff --git a/packages/kbn-openapi-common/shared/index.ts b/packages/kbn-openapi-common/shared/index.ts new file mode 100644 index 00000000000000..98c43c700fca00 --- /dev/null +++ b/packages/kbn-openapi-common/shared/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './path_params_replacer'; diff --git a/packages/kbn-openapi-common/shared/path_params_replacer.ts b/packages/kbn-openapi-common/shared/path_params_replacer.ts new file mode 100644 index 00000000000000..bc0bedd0113562 --- /dev/null +++ b/packages/kbn-openapi-common/shared/path_params_replacer.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/** + * Replaces placeholders in a path string with provided param value + * + * @param path Path string with placeholders for params + * @param params Object with params to replace + * @returns Path string with params replaced + * + * @example + * Having a path string `my/path/{param1}/to/{param2}` and params object + * + * ```ts + * const params = { + * param1: 'value1', + * param2: 'value2, + * } + * ``` + * + * and invoking the function + * + * ```ts + * replaceParams('my/path/{param1}/to/{param2}', params); + * ``` + * + * it will return `my/path/value1/to/value2`. + * + */ +export function replaceParams(path: string, params: Record): string { + let output = path; + Object.entries(params).forEach(([param, value]) => { + output = path.replace(`{${param}}`, `${value}`); + }); + return output; +} diff --git a/packages/kbn-openapi-generator/src/template_service/templates/api_client_supertest.handlebars b/packages/kbn-openapi-generator/src/template_service/templates/api_client_supertest.handlebars index 2fc51fb5de6a79..a51be66f1019b4 100644 --- a/packages/kbn-openapi-generator/src/template_service/templates/api_client_supertest.handlebars +++ b/packages/kbn-openapi-generator/src/template_service/templates/api_client_supertest.handlebars @@ -8,6 +8,7 @@ {{> disclaimer}} import { ELASTIC_HTTP_VERSION_HEADER, X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; +import { replaceParams } from '@kbn/openapi-common/shared'; import { FtrProviderContext } from 'x-pack/test/api_integration/ftr_provider_context'; {{#each operations}} @@ -50,18 +51,3 @@ export interface {{operationId}}Props { } {{/if}} {{/each}} - -/** - * Replaces placeholders in a path string with provided param value - * - * @param path Path string with placeholders for params - * @param params Object with params to replace - * @returns Path string with params replaced - */ -function replaceParams(path: string, params: Record): string { - let output = path; - Object.entries(params).forEach(([param, value]) => { - output = path.replace(`{${param}}`, `${value}`); - }); - return output; -} \ No newline at end of file diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 3b7828dc7f67d0..4ea1c79eaad3a9 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -110,7 +110,7 @@ pageLoadAssetSize: navigation: 37269 newsfeed: 42228 noDataPage: 5000 - observability: 76678 + observability: 118191 observabilityAIAssistant: 58230 observabilityAIAssistantApp: 27680 observabilityAiAssistantManagement: 19279 diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts index 7d693f085ef174..f1d0c90de1d0f0 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts @@ -60,9 +60,10 @@ const walkSchema = (ctx: IContext, schema: Schema): void => { } else { for (const arrayContainer of arrayContainers) { if (schema[arrayContainer]) { - schema[arrayContainer].forEach((s: OpenAPIV3.SchemaObject, idx: number) => { + schema[arrayContainer].forEach((s: OpenAPIV3.SchemaObject) => { walkSchema(ctx, s); }); + mutations.processEnum(schema); break; } } diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/enum.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/enum.test.ts new file mode 100644 index 00000000000000..5c783e739d0453 --- /dev/null +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/enum.test.ts @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { OpenAPIV3 } from 'openapi-types'; +import { processEnum } from './enum'; + +describe('processEnum', () => { + it.each([ + { + name: 'when there is no anyOf property does not change input', + input: {} as OpenAPIV3.SchemaObject, + expected: {}, + }, + { + name: 'converts anyOf to enum if all items are enum and of the same type', + input: { + anyOf: [ + { + type: 'string', + enum: ['a', 'b'], + }, + { + type: 'string', + enum: ['c', 'd'], + }, + { + type: 'string', + enum: ['e'], + }, + ], + description: 'description', + } as OpenAPIV3.SchemaObject, + expected: { + type: 'string', + enum: ['a', 'b', 'c', 'd', 'e'], + description: 'description', + }, + }, + { + name: 'does not change input if item types are different', + input: { + anyOf: [ + { + type: 'string', + enum: ['a'], + }, + { + type: 'number', + enum: [1], + }, + ], + } as OpenAPIV3.SchemaObject, + expected: { + anyOf: [ + { + type: 'string', + enum: ['a'], + }, + { + type: 'number', + enum: [1], + }, + ], + }, + }, + { + name: 'if anyOf contains a ref does not change input', + input: { + anyOf: [ + { + $ref: '#/components/schemas/Ref', + }, + { + type: 'string', + enum: ['a'], + }, + ], + } as OpenAPIV3.SchemaObject, + expected: { + anyOf: [ + { + $ref: '#/components/schemas/Ref', + }, + { + type: 'string', + enum: ['a'], + }, + ], + }, + }, + { + name: 'if anyOf contains non-enums does not change input', + input: { + anyOf: [ + { + type: 'object', + }, + ], + } as OpenAPIV3.SchemaObject, + expected: { + anyOf: [ + { + type: 'object', + }, + ], + }, + }, + ])('$name', ({ input, expected }) => { + processEnum(input); + expect(input).toEqual(expected); + }); +}); diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/enum.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/enum.ts new file mode 100644 index 00000000000000..7bbb7ae2c26d0a --- /dev/null +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/enum.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { OpenAPIV3 } from 'openapi-types'; +import { isReferenceObject } from '../../../common'; + +export const processEnum = (schema: OpenAPIV3.SchemaObject) => { + if (!schema.anyOf) return; + const result: unknown[] = []; + let type: OpenAPIV3.SchemaObject['type']; + for (const item of schema.anyOf!) { + if (isReferenceObject(item) || !item.enum || !item.type) return; + if (type && type !== item.type) return; + + type = item.type; + result.push(...item.enum); + } + schema.type = type; + schema.enum = result; + delete schema.anyOf; +}; diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts index 0dd6cb5dc2f841..e3887717769ac3 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts @@ -68,3 +68,5 @@ export const processAnyType = (schema: OpenAPIV3.SchemaObject): void => { }; export { processObject } from './object'; + +export { processEnum } from './enum'; diff --git a/packages/kbn-securitysolution-exceptions-common/README.md b/packages/kbn-securitysolution-exceptions-common/README.md new file mode 100644 index 00000000000000..f29d982dbe6651 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/README.md @@ -0,0 +1,20 @@ +# Security Solution Exceptions common package + +The package contains common files for the Exceptions feature. + +`common` in the name highlights that this package is intended to combine any common entities related to Exceptions in this package. E.g. the other `kbn-securitysolution-exception-list-*` packages +content should be moved here while `kbn-securitysolution-io-ts-list-types` package should be +gone eventually. + +## API folder + +`api` folder contains OpenAPI schemas for Security Solution Exceptions feature. There are automatically generated Zod schemas and TS types for each schemas located in corresponding +`*.gen.ts` files. + +**Please add any Exceptions feature related schemas to this package.** + +TS types and/or Zod schemas can be imported in a plugin or another package like + +```ts +import { CreateExceptionRequestBody } from '@kbn/securitysolution-exceptions-common/api'; +``` diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.gen.ts new file mode 100644 index 00000000000000..3509b26499fc90 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.gen.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Create exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListHumanId, + ExceptionListName, + ExceptionListDescription, + ExceptionListType, + ExceptionNamespaceType, + ExceptionListOsTypeArray, + ExceptionListTags, + ExceptionListMeta, + ExceptionListVersion, + ExceptionList, +} from '../model/exception_list_common.gen'; + +export type CreateExceptionListRequestBody = z.infer; +export const CreateExceptionListRequestBody = z.object({ + list_id: ExceptionListHumanId.optional(), + name: ExceptionListName, + description: ExceptionListDescription, + type: ExceptionListType, + namespace_type: ExceptionNamespaceType.optional().default('single'), + os_types: ExceptionListOsTypeArray.optional(), + tags: ExceptionListTags.optional().default([]), + meta: ExceptionListMeta.optional(), + version: ExceptionListVersion.optional().default(1), +}); +export type CreateExceptionListRequestBodyInput = z.input; + +export type CreateExceptionListResponse = z.infer; +export const CreateExceptionListResponse = ExceptionList; diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml new file mode 100644 index 00000000000000..823ead2991330e --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list/create_exception_list.schema.yaml @@ -0,0 +1,85 @@ +openapi: 3.0.0 +info: + title: Create exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists: + post: + x-labels: [serverless, ess] + operationId: CreateExceptionList + x-codegen-enabled: true + summary: Creates an exception list + tags: + - Exceptions API + requestBody: + description: Exception list's properties + required: true + content: + application/json: + schema: + type: object + properties: + list_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + name: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListName' + description: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListDescription' + type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListType' + namespace_type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: 'single' + os_types: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListOsTypeArray' + tags: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListTags' + default: [] + meta: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListMeta' + version: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListVersion' + default: 1 + required: + - name + - description + - type + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 409: + description: Exception list already exists response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.gen.ts new file mode 100644 index 00000000000000..a11dd91aedd444 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.gen.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Create exception list item API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { NonEmptyString } from '@kbn/openapi-common/schemas/primitives.gen'; +import { + ExceptionListItemHumanId, + ExceptionListHumanId, + ExceptionListItemType, + ExceptionListItemName, + ExceptionListItemDescription, + ExceptionNamespaceType, + ExceptionListItemOsTypeArray, + ExceptionListItemTags, + ExceptionListItemMeta, + ExceptionListItem, +} from '../model/exception_list_common.gen'; +import { ExceptionListItemEntryArray } from '../model/exception_list_item_entry.gen'; + +export type CreateExceptionListItemComment = z.infer; +export const CreateExceptionListItemComment = z.object({ + comment: NonEmptyString, +}); + +export type CreateExceptionListItemCommentArray = z.infer< + typeof CreateExceptionListItemCommentArray +>; +export const CreateExceptionListItemCommentArray = z.array(CreateExceptionListItemComment); + +export type CreateExceptionListItemRequestBody = z.infer; +export const CreateExceptionListItemRequestBody = z.object({ + item_id: ExceptionListItemHumanId.optional(), + list_id: ExceptionListHumanId, + type: ExceptionListItemType, + name: ExceptionListItemName, + description: ExceptionListItemDescription, + entries: ExceptionListItemEntryArray, + namespace_type: ExceptionNamespaceType.optional().default('single'), + os_types: ExceptionListItemOsTypeArray.optional().default([]), + tags: ExceptionListItemTags.optional().default([]), + meta: ExceptionListItemMeta.optional(), + expire_time: z.string().datetime().optional(), + comments: CreateExceptionListItemCommentArray.optional().default([]), +}); +export type CreateExceptionListItemRequestBodyInput = z.input< + typeof CreateExceptionListItemRequestBody +>; + +export type CreateExceptionListItemResponse = z.infer; +export const CreateExceptionListItemResponse = ExceptionListItem; diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml new file mode 100644 index 00000000000000..6ee00569336e09 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_exception_list_item/create_exception_list_item.schema.yaml @@ -0,0 +1,111 @@ +openapi: 3.0.0 +info: + title: Create exception list item API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/items: + post: + x-labels: [serverless, ess] + operationId: CreateExceptionListItem + x-codegen-enabled: true + summary: Creates an exception list item + tags: + - Exceptions API + requestBody: + description: Exception list item's properties + required: true + content: + application/json: + schema: + type: object + properties: + item_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemHumanId' + list_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemType' + name: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemName' + description: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemDescription' + entries: + $ref: '../model/exception_list_item_entry.schema.yaml#/components/schemas/ExceptionListItemEntryArray' + namespace_type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: 'single' + os_types: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemOsTypeArray' + default: [] + tags: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemTags' + default: [] + meta: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemMeta' + expire_time: + type: string + format: date-time + comments: + $ref: '#/components/schemas/CreateExceptionListItemCommentArray' + default: [] + required: + - list_id + - type + - name + - description + - entries + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItem' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 409: + description: Exception list item already exists response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + +components: + x-codegen-enabled: true + schemas: + CreateExceptionListItemComment: + type: object + properties: + comment: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + required: + - comment + + CreateExceptionListItemCommentArray: + type: array + items: + $ref: '#/components/schemas/CreateExceptionListItemComment' diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.gen.ts new file mode 100644 index 00000000000000..e30f466cc056c6 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.gen.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Create rule exception list items API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { UUID, NonEmptyString } from '@kbn/openapi-common/schemas/primitives.gen'; +import { + ExceptionListItem, + ExceptionListItemHumanId, + ExceptionListItemType, + ExceptionListItemName, + ExceptionListItemDescription, + ExceptionNamespaceType, + ExceptionListItemOsTypeArray, + ExceptionListItemTags, + ExceptionListItemMeta, +} from '../model/exception_list_common.gen'; +import { ExceptionListItemEntryArray } from '../model/exception_list_item_entry.gen'; + +export type RuleId = z.infer; +export const RuleId = UUID; + +export type CreateRuleExceptionListItemComment = z.infer; +export const CreateRuleExceptionListItemComment = z.object({ + comment: NonEmptyString, +}); + +export type CreateRuleExceptionListItemCommentArray = z.infer< + typeof CreateRuleExceptionListItemCommentArray +>; +export const CreateRuleExceptionListItemCommentArray = z.array(CreateRuleExceptionListItemComment); + +export type CreateRuleExceptionListItemProps = z.infer; +export const CreateRuleExceptionListItemProps = z.object({ + item_id: ExceptionListItemHumanId.optional(), + type: ExceptionListItemType, + name: ExceptionListItemName, + description: ExceptionListItemDescription, + entries: ExceptionListItemEntryArray, + namespace_type: ExceptionNamespaceType.optional().default('single'), + os_types: ExceptionListItemOsTypeArray.optional().default([]), + tags: ExceptionListItemTags.optional().default([]), + meta: ExceptionListItemMeta.optional(), + expire_time: z.string().datetime().optional(), + comments: CreateRuleExceptionListItemCommentArray.optional().default([]), +}); + +export type CreateRuleExceptionListItemsRequestParams = z.infer< + typeof CreateRuleExceptionListItemsRequestParams +>; +export const CreateRuleExceptionListItemsRequestParams = z.object({ + /** + * Detection rule's identifier + */ + id: RuleId, +}); +export type CreateRuleExceptionListItemsRequestParamsInput = z.input< + typeof CreateRuleExceptionListItemsRequestParams +>; + +export type CreateRuleExceptionListItemsRequestBody = z.infer< + typeof CreateRuleExceptionListItemsRequestBody +>; +export const CreateRuleExceptionListItemsRequestBody = z.object({ + items: z.array(CreateRuleExceptionListItemProps), +}); +export type CreateRuleExceptionListItemsRequestBodyInput = z.input< + typeof CreateRuleExceptionListItemsRequestBody +>; + +export type CreateRuleExceptionListItemsResponse = z.infer< + typeof CreateRuleExceptionListItemsResponse +>; +export const CreateRuleExceptionListItemsResponse = z.array(ExceptionListItem); diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml new file mode 100644 index 00000000000000..b7cad73c9bb22c --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_rule_exceptions/create_rule_exceptions.schema.yaml @@ -0,0 +1,122 @@ +openapi: 3.0.0 +info: + title: Create rule exception list items API endpoint + version: '2023-10-31' +paths: + /api/detection_engine/rules/{id}/exceptions: + post: + x-labels: [serverless, ess] + operationId: CreateRuleExceptionListItems + x-codegen-enabled: true + summary: Creates rule exception list items + tags: + - Exceptions API + parameters: + - name: id + in: path + required: true + description: Detection rule's identifier + schema: + $ref: '#/components/schemas/RuleId' + requestBody: + description: Rule exception list items + required: true + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/CreateRuleExceptionListItemProps' + required: [items] + responses: + 200: + description: Successful response + content: + application/json: + schema: + type: array + items: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItem' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + +components: + schemas: + RuleId: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/UUID' + + CreateRuleExceptionListItemComment: + type: object + properties: + comment: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + required: + - comment + + CreateRuleExceptionListItemCommentArray: + type: array + items: + $ref: '#/components/schemas/CreateRuleExceptionListItemComment' + + CreateRuleExceptionListItemProps: + type: object + properties: + item_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemHumanId' + type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemType' + name: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemName' + description: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemDescription' + entries: + $ref: '../model/exception_list_item_entry.schema.yaml#/components/schemas/ExceptionListItemEntryArray' + namespace_type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: 'single' + os_types: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemOsTypeArray' + default: [] + tags: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemTags' + default: [] + meta: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemMeta' + expire_time: + type: string + format: date-time + comments: + $ref: '#/components/schemas/CreateRuleExceptionListItemCommentArray' + default: [] + required: + - type + - name + - description + - entries diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.gen.ts new file mode 100644 index 00000000000000..e050c211e15133 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.gen.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Create shared exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListName, + ExceptionListDescription, + ExceptionList, +} from '../model/exception_list_common.gen'; + +export type CreateSharedExceptionListRequestBody = z.infer< + typeof CreateSharedExceptionListRequestBody +>; +export const CreateSharedExceptionListRequestBody = z.object({ + name: ExceptionListName, + description: ExceptionListDescription, +}); +export type CreateSharedExceptionListRequestBodyInput = z.input< + typeof CreateSharedExceptionListRequestBody +>; + +export type CreateSharedExceptionListResponse = z.infer; +export const CreateSharedExceptionListResponse = ExceptionList; diff --git a/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml new file mode 100644 index 00000000000000..0a072e855f0d24 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/create_shared_exceptions_list/create_shared_exceptions_list.schema.yaml @@ -0,0 +1,66 @@ +openapi: 3.0.0 +info: + title: Create shared exception list API endpoint + version: '2023-10-31' +paths: + /api/exceptions/shared: + post: + x-labels: [serverless, ess] + operationId: CreateSharedExceptionList + x-codegen-enabled: true + summary: Creates a shared exception list + tags: + - Exceptions API + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListName' + description: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListDescription' + required: + - name + - description + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 409: + description: Exception list already exists response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.gen.ts new file mode 100644 index 00000000000000..0797b7e3b9b01a --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.gen.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Delete exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListId, + ExceptionListHumanId, + ExceptionNamespaceType, + ExceptionList, +} from '../model/exception_list_common.gen'; + +export type DeleteExceptionListRequestQuery = z.infer; +export const DeleteExceptionListRequestQuery = z.object({ + /** + * Either `id` or `list_id` must be specified + */ + id: ExceptionListId.optional(), + /** + * Either `id` or `list_id` must be specified + */ + list_id: ExceptionListHumanId.optional(), + namespace_type: ExceptionNamespaceType.optional().default('single'), +}); +export type DeleteExceptionListRequestQueryInput = z.input; + +export type DeleteExceptionListResponse = z.infer; +export const DeleteExceptionListResponse = ExceptionList; diff --git a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml new file mode 100644 index 00000000000000..f8522ddf2de68c --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list/delete_exception_list.schema.yaml @@ -0,0 +1,71 @@ +openapi: 3.0.0 +info: + title: Delete exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists: + delete: + x-labels: [serverless, ess] + operationId: DeleteExceptionList + x-codegen-enabled: true + summary: Deletes an exception list + tags: + - Exceptions API + parameters: + - name: id + in: query + required: false + description: Either `id` or `list_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListId' + - name: list_id + in: query + required: false + description: Either `id` or `list_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + - name: namespace_type + in: query + required: false + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: single + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.gen.ts new file mode 100644 index 00000000000000..d709fd5597b804 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.gen.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Delete exception list item API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListItemId, + ExceptionListItemHumanId, + ExceptionNamespaceType, + ExceptionListItem, +} from '../model/exception_list_common.gen'; + +export type DeleteExceptionListItemRequestQuery = z.infer< + typeof DeleteExceptionListItemRequestQuery +>; +export const DeleteExceptionListItemRequestQuery = z.object({ + /** + * Either `id` or `item_id` must be specified + */ + id: ExceptionListItemId.optional(), + /** + * Either `id` or `item_id` must be specified + */ + item_id: ExceptionListItemHumanId.optional(), + namespace_type: ExceptionNamespaceType.optional().default('single'), +}); +export type DeleteExceptionListItemRequestQueryInput = z.input< + typeof DeleteExceptionListItemRequestQuery +>; + +export type DeleteExceptionListItemResponse = z.infer; +export const DeleteExceptionListItemResponse = ExceptionListItem; diff --git a/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml new file mode 100644 index 00000000000000..a34339e4f4c31b --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/delete_exception_list_item/delete_exception_list_item.schema.yaml @@ -0,0 +1,71 @@ +openapi: 3.0.0 +info: + title: Delete exception list item API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/items: + delete: + x-labels: [serverless, ess] + operationId: DeleteExceptionListItem + x-codegen-enabled: true + summary: Deletes an exception list item + tags: + - Exceptions API + parameters: + - name: id + in: query + required: false + description: Either `id` or `item_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemId' + - name: item_id + in: query + required: false + description: Either `id` or `item_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemHumanId' + - name: namespace_type + in: query + required: false + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: single + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItem' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list item not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.gen.ts new file mode 100644 index 00000000000000..e5c3f19b28aa2c --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.gen.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Duplicate exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListHumanId, + ExceptionNamespaceType, + ExceptionList, +} from '../model/exception_list_common.gen'; + +export type DuplicateExceptionListRequestQuery = z.infer; +export const DuplicateExceptionListRequestQuery = z.object({ + /** + * Exception list's human identifier + */ + list_id: ExceptionListHumanId, + namespace_type: ExceptionNamespaceType, + /** + * Determines whether to include expired exceptions in the exported list + */ + include_expired_exceptions: z.enum(['true', 'false']).default('true'), +}); +export type DuplicateExceptionListRequestQueryInput = z.input< + typeof DuplicateExceptionListRequestQuery +>; + +export type DuplicateExceptionListResponse = z.infer; +export const DuplicateExceptionListResponse = ExceptionList; diff --git a/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml new file mode 100644 index 00000000000000..2620d882087a79 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/duplicate_exception_list/duplicate_exception_list.schema.yaml @@ -0,0 +1,71 @@ +openapi: 3.0.0 +info: + title: Duplicate exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/_duplicate: + post: + operationId: DuplicateExceptionList + x-codegen-enabled: true + summary: Duplicates an exception list + tags: + - Exceptions API + parameters: + - name: list_id + in: query + required: true + description: Exception list's human identifier + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + - name: namespace_type + in: query + required: true + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + - name: include_expired_exceptions + in: query + required: true + description: Determines whether to include expired exceptions in the exported list + schema: + type: string + enum: ['true', 'false'] + default: 'true' + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 405: + description: Exception list to duplicate not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.gen.ts new file mode 100644 index 00000000000000..bb62df2e43226f --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.gen.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Export exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListId, + ExceptionListHumanId, + ExceptionNamespaceType, +} from '../model/exception_list_common.gen'; + +export type ExportExceptionListRequestQuery = z.infer; +export const ExportExceptionListRequestQuery = z.object({ + /** + * Exception list's identifier + */ + id: ExceptionListId, + /** + * Exception list's human identifier + */ + list_id: ExceptionListHumanId, + namespace_type: ExceptionNamespaceType, + /** + * Determines whether to include expired exceptions in the exported list + */ + include_expired_exceptions: z.enum(['true', 'false']).default('true'), +}); +export type ExportExceptionListRequestQueryInput = z.input; diff --git a/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml new file mode 100644 index 00000000000000..9d24b654625c2c --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/export_exception_list/export_exception_list.schema.yaml @@ -0,0 +1,80 @@ +openapi: 3.0.0 +info: + title: Export exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/_export: + post: + operationId: ExportExceptionList + x-codegen-enabled: true + summary: Exports an exception list + description: Exports an exception list and its associated items to an .ndjson file + tags: + - Exceptions API + parameters: + - name: id + in: query + required: true + description: Exception list's identifier + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListId' + - name: list_id + in: query + required: true + description: Exception list's human identifier + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + - name: namespace_type + in: query + required: true + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + - name: include_expired_exceptions + in: query + required: true + description: Determines whether to include expired exceptions in the exported list + schema: + type: string + enum: ['true', 'false'] + default: 'true' + responses: + 200: + description: Successful response + content: + application/ndjson: + schema: + type: string + format: binary + description: A `.ndjson` file containing specified exception list and its items + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/find_exception_list/find_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list/find_exception_list.gen.ts new file mode 100644 index 00000000000000..6ae1aef1f15dff --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list/find_exception_list.gen.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Find exception lists API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; +import { ArrayFromString } from '@kbn/zod-helpers'; + +import { ExceptionNamespaceType, ExceptionList } from '../model/exception_list_common.gen'; + +export type FindExceptionListsFilter = z.infer; +export const FindExceptionListsFilter = z.string(); + +export type FindExceptionListsRequestQuery = z.infer; +export const FindExceptionListsRequestQuery = z.object({ + /** + * Filters the returned results according to the value of the specified field. + +Uses the `so type.field name:field` value syntax, where `so type` can be: + +- `exception-list`: Specify a space-aware exception list. +- `exception-list-agnostic`: Specify an exception list that is shared across spaces. + + */ + filter: FindExceptionListsFilter.optional(), + /** + * Determines whether the returned containers are Kibana associated with a Kibana space +or available in all spaces (`agnostic` or `single`) + + */ + namespace_type: ArrayFromString(ExceptionNamespaceType).optional().default(['single']), + /** + * The page number to return + */ + page: z.coerce.number().int().min(1).optional(), + /** + * The number of exception lists to return per page + */ + per_page: z.coerce.number().int().min(1).optional(), + /** + * Determines which field is used to sort the results + */ + sort_field: z.string().optional(), + /** + * Determines the sort order, which can be `desc` or `asc` + */ + sort_order: z.enum(['desc', 'asc']).optional(), +}); +export type FindExceptionListsRequestQueryInput = z.input; + +export type FindExceptionListsResponse = z.infer; +export const FindExceptionListsResponse = z.object({ + data: z.array(ExceptionList), + page: z.number().int().min(1), + per_page: z.number().int().min(1), + total: z.number().int().min(0), +}); diff --git a/packages/kbn-securitysolution-exceptions-common/api/find_exception_list/find_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list/find_exception_list.schema.yaml new file mode 100644 index 00000000000000..280831939b838e --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list/find_exception_list.schema.yaml @@ -0,0 +1,121 @@ +openapi: 3.0.0 +info: + title: Find exception lists API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/items/_find: + get: + x-labels: [serverless, ess] + operationId: FindExceptionLists + x-codegen-enabled: true + summary: Finds exception lists + tags: + - Exceptions API + parameters: + - name: filter + in: query + required: false + description: | + Filters the returned results according to the value of the specified field. + + Uses the `so type.field name:field` value syntax, where `so type` can be: + + - `exception-list`: Specify a space-aware exception list. + - `exception-list-agnostic`: Specify an exception list that is shared across spaces. + schema: + $ref: '#/components/schemas/FindExceptionListsFilter' + - name: namespace_type + in: query + required: false + description: | + Determines whether the returned containers are Kibana associated with a Kibana space + or available in all spaces (`agnostic` or `single`) + schema: + type: array + items: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: [single] + - name: page + in: query + required: false + description: The page number to return + schema: + type: integer + minimum: 1 + - name: per_page + in: query + required: false + description: The number of exception lists to return per page + schema: + type: integer + minimum: 1 + - name: sort_field + in: query + required: false + description: Determines which field is used to sort the results + schema: + type: string + - name: sort_order + in: query + required: false + description: Determines the sort order, which can be `desc` or `asc` + schema: + type: string + enum: [desc, asc] + responses: + 200: + description: Successful response + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + page: + type: integer + minimum: 1 + per_page: + type: integer + minimum: 1 + total: + type: integer + minimum: 0 + required: + - data + - page + - per_page + - total + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + +components: + schemas: + FindExceptionListsFilter: + type: string diff --git a/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_item/find_exception_list_item.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_item/find_exception_list_item.gen.ts new file mode 100644 index 00000000000000..3c89952682847d --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_item/find_exception_list_item.gen.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Find exception list items API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; +import { ArrayFromString } from '@kbn/zod-helpers'; + +import { NonEmptyString } from '@kbn/openapi-common/schemas/primitives.gen'; +import { + ExceptionListHumanId, + ExceptionNamespaceType, + ExceptionListItem, +} from '../model/exception_list_common.gen'; + +export type FindExceptionListItemsFilter = z.infer; +export const FindExceptionListItemsFilter = NonEmptyString; + +export type FindExceptionListItemsRequestQuery = z.infer; +export const FindExceptionListItemsRequestQuery = z.object({ + /** + * List's id + */ + list_id: ArrayFromString(ExceptionListHumanId), + /** + * Filters the returned results according to the value of the specified field, +using the `:` syntax. + + */ + filter: ArrayFromString(FindExceptionListItemsFilter).optional().default([]), + /** + * Determines whether the returned containers are Kibana associated with a Kibana space +or available in all spaces (`agnostic` or `single`) + + */ + namespace_type: ArrayFromString(ExceptionNamespaceType).optional().default(['single']), + search: z.string().optional(), + /** + * The page number to return + */ + page: z.coerce.number().int().min(0).optional(), + /** + * The number of exception list items to return per page + */ + per_page: z.coerce.number().int().min(0).optional(), + /** + * Determines which field is used to sort the results + */ + sort_field: NonEmptyString.optional(), + /** + * Determines the sort order, which can be `desc` or `asc` + */ + sort_order: z.enum(['desc', 'asc']).optional(), +}); +export type FindExceptionListItemsRequestQueryInput = z.input< + typeof FindExceptionListItemsRequestQuery +>; + +export type FindExceptionListItemsResponse = z.infer; +export const FindExceptionListItemsResponse = z.object({ + data: z.array(ExceptionListItem), + page: z.number().int().min(1), + per_page: z.number().int().min(1), + total: z.number().int().min(0), + pit: z.string().optional(), +}); diff --git a/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_item/find_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_item/find_exception_list_item.schema.yaml new file mode 100644 index 00000000000000..2fae12499d513e --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/find_exception_list_item/find_exception_list_item.schema.yaml @@ -0,0 +1,141 @@ +openapi: 3.0.0 +info: + title: Find exception list items API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/items/_find: + get: + x-labels: [serverless, ess] + operationId: FindExceptionListItems + x-codegen-enabled: true + summary: Finds exception list items + tags: + - Exceptions API + parameters: + - name: list_id + in: query + required: true + description: List's id + schema: + type: array + items: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + - name: filter + in: query + required: false + description: | + Filters the returned results according to the value of the specified field, + using the `:` syntax. + schema: + type: array + items: + $ref: '#/components/schemas/FindExceptionListItemsFilter' + default: [] + - name: namespace_type + in: query + required: false + description: | + Determines whether the returned containers are Kibana associated with a Kibana space + or available in all spaces (`agnostic` or `single`) + schema: + type: array + items: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: [single] + - name: search + in: query + required: false + schema: + type: string + - name: page + in: query + required: false + description: The page number to return + schema: + type: integer + minimum: 0 + - name: per_page + in: query + required: false + description: The number of exception list items to return per page + schema: + type: integer + minimum: 0 + - name: sort_field + in: query + required: false + description: Determines which field is used to sort the results + schema: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + - name: sort_order + in: query + required: false + description: Determines the sort order, which can be `desc` or `asc` + schema: + type: string + enum: [desc, asc] + responses: + 200: + description: Successful response + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItem' + page: + type: integer + minimum: 1 + per_page: + type: integer + minimum: 1 + total: + type: integer + minimum: 0 + pit: + type: string + required: + - data + - page + - per_page + - total + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + +components: + schemas: + FindExceptionListItemsFilter: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' diff --git a/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.gen.ts new file mode 100644 index 00000000000000..ec25576cc9dfef --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.gen.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Import exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; +import { BooleanFromString } from '@kbn/zod-helpers'; + +import { + ExceptionListId, + ExceptionListHumanId, + ExceptionListItemHumanId, +} from '../model/exception_list_common.gen'; + +export type ExceptionListsImportBulkError = z.infer; +export const ExceptionListsImportBulkError = z.object({ + error: z.object({ + status_code: z.number().int(), + message: z.string(), + }), + id: ExceptionListId.optional(), + list_id: ExceptionListHumanId.optional(), + item_id: ExceptionListItemHumanId.optional(), +}); + +export type ExceptionListsImportBulkErrorArray = z.infer; +export const ExceptionListsImportBulkErrorArray = z.array(ExceptionListsImportBulkError); + +export type ImportExceptionListRequestQuery = z.infer; +export const ImportExceptionListRequestQuery = z.object({ + /** + * Determines whether existing exception lists with the same `list_id` are overwritten. +If any exception items have the same `item_id`, those are also overwritten. + + */ + overwrite: BooleanFromString.optional().default(false), + overwrite_exceptions: BooleanFromString.optional().default(false), + overwrite_action_connectors: BooleanFromString.optional().default(false), + /** + * Determines whether the list being imported will have a new `list_id` generated. +Additional `item_id`'s are generated for each exception item. Both the exception +list and its items are overwritten. + + */ + as_new_list: BooleanFromString.optional().default(false), +}); +export type ImportExceptionListRequestQueryInput = z.input; + +export type ImportExceptionListResponse = z.infer; +export const ImportExceptionListResponse = z.object({ + errors: ExceptionListsImportBulkErrorArray, + success: z.boolean(), + success_count: z.number().int().min(0), + success_exception_lists: z.boolean(), + success_count_exception_lists: z.number().int().min(0), + success_exception_list_items: z.boolean(), + success_count_exception_list_items: z.number().int().min(0), +}); diff --git a/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml new file mode 100644 index 00000000000000..c1a04e7a38b8c9 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/import_exceptions/import_exceptions.schema.yaml @@ -0,0 +1,141 @@ +openapi: 3.0.0 +info: + title: Import exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/_import: + post: + operationId: ImportExceptionList + x-codegen-enabled: true + summary: Imports an exception list + description: Imports an exception list and associated items + tags: + - Exceptions API + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + description: A `.ndjson` file containing the exception list + parameters: + - name: overwrite + in: query + required: false + description: | + Determines whether existing exception lists with the same `list_id` are overwritten. + If any exception items have the same `item_id`, those are also overwritten. + schema: + type: boolean + default: false + - name: overwrite_exceptions + in: query + required: false + schema: + type: boolean + default: false + - name: overwrite_action_connectors + in: query + required: false + schema: + type: boolean + default: false + - name: as_new_list + in: query + required: false + description: | + Determines whether the list being imported will have a new `list_id` generated. + Additional `item_id`'s are generated for each exception item. Both the exception + list and its items are overwritten. + schema: + type: boolean + default: false + responses: + 200: + description: Successful response + content: + application/json: + schema: + type: object + properties: + errors: + $ref: '#/components/schemas/ExceptionListsImportBulkErrorArray' + success: + type: boolean + success_count: + type: integer + minimum: 0 + success_exception_lists: + type: boolean + success_count_exception_lists: + type: integer + minimum: 0 + success_exception_list_items: + type: boolean + success_count_exception_list_items: + type: integer + minimum: 0 + required: + - errors + - success + - success_count + - success_exception_lists + - success_count_exception_lists + - success_exception_list_items + - success_count_exception_list_items + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + +components: + schemas: + ExceptionListsImportBulkError: + type: object + properties: + error: + type: object + properties: + status_code: + type: integer + message: + type: string + required: [status_code, message] + id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListId' + list_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + item_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemHumanId' + required: [error] + + ExceptionListsImportBulkErrorArray: + type: array + items: + $ref: '#/components/schemas/ExceptionListsImportBulkError' diff --git a/packages/kbn-securitysolution-exceptions-common/api/index.ts b/packages/kbn-securitysolution-exceptions-common/api/index.ts new file mode 100644 index 00000000000000..b9e866aeb6a128 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './model/exception_list_common.gen'; +export * from './model/exception_list_item_entry.gen'; +export * from './create_exception_list_item/create_exception_list_item.gen'; +export * from './create_rule_exceptions/create_rule_exceptions.gen'; +export * from './create_shared_exceptions_list/create_shared_exceptions_list.gen'; +export * from './create_exception_list/create_exception_list.gen'; +export * from './delete_exception_list_item/delete_exception_list_item.gen'; +export * from './delete_exception_list/delete_exception_list.gen'; +export * from './duplicate_exception_list/duplicate_exception_list.gen'; +export * from './export_exception_list/export_exception_list.gen'; +export * from './find_exception_list_item/find_exception_list_item.gen'; +export * from './find_exception_list/find_exception_list.gen'; +export * from './import_exceptions/import_exceptions.gen'; +export * from './read_exception_list_item/read_exception_list_item.gen'; +export * from './read_exception_list/read_exception_list.gen'; +export * from './summary_exception_list/summary_exception_list.gen'; +export * from './update_exception_list_item/update_exception_list_item.gen'; +export * from './update_exception_list/update_exception_list.gen'; diff --git a/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_common.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_common.gen.ts new file mode 100644 index 00000000000000..360e4ec747d85b --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_common.gen.ts @@ -0,0 +1,187 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Common Exception List Attributes + * version: not applicable + */ + +import { z } from 'zod'; + +import { NonEmptyString } from '@kbn/openapi-common/schemas/primitives.gen'; +import { ExceptionListItemEntryArray } from './exception_list_item_entry.gen'; + +export type ExceptionListId = z.infer; +export const ExceptionListId = NonEmptyString; + +/** + * Human readable string identifier, e.g. `trusted-linux-processes` + */ +export type ExceptionListHumanId = z.infer; +export const ExceptionListHumanId = NonEmptyString; + +export type ExceptionListType = z.infer; +export const ExceptionListType = z.enum([ + 'detection', + 'rule_default', + 'endpoint', + 'endpoint_trusted_apps', + 'endpoint_events', + 'endpoint_host_isolation_exceptions', + 'endpoint_blocklists', +]); +export type ExceptionListTypeEnum = typeof ExceptionListType.enum; +export const ExceptionListTypeEnum = ExceptionListType.enum; + +export type ExceptionListName = z.infer; +export const ExceptionListName = z.string(); + +export type ExceptionListDescription = z.infer; +export const ExceptionListDescription = z.string(); + +export type ExceptionListMeta = z.infer; +export const ExceptionListMeta = z.object({}).catchall(z.unknown()); + +/** + * Determines whether the exception container is available in all Kibana spaces or just the space +in which it is created, where: + +- `single`: Only available in the Kibana space in which it is created. +- `agnostic`: Available in all Kibana spaces. + + */ +export type ExceptionNamespaceType = z.infer; +export const ExceptionNamespaceType = z.enum(['agnostic', 'single']); +export type ExceptionNamespaceTypeEnum = typeof ExceptionNamespaceType.enum; +export const ExceptionNamespaceTypeEnum = ExceptionNamespaceType.enum; + +export type ExceptionListTags = z.infer; +export const ExceptionListTags = z.array(z.string()); + +export type ExceptionListOsType = z.infer; +export const ExceptionListOsType = z.enum(['linux', 'macos', 'windows']); +export type ExceptionListOsTypeEnum = typeof ExceptionListOsType.enum; +export const ExceptionListOsTypeEnum = ExceptionListOsType.enum; + +export type ExceptionListOsTypeArray = z.infer; +export const ExceptionListOsTypeArray = z.array(ExceptionListOsType); + +export type ExceptionListVersion = z.infer; +export const ExceptionListVersion = z.number().int().min(1); + +export type ExceptionList = z.infer; +export const ExceptionList = z.object({ + id: ExceptionListId, + list_id: ExceptionListHumanId, + type: ExceptionListType, + name: ExceptionListName, + description: ExceptionListDescription, + immutable: z.boolean(), + namespace_type: ExceptionNamespaceType, + os_types: ExceptionListOsTypeArray.optional(), + tags: ExceptionListTags.optional(), + meta: ExceptionListMeta.optional(), + version: ExceptionListVersion, + _version: z.string().optional(), + tie_breaker_id: z.string(), + created_at: z.string().datetime(), + created_by: z.string(), + updated_at: z.string().datetime(), + updated_by: z.string(), +}); + +export type ExceptionListItemId = z.infer; +export const ExceptionListItemId = NonEmptyString; + +export type ExceptionListItemHumanId = z.infer; +export const ExceptionListItemHumanId = NonEmptyString; + +export type ExceptionListItemType = z.infer; +export const ExceptionListItemType = z.literal('simple'); + +export type ExceptionListItemName = z.infer; +export const ExceptionListItemName = NonEmptyString; + +export type ExceptionListItemDescription = z.infer; +export const ExceptionListItemDescription = z.string(); + +export type ExceptionListItemMeta = z.infer; +export const ExceptionListItemMeta = z.object({}).catchall(z.unknown()); + +export type ExceptionListItemTags = z.infer; +export const ExceptionListItemTags = z.array(NonEmptyString); + +export type ExceptionListItemOsType = z.infer; +export const ExceptionListItemOsType = z.enum(['linux', 'macos', 'windows']); +export type ExceptionListItemOsTypeEnum = typeof ExceptionListItemOsType.enum; +export const ExceptionListItemOsTypeEnum = ExceptionListItemOsType.enum; + +export type ExceptionListItemOsTypeArray = z.infer; +export const ExceptionListItemOsTypeArray = z.array(ExceptionListOsType); + +export type ExceptionListItemComment = z.infer; +export const ExceptionListItemComment = z.object({ + id: NonEmptyString, + comment: NonEmptyString, + created_at: z.string().datetime(), + created_by: NonEmptyString, + updated_at: z.string().datetime().optional(), + updated_by: NonEmptyString.optional(), +}); + +export type ExceptionListItemCommentArray = z.infer; +export const ExceptionListItemCommentArray = z.array(ExceptionListItemComment); + +export type ExceptionListItem = z.infer; +export const ExceptionListItem = z.object({ + id: ExceptionListItemId, + item_id: ExceptionListItemHumanId, + list_id: ExceptionListHumanId, + type: ExceptionListItemType, + name: ExceptionListItemName, + description: ExceptionListItemDescription, + entries: ExceptionListItemEntryArray, + namespace_type: ExceptionNamespaceType, + os_types: ExceptionListItemOsTypeArray.optional(), + tags: ExceptionListItemTags.optional(), + meta: ExceptionListItemMeta.optional(), + expire_time: z.string().datetime().optional(), + comments: ExceptionListItemCommentArray, + _version: z.string().optional(), + tie_breaker_id: z.string(), + created_at: z.string().datetime(), + created_by: z.string(), + updated_at: z.string().datetime(), + updated_by: z.string(), +}); + +export type ExceptionListSO = z.infer; +export const ExceptionListSO = z.object({ + item_id: ExceptionListItemHumanId.optional(), + list_id: ExceptionListHumanId, + list_type: z.enum(['item', 'list']), + immutable: z.boolean().optional(), + type: ExceptionListItemType, + name: ExceptionListItemName, + description: ExceptionListItemDescription, + entries: ExceptionListItemEntryArray.optional(), + os_types: ExceptionListItemOsTypeArray.optional(), + tags: ExceptionListItemTags.optional(), + meta: ExceptionListItemMeta.optional(), + expire_time: z.string().datetime().optional(), + comments: ExceptionListItemCommentArray.optional(), + version: NonEmptyString.optional(), + tie_breaker_id: z.string(), + created_at: z.string().datetime(), + created_by: z.string(), + updated_by: z.string(), +}); diff --git a/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_common.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_common.schema.yaml new file mode 100644 index 00000000000000..ebcecc9c916f7a --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_common.schema.yaml @@ -0,0 +1,301 @@ +openapi: 3.0.0 +info: + title: Common Exception List Attributes + version: 'not applicable' +paths: {} +components: + x-codegen-enabled: true + schemas: + ExceptionListId: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + + ExceptionListHumanId: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + description: Human readable string identifier, e.g. `trusted-linux-processes` + + ExceptionListType: + type: string + enum: + - detection + - rule_default + - endpoint + - endpoint_trusted_apps + - endpoint_events + - endpoint_host_isolation_exceptions + - endpoint_blocklists + + ExceptionListName: + type: string + + ExceptionListDescription: + type: string + + ExceptionListMeta: + type: object + additionalProperties: true + + ExceptionNamespaceType: + type: string + enum: + - agnostic + - single + description: | + Determines whether the exception container is available in all Kibana spaces or just the space + in which it is created, where: + + - `single`: Only available in the Kibana space in which it is created. + - `agnostic`: Available in all Kibana spaces. + + ExceptionListTags: + type: array + items: + type: string + + ExceptionListOsType: + type: string + enum: + - linux + - macos + - windows + + ExceptionListOsTypeArray: + type: array + items: + $ref: '#/components/schemas/ExceptionListOsType' + + ExceptionListVersion: + type: integer + minimum: 1 + + ExceptionList: + type: object + properties: + id: + $ref: '#/components/schemas/ExceptionListId' + list_id: + $ref: '#/components/schemas/ExceptionListHumanId' + type: + $ref: '#/components/schemas/ExceptionListType' + name: + $ref: '#/components/schemas/ExceptionListName' + description: + $ref: '#/components/schemas/ExceptionListDescription' + immutable: + type: boolean + namespace_type: + $ref: '#/components/schemas/ExceptionNamespaceType' + os_types: + $ref: '#/components/schemas/ExceptionListOsTypeArray' + tags: + $ref: '#/components/schemas/ExceptionListTags' + meta: + $ref: '#/components/schemas/ExceptionListMeta' + version: + $ref: '#/components/schemas/ExceptionListVersion' + _version: + type: string + tie_breaker_id: + type: string + created_at: + type: string + format: date-time + created_by: + type: string + updated_at: + type: string + format: date-time + updated_by: + type: string + required: + - id + - list_id + - type + - name + - description + - immutable + - namespace_type + - version + - tie_breaker_id + - created_at + - created_by + - updated_at + - updated_by + + ExceptionListItemId: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + + ExceptionListItemHumanId: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + + ExceptionListItemType: + type: string + enum: [simple] + + ExceptionListItemName: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + + ExceptionListItemDescription: + type: string + + ExceptionListItemMeta: + type: object + additionalProperties: true + + ExceptionListItemTags: + type: array + items: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + + ExceptionListItemOsType: + type: string + enum: + - linux + - macos + - windows + + ExceptionListItemOsTypeArray: + type: array + items: + $ref: '#/components/schemas/ExceptionListOsType' + + ExceptionListItemComment: + type: object + properties: + id: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + comment: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + created_at: + type: string + format: date-time + created_by: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + updated_at: + type: string + format: date-time + updated_by: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + required: + - id + - comment + - created_at + - created_by + + ExceptionListItemCommentArray: + type: array + items: + $ref: '#/components/schemas/ExceptionListItemComment' + + ExceptionListItem: + type: object + properties: + id: + $ref: '#/components/schemas/ExceptionListItemId' + item_id: + $ref: '#/components/schemas/ExceptionListItemHumanId' + list_id: + $ref: '#/components/schemas/ExceptionListHumanId' + type: + $ref: '#/components/schemas/ExceptionListItemType' + name: + $ref: '#/components/schemas/ExceptionListItemName' + description: + $ref: '#/components/schemas/ExceptionListItemDescription' + entries: + $ref: './exception_list_item_entry.schema.yaml#/components/schemas/ExceptionListItemEntryArray' + namespace_type: + $ref: '#/components/schemas/ExceptionNamespaceType' + os_types: + $ref: '#/components/schemas/ExceptionListItemOsTypeArray' + tags: + $ref: '#/components/schemas/ExceptionListItemTags' + meta: + $ref: '#/components/schemas/ExceptionListItemMeta' + expire_time: + type: string + format: date-time + comments: + $ref: '#/components/schemas/ExceptionListItemCommentArray' + _version: + type: string + tie_breaker_id: + type: string + created_at: + type: string + format: date-time + created_by: + type: string + updated_at: + type: string + format: date-time + updated_by: + type: string + required: + - id + - item_id + - list_id + - type + - name + - description + - entries + - namespace_type + - comments + - tie_breaker_id + - created_at + - created_by + - updated_at + - updated_by + + ExceptionListSO: + type: object + properties: + item_id: + $ref: '#/components/schemas/ExceptionListItemHumanId' + list_id: + $ref: '#/components/schemas/ExceptionListHumanId' + list_type: + type: string + enum: [item, list] + immutable: + type: boolean + type: + $ref: '#/components/schemas/ExceptionListItemType' + name: + $ref: '#/components/schemas/ExceptionListItemName' + description: + $ref: '#/components/schemas/ExceptionListItemDescription' + entries: + $ref: './exception_list_item_entry.schema.yaml#/components/schemas/ExceptionListItemEntryArray' + os_types: + $ref: '#/components/schemas/ExceptionListItemOsTypeArray' + tags: + $ref: '#/components/schemas/ExceptionListItemTags' + meta: + $ref: '#/components/schemas/ExceptionListItemMeta' + expire_time: + type: string + format: date-time + comments: + $ref: '#/components/schemas/ExceptionListItemCommentArray' + version: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + tie_breaker_id: + type: string + created_at: + type: string + format: date-time + created_by: + type: string + updated_by: + type: string + required: + - list_id + - list_type + - type + - name + - description + - tie_breaker_id + - created_at + - created_by + - updated_at + - updated_by diff --git a/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_item_entry.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_item_entry.gen.ts new file mode 100644 index 00000000000000..c2973886334292 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_item_entry.gen.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Common Exception List Item Entry Attributes + * version: not applicable + */ + +import { z } from 'zod'; + +import { NonEmptyString } from '@kbn/openapi-common/schemas/primitives.gen'; +import { ListId, ListType } from '@kbn/securitysolution-lists-common/api/model/list_common.gen'; + +export type ExceptionListItemEntryOperator = z.infer; +export const ExceptionListItemEntryOperator = z.enum(['excluded', 'included']); +export type ExceptionListItemEntryOperatorEnum = typeof ExceptionListItemEntryOperator.enum; +export const ExceptionListItemEntryOperatorEnum = ExceptionListItemEntryOperator.enum; + +export type ExceptionListItemEntryMatch = z.infer; +export const ExceptionListItemEntryMatch = z.object({ + type: z.literal('match'), + field: NonEmptyString, + value: NonEmptyString, + operator: ExceptionListItemEntryOperator, +}); + +export type ExceptionListItemEntryMatchAny = z.infer; +export const ExceptionListItemEntryMatchAny = z.object({ + type: z.literal('match_any'), + field: NonEmptyString, + value: z.array(NonEmptyString).min(1), + operator: ExceptionListItemEntryOperator, +}); + +export type ExceptionListItemEntryList = z.infer; +export const ExceptionListItemEntryList = z.object({ + type: z.literal('list'), + field: NonEmptyString, + list: z.object({ + id: ListId, + type: ListType, + }), + operator: ExceptionListItemEntryOperator, +}); + +export type ExceptionListItemEntryExists = z.infer; +export const ExceptionListItemEntryExists = z.object({ + type: z.literal('exists'), + field: NonEmptyString, + operator: ExceptionListItemEntryOperator, +}); + +export type ExceptionListItemEntryNestedEntryItem = z.infer< + typeof ExceptionListItemEntryNestedEntryItem +>; +export const ExceptionListItemEntryNestedEntryItem = z.union([ + ExceptionListItemEntryMatch, + ExceptionListItemEntryMatchAny, + ExceptionListItemEntryExists, +]); + +export type ExceptionListItemEntryNested = z.infer; +export const ExceptionListItemEntryNested = z.object({ + type: z.literal('nested'), + field: NonEmptyString, + entries: z.array(ExceptionListItemEntryNestedEntryItem).min(1), +}); + +export type ExceptionListItemEntryMatchWildcard = z.infer< + typeof ExceptionListItemEntryMatchWildcard +>; +export const ExceptionListItemEntryMatchWildcard = z.object({ + type: z.literal('wildcard'), + field: NonEmptyString, + value: NonEmptyString, + operator: ExceptionListItemEntryOperator, +}); + +export type ExceptionListItemEntry = z.infer; +export const ExceptionListItemEntry = z.discriminatedUnion('type', [ + ExceptionListItemEntryMatch, + ExceptionListItemEntryMatchAny, + ExceptionListItemEntryList, + ExceptionListItemEntryExists, + ExceptionListItemEntryNested, + ExceptionListItemEntryMatchWildcard, +]); + +export type ExceptionListItemEntryArray = z.infer; +export const ExceptionListItemEntryArray = z.array(ExceptionListItemEntry); diff --git a/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_item_entry.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_item_entry.schema.yaml new file mode 100644 index 00000000000000..883a62e5bbec59 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/model/exception_list_item_entry.schema.yaml @@ -0,0 +1,147 @@ +openapi: 3.0.0 +info: + title: Common Exception List Item Entry Attributes + version: 'not applicable' +paths: {} +components: + x-codegen-enabled: true + schemas: + ExceptionListItemEntryOperator: + type: string + enum: [excluded, included] + + ExceptionListItemEntryMatch: + type: object + properties: + type: + type: string + enum: [match] + field: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + value: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + operator: + $ref: '#/components/schemas/ExceptionListItemEntryOperator' + required: + - type + - field + - value + - operator + + ExceptionListItemEntryMatchAny: + type: object + properties: + type: + type: string + enum: [match_any] + field: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + value: + type: array + items: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + minItems: 1 + operator: + $ref: '#/components/schemas/ExceptionListItemEntryOperator' + required: + - type + - field + - value + - operator + + ExceptionListItemEntryList: + type: object + properties: + type: + type: string + enum: [list] + field: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + list: + type: object + properties: + id: + $ref: '../../../kbn-securitysolution-lists-common/api/model/list_common.schema.yaml#/components/schemas/ListId' + type: + $ref: '../../../kbn-securitysolution-lists-common/api/model/list_common.schema.yaml#/components/schemas/ListType' + required: [id, type] + operator: + $ref: '#/components/schemas/ExceptionListItemEntryOperator' + required: + - type + - field + - list + - operator + + ExceptionListItemEntryExists: + type: object + properties: + type: + type: string + enum: [exists] + field: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + operator: + $ref: '#/components/schemas/ExceptionListItemEntryOperator' + required: + - type + - field + - operator + + ExceptionListItemEntryNestedEntryItem: + oneOf: + - $ref: '#/components/schemas/ExceptionListItemEntryMatch' + - $ref: '#/components/schemas/ExceptionListItemEntryMatchAny' + - $ref: '#/components/schemas/ExceptionListItemEntryExists' + + ExceptionListItemEntryNested: + type: object + properties: + type: + type: string + enum: [nested] + field: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + entries: + type: array + items: + $ref: '#/components/schemas/ExceptionListItemEntryNestedEntryItem' + minItems: 1 + required: + - type + - field + - entries + + ExceptionListItemEntryMatchWildcard: + type: object + properties: + type: + type: string + enum: [wildcard] + field: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + value: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + operator: + $ref: '#/components/schemas/ExceptionListItemEntryOperator' + required: + - type + - field + - value + - operator + + ExceptionListItemEntry: + discriminator: + propertyName: type + anyOf: + - $ref: '#/components/schemas/ExceptionListItemEntryMatch' + - $ref: '#/components/schemas/ExceptionListItemEntryMatchAny' + - $ref: '#/components/schemas/ExceptionListItemEntryList' + - $ref: '#/components/schemas/ExceptionListItemEntryExists' + - $ref: '#/components/schemas/ExceptionListItemEntryNested' + - $ref: '#/components/schemas/ExceptionListItemEntryMatchWildcard' + + ExceptionListItemEntryArray: + type: array + items: + $ref: '#/components/schemas/ExceptionListItemEntry' diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.gen.ts new file mode 100644 index 00000000000000..3fdb7c7473f08e --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.gen.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Get exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListId, + ExceptionListHumanId, + ExceptionNamespaceType, + ExceptionList, +} from '../model/exception_list_common.gen'; + +export type GetExceptionListRequestQuery = z.infer; +export const GetExceptionListRequestQuery = z.object({ + /** + * Either `id` or `list_id` must be specified + */ + id: ExceptionListId.optional(), + /** + * Either `id` or `list_id` must be specified + */ + list_id: ExceptionListHumanId.optional(), + namespace_type: ExceptionNamespaceType.optional().default('single'), +}); +export type GetExceptionListRequestQueryInput = z.input; + +export type GetExceptionListResponse = z.infer; +export const GetExceptionListResponse = ExceptionList; diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml new file mode 100644 index 00000000000000..f9dcf6ea511779 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list/read_exception_list.schema.yaml @@ -0,0 +1,71 @@ +openapi: 3.0.0 +info: + title: Get exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists: + get: + x-labels: [serverless, ess] + operationId: GetExceptionList + x-codegen-enabled: true + summary: Retrieves an exception list using its `id` or `list_id` field + tags: + - Exceptions API + parameters: + - name: id + in: query + required: false + description: Either `id` or `list_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListId' + - name: list_id + in: query + required: false + description: Either `id` or `list_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + - name: namespace_type + in: query + required: false + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: single + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list item not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.gen.ts new file mode 100644 index 00000000000000..5acf491245ce28 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.gen.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Get exception list item API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListItemId, + ExceptionListItemHumanId, + ExceptionNamespaceType, + ExceptionListItem, +} from '../model/exception_list_common.gen'; + +export type GetExceptionListItemRequestQuery = z.infer; +export const GetExceptionListItemRequestQuery = z.object({ + /** + * Either `id` or `item_id` must be specified + */ + id: ExceptionListItemId.optional(), + /** + * Either `id` or `item_id` must be specified + */ + item_id: ExceptionListItemHumanId.optional(), + namespace_type: ExceptionNamespaceType.optional().default('single'), +}); +export type GetExceptionListItemRequestQueryInput = z.input< + typeof GetExceptionListItemRequestQuery +>; + +export type GetExceptionListItemResponse = z.infer; +export const GetExceptionListItemResponse = ExceptionListItem; diff --git a/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml new file mode 100644 index 00000000000000..1ebad101251607 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/read_exception_list_item/read_exception_list_item.schema.yaml @@ -0,0 +1,71 @@ +openapi: 3.0.0 +info: + title: Get exception list item API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/items: + get: + x-labels: [serverless, ess] + operationId: GetExceptionListItem + x-codegen-enabled: true + summary: Gets an exception list item + tags: + - Exceptions API + parameters: + - name: id + in: query + required: false + description: Either `id` or `item_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemId' + - name: item_id + in: query + required: false + description: Either `id` or `item_id` must be specified + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemHumanId' + - name: namespace_type + in: query + required: false + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: single + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItem' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list item not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/summary_exception_list/summary_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/summary_exception_list/summary_exception_list.gen.ts new file mode 100644 index 00000000000000..166093ccbeb308 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/summary_exception_list/summary_exception_list.gen.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Get exception list summary API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListId, + ExceptionListHumanId, + ExceptionNamespaceType, +} from '../model/exception_list_common.gen'; + +export type GetExceptionListSummaryRequestQuery = z.infer< + typeof GetExceptionListSummaryRequestQuery +>; +export const GetExceptionListSummaryRequestQuery = z.object({ + /** + * Exception list's identifier generated upon creation + */ + id: ExceptionListId.optional(), + /** + * Exception list's human readable identifier + */ + list_id: ExceptionListHumanId.optional(), + namespace_type: ExceptionNamespaceType.optional().default('single'), + /** + * Search filter clause + */ + filter: z.string().optional(), +}); +export type GetExceptionListSummaryRequestQueryInput = z.input< + typeof GetExceptionListSummaryRequestQuery +>; + +export type GetExceptionListSummaryResponse = z.infer; +export const GetExceptionListSummaryResponse = z.object({ + windows: z.number().int().min(0).optional(), + linux: z.number().int().min(0).optional(), + macos: z.number().int().min(0).optional(), + total: z.number().int().min(0).optional(), +}); diff --git a/packages/kbn-securitysolution-exceptions-common/api/summary_exception_list/summary_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/summary_exception_list/summary_exception_list.schema.yaml new file mode 100644 index 00000000000000..cc288ee524ff20 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/summary_exception_list/summary_exception_list.schema.yaml @@ -0,0 +1,90 @@ +openapi: 3.0.0 +info: + title: Get exception list summary API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/summary: + get: + x-labels: [serverless, ess] + operationId: GetExceptionListSummary + x-codegen-enabled: true + summary: Retrieves an exception list summary + tags: + - Exceptions API + parameters: + - name: id + in: query + required: false + description: Exception list's identifier generated upon creation + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListId' + - name: list_id + in: query + required: false + description: Exception list's human readable identifier + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + - name: namespace_type + in: query + required: false + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: single + - name: filter + in: query + required: false + description: Search filter clause + schema: + type: string + responses: + 200: + description: Successful response + content: + application/json: + schema: + type: object + properties: + windows: + type: integer + minimum: 0 + linux: + type: integer + minimum: 0 + macos: + type: integer + minimum: 0 + total: + type: integer + minimum: 0 + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.gen.ts new file mode 100644 index 00000000000000..8fb07606778739 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.gen.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Update exception list API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { + ExceptionListId, + ExceptionListHumanId, + ExceptionListName, + ExceptionListDescription, + ExceptionListType, + ExceptionNamespaceType, + ExceptionListOsTypeArray, + ExceptionListTags, + ExceptionListMeta, + ExceptionListVersion, + ExceptionList, +} from '../model/exception_list_common.gen'; + +export type UpdateExceptionListRequestBody = z.infer; +export const UpdateExceptionListRequestBody = z.object({ + id: ExceptionListId.optional(), + list_id: ExceptionListHumanId.optional(), + name: ExceptionListName, + description: ExceptionListDescription, + type: ExceptionListType, + namespace_type: ExceptionNamespaceType.optional().default('single'), + os_types: ExceptionListOsTypeArray.optional().default([]), + tags: ExceptionListTags.optional(), + meta: ExceptionListMeta.optional(), + version: ExceptionListVersion.optional(), + _version: z.string().optional(), +}); +export type UpdateExceptionListRequestBodyInput = z.input; + +export type UpdateExceptionListResponse = z.infer; +export const UpdateExceptionListResponse = ExceptionList; diff --git a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml new file mode 100644 index 00000000000000..af31f2af4273d6 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list/update_exception_list.schema.yaml @@ -0,0 +1,88 @@ +openapi: 3.0.0 +info: + title: Update exception list API endpoint + version: '2023-10-31' +paths: + /api/exception_lists: + put: + x-labels: [serverless, ess] + operationId: UpdateExceptionList + x-codegen-enabled: true + summary: Updates an exception list + tags: + - Exceptions API + requestBody: + description: Exception list's properties + required: true + content: + application/json: + schema: + type: object + properties: + id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListId' + list_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + name: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListName' + description: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListDescription' + type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListType' + namespace_type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: 'single' + os_types: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListOsTypeArray' + default: [] + tags: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListTags' + meta: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListMeta' + version: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListVersion' + _version: + type: string + required: + - name + - description + - type + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionList' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' diff --git a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.gen.ts b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.gen.ts new file mode 100644 index 00000000000000..963628a7be5c57 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.gen.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* + * NOTICE: Do not edit this file manually. + * This file is automatically generated by the OpenAPI Generator, @kbn/openapi-generator. + * + * info: + * title: Update exception list item API endpoint + * version: 2023-10-31 + */ + +import { z } from 'zod'; + +import { NonEmptyString } from '@kbn/openapi-common/schemas/primitives.gen'; +import { + ExceptionListItemId, + ExceptionListItemHumanId, + ExceptionListHumanId, + ExceptionListItemType, + ExceptionListItemName, + ExceptionListItemDescription, + ExceptionNamespaceType, + ExceptionListItemOsTypeArray, + ExceptionListItemTags, + ExceptionListItemMeta, + ExceptionListItem, +} from '../model/exception_list_common.gen'; +import { ExceptionListItemEntryArray } from '../model/exception_list_item_entry.gen'; + +export type UpdateExceptionListItemComment = z.infer; +export const UpdateExceptionListItemComment = z.object({ + id: NonEmptyString.optional(), + comment: NonEmptyString, +}); + +export type UpdateExceptionListItemCommentArray = z.infer< + typeof UpdateExceptionListItemCommentArray +>; +export const UpdateExceptionListItemCommentArray = z.array(UpdateExceptionListItemComment); + +export type UpdateExceptionListItemRequestBody = z.infer; +export const UpdateExceptionListItemRequestBody = z.object({ + /** + * Either `id` or `item_id` must be specified + */ + id: ExceptionListItemId.optional(), + /** + * Either `id` or `item_id` must be specified + */ + item_id: ExceptionListItemHumanId.optional(), + list_id: ExceptionListHumanId.optional(), + type: ExceptionListItemType, + name: ExceptionListItemName, + description: ExceptionListItemDescription, + entries: ExceptionListItemEntryArray, + namespace_type: ExceptionNamespaceType.optional().default('single'), + os_types: ExceptionListItemOsTypeArray.optional().default([]), + tags: ExceptionListItemTags.optional(), + meta: ExceptionListItemMeta.optional(), + expire_time: z.string().datetime().optional(), + comments: UpdateExceptionListItemCommentArray.optional().default([]), + _version: z.string().optional(), +}); +export type UpdateExceptionListItemRequestBodyInput = z.input< + typeof UpdateExceptionListItemRequestBody +>; + +export type UpdateExceptionListItemResponse = z.infer; +export const UpdateExceptionListItemResponse = ExceptionListItem; diff --git a/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml new file mode 100644 index 00000000000000..02ff5e2d017119 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/api/update_exception_list_item/update_exception_list_item.schema.yaml @@ -0,0 +1,117 @@ +openapi: 3.0.0 +info: + title: Update exception list item API endpoint + version: '2023-10-31' +paths: + /api/exception_lists/items: + put: + x-labels: [serverless, ess] + operationId: UpdateExceptionListItem + x-codegen-enabled: true + summary: Updates an exception list item + tags: + - Exceptions API + requestBody: + description: Exception list item's properties + required: true + content: + application/json: + schema: + type: object + properties: + id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemId' + description: Either `id` or `item_id` must be specified + item_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemHumanId' + description: Either `id` or `item_id` must be specified + list_id: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListHumanId' + type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemType' + name: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemName' + description: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemDescription' + entries: + $ref: '../model/exception_list_item_entry.schema.yaml#/components/schemas/ExceptionListItemEntryArray' + namespace_type: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionNamespaceType' + default: 'single' + os_types: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemOsTypeArray' + default: [] + tags: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemTags' + meta: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItemMeta' + expire_time: + type: string + format: date-time + comments: + $ref: '#/components/schemas/UpdateExceptionListItemCommentArray' + default: [] + _version: + type: string + required: + - type + - name + - description + - entries + responses: + 200: + description: Successful response + content: + application/json: + schema: + $ref: '../model/exception_list_common.schema.yaml#/components/schemas/ExceptionListItem' + 400: + description: Invalid input data response + content: + application/json: + schema: + oneOf: + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + - $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 401: + description: Unsuccessful authentication response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 403: + description: Not enough privileges response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/PlatformErrorResponse' + 404: + description: Exception list item not found response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + 500: + description: Internal server error response + content: + application/json: + schema: + $ref: '../../../kbn-openapi-common/schemas/error_responses.schema.yaml#/components/schemas/SiemErrorResponse' + +components: + x-codegen-enabled: true + schemas: + UpdateExceptionListItemComment: + type: object + properties: + id: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + comment: + $ref: '../../../kbn-openapi-common/schemas/primitives.schema.yaml#/components/schemas/NonEmptyString' + required: + - comment + + UpdateExceptionListItemCommentArray: + type: array + items: + $ref: '#/components/schemas/UpdateExceptionListItemComment' diff --git a/packages/kbn-securitysolution-exceptions-common/kibana.jsonc b/packages/kbn-securitysolution-exceptions-common/kibana.jsonc new file mode 100644 index 00000000000000..ff47bd8f5a585c --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/securitysolution-exceptions-common", + "owner": "@elastic/security-detection-engine" +} diff --git a/packages/kbn-securitysolution-exceptions-common/package.json b/packages/kbn-securitysolution-exceptions-common/package.json new file mode 100644 index 00000000000000..083d081d501fa6 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/package.json @@ -0,0 +1,10 @@ +{ + "description": "Security Solution Exceptions common package", + "license": "SSPL-1.0 OR Elastic License 2.0", + "name": "@kbn/securitysolution-exceptions-common", + "private": true, + "version": "1.0.0", + "scripts": { + "openapi:generate": "node scripts/openapi_generate" + } +} diff --git a/packages/kbn-securitysolution-exceptions-common/scripts/openapi_generate.js b/packages/kbn-securitysolution-exceptions-common/scripts/openapi_generate.js new file mode 100644 index 00000000000000..9dd381501dc2b6 --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/scripts/openapi_generate.js @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +require('../../../src/setup_node_env'); +const { join, resolve } = require('path'); +const { generate } = require('@kbn/openapi-generator'); +const { REPO_ROOT } = require('@kbn/repo-info'); + +const ROOT = resolve(__dirname, '..'); + +(async () => { + await generate({ + title: 'OpenAPI Exceptions API Schemas', + rootDir: ROOT, + sourceGlob: './**/*.schema.yaml', + templateName: 'zod_operation_schema', + }); + + await generate({ + title: 'Exceptions API client for tests', + rootDir: ROOT, + sourceGlob: './**/*.schema.yaml', + templateName: 'api_client_supertest', + skipLinting: true, + bundle: { + outFile: join( + REPO_ROOT, + 'x-pack/test/api_integration/services/security_solution_exceptions_api.gen.ts' + ), + }, + }); +})(); diff --git a/packages/kbn-securitysolution-exceptions-common/tsconfig.json b/packages/kbn-securitysolution-exceptions-common/tsconfig.json new file mode 100644 index 00000000000000..96bc2e233e73ea --- /dev/null +++ b/packages/kbn-securitysolution-exceptions-common/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "outDir": "target/types", + "types": ["jest", "node"] + }, + "exclude": ["target/**/*"], + "extends": "../../tsconfig.base.json", + "include": ["**/*.ts"], + "kbn_references": [ + "@kbn/openapi-common", + "@kbn/zod-helpers", + "@kbn/securitysolution-lists-common" + ] +} diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/index.ts index 2f82690bbecd6c..7e51e6be46d78b 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/index.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/request/index.ts @@ -39,7 +39,6 @@ export * from './read_list_schema'; export * from './summary_exception_list_schema'; export * from './update_endpoint_list_item_schema'; export * from './update_exception_list_item_schema'; -export * from './update_exception_list_item_validation'; export * from './update_exception_list_schema'; export * from './update_list_item_schema'; export * from './update_list_schema'; diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts index bb6ae55c0f037e..b998a1695712d7 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_schema/index.ts @@ -7,9 +7,9 @@ */ import * as t from 'io-ts'; +import { ExceptionListItemEntryArray } from '@kbn/securitysolution-exceptions-common/api'; import { NamespaceType } from '../../common/default_namespace'; import { DefaultUpdateCommentsArray } from '../../common/default_update_comments_array'; -import { EntriesArray } from '../../common/entries'; import { exceptionListItemType } from '../../common/exception_list_item_type'; import { nonEmptyEntriesArray } from '../../common/non_empty_entries_array'; import { OsTypeArray, osTypeArrayOrUndefined } from '../../common/os_type'; @@ -57,7 +57,7 @@ export type UpdateExceptionListItemSchemaDecoded = Omit< > & { comments: UpdateCommentsArray; tags: Tags; - entries: EntriesArray; + entries: ExceptionListItemEntryArray; namespace_type: NamespaceType; os_types: OsTypeArray; expire_time: ExpireTimeOrUndefined; diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.test.ts deleted file mode 100644 index fea25b1ca8a21d..00000000000000 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { validateComments } from '.'; -import { getUpdateExceptionListItemSchemaMock } from '../update_exception_list_item_schema/index.mock'; - -describe('update_exception_list_item_validation', () => { - describe('#validateComments', () => { - test('it returns no errors if comments is undefined', () => { - const payload = getUpdateExceptionListItemSchemaMock(); - delete payload.comments; - const output = validateComments(payload); - - expect(output).toEqual([]); - }); - - test('it returns no errors if new comments are append only', () => { - const payload = getUpdateExceptionListItemSchemaMock(); - payload.comments = [ - { comment: 'Im an old comment', id: '1' }, - { comment: 'Im a new comment' }, - ]; - const output = validateComments(payload); - - expect(output).toEqual([]); - }); - - test('it returns error if comments are not append only', () => { - const payload = getUpdateExceptionListItemSchemaMock(); - payload.comments = [ - { comment: 'Im an old comment', id: '1' }, - { comment: 'Im a new comment modifying the order of existing comments' }, - { comment: 'Im an old comment', id: '2' }, - ]; - const output = validateComments(payload); - - expect(output).toEqual(['item "comments" are append only']); - }); - }); -}); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts deleted file mode 100644 index 72c418eb913a22..00000000000000 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/update_exception_list_item_validation/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { UpdateExceptionListItemSchema } from '../update_exception_list_item_schema'; - -export const validateComments = (item: UpdateExceptionListItemSchema): string[] => { - if (item.comments == null) { - return []; - } - - const [appendOnly] = item.comments.reduce( - (acc, comment) => { - const [, hasNewComments] = acc; - if (comment.id == null) { - return [true, true]; - } - - if (hasNewComments && comment.id != null) { - return [false, true]; - } - - return acc; - }, - [true, false] - ); - if (!appendOnly) { - return ['item "comments" are append only']; - } else { - return []; - } -}; - -export const updateExceptionListItemValidate = ( - schema: UpdateExceptionListItemSchema -): string[] => { - return [...validateComments(schema)]; -}; diff --git a/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json b/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json index 124e310f10465e..706aa6e81fc59d 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json +++ b/packages/kbn-securitysolution-io-ts-list-types/tsconfig.json @@ -2,23 +2,17 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "target/types", - "types": [ - "jest", - "node" - ] + "types": ["jest", "node"] }, - "include": [ - "**/*.ts" - ], + "include": ["**/*.ts"], "kbn_references": [ "@kbn/securitysolution-io-ts-types", "@kbn/securitysolution-io-ts-utils", "@kbn/securitysolution-list-constants", "@kbn/es-query", "@kbn/core-http-browser", - "@kbn/core-notifications-browser" + "@kbn/core-notifications-browser", + "@kbn/securitysolution-exceptions-common" ], - "exclude": [ - "target/**/*", - ] + "exclude": ["target/**/*"] } diff --git a/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.gen.ts b/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.gen.ts index 6288ece0cf179b..adc9574833813d 100644 --- a/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.gen.ts +++ b/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.gen.ts @@ -30,7 +30,7 @@ export const FindListItemsFilter = z.string(); export type FindListItemsRequestQuery = z.infer; export const FindListItemsRequestQuery = z.object({ /** - * List's ide + * List's id */ list_id: ListId, /** diff --git a/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.schema.yaml b/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.schema.yaml index 67df0f4e8d031b..f08b2d1c6c0cd5 100644 --- a/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.schema.yaml +++ b/packages/kbn-securitysolution-lists-common/api/find_list_item/find_list_item.schema.yaml @@ -15,7 +15,7 @@ paths: - name: list_id in: query required: true - description: List's ide + description: List's id schema: $ref: '../model/list_common.schema.yaml#/components/schemas/ListId' - name: page diff --git a/packages/kbn-securitysolution-lists-common/scripts/openapi_generate.js b/packages/kbn-securitysolution-lists-common/scripts/openapi_generate.js index 8580994b16859c..49bd2860befd61 100644 --- a/packages/kbn-securitysolution-lists-common/scripts/openapi_generate.js +++ b/packages/kbn-securitysolution-lists-common/scripts/openapi_generate.js @@ -7,8 +7,9 @@ */ require('../../../src/setup_node_env'); -const { resolve } = require('path'); +const { join, resolve } = require('path'); const { generate } = require('@kbn/openapi-generator'); +const { REPO_ROOT } = require('@kbn/repo-info'); const ROOT = resolve(__dirname, '..'); @@ -19,4 +20,18 @@ const ROOT = resolve(__dirname, '..'); sourceGlob: './**/*.schema.yaml', templateName: 'zod_operation_schema', }); + + await generate({ + title: 'Lists API client for tests', + rootDir: ROOT, + sourceGlob: './**/*.schema.yaml', + templateName: 'api_client_supertest', + skipLinting: true, + bundle: { + outFile: join( + REPO_ROOT, + 'x-pack/test/api_integration/services/security_solution_lists_api.gen.ts' + ), + }, + }); })(); diff --git a/packages/kbn-test/src/auth/session_manager.ts b/packages/kbn-test/src/auth/session_manager.ts index 1783c3f389aa1f..40beccdfc3c6c1 100644 --- a/packages/kbn-test/src/auth/session_manager.ts +++ b/packages/kbn-test/src/auth/session_manager.ts @@ -146,7 +146,7 @@ export class SamlSessionManager { return { Cookie: `sid=${session.getCookieValue()}` }; } - async getSessionCookieForRole(role: string) { + async getInteractiveUserSessionCookieWithRoleScope(role: string) { const session = await this.getSessionByRole(role); return session.getCookieValue(); } diff --git a/packages/kbn-test/src/auth/sesson_manager.test.ts b/packages/kbn-test/src/auth/sesson_manager.test.ts index df037ebdf04e48..1f04620584507a 100644 --- a/packages/kbn-test/src/auth/sesson_manager.test.ts +++ b/packages/kbn-test/src/auth/sesson_manager.test.ts @@ -73,7 +73,9 @@ describe('SamlSessionManager', () => { test(`'getSessionCookieForRole' should return the actual cookie value`, async () => { const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); - const cookie = await samlSessionManager.getSessionCookieForRole(roleViewer); + const cookie = await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope( + roleViewer + ); expect(cookie).toBe(cookieInstance.value); }); @@ -85,9 +87,9 @@ describe('SamlSessionManager', () => { test(`'getSessionCookieForRole' should call 'createLocalSAMLSession' only once for the same role`, async () => { const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); - await samlSessionManager.getSessionCookieForRole(roleViewer); - await samlSessionManager.getSessionCookieForRole(roleEditor); - await samlSessionManager.getSessionCookieForRole(roleViewer); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleViewer); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleEditor); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleViewer); expect(createLocalSAMLSessionMock.mock.calls).toHaveLength(2); expect(createCloudSAMLSessionMock.mock.calls).toHaveLength(0); }); @@ -120,9 +122,9 @@ describe('SamlSessionManager', () => { ', ' )}. Update roles resource file in ${SERVERLESS_ROLES_ROOT_PATH} to enable it for testing`; const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); - await expect(samlSessionManager.getSessionCookieForRole(nonExistingRole)).rejects.toThrow( - expectedErrorMessage - ); + await expect( + samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(nonExistingRole) + ).rejects.toThrow(expectedErrorMessage); await expect(samlSessionManager.getApiCredentialsForRole(nonExistingRole)).rejects.toThrow( expectedErrorMessage ); @@ -148,7 +150,7 @@ describe('SamlSessionManager', () => { log, isCloud, }); - await samlSessionManager.getSessionCookieForRole(nonExistingRole); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(nonExistingRole); await samlSessionManager.getApiCredentialsForRole(nonExistingRole); await samlSessionManager.getUserData(nonExistingRole); expect(createLocalSAMLSessionMock.mock.calls).toHaveLength(1); @@ -198,7 +200,9 @@ describe('SamlSessionManager', () => { log, isCloud, }); - await expect(samlSessionManager.getSessionCookieForRole(roleViewer)).rejects.toThrow( + await expect( + samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleViewer) + ).rejects.toThrow( 'SAML Authentication requires TEST_CLOUD_HOST_NAME env variable to be set' ); }); @@ -227,7 +231,9 @@ describe('SamlSessionManager', () => { test(`'getSessionCookieForRole' should return the actual cookie value`, async () => { const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); createCloudSAMLSessionMock.mockResolvedValue(new Session(cloudCookieInstance, cloudEmail)); - const cookie = await samlSessionManager.getSessionCookieForRole(roleViewer); + const cookie = await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope( + roleViewer + ); expect(cookie).toBe(cloudCookieInstance.value); }); @@ -239,9 +245,9 @@ describe('SamlSessionManager', () => { test(`'getSessionCookieForRole' should call 'createCloudSAMLSession' only once for the same role`, async () => { const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); - await samlSessionManager.getSessionCookieForRole(roleViewer); - await samlSessionManager.getSessionCookieForRole(roleEditor); - await samlSessionManager.getSessionCookieForRole(roleViewer); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleViewer); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleEditor); + await samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(roleViewer); expect(createLocalSAMLSessionMock.mock.calls).toHaveLength(0); expect(createCloudSAMLSessionMock.mock.calls).toHaveLength(2); }); @@ -274,9 +280,9 @@ describe('SamlSessionManager', () => { ', ' )}. Update roles resource file in ${SERVERLESS_ROLES_ROOT_PATH} to enable it for testing`; const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); - await expect(samlSessionManager.getSessionCookieForRole(nonExistingRole)).rejects.toThrow( - expectedErrorMessage - ); + await expect( + samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(nonExistingRole) + ).rejects.toThrow(expectedErrorMessage); await expect(samlSessionManager.getApiCredentialsForRole(nonExistingRole)).rejects.toThrow( expectedErrorMessage ); @@ -293,9 +299,9 @@ describe('SamlSessionManager', () => { log, isCloud, }); - await expect(samlSessionManager.getSessionCookieForRole(nonExistingRole)).rejects.toThrow( - `User with '${nonExistingRole}' role is not defined` - ); + await expect( + samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(nonExistingRole) + ).rejects.toThrow(`User with '${nonExistingRole}' role is not defined`); await expect(samlSessionManager.getApiCredentialsForRole(nonExistingRole)).rejects.toThrow( `User with '${nonExistingRole}' role is not defined` ); @@ -308,9 +314,9 @@ describe('SamlSessionManager', () => { test(`throws error when credentials are not specified for the role`, async () => { const noCredentialsRole = 'admin'; const samlSessionManager = new SamlSessionManager(samlSessionManagerOptions); - await expect(samlSessionManager.getSessionCookieForRole(noCredentialsRole)).rejects.toThrow( - `User with '${noCredentialsRole}' role is not defined` - ); + await expect( + samlSessionManager.getInteractiveUserSessionCookieWithRoleScope(noCredentialsRole) + ).rejects.toThrow(`User with '${noCredentialsRole}' role is not defined`); await expect(samlSessionManager.getApiCredentialsForRole(noCredentialsRole)).rejects.toThrow( `User with '${noCredentialsRole}' role is not defined` ); diff --git a/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts b/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts index 12e3bfc56d9803..f15fb0035d6709 100644 --- a/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts +++ b/packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts @@ -128,6 +128,7 @@ const STANDARD_LIST_TYPES = [ 'fleet-fleet-server-host', 'fleet-proxy', 'fleet-uninstall-tokens', + 'fleet-space-settings', ]; /** diff --git a/packages/kbn-text-based-editor/src/ecs_metadata_helper.test.ts b/packages/kbn-text-based-editor/src/ecs_metadata_helper.test.ts new file mode 100644 index 00000000000000..2dc2637fa98105 --- /dev/null +++ b/packages/kbn-text-based-editor/src/ecs_metadata_helper.test.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { getColumnsWithMetadata } from './ecs_metadata_helper'; +import type { DatatableColumnType } from '@kbn/expressions-plugin/common'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; + +describe('getColumnsWithMetadata', () => { + it('should return original columns if fieldsMetadata is not provided', async () => { + const columns = [ + { name: 'ecs.version', type: 'string' as DatatableColumnType }, + { name: 'field1', type: 'string' as DatatableColumnType }, + { name: 'field2', type: 'number' as DatatableColumnType }, + ]; + + const result = await getColumnsWithMetadata(columns); + expect(result).toEqual(columns); + }); + + it('should return columns with metadata if ECS version field is present', async () => { + const columns = [ + { name: 'ecs.version', type: 'string' as DatatableColumnType }, + { name: 'field2', type: 'number' as DatatableColumnType }, + ]; + const fieldsMetadata = { + getClient: jest.fn().mockResolvedValue({ + find: jest.fn().mockResolvedValue({ + fields: { + 'ecs.version': { description: 'ECS version field', type: 'keyword' }, + 'ecs.field': { description: 'ECS field description', type: 'keyword' }, + }, + }), + }), + } as unknown as FieldsMetadataPublicStart; + + const result = await getColumnsWithMetadata(columns, fieldsMetadata); + + expect(result).toEqual([ + { + name: 'ecs.version', + type: 'string', + metadata: { description: 'ECS version field' }, + }, + { name: 'field2', type: 'number' }, + ]); + }); + + it('should handle keyword suffix correctly', async () => { + const columns = [ + { name: 'ecs.version', type: 'string' as DatatableColumnType }, + { name: 'ecs.version.keyword', type: 'string' as DatatableColumnType }, + { name: 'field2', type: 'number' as DatatableColumnType }, + ]; + const fieldsMetadata = { + getClient: jest.fn().mockResolvedValue({ + find: jest.fn().mockResolvedValue({ + fields: { + 'ecs.version': { description: 'ECS version field', type: 'keyword' }, + }, + }), + }), + } as unknown as FieldsMetadataPublicStart; + + const result = await getColumnsWithMetadata(columns, fieldsMetadata); + + expect(result).toEqual([ + { name: 'ecs.version', type: 'string', metadata: { description: 'ECS version field' } }, + { + name: 'ecs.version.keyword', + type: 'string', + metadata: { description: 'ECS version field' }, + }, + { name: 'field2', type: 'number' }, + ]); + }); +}); diff --git a/packages/kbn-text-based-editor/src/ecs_metadata_helper.ts b/packages/kbn-text-based-editor/src/ecs_metadata_helper.ts new file mode 100644 index 00000000000000..687999350be0e3 --- /dev/null +++ b/packages/kbn-text-based-editor/src/ecs_metadata_helper.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ESQLRealField } from '@kbn/esql-validation-autocomplete'; +import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; +import { chunk } from 'lodash'; + +const removeKeywordSuffix = (name: string) => { + return name.endsWith('.keyword') ? name.slice(0, -8) : name; +}; + +/** + * Returns columns with the metadata/description (e.g ECS info) + * if available + * + * @param columns + * @param fieldsMetadata + * @returns + */ +export async function getColumnsWithMetadata( + columns: Array>, + fieldsMetadata?: FieldsMetadataPublicStart +): Promise { + if (!fieldsMetadata) return columns; + + try { + const fieldsMetadataClient = await fieldsMetadata?.getClient(); + if (fieldsMetadataClient) { + const fields = await fieldsMetadataClient.find({ + fieldNames: columns.map((c) => c.name), + attributes: ['description', 'type'], + }); + + if (fields?.fields) { + return columns.map((c) => { + // Metadata services gives description for + // 'ecs.version' but not 'ecs.version.keyword' + // but both should show description if available + const metadata = fields.fields[removeKeywordSuffix(c.name)]; + + // Need to convert metadata's type (e.g. keyword) to ES|QL type (e.g. string) to check if they are the same + if ( + !metadata || + (metadata?.type && esFieldTypeToKibanaFieldType(metadata.type) !== c.type) + ) + return c; + return { + ...c, + metadata: { description: metadata.description }, + }; + }); + } + } + } catch (error) { + // eslint-disable-next-line no-console + console.error('Unable to fetch field metadata', error); + } + return columns; +} +/** + * Returns columns with the metadata/description (e.g ECS info) + * if available. Safely partition the requests to avoid 400 payload too big errors. + * + * @param columns + * @param fieldsMetadata + * @returns + */ +export async function getRateLimitedColumnsWithMetadata( + columns: Array>, + fieldsMetadata?: FieldsMetadataPublicStart, + maxFieldsPerRequest = 250, + maxConcurrentRequests = 10 +): Promise { + if (!fieldsMetadata) return columns; + + try { + // Chunking requests here since we are calling fieldsMetadata.find with list of fields, + // and we need to make sure payload is not too big, or else get 400 error + const chunkedColumns = chunk(columns, maxFieldsPerRequest); + const result: Array> = []; + // Also only make max of n at a time to avoid too many concurrent requests + for (let i = 0; i < chunkedColumns.length; i += maxConcurrentRequests) { + const cols = chunkedColumns.slice(i, i + maxConcurrentRequests); + const chunkResult = await Promise.allSettled( + cols.map((c) => getColumnsWithMetadata(c, fieldsMetadata)) + ); + result.push(...chunkResult); + } + + return result.flatMap((r, idx) => (r.status === 'fulfilled' ? r.value : chunkedColumns[idx])); + } catch (error) { + // eslint-disable-next-line no-console + console.error('Unable to fetch field metadata', error); + } + return columns; +} diff --git a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx index fae00e8e8d1b0a..6f551e0888bc3c 100644 --- a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx +++ b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx @@ -877,6 +877,39 @@ export const functions = { ROW y=12.9, x=.6 | EVAL atan2=ATAN2(y, x) \`\`\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + ignoreTag: true, + } + )} + /> + ), + }, + // Do not edit manually... automatically generated by scripts/generate_esql_docs.ts + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.avg', + { + defaultMessage: 'AVG', + } + ), + description: ( + + + ### AVG + The average of a numeric field. + + \`\`\` + FROM employees + | STATS AVG(height) + \`\`\` `, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', @@ -1688,7 +1721,7 @@ export const functions = { --> ### LOCATE - Returns an integer that indicates the position of a keyword substring within another string + Returns an integer that indicates the position of a keyword substring within another string. \`\`\` row a = "hello" @@ -1800,6 +1833,72 @@ export const functions = { | EVAL message = CONCAT("'", message, "'") | EVAL color = CONCAT("'", color, "'") \`\`\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + ignoreTag: true, + } + )} + /> + ), + }, + // Do not edit manually... automatically generated by scripts/generate_esql_docs.ts + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.max', + { + defaultMessage: 'MAX', + } + ), + description: ( + + + ### MAX + The maximum value of a field. + + \`\`\` + FROM employees + | STATS MAX(languages) + \`\`\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + ignoreTag: true, + } + )} + /> + ), + }, + // Do not edit manually... automatically generated by scripts/generate_esql_docs.ts + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.min', + { + defaultMessage: 'MIN', + } + ), + description: ( + + + ### MIN + The minimum value of a field. + + \`\`\` + FROM employees + | STATS MIN(languages) + \`\`\` `, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', @@ -3024,7 +3123,7 @@ export const functions = { --> ### SUBSTRING - Returns a substring of a string, specified by a start position and an optional length + Returns a substring of a string, specified by a start position and an optional length. \`\`\` FROM employees diff --git a/packages/kbn-text-based-editor/src/overwrite.scss b/packages/kbn-text-based-editor/src/overwrite.scss index 7c66fe96e36cb4..692ed308869383 100644 --- a/packages/kbn-text-based-editor/src/overwrite.scss +++ b/packages/kbn-text-based-editor/src/overwrite.scss @@ -60,4 +60,4 @@ .TextBasedLangEditor--expanded .monaco-editor, .TextBasedLangEditor--expanded .monaco-editor .margin, .TextBasedLangEditor--expanded .monaco-editor .overflow-guard { border-top-left-radius: 0; border-bottom-left-radius: 0; -} \ No newline at end of file +} diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index 14767da922ed93..221e245fe936fe 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -23,6 +23,7 @@ import { getAggregateQueryMode, getLanguageDisplayName } from '@kbn/es-query'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import { i18n } from '@kbn/i18n'; import type { IndexManagementPluginSetup } from '@kbn/index-management'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { LanguageDocumentationPopover, @@ -56,6 +57,7 @@ import { EDITOR_MIN_HEIGHT, textBasedLanguageEditorStyles, } from './text_based_languages_editor.styles'; +import { getRateLimitedColumnsWithMetadata } from './ecs_metadata_helper'; import './overwrite.scss'; @@ -123,6 +125,7 @@ interface TextBasedEditorDeps { dataViews: DataViewsPublicPluginStart; expressions: ExpressionsStart; indexManagementApiService?: IndexManagementPluginSetup['apiService']; + fieldsMetadata?: FieldsMetadataPublicStart; } const MAX_COMPACT_VIEW_LENGTH = 250; @@ -167,8 +170,15 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const language = getAggregateQueryMode(query); const queryString: string = query[language] ?? ''; const kibana = useKibana(); - const { dataViews, expressions, indexManagementApiService, application, docLinks, core } = - kibana.services; + const { + dataViews, + expressions, + indexManagementApiService, + application, + docLinks, + core, + fieldsMetadata, + } = kibana.services; const timeZone = core?.uiSettings?.get('dateFormat:tz'); const [code, setCode] = useState(queryString ?? ''); const [codeOneLiner, setCodeOneLiner] = useState(null); @@ -430,7 +440,8 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ undefined, abortController ).result; - return table?.columns.map((c) => ({ name: c.name, type: c.meta.type })) || []; + const columns = table?.columns.map((c) => ({ name: c.name, type: c.meta.type })) || []; + return await getRateLimitedColumnsWithMetadata(columns, fieldsMetadata); } catch (e) { // no action yet } @@ -458,6 +469,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ expressions, abortController, indexManagementApiService, + fieldsMetadata, ]); const parseMessages = useCallback(async () => { diff --git a/packages/kbn-text-based-editor/tsconfig.json b/packages/kbn-text-based-editor/tsconfig.json index fcb296d4d086cf..632dd057534591 100644 --- a/packages/kbn-text-based-editor/tsconfig.json +++ b/packages/kbn-text-based-editor/tsconfig.json @@ -26,6 +26,9 @@ "@kbn/index-management", "@kbn/code-editor", "@kbn/shared-ux-markdown", + "@kbn/fields-metadata-plugin", + "@kbn/esql-validation-autocomplete", + "@kbn/field-types" ], "exclude": [ "target/**/*", diff --git a/packages/kbn-ui-shared-deps-npm/BUILD.bazel b/packages/kbn-ui-shared-deps-npm/BUILD.bazel index f2ff64942a9937..937cbe0c2a8ef3 100644 --- a/packages/kbn-ui-shared-deps-npm/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-npm/BUILD.bazel @@ -47,6 +47,7 @@ RUNTIME_DEPS = [ "@npm//@tanstack/react-query-devtools", "@npm//classnames", "@npm//fflate", + "@npm//fastest-levenshtein", "@npm//history", "@npm//jquery", "@npm//lodash", diff --git a/packages/kbn-ui-shared-deps-npm/webpack.config.js b/packages/kbn-ui-shared-deps-npm/webpack.config.js index 24085109d0d564..294bffdaaa8331 100644 --- a/packages/kbn-ui-shared-deps-npm/webpack.config.js +++ b/packages/kbn-ui-shared-deps-npm/webpack.config.js @@ -77,6 +77,7 @@ module.exports = (_, argv) => { '@tanstack/react-query-devtools', 'classnames', 'fflate', + 'fastest-levenshtein', 'history', 'io-ts', 'jquery', diff --git a/packages/kbn-ui-shared-deps-src/src/definitions.js b/packages/kbn-ui-shared-deps-src/src/definitions.js index 98c152403dcff6..6f7bff397d3201 100644 --- a/packages/kbn-ui-shared-deps-src/src/definitions.js +++ b/packages/kbn-ui-shared-deps-src/src/definitions.js @@ -61,6 +61,7 @@ const externals = { redux: '__kbnSharedDeps__.Redux', immer: '__kbnSharedDeps__.Immer', reselect: '__kbnSharedDeps__.Reselect', + 'fastest-levenshtein': '__kbnSharedDeps__.FastestLevenshtein', /** * big deps which are locked to a single version diff --git a/packages/kbn-ui-shared-deps-src/src/entry.js b/packages/kbn-ui-shared-deps-src/src/entry.js index a9d318721814be..53479529787801 100644 --- a/packages/kbn-ui-shared-deps-src/src/entry.js +++ b/packages/kbn-ui-shared-deps-src/src/entry.js @@ -31,6 +31,7 @@ export const ReactRouter = require('react-router'); export const ReactRouterDom = require('react-router-dom'); export const ReactRouterDomV5Compat = require('react-router-dom-v5-compat'); export const StyledComponents = require('styled-components'); +export const FastestLevenshtein = require('fastest-levenshtein'); Moment.tz.load(require('moment-timezone/data/packed/latest.json')); diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.ts b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.ts index 611397145b555a..b1653c8e263361 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.ts +++ b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.ts @@ -12,7 +12,7 @@ import { AdditionalFieldGroups, convertFieldsToFallbackFields } from '@kbn/unifi import { isEqual } from 'lodash'; import { useMemo } from 'react'; -export const MAX_COMPARISON_FIELDS = 100; +export const MAX_COMPARISON_FIELDS = 250; export interface UseComparisonFieldsProps { dataView: DataView; diff --git a/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/color_indicator_control_column.test.tsx b/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/color_indicator_control_column.test.tsx new file mode 100644 index 00000000000000..5d828c1132abbd --- /dev/null +++ b/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/color_indicator_control_column.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { EuiDataGridCellValueElementProps } from '@elastic/eui'; +import { getColorIndicatorControlColumn } from './color_indicator_control_column'; +import { dataTableContextMock } from '../../../../__mocks__/table_context'; +import { UnifiedDataTableContext } from '../../../table_context'; + +describe('ColorIndicatorControlColumn', () => { + const contextMock = { + ...dataTableContextMock, + }; + + it('should render the component', () => { + const getRowIndicator = jest.fn(() => ({ color: 'red', label: 'error' })); + const column = getColorIndicatorControlColumn({ + getRowIndicator, + }); + const ColorIndicatorControlColumn = + column.rowCellRender as React.FC; + mountWithIntl( + + + + ); + expect(getRowIndicator).toHaveBeenCalledWith(contextMock.rows[1], expect.any(Object)); + }); +}); diff --git a/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/color_indicator_control_column.tsx b/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/color_indicator_control_column.tsx new file mode 100644 index 00000000000000..dd9be4ab90d133 --- /dev/null +++ b/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/color_indicator_control_column.tsx @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useContext, useEffect } from 'react'; +import { css } from '@emotion/react'; +import { + EuiDataGridControlColumn, + useEuiTheme, + EuiThemeComputed, + EuiDataGridCellValueElementProps, +} from '@elastic/eui'; +import type { DataTableRecord } from '@kbn/discover-utils'; +import { UnifiedDataTableContext } from '../../../table_context'; + +const COLOR_INDICATOR_WIDTH = 4; + +interface ColorIndicatorCellParams { + rowIndex: EuiDataGridCellValueElementProps['rowIndex']; + setCellProps: EuiDataGridCellValueElementProps['setCellProps']; + getRowIndicator: ( + row: DataTableRecord, + euiTheme: EuiThemeComputed + ) => { color: string; label: string } | undefined; +} + +const ColorIndicatorCell: React.FC = ({ + rowIndex, + setCellProps, + getRowIndicator, +}) => { + const { euiTheme } = useEuiTheme(); + const { rows, expanded } = useContext(UnifiedDataTableContext); + const row = rows[rowIndex]; + const configuration = row ? getRowIndicator(row, euiTheme) : undefined; + const color = configuration?.color || 'transparent'; + const label = configuration?.label; + + useEffect(() => { + if (row.isAnchor) { + setCellProps({ + className: 'unifiedDataTable__cell--highlight', + }); + } else if (expanded && row && expanded.id === row.id) { + setCellProps({ + className: 'unifiedDataTable__cell--expanded', + }); + } else { + setCellProps({ className: '' }); + } + }, [expanded, row, setCellProps]); + + return ( +
+ ); +}; + +export interface ColorIndicatorControlColumnParams { + getRowIndicator: ColorIndicatorCellParams['getRowIndicator']; +} + +export const getColorIndicatorControlColumn = ({ + getRowIndicator, +}: ColorIndicatorControlColumnParams): EuiDataGridControlColumn => { + return { + id: 'colorIndicator', + width: COLOR_INDICATOR_WIDTH, + headerCellRender: () => { + return null; + }, + rowCellRender: ({ rowIndex, setCellProps }) => { + return ( + + ); + }, + }; +}; diff --git a/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/index.ts b/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/index.ts new file mode 100644 index 00000000000000..ebe0e386d49685 --- /dev/null +++ b/packages/kbn-unified-data-table/src/components/custom_control_columns/color_indicator/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { + getColorIndicatorControlColumn, + type ColorIndicatorControlColumnParams, +} from './color_indicator_control_column'; diff --git a/packages/kbn-unified-data-table/src/components/custom_control_columns/index.ts b/packages/kbn-unified-data-table/src/components/custom_control_columns/index.ts new file mode 100644 index 00000000000000..8ff889b66d9e54 --- /dev/null +++ b/packages/kbn-unified-data-table/src/components/custom_control_columns/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { + getColorIndicatorControlColumn, + type ColorIndicatorControlColumnParams, +} from './color_indicator'; diff --git a/packages/kbn-unified-data-table/src/components/data_table.scss b/packages/kbn-unified-data-table/src/components/data_table.scss index 4e56e3450ffcbe..cb00516ee63e6e 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.scss +++ b/packages/kbn-unified-data-table/src/components/data_table.scss @@ -60,6 +60,18 @@ padding-right: 0; } + .euiDataGridHeaderCell.euiDataGridHeaderCell--controlColumn[data-gridcell-column-id='colorIndicator'], + .euiDataGridRowCell.euiDataGridRowCell--controlColumn[data-gridcell-column-id='colorIndicator'] { + padding: 0; + border-left: 0; + border-right: 0; + } + .euiDataGridRowCell.euiDataGridRowCell--controlColumn[data-gridcell-column-id='colorIndicator'] .euiDataGridRowCell__content { + height: 100%; + padding: 0; + border-bottom: 0; + } + .euiDataGrid--rowHoverHighlight .euiDataGridRow:hover { background-color: tintOrShade($euiColorLightShade, 50%, 0); } diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index 88f13ac6688fac..e1bd33f7119495 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -846,4 +846,27 @@ describe('UnifiedDataTable', () => { expect(getFieldColumns()).toEqual(['@timestamp', '_index', 'bytes', 'extension', 'message']); }); }); + + describe('getRowIndicator', () => { + it('should render the color indicator control', async () => { + const component = await getComponent({ + ...getProps(), + getRowIndicator: jest.fn(() => ({ color: 'blue', label: 'test' })), + }); + + expect(findTestSubject(component, 'dataGridHeaderCell-colorIndicator').exists()).toBeTruthy(); + expect( + findTestSubject(component, 'unifiedDataTableRowColorIndicatorCell').first().prop('title') + ).toEqual('test'); + }); + + it('should not render the color indicator control by default', async () => { + const component = await getComponent({ + ...getProps(), + getRowIndicator: undefined, + }); + + expect(findTestSubject(component, 'dataGridHeaderCell-colorIndicator').exists()).toBeFalsy(); + }); + }); }); diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 07755e0e65769b..e52e8de117968f 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -86,6 +86,10 @@ import { CompareDocuments } from './compare_documents'; import { useFullScreenWatcher } from '../hooks/use_full_screen_watcher'; import { UnifiedDataTableRenderCustomToolbar } from './custom_toolbar/render_custom_toolbar'; import { getCustomCellPopoverRenderer } from '../utils/get_render_cell_popover'; +import { + getColorIndicatorControlColumn, + type ColorIndicatorControlColumnParams, +} from './custom_control_columns'; export type SortOrder = [string, string]; @@ -387,6 +391,11 @@ export interface UnifiedDataTableProps { * */ renderCellPopover?: EuiDataGridProps['renderCellPopover']; + /** + * When specified, this function will be called to determine the color of the row indicator. + * @param row + */ + getRowIndicator?: ColorIndicatorControlColumnParams['getRowIndicator']; } export const EuiDataGridMemoized = React.memo(EuiDataGrid); @@ -457,6 +466,7 @@ export const UnifiedDataTable = ({ enableComparisonMode, cellContext, renderCellPopover, + getRowIndicator, }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = services; @@ -851,10 +861,19 @@ export const UnifiedDataTable = ({ const internalControlColumns = getLeadControlColumns(canSetExpandedDoc).filter(({ id }) => controlColumnIds.includes(id) ); - return externalControlColumns + const leadingColumns = externalControlColumns ? [...internalControlColumns, ...externalControlColumns] : internalControlColumns; - }, [canSetExpandedDoc, controlColumnIds, externalControlColumns]); + + if (getRowIndicator) { + const colorIndicatorControlColumn = getColorIndicatorControlColumn({ + getRowIndicator, + }); + leadingColumns.unshift(colorIndicatorControlColumn); + } + + return leadingColumns; + }, [canSetExpandedDoc, controlColumnIds, externalControlColumns, getRowIndicator]); const controlColumnsConfig = customControlColumnsConfiguration?.({ controlColumns: getAllControlColumns(), diff --git a/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx index 8e86535f0bb85e..17d937b270d86e 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx +++ b/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx @@ -63,7 +63,9 @@ describe('UnifiedFieldList useFieldFilters()', () => { expect(result.current.fieldSearchHighlight).toBe('time'); expect(result.current.onFilterField).toBeDefined(); - expect(result.current.onFilterField!({ displayName: 'time test' } as DataViewField)).toBe(true); + expect( + result.current.onFilterField!({ displayName: 'time test', name: '' } as DataViewField) + ).toBe(true); expect(result.current.onFilterField!(dataView.getFieldByName('@timestamp')!)).toBe(true); expect(result.current.onFilterField!(dataView.getFieldByName('bytes')!)).toBe(false); }); @@ -86,14 +88,46 @@ describe('UnifiedFieldList useFieldFilters()', () => { expect(result.current.fieldSearchHighlight).toBe('message*me1'); expect(result.current.onFilterField).toBeDefined(); - expect(result.current.onFilterField!({ displayName: 'test' } as DataViewField)).toBe(false); - expect(result.current.onFilterField!({ displayName: 'message' } as DataViewField)).toBe(false); - expect(result.current.onFilterField!({ displayName: 'message.name1' } as DataViewField)).toBe( - true + expect(result.current.onFilterField!({ displayName: 'test', name: '' } as DataViewField)).toBe( + false ); + expect( + result.current.onFilterField!({ displayName: 'message', name: '' } as DataViewField) + ).toBe(false); + expect( + result.current.onFilterField!({ displayName: 'message.name1', name: '' } as DataViewField) + ).toBe(true); expect(result.current.onFilterField!({ name: 'messagename10' } as DataViewField)).toBe(false); expect(result.current.onFilterField!({ name: 'message.test' } as DataViewField)).toBe(false); }); + it('should update correctly on search by name with a typo', async () => { + const props: FieldFiltersParams = { + allFields: dataView.fields, + services: mockedServices, + }; + const { result } = renderHook(useFieldFilters, { + initialProps: props, + }); + + expect(result.current.fieldSearchHighlight).toBe(''); + expect(result.current.onFilterField).toBeUndefined(); + + act(() => { + result.current.fieldListFiltersProps.onChangeNameFilter('messsge'); + }); + + expect(result.current.fieldSearchHighlight).toBe('messsge'); + expect(result.current.onFilterField).toBeDefined(); + expect(result.current.onFilterField!({ displayName: 'test', name: '' } as DataViewField)).toBe( + false + ); + expect( + result.current.onFilterField!({ displayName: 'message', name: '' } as DataViewField) + ).toBe(true); + expect( + result.current.onFilterField!({ displayName: 'message.name1', name: '' } as DataViewField) + ).toBe(true); + }); it('should update correctly on filter by type', async () => { const props: FieldFiltersParams = { diff --git a/packages/presentation/presentation_publishing/comparators/state_comparators.ts b/packages/presentation/presentation_publishing/comparators/state_comparators.ts index 05896589063386..9506984464718d 100644 --- a/packages/presentation/presentation_publishing/comparators/state_comparators.ts +++ b/packages/presentation/presentation_publishing/comparators/state_comparators.ts @@ -28,7 +28,7 @@ export const runComparators = ( lastSavedState: StateType | undefined, latestState: Partial ) => { - if (!lastSavedState) { + if (!lastSavedState || Object.keys(latestState).length === 0) { // if we have no last saved state, everything is considered a change return latestState; } diff --git a/packages/serverless/settings/observability_project/index.ts b/packages/serverless/settings/observability_project/index.ts index 0374fc9a6b6e86..00d9d7b6d544f8 100644 --- a/packages/serverless/settings/observability_project/index.ts +++ b/packages/serverless/settings/observability_project/index.ts @@ -32,5 +32,5 @@ export const OBSERVABILITY_PROJECT_SETTINGS = [ settings.OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID, settings.OBSERVABILITY_APM_ENABLE_TABLE_SEARCH_BAR, settings.OBSERVABILITY_APM_ENABLE_SERVICE_INVENTORY_TABLE_SEARCH_BAR, - settings.OBSERVABILITY_APM_ENABLE_MULTI_SIGNAL, + settings.OBSERVABILITY_ENTITY_CENTRIC_EXPERIENCE, ]; diff --git a/renovate.json b/renovate.json index 2da4773622aac9..5e8cc3ca6e340e 100644 --- a/renovate.json +++ b/renovate.json @@ -407,6 +407,14 @@ "matchBaseBranches": ["main"], "labels": ["Team: Cloud Security", "release_note:skip", "backport:skip"], "enabled": true + }, + { + "groupName": "re2js", + "matchDepNames": ["re2js"], + "reviewers": ["team:visualizations", "dej611"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:all-open", "Team:Visualizations"], + "enabled": true } ] } diff --git a/scripts/download_re2.sh b/scripts/download_re2.sh deleted file mode 100755 index e7b419baa8157a..00000000000000 --- a/scripts/download_re2.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -args=("$@") -re2_version=${args[0]} - -if [ -z "$re2_version" ]; then - echo "Usage: ./download_re2.sh [re2_version]" - exit 1 -fi - -archs=( - "darwin-arm64" - "darwin-x64" - "linux-musl-x64" - "linux-x64" - "win32-x64" -) -node_api_versions=( 108 115 ) -formats=( "br" "gz" ) - -echo "Downloading builds of re2 version ${re2_version} to /tmp/re2" -mkdir /tmp/re2 - -for node_api_version in "${node_api_versions[@]}"; do - echo " Node.js API version ${node_api_version}" - - for arch in "${archs[@]}"; do - for format in "${formats[@]}"; do - url="https://github.com/uhop/node-re2/releases/download/${re2_version}/${arch}-${node_api_version}.${format}" - echo " ${url}" - (cd /tmp/re2 && curl -s -L -O "${url}") - done - done -done - -echo -echo "Calculating shasums for downloaded artifacts..." -echo -shasum -a 256 /tmp/re2/* diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 51c06947d224b9..84cdfb9217adf9 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -104,6 +104,7 @@ describe('checking migration metadata changes on all registered SO types', () => "fleet-preconfiguration-deletion-record": "c52ea1e13c919afe8a5e8e3adbb7080980ecc08e", "fleet-proxy": "6cb688f0d2dd856400c1dbc998b28704ff70363d", "fleet-setup-lock": "0dc784792c79b5af5a6e6b5dcac06b0dbaa90bde", + "fleet-space-settings": "b278e82a33978900e53a1253884b5bdbd929c9bb", "fleet-uninstall-tokens": "ed8aa37e3cdd69e4360709e64944bb81cae0c025", "graph-workspace": "5cc6bb1455b078fd848c37324672163f09b5e376", "guided-onboarding-guide-state": "d338972ed887ac480c09a1a7fbf582d6a3827c91", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index 2228b19956bb3f..8d0670b9770919 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -72,6 +72,7 @@ const previouslyRegisteredTypes = [ 'fleet-proxy', 'fleet-uninstall-tokens', 'fleet-setup-lock', + 'fleet-space-settings', 'graph-workspace', 'guided-setup-state', 'guided-onboarding-guide-state', diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 826ac703d40c62..13321fb92367b4 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -83,7 +83,7 @@ export function pluginInitializerContextConfigMock(config: T) { return mock; } -type PluginInitializerContextMock = Omit, 'config'> & { +export type PluginInitializerContextMock = Omit, 'config'> & { config: MockedPluginInitializerConfig; }; diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index 9e8fa29979cf5f..ad9707a433dc50 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -107,7 +107,6 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions */ if (options.createPlatformFolders) { await run(Tasks.CreateArchivesSources); - await run(Tasks.PatchNativeModules); await run(Tasks.InstallChromium); await run(Tasks.CopyBinScripts); await run(Tasks.CleanNodeBuilds); diff --git a/src/dev/build/tasks/bin/scripts/kibana-setup.bat b/src/dev/build/tasks/bin/scripts/kibana-setup.bat index 518e9c08728d28..6fee4a60ea0cd3 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-setup.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-setup.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV=production If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/bin/scripts/kibana.bat b/src/dev/build/tasks/bin/scripts/kibana.bat index ce0a0976a2267c..80040138cd84cd 100755 --- a/src/dev/build/tasks/bin/scripts/kibana.bat +++ b/src/dev/build/tasks/bin/scripts/kibana.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV=production If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/index.ts b/src/dev/build/tasks/index.ts index e62c09e637d6a2..4c279865c262df 100644 --- a/src/dev/build/tasks/index.ts +++ b/src/dev/build/tasks/index.ts @@ -25,7 +25,6 @@ export * from './nodejs'; export * from './notice_file_task'; export * from './os_packages'; export * from './package_json'; -export * from './patch_native_modules_task'; export * from './assert_file_time'; export * from './assert_no_uuid'; export * from './assert_path_length'; diff --git a/src/dev/build/tasks/install_dependencies_task.ts b/src/dev/build/tasks/install_dependencies_task.ts index 0eebadec5ca791..e5cc5e26ea37f6 100644 --- a/src/dev/build/tasks/install_dependencies_task.ts +++ b/src/dev/build/tasks/install_dependencies_task.ts @@ -31,10 +31,6 @@ export const InstallDependencies: Task = { ], { cwd: build.resolvePath(), - env: { - RE2_DOWNLOAD_MIRROR: - 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2', - }, } ); }, diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index a8daba08d37b4e..0195825313b57e 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -156,6 +156,7 @@ RUN /usr/bin/echo -e '\n--enable-fips' >> config/node.options RUN /usr/bin/echo '--openssl-config=/usr/share/kibana/config/nodejs.cnf' >> config/node.options COPY --chown=1000:0 openssl/nodejs.cnf "/usr/share/kibana/config/nodejs.cnf" ENV OPENSSL_MODULES=/usr/share/kibana/openssl/lib/ossl-modules +ENV XPACK_SECURITY_EXPERIMENTAL_FIPSMODE_ENABLED=true {{/fips}} RUN ln -s /usr/share/kibana /opt/kibana diff --git a/src/dev/build/tasks/patch_native_modules_task.ts b/src/dev/build/tasks/patch_native_modules_task.ts deleted file mode 100644 index df851036b79ed5..00000000000000 --- a/src/dev/build/tasks/patch_native_modules_task.ts +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import path from 'path'; - -import { ToolingLog } from '@kbn/tooling-log'; - -import { - deleteAll, - downloadToDisk, - gunzip, - untar, - Task, - Config, - Build, - Platform, - read, -} from '../lib'; - -const DOWNLOAD_DIRECTORY = '.native_modules'; - -interface Package { - name: string; - version: string; - destinationPath: string; - extractMethod: string; - archives: Record< - string, - { - url: string; - sha256: string; - } - >; -} - -const packages: Package[] = [ - { - // Tip: use `scripts/download_re2.sh` to download binary artifacts from GitHub - name: 're2', - version: '1.20.9', - destinationPath: 'node_modules/re2/build/Release/re2.node', - extractMethod: 'gunzip', - archives: { - 'linux-x64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/linux-x64-115.gz', - sha256: 'b88183fe7bc8afa260d22cd909f496ab5636aace7075b54ac345d33ea32aedc0', - }, - // Linux ARM builds are currently done manually as Github Actions used in upstream project - // do not natively support an Linux ARM target. - // - // From an AWS Graviton instance running Ubuntu or a GCE T2A instance running Debian: - // * install build-essential package: `sudo apt-get update` + `sudo apt install build-essential` - // * install nvm and the node version used by the Kibana repository - // * `npm install re2@1.17.7` - // * re2 will build itself on install - // * `cp node_modules/re2/build/Release/re2.node linux-arm64-$(node -e "console.log(process.versions.modules)")` - // * `gzip linux-arm64-*` - // * capture the sha256 with: `shasum -a 256 linux-arm64-*` - // * upload the `linux-arm64-*.gz` artifact to the `yarn-prebuilt-artifacts` bucket in GCS using the correct version number - 'linux-arm64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/linux-arm64-115.gz', - sha256: '6c04136a6658df3dcc5b8ac0041641c227d232bed385fe55f62c8470f8db041d', - }, - 'darwin-x64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/darwin-x64-115.gz', - sha256: '1e0d79983c94222c414a5410444ec0ccf37614fd0e45187d0f313a19b203702c', - }, - 'darwin-arm64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/darwin-arm64-115.gz', - sha256: '192c8e036062504b818941989c44ddb799efe0419d039f7089caedb09d49a597', - }, - 'win32-x64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/win32-x64-115.gz', - sha256: '01ae2df89f976f4097e50e121d7ec6ac62ec8050c838107dcfb976d037a60d59', - }, - }, - }, -]; - -async function getInstalledVersion(config: Config, packageName: string) { - const packageJSONPath = config.resolveFromRepo( - path.join('node_modules', packageName, 'package.json') - ); - const json = await read(packageJSONPath); - const packageJSON = JSON.parse(json); - return packageJSON.version; -} - -async function patchModule( - config: Config, - log: ToolingLog, - build: Build, - platform: Platform, - pkg: Package -) { - const installedVersion = await getInstalledVersion(config, pkg.name); - if (installedVersion !== pkg.version) { - throw new Error( - `Can't patch ${pkg.name}'s native module, we were expecting version ${pkg.version} and found ${installedVersion}` - ); - } - const platformName = platform.getNodeArch(); - const archive = pkg.archives[platformName]; - const archiveName = path.basename(archive.url); - const downloadPath = config.resolveFromRepo(DOWNLOAD_DIRECTORY, pkg.name, archiveName); - const extractPath = build.resolvePathForPlatform(platform, pkg.destinationPath); - log.debug(`Patching ${pkg.name} binaries from ${archive.url} to ${extractPath}`); - - await deleteAll([extractPath], log); - await downloadToDisk({ - log, - url: archive.url, - destination: downloadPath, - shaChecksum: archive.sha256, - shaAlgorithm: 'sha256', - maxAttempts: 3, - }); - switch (pkg.extractMethod) { - case 'gunzip': - await gunzip(downloadPath, extractPath); - break; - case 'untar': - await untar(downloadPath, extractPath); - break; - default: - throw new Error(`Extract method of ${pkg.extractMethod} is not supported`); - } -} - -export const PatchNativeModules: Task = { - description: 'Patching platform-specific native modules', - async run(config, log, build) { - for (const pkg of packages) { - await Promise.all( - config.getTargetPlatforms().map(async (platform) => { - await patchModule(config, log, build, platform, pkg); - }) - ); - } - }, -}; diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index fabd250b291377..6bc2f6cdfff2b4 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -85,8 +85,8 @@ export const PER_PACKAGE_ALLOWED_LICENSES = { export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint - '@elastic/ems-client@8.5.1': ['Elastic License 2.0'], - '@elastic/eui@95.2.0': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/ems-client@8.5.3': ['Elastic License 2.0'], + '@elastic/eui@95.3.0': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx b/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx index 9b0941d86a5d42..24dc00cae84f60 100644 --- a/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx +++ b/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx @@ -24,8 +24,7 @@ import { useAppContext } from '../../app_context'; export function AiAssistantSelectionPage() { const { capabilities, setBreadcrumbs, navigateToApp } = useAppContext(); - - const observabilityAIAssistantEnabled = capabilities.observabilityAIAssistant.show; + const observabilityAIAssistantEnabled = capabilities.observabilityAIAssistant?.show; const securityAIAssistantEnabled = capabilities.securitySolutionAssistant?.['ai-assistant']; useEffect(() => { @@ -78,8 +77,7 @@ export function AiAssistantSelectionPage() { title={i18n.translate( 'aiAssistantManagementSelection.aiAssistantSelectionPage.observabilityAi.thisFeatureIsDisabledCallOutLabel', { - defaultMessage: - 'This feature is disabled. It can be enabled from Spaces > Features.', + defaultMessage: 'This feature is disabled.', } )} size="s" diff --git a/src/plugins/bfetch/server/ui_settings.ts b/src/plugins/bfetch/server/ui_settings.ts index 697864bec1c59c..0dede79980d931 100644 --- a/src/plugins/bfetch/server/ui_settings.ts +++ b/src/plugins/bfetch/server/ui_settings.ts @@ -23,6 +23,12 @@ export function getUiSettings(): Record> { 'Disables requests batching. This increases number of HTTP requests from Kibana, but allows to debug requests individually.', }), schema: schema.boolean(), + deprecation: { + message: i18n.translate('bfetch.advancedSettings.disableBfetchDeprecation', { + defaultMessage: 'This setting is deprecated and will be removed in Kibana 9.0.', + }), + docLinksKey: 'generalSettings', + }, category: [], requiresPageReload: true, }, @@ -36,6 +42,12 @@ export function getUiSettings(): Record> { 'Disable batch compression. This allows you to debug individual requests, but increases response size.', }), schema: schema.boolean(), + deprecation: { + message: i18n.translate('bfetch.advancedSettings.disableBfetchCompressionDeprecation', { + defaultMessage: 'This setting is deprecated and will be removed in Kibana 9.0.', + }), + docLinksKey: 'generalSettings', + }, category: [], requiresPageReload: true, }, diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx index cd93d3997b8d5a..3687113d9aee0f 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx @@ -405,6 +405,61 @@ describe('MetricVisComponent', function () { expect(tileConfig.trend).toEqual(trends[DEFAULT_TRENDLINE_NAME]); expect(tileConfig.trendShape).toEqual('area'); }); + + it('should display multi-values non-numeric values formatted and without quotes', () => { + const newTable: Datatable = { + ...table, + // change the format id for the columns + columns: table.columns.map((column) => + [basePriceColumnId, minPriceColumnId].includes(column.id) + ? { + ...column, + meta: { ...column.meta, params: { id: 'text' } }, + } + : column + ), + rows: table.rows.map((row) => ({ + ...row, + [basePriceColumnId]: [String(row[basePriceColumnId]), String(100)], + [minPriceColumnId]: [String(row[minPriceColumnId]), String(10)], + })), + }; + const component = shallow(); + + const [[visConfig]] = component.find(Metric).props().data!; + + expect(visConfig!.value).toMatchInlineSnapshot( + ` + Array [ + "text-28.984375", + "text-100", + ] + ` + ); + }); + + it('should display multi-values numeric values formatted and without quotes', () => { + const newTable = { + ...table, + rows: table.rows.map((row) => ({ + ...row, + [basePriceColumnId]: [row[basePriceColumnId], 100], + [minPriceColumnId]: [row[minPriceColumnId], 10], + })), + }; + const component = shallow(); + + const [[visConfig]] = component.find(Metric).props().data!; + + expect(visConfig!.value).toMatchInlineSnapshot( + ` + Array [ + "number-28.984375", + "number-100", + ] + ` + ); + }); }); describe('metric grid', () => { diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx index 117497d6e1e73c..4ed15f5f72554f 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx @@ -208,15 +208,16 @@ export const MetricVis = ({ const subtitle = breakdownByColumn ? primaryMetricColumn.name : config.metric.subtitle; if (typeof value !== 'number') { - const nonNumericMetric: MetricWText = { - value: formatPrimaryMetric(value), + const nonNumericMetricBase: Omit = { title: String(title), subtitle, icon: config.metric?.icon ? getIcon(config.metric?.icon) : undefined, extra: renderSecondaryMetric(data.columns, row, config), color: config.metric.color ?? defaultColor, }; - return nonNumericMetric; + return Array.isArray(value) + ? { ...nonNumericMetricBase, value: value.map((v) => formatPrimaryMetric(v)) } + : { ...nonNumericMetricBase, value: formatPrimaryMetric(value) }; } const baseMetric: MetricWNumber = { diff --git a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx index e1c71ef9a47194..d17312ee20bdf4 100644 --- a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_modal.tsx @@ -5,9 +5,6 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { omit } from 'lodash'; -import React, { useCallback, useState } from 'react'; - import { EuiButton, EuiButtonEmpty, @@ -20,8 +17,10 @@ import { EuiSpacer, } from '@elastic/eui'; import { EmbeddablePackageState, PanelNotFoundError } from '@kbn/embeddable-plugin/public'; +import { apiHasSnapshottableState } from '@kbn/presentation-containers/interfaces/serialized_state'; import { LazyDashboardPicker, withSuspense } from '@kbn/presentation-util-plugin/public'; - +import { omit } from 'lodash'; +import React, { useCallback, useState } from 'react'; import { createDashboardEditUrl, CREATE_NEW_DASHBOARD_URL } from '../dashboard_constants'; import { pluginServices } from '../services/plugin_services'; import { CopyToDashboardAPI } from './copy_to_dashboard_action'; @@ -51,21 +50,21 @@ export function CopyToDashboardModal({ api, closeModal }: CopyToDashboardModalPr const onSubmit = useCallback(async () => { const dashboard = api.parentApi; const panelToCopy = await dashboard.getDashboardPanelFromId(api.uuid); + const runtimeSnapshot = apiHasSnapshottableState(api) ? api.snapshotRuntimeState() : undefined; - if (!panelToCopy) { + if (!panelToCopy && !runtimeSnapshot) { throw new PanelNotFoundError(); } const state: EmbeddablePackageState = { type: panelToCopy.type, - input: { + input: runtimeSnapshot ?? { ...omit(panelToCopy.explicitInput, 'id'), }, size: { width: panelToCopy.gridData.w, height: panelToCopy.gridData.h, }, - references: panelToCopy.references, }; const path = diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index 26435c31a0d2c9..708e3c8aac809d 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -5,7 +5,6 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import deepEqual from 'fast-deep-equal'; import { ControlGroupInput, CONTROL_GROUP_TYPE, @@ -28,16 +27,21 @@ import { TimeRange, } from '@kbn/es-query'; import { lazyLoadReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; +import deepEqual from 'fast-deep-equal'; import { cloneDeep, identity, omit, pickBy } from 'lodash'; -import { BehaviorSubject, combineLatest, Subject } from 'rxjs'; -import { map, distinctUntilChanged, startWith } from 'rxjs'; +import { + BehaviorSubject, + combineLatest, + distinctUntilChanged, + map, + startWith, + Subject, +} from 'rxjs'; import { v4 } from 'uuid'; -import { combineDashboardFiltersWithControlGroupFilters } from './controls/dashboard_control_group_integration'; import { DashboardContainerInput, DashboardPanelMap, DashboardPanelState, - prefixReferencesFromPanel, } from '../../../../common'; import { DEFAULT_DASHBOARD_INPUT, @@ -56,11 +60,14 @@ import { startDiffingDashboardState } from '../../state/diffing/dashboard_diffin import { DashboardPublicState, UnsavedPanelState } from '../../types'; import { DashboardContainer } from '../dashboard_container'; import { DashboardCreationOptions } from '../dashboard_container_factory'; -import { startSyncingDashboardControlGroup } from './controls/dashboard_control_group_integration'; +import { + combineDashboardFiltersWithControlGroupFilters, + startSyncingDashboardControlGroup, +} from './controls/dashboard_control_group_integration'; import { startSyncingDashboardDataViews } from './data_views/sync_dashboard_data_views'; +import { startQueryPerformanceTracking } from './performance/query_performance_tracking'; import { startDashboardSearchSessionIntegration } from './search_sessions/start_dashboard_search_session_integration'; import { syncUnifiedSearchState } from './unified_search/sync_dashboard_unified_search_state'; -import { startQueryPerformanceTracking } from './performance/query_performance_tracking'; /** * Builds a new Dashboard from scratch. @@ -276,17 +283,6 @@ export const initializeDashboard = async ({ ...overrideInput, }; - // -------------------------------------------------------------------------------------- - // Set restored runtime state for react embeddables. - // -------------------------------------------------------------------------------------- - untilDashboardReady().then((dashboardContainer) => { - for (const idWithRuntimeState of Object.keys(runtimePanelsToRestore)) { - const restoredRuntimeStateForChild = runtimePanelsToRestore[idWithRuntimeState]; - if (!restoredRuntimeStateForChild) continue; - dashboardContainer.setRuntimeStateForChild(idWithRuntimeState, restoredRuntimeStateForChild); - } - }); - // -------------------------------------------------------------------------------------- // Combine input from saved object, session storage, & passed input to create initial input. // -------------------------------------------------------------------------------------- @@ -391,7 +387,7 @@ export const initializeDashboard = async ({ const sameType = panelToUpdate.type === incomingEmbeddable.type; panelToUpdate.type = incomingEmbeddable.type; - panelToUpdate.explicitInput = { + const nextRuntimeState = { // if the incoming panel is the same type as what was there before we can safely spread the old panel's explicit input ...(sameType ? panelToUpdate.explicitInput : {}), @@ -401,6 +397,13 @@ export const initializeDashboard = async ({ // maintain hide panel titles setting. hidePanelTitles: panelToUpdate.explicitInput.hidePanelTitles, }; + if (reactEmbeddableRegistryHasKey(incomingEmbeddable.type)) { + panelToUpdate.explicitInput = { id: panelToUpdate.explicitInput.id }; + runtimePanelsToRestore[incomingEmbeddable.embeddableId] = nextRuntimeState; + } else { + panelToUpdate.explicitInput = nextRuntimeState; + } + untilDashboardReady().then((container) => scrolltoIncomingEmbeddable(container, incomingEmbeddable.embeddableId as string) ); @@ -429,19 +432,27 @@ export const initializeDashboard = async ({ currentPanels, } ); - const newPanelState: DashboardPanelState = { - explicitInput: { ...incomingEmbeddable.input, id: embeddableId }, - type: incomingEmbeddable.type, - gridData: { - ...newPanelPlacement, - i: embeddableId, - }, - }; - if (incomingEmbeddable.references) { - container.savedObjectReferences.push( - ...prefixReferencesFromPanel(embeddableId, incomingEmbeddable.references) - ); - } + const newPanelState: DashboardPanelState = (() => { + if (reactEmbeddableRegistryHasKey(incomingEmbeddable.type)) { + runtimePanelsToRestore[embeddableId] = incomingEmbeddable.input; + return { + explicitInput: { id: embeddableId }, + type: incomingEmbeddable.type, + gridData: { + ...newPanelPlacement, + i: embeddableId, + }, + }; + } + return { + explicitInput: { ...incomingEmbeddable.input, id: embeddableId }, + type: incomingEmbeddable.type, + gridData: { + ...newPanelPlacement, + i: embeddableId, + }, + }; + })(); container.updateInput({ panels: { ...container.getInput().panels, @@ -458,6 +469,17 @@ export const initializeDashboard = async ({ } } + // -------------------------------------------------------------------------------------- + // Set restored runtime state for react embeddables. + // -------------------------------------------------------------------------------------- + untilDashboardReady().then((dashboardContainer) => { + for (const idWithRuntimeState of Object.keys(runtimePanelsToRestore)) { + const restoredRuntimeStateForChild = runtimePanelsToRestore[idWithRuntimeState]; + if (!restoredRuntimeStateForChild) continue; + dashboardContainer.setRuntimeStateForChild(idWithRuntimeState, restoredRuntimeStateForChild); + } + }); + // -------------------------------------------------------------------------------------- // Start the control group integration. // -------------------------------------------------------------------------------------- diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 06e1039497f8be..eff68d395f0b7c 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -527,10 +527,12 @@ export class DashboardContainer i: newId, }, explicitInput: { - ...panelPackage.initialState, id: newId, }, }; + if (panelPackage.initialState) { + this.setRuntimeStateForChild(newId, panelPackage.initialState); + } this.updateInput({ panels: { ...otherPanels, [newId]: newPanel } }); onSuccess(newId, newPanel.explicitInput.title); return await this.untilReactEmbeddableLoaded(newId); diff --git a/src/plugins/data/public/search/session/search_sessions_deprecation_message.tsx b/src/plugins/data/public/search/session/search_sessions_deprecation_message.tsx new file mode 100644 index 00000000000000..c6d75cda58e01d --- /dev/null +++ b/src/plugins/data/public/search/session/search_sessions_deprecation_message.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiCallOut } from '@elastic/eui'; + +const searchSessionsDeprecatedWarningTitle = i18n.translate( + 'data.searchSessionIndicator.deprecationWarning.title', + { + defaultMessage: 'Deprecated in 8.15.0', + } +); + +export interface SearchSessionsDeprecatedWarningProps { + size?: 's' | 'm'; +} + +export const SearchSessionsDeprecatedWarning = ({ + size = 'm', +}: SearchSessionsDeprecatedWarningProps) => ( + + + +); diff --git a/src/plugins/data/public/search/session/session_indicator/search_session_indicator/search_session_indicator.tsx b/src/plugins/data/public/search/session/session_indicator/search_session_indicator/search_session_indicator.tsx index 091c080969329f..ba754d208b5296 100644 --- a/src/plugins/data/public/search/session/session_indicator/search_session_indicator/search_session_indicator.tsx +++ b/src/plugins/data/public/search/session/session_indicator/search_session_indicator/search_session_indicator.tsx @@ -27,6 +27,7 @@ import { CheckInEmptyCircle, PartialClock } from './custom_icons'; import './search_session_indicator.scss'; import { SearchSessionName } from './components'; import { SearchSessionState } from '../../search_session_state'; +import { SearchSessionsDeprecatedWarning } from '../../search_sessions_deprecation_message'; export interface SearchSessionIndicatorProps { state: SearchSessionState; @@ -404,6 +405,9 @@ export const SearchSessionIndicator = React.forwardRef< } >
+ + + {props.searchSessionName && props.saveSearchSessionNameFn ? ( + + + diff --git a/src/plugins/data_views/docs/openapi/bundled.json b/src/plugins/data_views/docs/openapi/bundled.json index 28893b86cef3f4..5f2506c46e609b 100644 --- a/src/plugins/data_views/docs/openapi/bundled.json +++ b/src/plugins/data_views/docs/openapi/bundled.json @@ -1036,7 +1036,7 @@ "post": { "summary": "Update data view fields metadata in the default space", "operationId": "updateFieldsMetadataDefault", - "description": "Update fields presentation metadata such as count, customLabel and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value.\n", + "description": "Update fields presentation metadata such as count, customLabel, customDescription, and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value.\n", "tags": [ "data views" ], @@ -2786,11 +2786,16 @@ } }, "update_field_metadata_request": { - "summary": "Set popularity count for field foo.", + "summary": "Update multiple metadata fields.", "value": { "fields": { - "foo": { - "count": 123 + "field1": { + "count": 123, + "customLabel": "Field 1 label" + }, + "field2": { + "customLabel": "Field 2 label", + "customDescription": "Field 2 description" } } } @@ -3465,7 +3470,22 @@ }, "fieldattrs": { "type": "object", - "description": "A map of field attributes by field name." + "description": "A map of field attributes by field name.", + "properties": { + "count": { + "type": "integer", + "description": "Popularity count for the field." + }, + "customDescription": { + "type": "string", + "description": "Custom description for the field.", + "maxLength": 300 + }, + "customLabel": { + "type": "string", + "description": "Custom label for the field." + } + } }, "fieldformats": { "type": "object", @@ -3532,7 +3552,10 @@ "$ref": "#/components/schemas/allownoindex" }, "fieldAttrs": { - "$ref": "#/components/schemas/fieldattrs" + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/fieldattrs" + } }, "fieldFormats": { "$ref": "#/components/schemas/fieldformats" @@ -3591,7 +3614,10 @@ "$ref": "#/components/schemas/allownoindex" }, "fieldAttrs": { - "$ref": "#/components/schemas/fieldattrs" + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/fieldattrs" + } }, "fieldFormats": { "$ref": "#/components/schemas/fieldformats" diff --git a/src/plugins/data_views/docs/openapi/bundled.yaml b/src/plugins/data_views/docs/openapi/bundled.yaml index dee19e6b1d67ba..810f379b272e6f 100644 --- a/src/plugins/data_views/docs/openapi/bundled.yaml +++ b/src/plugins/data_views/docs/openapi/bundled.yaml @@ -646,7 +646,7 @@ paths: summary: Update data view fields metadata in the default space operationId: updateFieldsMetadataDefault description: | - Update fields presentation metadata such as count, customLabel and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value. + Update fields presentation metadata such as count, customLabel, customDescription, and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value. tags: - data views parameters: @@ -1966,11 +1966,15 @@ components: data_view_id: ff959d40-b880-11e8-a6d9-e546fe2bba5f force: true update_field_metadata_request: - summary: Set popularity count for field foo. + summary: Update multiple metadata fields. value: fields: - foo: + field1: count: 123 + customLabel: Field 1 label + field2: + customLabel: Field 2 label + customDescription: Field 2 description create_runtime_field_request: summary: Create a runtime field. value: @@ -2507,6 +2511,17 @@ components: fieldattrs: type: object description: A map of field attributes by field name. + properties: + count: + type: integer + description: Popularity count for the field. + customDescription: + type: string + description: Custom description for the field. + maxLength: 300 + customLabel: + type: string + description: Custom label for the field. fieldformats: type: object description: A map of field formats by field name. @@ -2556,7 +2571,9 @@ components: allowNoIndex: $ref: '#/components/schemas/allownoindex' fieldAttrs: - $ref: '#/components/schemas/fieldattrs' + type: object + additionalProperties: + $ref: '#/components/schemas/fieldattrs' fieldFormats: $ref: '#/components/schemas/fieldformats' fields: @@ -2596,7 +2613,9 @@ components: allowNoIndex: $ref: '#/components/schemas/allownoindex' fieldAttrs: - $ref: '#/components/schemas/fieldattrs' + type: object + additionalProperties: + $ref: '#/components/schemas/fieldattrs' fieldFormats: $ref: '#/components/schemas/fieldformats' fields: diff --git a/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml b/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml index ffa1eba13150f0..e16e7e4d38dcb4 100644 --- a/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml +++ b/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml @@ -1,9 +1,14 @@ -summary: Set popularity count for field foo. +summary: Update metadata for multiple fields. value: { "fields": { - "foo": { - "count": 123 + "field1": { + "count": 123, + "customLabel": "Field 1 label" + }, + "field2": { + "customLabel": "Field 2 label", + "customDescription": "Field 2 description" } } } \ No newline at end of file diff --git a/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml b/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml index ff2c34ed6d9ad5..9ac5e0ddd796a7 100644 --- a/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml +++ b/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml @@ -12,7 +12,9 @@ properties: allowNoIndex: $ref: 'allownoindex.yaml' fieldAttrs: - $ref: 'fieldattrs.yaml' + type: object + additionalProperties: + $ref: 'fieldattrs.yaml' fieldFormats: $ref: 'fieldformats.yaml' fields: diff --git a/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml b/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml index 9d3c67201896b2..f850c2f7c565e7 100644 --- a/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml +++ b/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml @@ -7,7 +7,9 @@ properties: allowNoIndex: $ref: 'allownoindex.yaml' fieldAttrs: - $ref: 'fieldattrs.yaml' + type: object + additionalProperties: + $ref: 'fieldattrs.yaml' fieldFormats: $ref: 'fieldformats.yaml' fields: diff --git a/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml b/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml index ede637d538a920..6d0cecd6b43b5f 100644 --- a/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml +++ b/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml @@ -1,2 +1,13 @@ type: object -description: A map of field attributes by field name. \ No newline at end of file +description: A map of field attributes by field name. +properties: + count: + type: integer + description: Popularity count for the field. + customDescription: + type: string + description: Custom description for the field. + maxLength: 300 + customLabel: + type: string + description: Custom label for the field. \ No newline at end of file diff --git a/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml b/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml index 58dd10b88b5d30..3c2526c0735133 100644 --- a/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml +++ b/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml @@ -2,7 +2,7 @@ post: summary: Update data view fields metadata in the default space operationId: updateFieldsMetadataDefault description: > - Update fields presentation metadata such as count, customLabel and format. + Update fields presentation metadata such as count, customLabel, customDescription, and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value. tags: - data views diff --git a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx index bf48c0bb83cf49..800b1432132272 100644 --- a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx +++ b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx @@ -56,7 +56,12 @@ export const FieldStatisticsTable = React.memo((props: FieldStatisticsTableProps } = props; const visibleFields = useMemo( - () => convertFieldsToFallbackFields({ fields: columns, additionalFieldGroups }), + () => + convertFieldsToFallbackFields({ + // `discover:searchFieldsFromSource` adds `_source` to the columns, but we should exclude it for Field Statistics + fields: columns.filter((col) => col !== '_source'), + additionalFieldGroups, + }), [additionalFieldGroups, columns] ); const allFallbackFields = useMemo( diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index caba229e9137ac..9e061beffc4fc0 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -277,7 +277,8 @@ function DiscoverDocumentsComponent({ <> col !== '_source')} /> diff --git a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts index 385dd432dc3c11..3814bd93fa6360 100644 --- a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts +++ b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts @@ -246,6 +246,7 @@ export const useDiscoverHistogram = ({ useEffect(() => { if (!isEsqlMode) { + setIsSuggestionLoading(false); return; } diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx index cc0b283c4c5e81..79ca8afd005e34 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx @@ -6,12 +6,13 @@ * Side Public License, v 1. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { renderCustomToolbar, UnifiedDataTable, type UnifiedDataTableProps, } from '@kbn/unified-data-table'; +import { useProfileAccessor } from '../../context_awareness'; /** * Customized version of the UnifiedDataTable @@ -19,11 +20,17 @@ import { * @constructor */ export const DiscoverGrid: React.FC = (props) => { + const getRowIndicatorProvider = useProfileAccessor('getRowIndicatorProvider'); + const getRowIndicator = useMemo(() => { + return getRowIndicatorProvider(() => undefined)({ dataView: props.dataView }); + }, [getRowIndicatorProvider, props.dataView]); + return ( ); diff --git a/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx b/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx index 6b705b00c1ba19..f9cba1592dc305 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx +++ b/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx @@ -58,7 +58,15 @@ export const exampleDataSourceProfileProvider: DataSourceProfileProvider = { return { title: `Record #${recordId}`, docViewsRegistry: (registry) => { - registry.enableById('doc_view_logs_overview'); + registry.add({ + id: 'doc_view_example', + title: 'Example', + order: 0, + component: () => ( +
Example Doc View
+ ), + }); + return prevValue.docViewsRegistry(registry); }, }; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/example_document_profile/profile.ts b/src/plugins/discover/public/context_awareness/profile_providers/example_document_profile/profile.ts index 303efa103e327f..9739430e080008 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/example_document_profile/profile.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/example_document_profile/profile.ts @@ -13,14 +13,14 @@ export const exampleDocumentProfileProvider: DocumentProfileProvider = { profileId: 'example-document-profile', profile: {}, resolve: (params) => { - if (getFieldValue(params.record, 'data_stream.type') !== 'logs') { + if (getFieldValue(params.record, 'data_stream.type') !== 'example') { return { isMatch: false }; } return { isMatch: true, context: { - type: DocumentType.Log, + type: DocumentType.Default, }, }; }, diff --git a/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/accessors/get_doc_viewer.tsx b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/accessors/get_doc_viewer.tsx new file mode 100644 index 00000000000000..c83155c4d3a497 --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/accessors/get_doc_viewer.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; +import { UnifiedDocViewerLogsOverview } from '@kbn/unified-doc-viewer-plugin/public'; +import React from 'react'; +import type { DocumentProfileProvider } from '../../../profiles'; + +export const getDocViewer: DocumentProfileProvider['profile']['getDocViewer'] = + (prev) => (params) => { + const prevDocViewer = prev(params); + + return { + ...prevDocViewer, + docViewsRegistry: (registry) => { + registry.add({ + id: 'doc_view_logs_overview', + title: i18n.translate('discover.docViews.logsOverview.title', { + defaultMessage: 'Log overview', + }), + order: 0, + component: (props) => , + }); + + return prevDocViewer.docViewsRegistry(registry); + }, + }; + }; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/accessors/index.ts b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/accessors/index.ts new file mode 100644 index 00000000000000..781ad513431233 --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/accessors/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { getDocViewer } from './get_doc_viewer'; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.test.ts b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.test.ts index 6514eb699e553d..a188dd4584508a 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.test.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.test.ts @@ -7,6 +7,7 @@ */ import { buildDataTableRecord } from '@kbn/discover-utils'; +import { DocViewsRegistry } from '@kbn/unified-doc-viewer'; import { DocumentType } from '../../profiles'; import { createContextAwarenessMocks } from '../../__mocks__'; import { createLogDocumentProfileProvider } from './profile'; @@ -65,6 +66,32 @@ describe('logDocumentProfileProvider', () => { }) ).toEqual(RESOLUTION_MISMATCH); }); + + describe('getDocViewer', () => { + it('adds a log overview doc view to the registry', () => { + const getDocViewer = logDocumentProfileProvider.profile.getDocViewer!(() => ({ + title: 'test title', + docViewsRegistry: (registry) => registry, + })); + const docViewer = getDocViewer({ + record: buildDataTableRecord({}), + }); + const registry = new DocViewsRegistry(); + + expect(docViewer.title).toBe('test title'); + expect(registry.getAll()).toHaveLength(0); + docViewer.docViewsRegistry(registry); + expect(registry.getAll()).toHaveLength(1); + expect(registry.getAll()[0]).toEqual( + expect.objectContaining({ + id: 'doc_view_logs_overview', + title: 'Log overview', + order: 0, + component: expect.any(Function), + }) + ); + }); + }); }); const buildMockRecord = (index: string, fields: Record = {}) => diff --git a/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.ts b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.tsx similarity index 95% rename from src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.ts rename to src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.tsx index 2d03c9e35398af..bf7276f1d39b84 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/log_document_profile/profile.tsx @@ -9,12 +9,15 @@ import { DataTableRecord } from '@kbn/discover-utils'; import { DocumentProfileProvider, DocumentType } from '../../profiles'; import { ProfileProviderServices } from '../profile_provider_services'; +import { getDocViewer } from './accessors'; export const createLogDocumentProfileProvider = ( services: ProfileProviderServices ): DocumentProfileProvider => ({ profileId: 'log-document-profile', - profile: {}, + profile: { + getDocViewer, + }, resolve: ({ record }) => { const isLogRecord = getIsLogRecord(record, services.logsContextService.isLogsIndexPattern); diff --git a/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/accessors/get_row_indicator_provider.ts b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/accessors/get_row_indicator_provider.ts new file mode 100644 index 00000000000000..7980453181377b --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/accessors/get_row_indicator_provider.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + getLogLevelCoalescedValue, + getLogLevelCoalescedValueLabel, + getLogLevelColor, +} from '@kbn/discover-utils'; +import type { UnifiedDataTableProps } from '@kbn/unified-data-table'; +import type { DataSourceProfileProvider } from '../../../profiles'; + +const LOG_LEVEL_FIELDS = ['log.level', 'log_level']; + +export const getRowIndicatorProvider: DataSourceProfileProvider['profile']['getRowIndicatorProvider'] = + + () => + ({ dataView }) => { + // Check if the data view has any of the log level fields. + if (!LOG_LEVEL_FIELDS.some((field) => dataView.getFieldByName(field))) { + // Otherwise, don't set the row indicator color so the color indicator control column is not added to the grid at all. + return undefined; + } + return getRowIndicator; + }; + +const getRowIndicator: UnifiedDataTableProps['getRowIndicator'] = (row, euiTheme) => { + const logLevel = LOG_LEVEL_FIELDS.reduce((acc: unknown, field) => { + return acc || row.flattened[field]; + }, undefined); + + const logLevelCoalescedValue = getLogLevelCoalescedValue(logLevel); + + if (logLevelCoalescedValue) { + const color = getLogLevelColor(logLevelCoalescedValue, euiTheme); + + if (!color) { + return undefined; + } + + return { + color, + label: getLogLevelCoalescedValueLabel(logLevelCoalescedValue), + }; + } + + return undefined; +}; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/accessors/index.ts b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/accessors/index.ts new file mode 100644 index 00000000000000..cf544aa298093e --- /dev/null +++ b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/accessors/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { getRowIndicatorProvider } from './get_row_indicator_provider'; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.test.ts b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.test.ts index e6b99802235cf9..793af0a16e1b6e 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.test.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.test.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import { buildDataTableRecord } from '@kbn/discover-utils'; +import type { EuiThemeComputed } from '@elastic/eui'; import { createStubIndexPattern } from '@kbn/data-views-plugin/common/data_view.stub'; import { createDataViewDataSource, createEsqlDataSource } from '../../../../common/data_sources'; import { DataSourceCategory } from '../../profiles'; @@ -75,4 +77,67 @@ describe('logsDataSourceProfileProvider', () => { }) ).toEqual(RESOLUTION_MISMATCH); }); + + describe('getRowIndicator', () => { + const dataViewWithLogLevel = createStubIndexPattern({ + spec: { + title: VALID_INDEX_PATTERN, + fields: { + 'log.level': { + name: 'log.level', + type: 'string', + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + count: 0, + readFromDocValues: false, + scripted: false, + isMapped: true, + }, + }, + }, + }); + + const dataViewWithoutLogLevel = createStubIndexPattern({ + spec: { + title: VALID_INDEX_PATTERN, + }, + }); + + it('should return the correct color for a given log level', () => { + const row = buildDataTableRecord({ fields: { 'log.level': 'info' } }); + const euiTheme = { euiTheme: { colors: {} } } as unknown as EuiThemeComputed; + const getRowIndicatorProvider = + logsDataSourceProfileProvider.profile.getRowIndicatorProvider?.(() => undefined); + const getRowIndicator = getRowIndicatorProvider?.({ + dataView: dataViewWithLogLevel, + }); + + expect(getRowIndicator).toBeDefined(); + expect(getRowIndicator?.(row, euiTheme)).toEqual({ color: '#90b0d1', label: 'Info' }); + }); + + it('should not return a color for a missing log level in the document', () => { + const row = buildDataTableRecord({ fields: { other: 'info' } }); + const euiTheme = { euiTheme: { colors: {} } } as unknown as EuiThemeComputed; + const getRowIndicatorProvider = + logsDataSourceProfileProvider.profile.getRowIndicatorProvider?.(() => undefined); + const getRowIndicator = getRowIndicatorProvider?.({ + dataView: dataViewWithLogLevel, + }); + + expect(getRowIndicator).toBeDefined(); + expect(getRowIndicator?.(row, euiTheme)).toBe(undefined); + }); + + it('should not set the color indicator handler if data view does not have log level field', () => { + const getRowIndicatorProvider = + logsDataSourceProfileProvider.profile.getRowIndicatorProvider?.(() => undefined); + const getRowIndicator = getRowIndicatorProvider?.({ + dataView: dataViewWithoutLogLevel, + }); + + expect(getRowIndicator).toBeUndefined(); + }); + }); }); diff --git a/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.ts b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.ts index e4a12aa9e4baf2..f32af6df8dc757 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/logs_data_source_profile/profile.ts @@ -15,12 +15,15 @@ import { DataSourceProfileProviderParams, } from '../../profiles'; import { ProfileProviderServices } from '../profile_provider_services'; +import { getRowIndicatorProvider } from './accessors'; export const createLogsDataSourceProfileProvider = ( services: ProfileProviderServices ): DataSourceProfileProvider => ({ profileId: 'logs-data-source-profile', - profile: {}, + profile: { + getRowIndicatorProvider, + }, resolve: (params) => { const indexPattern = extractIndexPatternFrom(params); diff --git a/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.test.ts b/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.test.ts index c58726ecc1c11a..df437d1547cc56 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.test.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/register_profile_providers.test.ts @@ -68,7 +68,7 @@ describe('registerProfileProviders', () => { const documentContext = documentProfileServiceMock.resolve({ record: { id: 'test', - flattened: { 'data_stream.type': 'logs' }, + flattened: { 'data_stream.type': 'example' }, raw: {}, }, }); @@ -100,7 +100,7 @@ describe('registerProfileProviders', () => { const documentContext = documentProfileServiceMock.resolve({ record: { id: 'test', - flattened: { 'data_stream.type': 'logs' }, + flattened: { 'data_stream.type': 'example' }, raw: {}, }, }); diff --git a/src/plugins/discover/public/context_awareness/types.ts b/src/plugins/discover/public/context_awareness/types.ts index 9dbec9fab8dae8..19e51decc62f60 100644 --- a/src/plugins/discover/public/context_awareness/types.ts +++ b/src/plugins/discover/public/context_awareness/types.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import type { CustomCellRenderer } from '@kbn/unified-data-table'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import type { CustomCellRenderer, UnifiedDataTableProps } from '@kbn/unified-data-table'; import type { DocViewsRegistry } from '@kbn/unified-doc-viewer'; import type { DataTableRecord } from '@kbn/discover-utils'; @@ -19,7 +20,14 @@ export interface DocViewerExtensionParams { record: DataTableRecord; } +export interface RowIndicatorExtensionParams { + dataView: DataView; +} + export interface Profile { getCellRenderers: () => CustomCellRenderer; getDocViewer: (params: DocViewerExtensionParams) => DocViewerExtension; + getRowIndicatorProvider: ( + params: RowIndicatorExtensionParams + ) => UnifiedDataTableProps['getRowIndicator'] | undefined; } diff --git a/src/plugins/embeddable/public/lib/state_transfer/types.ts b/src/plugins/embeddable/public/lib/state_transfer/types.ts index d9de670973d626..ffc57028e829ea 100644 --- a/src/plugins/embeddable/public/lib/state_transfer/types.ts +++ b/src/plugins/embeddable/public/lib/state_transfer/types.ts @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -import { Reference } from '@kbn/content-management-utils'; - export const EMBEDDABLE_EDITOR_STATE_KEY = 'embeddable_editor_state'; /** @@ -39,23 +37,15 @@ export const EMBEDDABLE_PACKAGE_STATE_KEY = 'embeddable_package_state'; */ export interface EmbeddablePackageState { type: string; + /** + * For react embeddables, this input must be runtime state. + */ input: object; embeddableId?: string; size?: { width?: number; height?: number; }; - /** - * Copy dashboard panel transfers serialized panel state for React embeddables. - * The rawState will be passed into the input and references are passed separately - * so the container can update its references array and the updated references - * are correctly passed to the factory's deserialize method. - * - * Legacy embeddables have already injected the references - * into the input state, so they will not pass references. - */ - references?: Reference[]; - /** * Pass current search session id when navigating to an editor, * Editors could use it continue previous search session diff --git a/src/plugins/embeddable/tsconfig.json b/src/plugins/embeddable/tsconfig.json index a306e128f58f47..161b35bc716eaf 100644 --- a/src/plugins/embeddable/tsconfig.json +++ b/src/plugins/embeddable/tsconfig.json @@ -30,7 +30,6 @@ "@kbn/presentation-containers", "@kbn/react-kibana-mount", "@kbn/analytics", - "@kbn/content-management-utils" ], "exclude": ["target/**/*"] } diff --git a/src/plugins/esql/kibana.jsonc b/src/plugins/esql/kibana.jsonc index 797b9066e46ae4..2bb2b759dc4294 100644 --- a/src/plugins/esql/kibana.jsonc +++ b/src/plugins/esql/kibana.jsonc @@ -7,7 +7,8 @@ "server": true, "browser": true, "optionalPlugins": [ - "indexManagement" + "indexManagement", + "fieldsMetadata" ], "requiredPlugins": [ "data", diff --git a/src/plugins/esql/public/kibana_services.ts b/src/plugins/esql/public/kibana_services.ts index d9e39e3aefa681..ab98f07a0fdeff 100644 --- a/src/plugins/esql/public/kibana_services.ts +++ b/src/plugins/esql/public/kibana_services.ts @@ -10,7 +10,8 @@ import { BehaviorSubject } from 'rxjs'; import type { CoreStart } from '@kbn/core/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; -import { IndexManagementPluginSetup } from '@kbn/index-management'; +import type { IndexManagementPluginSetup } from '@kbn/index-management'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; export let core: CoreStart; @@ -20,6 +21,7 @@ interface ServiceDeps { dataViews: DataViewsPublicPluginStart; expressions: ExpressionsStart; indexManagementApiService?: IndexManagementPluginSetup['apiService']; + fieldsMetadata?: FieldsMetadataPublicStart; } const servicesReady$ = new BehaviorSubject(undefined); @@ -39,7 +41,8 @@ export const setKibanaServices = ( kibanaCore: CoreStart, dataViews: DataViewsPublicPluginStart, expressions: ExpressionsStart, - indexManagement?: IndexManagementPluginSetup + indexManagement?: IndexManagementPluginSetup, + fieldsMetadata?: FieldsMetadataPublicStart ) => { core = kibanaCore; core.theme.theme$.subscribe(({ darkMode }) => { @@ -49,6 +52,7 @@ export const setKibanaServices = ( dataViews, expressions, indexManagementApiService: indexManagement?.apiService, + fieldsMetadata, }); }); }; diff --git a/src/plugins/esql/public/plugin.ts b/src/plugins/esql/public/plugin.ts index 5b78a0b48dc2b8..7d130e22a1789a 100755 --- a/src/plugins/esql/public/plugin.ts +++ b/src/plugins/esql/public/plugin.ts @@ -12,6 +12,7 @@ import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { IndexManagementPluginSetup } from '@kbn/index-management'; import type { UiActionsSetup, UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; import { updateESQLQueryTrigger, UpdateESQLQueryAction, @@ -24,6 +25,7 @@ interface EsqlPluginStart { expressions: ExpressionsStart; uiActions: UiActionsStart; data: DataPublicPluginStart; + fieldsMetadata: FieldsMetadataPublicStart; } interface EsqlPluginSetup { @@ -44,11 +46,11 @@ export class EsqlPlugin implements Plugin<{}, void> { public start( core: CoreStart, - { dataViews, expressions, data, uiActions }: EsqlPluginStart + { dataViews, expressions, data, uiActions, fieldsMetadata }: EsqlPluginStart ): void { const appendESQLAction = new UpdateESQLQueryAction(data); uiActions.addTriggerAction(UPDATE_ESQL_QUERY_TRIGGER, appendESQLAction); - setKibanaServices(core, dataViews, expressions, this.indexManagement); + setKibanaServices(core, dataViews, expressions, this.indexManagement, fieldsMetadata); } public stop() {} diff --git a/src/plugins/esql/tsconfig.json b/src/plugins/esql/tsconfig.json index 3c7b28567816b2..500ff09276eaaa 100644 --- a/src/plugins/esql/tsconfig.json +++ b/src/plugins/esql/tsconfig.json @@ -21,7 +21,8 @@ "@kbn/esql-utils", "@kbn/ui-actions-plugin", "@kbn/data-plugin", - "@kbn/es-query" + "@kbn/es-query", + "@kbn/fields-metadata-plugin" ], "exclude": [ "target/**/*", diff --git a/src/plugins/files/server/integration_tests/file_service.test.ts b/src/plugins/files/server/integration_tests/file_service.test.ts index 05308ff7a78eff..e0416336945d4e 100644 --- a/src/plugins/files/server/integration_tests/file_service.test.ts +++ b/src/plugins/files/server/integration_tests/file_service.test.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import assert from 'assert'; import { ElasticsearchClient } from '@kbn/core/server'; import type { InternalCoreStart } from '@kbn/core-lifecycle-server-internal'; import { @@ -43,16 +44,15 @@ describe('FileService', () => { let fileServiceFactory: FileServiceFactory; let security: ReturnType; let auditLogger: AuditLogger; + let fileKindsRegistry: ReturnType; beforeAll(async () => { - const { startES } = createTestServers({ adjustTimeout: jest.setTimeout }); - manageES = await startES(); - kbnRoot = createRootWithCorePlugins(); - await kbnRoot.preboot(); - await kbnRoot.setup(); - coreStart = await kbnRoot.start(); + const { startES, startKibana } = createTestServers({ adjustTimeout: jest.setTimeout }); + const testServers = await Promise.all([startES(), startKibana()]); + manageES = testServers[0]; + ({ root: kbnRoot, coreStart } = testServers[1]); setFileKindsRegistry(new FileKindsRegistryImpl()); - const fileKindsRegistry = getFileKindsRegistry(); + fileKindsRegistry = getFileKindsRegistry(); fileKindsRegistry.register({ id: fileKind, http: {}, @@ -69,10 +69,16 @@ describe('FileService', () => { }, http: {}, }); + esClient = coreStart.elasticsearch.client.asInternalUser; }); afterAll(async () => { + assert.strictEqual( + await esClient.ping(), + true, + 'Unable to reach ES, Initial test setup failed!' + ); await kbnRoot.shutdown(); await manageES.stop(); }); @@ -87,7 +93,7 @@ describe('FileService', () => { coreStart.savedObjects, blobStorageService, security, - getFileKindsRegistry(), + fileKindsRegistry, kbnRoot.logger.get('test-file-service') ); fileService = fileServiceFactory.asInternal(); diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 8285a0aee6b018..85aeb535bb83b7 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -464,7 +464,7 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, - 'observability:apmEnableMultiSignal': { + 'observability:entityCentricExperience': { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index 95c72298a9b0ea..28f18e5e52fce4 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -163,7 +163,7 @@ export interface UsageStats { 'observability:apmTraceExplorerTab': boolean; 'observability:apmEnableCriticalPath': boolean; 'observability:apmEnableProfilingIntegration': boolean; - 'observability:apmEnableMultiSignal': boolean; + 'observability:entityCentricExperience': boolean; 'observability:profilingShowErrorFrames': boolean; 'securitySolution:enableGroupedNav': boolean; 'securitySolution:showRelatedIntegrations': boolean; diff --git a/src/plugins/links/public/actions/create_links_panel_action.ts b/src/plugins/links/public/actions/create_links_panel_action.ts index c5b78fe1e318b5..eb8f2c11d8682f 100644 --- a/src/plugins/links/public/actions/create_links_panel_action.ts +++ b/src/plugins/links/public/actions/create_links_panel_action.ts @@ -12,8 +12,6 @@ import { ADD_PANEL_TRIGGER, IncompatibleActionError } from '@kbn/ui-actions-plug import { COMMON_EMBEDDABLE_GROUPING } from '@kbn/embeddable-plugin/public'; import { APP_ICON, APP_NAME, CONTENT_ID } from '../../common'; import { uiActions } from '../services/kibana_services'; -import { serializeLinksAttributes } from '../lib/serialize_attributes'; -import { LinksSerializedState } from '../types'; const ADD_LINKS_PANEL_ACTION_ID = 'create_links_panel'; @@ -35,14 +33,9 @@ export const registerCreateLinksPanelAction = () => { }); if (!runtimeState) return; - const initialState: LinksSerializedState = runtimeState.savedObjectId - ? { savedObjectId: runtimeState.savedObjectId } - : // We should not extract the references when passing initialState to addNewPanel - serializeLinksAttributes(runtimeState, false); - await embeddable.addNewPanel({ panelType: CONTENT_ID, - initialState, + initialState: runtimeState, }); }, grouping: [COMMON_EMBEDDABLE_GROUPING.annotation], diff --git a/src/plugins/links/public/content_management/index.ts b/src/plugins/links/public/content_management/index.ts index 42e25c5465256d..50d0f7c20ba506 100644 --- a/src/plugins/links/public/content_management/index.ts +++ b/src/plugins/links/public/content_management/index.ts @@ -9,4 +9,3 @@ export { linksClient } from './links_content_management_client'; export { checkForDuplicateTitle } from './duplicate_title_check'; export { runSaveToLibrary } from './save_to_library'; -export { loadFromLibrary } from './load_from_library'; diff --git a/src/plugins/links/public/content_management/load_from_library.ts b/src/plugins/links/public/content_management/load_from_library.ts deleted file mode 100644 index 5c6e54bb702de0..00000000000000 --- a/src/plugins/links/public/content_management/load_from_library.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { injectReferences } from '../../common/persistable_state'; -import { linksClient } from './links_content_management_client'; - -export async function loadFromLibrary(savedObjectId: string) { - const { - item: savedObject, - meta: { outcome, aliasPurpose, aliasTargetId }, - } = await linksClient.get(savedObjectId); - if (savedObject.error) throw savedObject.error; - const { attributes } = injectReferences(savedObject); - return { - attributes, - metaInfo: { - sharingSavedObjectProps: { - aliasTargetId, - outcome, - aliasPurpose, - sourceId: savedObjectId, - }, - }, - }; -} diff --git a/src/plugins/links/public/embeddable/links_embeddable.test.tsx b/src/plugins/links/public/embeddable/links_embeddable.test.tsx index 73de5b8237df53..39de26a6a77c91 100644 --- a/src/plugins/links/public/embeddable/links_embeddable.test.tsx +++ b/src/plugins/links/public/embeddable/links_embeddable.test.tsx @@ -24,7 +24,7 @@ import { import { linksClient } from '../content_management'; import { getMockLinksParentApi } from '../mocks'; -const links: Link[] = [ +const getLinks: () => Link[] = () => [ { id: '001', order: 0, @@ -54,7 +54,7 @@ const links: Link[] = [ }, ]; -const resolvedLinks: ResolvedLink[] = [ +const getResolvedLinks: () => ResolvedLink[] = () => [ { id: '001', order: 0, @@ -105,33 +105,35 @@ const references = [ jest.mock('../lib/resolve_links', () => { return { - resolveLinks: jest.fn().mockResolvedValue(resolvedLinks), + resolveLinks: jest.fn().mockResolvedValue(getResolvedLinks()), }; }); jest.mock('../content_management', () => { return { - loadFromLibrary: jest.fn((savedObjectId) => { - return Promise.resolve({ - attributes: { - title: 'links 001', - description: 'some links', - links, - layout: 'vertical', - }, - metaInfo: { - sharingSavedObjectProps: { + linksClient: { + create: jest.fn().mockResolvedValue({ item: { id: '333' } }), + update: jest.fn().mockResolvedValue({ item: { id: '123' } }), + get: jest.fn((savedObjectId) => { + return Promise.resolve({ + item: { + id: savedObjectId, + attributes: { + title: 'links 001', + description: 'some links', + links: getLinks(), + layout: 'vertical', + }, + references, + }, + meta: { aliasTargetId: '123', outcome: 'exactMatch', aliasPurpose: 'sharing', sourceId: savedObjectId, }, - }, - }); - }), - linksClient: { - create: jest.fn().mockResolvedValue({ item: { id: '333' } }), - update: jest.fn().mockResolvedValue({ item: { id: '123' } }), + }); + }), }, }; }); @@ -157,7 +159,7 @@ describe('getLinksEmbeddableFactory', () => { defaultPanelTitle: 'links 001', defaultPanelDescription: 'some links', layout: 'vertical', - links: resolvedLinks, + links: getResolvedLinks(), description: 'just a few links', title: 'my links', savedObjectId: '123', @@ -172,7 +174,7 @@ describe('getLinksEmbeddableFactory', () => { test('deserializeState', async () => { const deserializedState = await factory.deserializeState({ rawState, - references, + references: [], // no references passed because the panel is by reference }); expect(deserializedState).toEqual({ ...expectedRuntimeState, @@ -240,7 +242,7 @@ describe('getLinksEmbeddableFactory', () => { attributes: { description: 'some links', title: 'links 001', - links, + links: getLinks(), layout: 'vertical', }, }, @@ -254,7 +256,7 @@ describe('getLinksEmbeddableFactory', () => { describe('by value embeddable', () => { const rawState = { attributes: { - links, + links: getLinks(), layout: 'horizontal', }, description: 'just a few links', @@ -265,7 +267,7 @@ describe('getLinksEmbeddableFactory', () => { defaultPanelTitle: undefined, defaultPanelDescription: undefined, layout: 'horizontal', - links: resolvedLinks, + links: getResolvedLinks(), description: 'just a few links', title: 'my links', savedObjectId: undefined, @@ -315,7 +317,7 @@ describe('getLinksEmbeddableFactory', () => { description: 'just a few links', hidePanelTitles: undefined, attributes: { - links, + links: getLinks(), layout: 'horizontal', }, }, @@ -342,7 +344,7 @@ describe('getLinksEmbeddableFactory', () => { expect(linksClient.create).toHaveBeenCalledWith({ data: { title: 'some new title', - links, + links: getLinks(), layout: 'horizontal', }, options: { references }, diff --git a/src/plugins/links/public/embeddable/links_embeddable.tsx b/src/plugins/links/public/embeddable/links_embeddable.tsx index 0a5b98a7ce3be0..23f9d82b7cb03b 100644 --- a/src/plugins/links/public/embeddable/links_embeddable.tsx +++ b/src/plugins/links/public/embeddable/links_embeddable.tsx @@ -74,9 +74,10 @@ export const getLinksEmbeddableFactory = () => { const { title, description } = serializedState.rawState; if (linksSerializeStateIsByReference(state)) { - const attributes = await deserializeLinksSavedObject(state); + const linksSavedObject = await linksClient.get(state.savedObjectId); + const runtimeState = await deserializeLinksSavedObject(linksSavedObject.item); return { - ...attributes, + ...runtimeState, title, description, }; diff --git a/src/plugins/links/public/lib/deserialize_from_library.ts b/src/plugins/links/public/lib/deserialize_from_library.ts index a35be4f4085549..859a988954a1b9 100644 --- a/src/plugins/links/public/lib/deserialize_from_library.ts +++ b/src/plugins/links/public/lib/deserialize_from_library.ts @@ -6,8 +6,10 @@ * Side Public License, v 1. */ -import { loadFromLibrary } from '../content_management'; -import { LinksByReferenceSerializedState, LinksSerializedState } from '../types'; +import { SOWithMetadata } from '@kbn/content-management-utils'; +import { LinksAttributes } from '../../common/content_management'; +import { injectReferences } from '../../common/persistable_state'; +import { LinksByReferenceSerializedState, LinksRuntimeState, LinksSerializedState } from '../types'; import { resolveLinks } from './resolve_links'; export const linksSerializeStateIsByReference = ( @@ -16,8 +18,11 @@ export const linksSerializeStateIsByReference = ( return Boolean(state && (state as LinksByReferenceSerializedState).savedObjectId !== undefined); }; -export const deserializeLinksSavedObject = async (state: LinksByReferenceSerializedState) => { - const { attributes } = await loadFromLibrary(state.savedObjectId); +export const deserializeLinksSavedObject = async ( + linksSavedObject: SOWithMetadata +): Promise => { + if (linksSavedObject.error) throw linksSavedObject.error; + const { attributes } = injectReferences(linksSavedObject); const links = await resolveLinks(attributes.links ?? []); @@ -26,7 +31,7 @@ export const deserializeLinksSavedObject = async (state: LinksByReferenceSeriali return { links, layout, - savedObjectId: state.savedObjectId, + savedObjectId: linksSavedObject.id, defaultPanelTitle, defaultPanelDescription, }; diff --git a/src/plugins/links/public/lib/serialize_attributes.ts b/src/plugins/links/public/lib/serialize_attributes.ts index d9e8d1de148bbb..696c8683f5a884 100644 --- a/src/plugins/links/public/lib/serialize_attributes.ts +++ b/src/plugins/links/public/lib/serialize_attributes.ts @@ -14,9 +14,15 @@ export const serializeLinksAttributes = ( state: LinksRuntimeState, shouldExtractReferences: boolean = true ) => { - const linksToSave: Link[] | undefined = state.links?.map( - ({ title, description, error, ...linkToSave }) => linkToSave - ); + const linksToSave: Link[] | undefined = state.links + ?.map(({ title, description, error, ...linkToSave }) => linkToSave) + ?.map( + // fiilter out null values which may have been introduced by the session state backup (undefined values are serialized as null). + (link) => + Object.fromEntries( + Object.entries(link).filter(([key, value]) => value !== null) + ) as unknown as Link + ); const attributes = { title: state.defaultPanelTitle, description: state.defaultPanelDescription, diff --git a/src/plugins/links/public/plugin.ts b/src/plugins/links/public/plugin.ts index f5ac0dd5f1d20a..9b01f01d853cde 100644 --- a/src/plugins/links/public/plugin.ts +++ b/src/plugins/links/public/plugin.ts @@ -22,17 +22,14 @@ import { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; import { VisualizationsSetup } from '@kbn/visualizations-plugin/public'; import { UiActionsPublicStart } from '@kbn/ui-actions-plugin/public/plugin'; -import { LinksSerializedState } from './types'; +import { LinksRuntimeState } from './types'; import { APP_ICON, APP_NAME, CONTENT_ID, LATEST_VERSION } from '../common'; import { LinksCrudTypes } from '../common/content_management'; import { LinksStrings } from './components/links_strings'; import { getLinksClient } from './content_management/links_content_management_client'; import { setKibanaServices, untilPluginStartServicesReady } from './services/kibana_services'; import { registerCreateLinksPanelAction } from './actions/create_links_panel_action'; -import { - deserializeLinksSavedObject, - linksSerializeStateIsByReference, -} from './lib/deserialize_from_library'; +import { deserializeLinksSavedObject } from './lib/deserialize_from_library'; export interface LinksSetupDependencies { embeddable: EmbeddableSetup; visualizations: VisualizationsSetup; @@ -64,10 +61,11 @@ export class LinksPlugin }); plugins.embeddable.registerReactEmbeddableSavedObject({ - onAdd: (container, savedObject) => { - container.addNewPanel({ + onAdd: async (container, savedObject) => { + const initialState = await deserializeLinksSavedObject(savedObject); + container.addNewPanel({ panelType: CONTENT_ID, - initialState: { savedObjectId: savedObject.id }, + initialState, }); }, embeddableType: CONTENT_ID, @@ -103,7 +101,8 @@ export class LinksPlugin editor: { onEdit: async (savedObjectId: string) => { const { openEditorFlyout } = await import('./editor/open_editor_flyout'); - const initialState = await deserializeLinksSavedObject({ savedObjectId }); + const linksSavedObject = await getLinksClient().get(savedObjectId); + const initialState = await deserializeLinksSavedObject(linksSavedObject.item); await openEditorFlyout({ initialState }); }, }, @@ -128,14 +127,11 @@ export class LinksPlugin plugins.dashboard.registerDashboardPanelPlacementSetting( CONTENT_ID, - async (serializedState?: LinksSerializedState) => { - if (!serializedState) return {}; - const { links, layout } = linksSerializeStateIsByReference(serializedState) - ? await deserializeLinksSavedObject(serializedState) - : serializedState.attributes; - const isHorizontal = layout === 'horizontal'; + async (runtimeState?: LinksRuntimeState) => { + if (!runtimeState) return {}; + const isHorizontal = runtimeState.layout === 'horizontal'; const width = isHorizontal ? DASHBOARD_GRID_COLUMN_COUNT : 8; - const height = isHorizontal ? 4 : (links?.length ?? 1 * 3) + 4; + const height = isHorizontal ? 4 : (runtimeState.links?.length ?? 1 * 3) + 4; return { width, height, strategy: PanelPlacementStrategy.placeAtTop }; } ); diff --git a/src/plugins/saved_objects_management/public/index.ts b/src/plugins/saved_objects_management/public/index.ts index 6df2288d110b57..37ed13ea749e83 100644 --- a/src/plugins/saved_objects_management/public/index.ts +++ b/src/plugins/saved_objects_management/public/index.ts @@ -13,14 +13,7 @@ export type { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart, } from './plugin'; -export type { - SavedObjectsManagementActionServiceSetup, - SavedObjectsManagementActionServiceStart, - SavedObjectsManagementColumnServiceSetup, - SavedObjectsManagementColumnServiceStart, - SavedObjectsManagementColumn, - SavedObjectsManagementRecord, -} from './services'; +export type { SavedObjectsManagementColumn, SavedObjectsManagementRecord } from './services'; export { SavedObjectsManagementAction } from './services'; export type { ProcessedImportResponse, FailedImport } from './lib'; export { processImportResponse, getTagFindReferences, parseQuery } from './lib'; diff --git a/src/plugins/saved_objects_management/public/management_section/mount_section.tsx b/src/plugins/saved_objects_management/public/management_section/mount_section.tsx index 57103921c909a0..66bd4f6e9542f3 100644 --- a/src/plugins/saved_objects_management/public/management_section/mount_section.tsx +++ b/src/plugins/saved_objects_management/public/management_section/mount_section.tsx @@ -17,10 +17,16 @@ import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { SavedObjectManagementTypeInfo } from '../../common/types'; import { StartDependencies, SavedObjectsManagementPluginStart } from '../plugin'; import { getAllowedTypes } from '../lib'; +import { + SavedObjectsManagementActionServiceStart, + SavedObjectsManagementColumnServiceStart, +} from '../services'; interface MountParams { core: CoreSetup; mountParams: ManagementAppMountParams; + getActionServiceStart: () => SavedObjectsManagementActionServiceStart; + getColumnServiceStart: () => SavedObjectsManagementColumnServiceStart; } let allowedObjectTypes: SavedObjectManagementTypeInfo[] | undefined; @@ -31,8 +37,13 @@ const title = i18n.translate('savedObjectsManagement.objects.savedObjectsTitle', const SavedObjectsEditionPage = lazy(() => import('./saved_objects_edition_page')); const SavedObjectsTablePage = lazy(() => import('./saved_objects_table_page')); -export const mountManagementSection = async ({ core, mountParams }: MountParams) => { - const [coreStart, { data, dataViews, savedObjectsTaggingOss, spaces: spacesApi }, pluginStart] = +export const mountManagementSection = async ({ + core, + mountParams, + getColumnServiceStart, + getActionServiceStart, +}: MountParams) => { + const [coreStart, { data, dataViews, savedObjectsTaggingOss, spaces: spacesApi }] = await core.getStartServices(); const { capabilities } = coreStart.application; const { element, history, setBreadcrumbs } = mountParams; @@ -77,8 +88,8 @@ export const mountManagementSection = async ({ core, mountParams }: MountParams) spacesApi={spacesApi} dataStart={data} dataViewsApi={dataViews} - actionRegistry={pluginStart.actions} - columnRegistry={pluginStart.columns} + actionRegistry={getActionServiceStart()} + columnRegistry={getColumnServiceStart()} allowedTypes={allowedObjectTypes} setBreadcrumbs={setBreadcrumbs} /> diff --git a/src/plugins/saved_objects_management/public/mocks.ts b/src/plugins/saved_objects_management/public/mocks.ts index 82fe0d419855c6..51b93f04c5826d 100644 --- a/src/plugins/saved_objects_management/public/mocks.ts +++ b/src/plugins/saved_objects_management/public/mocks.ts @@ -6,22 +6,18 @@ * Side Public License, v 1. */ -import { actionServiceMock } from './services/action_service.mock'; -import { columnServiceMock } from './services/column_service.mock'; -import { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart } from './plugin'; +import type { + SavedObjectsManagementPluginSetup, + SavedObjectsManagementPluginStart, +} from './plugin'; const createSetupContractMock = (): jest.Mocked => { - const mock = { - actions: actionServiceMock.createSetup(), - columns: columnServiceMock.createSetup(), - }; + const mock = {}; return mock; }; const createStartContractMock = (): jest.Mocked => { const mock = { - actions: actionServiceMock.createStart(), - columns: columnServiceMock.createStart(), getAllowedTypes: jest.fn(), getRelationships: jest.fn(), getSavedObjectLabel: jest.fn(), diff --git a/src/plugins/saved_objects_management/public/plugin.ts b/src/plugins/saved_objects_management/public/plugin.ts index eaefe96a0916ad..855ea9dd7c91ea 100644 --- a/src/plugins/saved_objects_management/public/plugin.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -16,10 +16,8 @@ import { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { SavedObjectTaggingOssPluginStart } from '@kbn/saved-objects-tagging-oss-plugin/public'; import { SavedObjectsManagementActionService, - SavedObjectsManagementActionServiceSetup, SavedObjectsManagementActionServiceStart, SavedObjectsManagementColumnService, - SavedObjectsManagementColumnServiceSetup, SavedObjectsManagementColumnServiceStart, } from './services'; @@ -28,21 +26,18 @@ import type { v1 } from '../common'; import { SavedObjectManagementTypeInfo } from './types'; import { getAllowedTypes, + getDefaultTitle, getRelationships, getSavedObjectLabel, - getDefaultTitle, - parseQuery, getTagFindReferences, + parseQuery, } from './lib'; -export interface SavedObjectsManagementPluginSetup { - actions: SavedObjectsManagementActionServiceSetup; - columns: SavedObjectsManagementColumnServiceSetup; -} +// keeping the interface to reduce work if we want to add back APIs later +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SavedObjectsManagementPluginSetup {} export interface SavedObjectsManagementPluginStart { - actions: SavedObjectsManagementActionServiceStart; - columns: SavedObjectsManagementColumnServiceStart; getAllowedTypes: () => Promise; getRelationships: ( type: string, @@ -79,6 +74,9 @@ export class SavedObjectsManagementPlugin private actionService = new SavedObjectsManagementActionService(); private columnService = new SavedObjectsManagementColumnService(); + private actionServiceStart?: SavedObjectsManagementActionServiceStart; + private columnServiceStart?: SavedObjectsManagementColumnServiceStart; + public setup( core: CoreSetup, { home, management }: SetupDependencies @@ -114,6 +112,8 @@ export class SavedObjectsManagementPlugin return mountManagementSection({ core, mountParams, + getColumnServiceStart: () => this.columnServiceStart!, + getActionServiceStart: () => this.actionServiceStart!, }); }, }); @@ -125,12 +125,10 @@ export class SavedObjectsManagementPlugin } public start(_core: CoreStart, { spaces: spacesApi }: StartDependencies) { - const actionStart = this.actionService.start(spacesApi); - const columnStart = this.columnService.start(spacesApi); + this.actionServiceStart = this.actionService.start(spacesApi); + this.columnServiceStart = this.columnService.start(spacesApi); return { - actions: actionStart, - columns: columnStart, getAllowedTypes: () => getAllowedTypes(_core.http), getRelationships: (type: string, id: string, savedObjectTypes: string[]) => getRelationships(_core.http, type, id, savedObjectTypes), diff --git a/src/plugins/saved_objects_management/public/services/action_service.ts b/src/plugins/saved_objects_management/public/services/action_service.ts index b255ee9a7fa807..83f968a846113a 100644 --- a/src/plugins/saved_objects_management/public/services/action_service.ts +++ b/src/plugins/saved_objects_management/public/services/action_service.ts @@ -36,30 +36,25 @@ export class SavedObjectsManagementActionService { setup(): SavedObjectsManagementActionServiceSetup { return { - register: (action) => { - if (this.actions.has(action.id)) { - throw new Error(`Saved Objects Management Action with id '${action.id}' already exists`); - } - this.actions.set(action.id, action); - }, + register: (action) => this.register(action), }; } start(spacesApi?: SpacesApi): SavedObjectsManagementActionServiceStart { if (spacesApi && !spacesApi.hasOnlyDefaultSpace) { - registerSpacesApiActions(this, spacesApi); + this.register(new ShareToSpaceSavedObjectsManagementAction(spacesApi.ui)); + this.register(new CopyToSpaceSavedObjectsManagementAction(spacesApi.ui)); } return { has: (actionId) => this.actions.has(actionId), getAll: () => [...this.actions.values()], }; } -} -function registerSpacesApiActions( - service: SavedObjectsManagementActionService, - spacesApi: SpacesApi -) { - service.setup().register(new ShareToSpaceSavedObjectsManagementAction(spacesApi.ui)); - service.setup().register(new CopyToSpaceSavedObjectsManagementAction(spacesApi.ui)); + private register(action: SavedObjectsManagementAction) { + if (this.actions.has(action.id)) { + throw new Error(`Saved Objects Management Action with id '${action.id}' already exists`); + } + this.actions.set(action.id, action); + } } diff --git a/src/plugins/saved_objects_management/public/services/column_service.ts b/src/plugins/saved_objects_management/public/services/column_service.ts index 665866df1b4b06..519704d258c493 100644 --- a/src/plugins/saved_objects_management/public/services/column_service.ts +++ b/src/plugins/saved_objects_management/public/services/column_service.ts @@ -29,28 +29,23 @@ export class SavedObjectsManagementColumnService { setup(): SavedObjectsManagementColumnServiceSetup { return { - register: (column) => { - if (this.columns.has(column.id)) { - throw new Error(`Saved Objects Management Column with id '${column.id}' already exists`); - } - this.columns.set(column.id, column); - }, + register: (column) => this.register(column), }; } start(spacesApi?: SpacesApi): SavedObjectsManagementColumnServiceStart { if (spacesApi && !spacesApi.hasOnlyDefaultSpace) { - registerSpacesApiColumns(this, spacesApi); + this.register(new ShareToSpaceSavedObjectsManagementColumn(spacesApi.ui)); } return { getAll: () => [...this.columns.values()], }; } -} -function registerSpacesApiColumns( - service: SavedObjectsManagementColumnService, - spacesApi: SpacesApi -) { - service.setup().register(new ShareToSpaceSavedObjectsManagementColumn(spacesApi.ui)); + private register(column: SavedObjectsManagementColumn) { + if (this.columns.has(column.id)) { + throw new Error(`Saved Objects Management Column with id '${column.id}' already exists`); + } + this.columns.set(column.id, column); + } } diff --git a/src/plugins/saved_objects_management/public/services/index.ts b/src/plugins/saved_objects_management/public/services/index.ts index 997a1b96b418f0..9d6f96cee0cfb6 100644 --- a/src/plugins/saved_objects_management/public/services/index.ts +++ b/src/plugins/saved_objects_management/public/services/index.ts @@ -6,15 +6,9 @@ * Side Public License, v 1. */ -export type { - SavedObjectsManagementActionServiceStart, - SavedObjectsManagementActionServiceSetup, -} from './action_service'; +export type { SavedObjectsManagementActionServiceStart } from './action_service'; export { SavedObjectsManagementActionService } from './action_service'; -export type { - SavedObjectsManagementColumnServiceStart, - SavedObjectsManagementColumnServiceSetup, -} from './column_service'; +export type { SavedObjectsManagementColumnServiceStart } from './column_service'; export { SavedObjectsManagementColumnService } from './column_service'; export type { SavedObjectsManagementRecord } from './types'; export { SavedObjectsManagementColumn, SavedObjectsManagementAction } from './types'; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 00c4a48da72faf..d36836e0f07470 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -10292,7 +10292,7 @@ "description": "Non-default value of setting." } }, - "observability:apmEnableMultiSignal": { + "observability:entityCentricExperience": { "type": "boolean", "_meta": { "description": "Non-default value of setting." diff --git a/src/plugins/unified_doc_viewer/kibana.jsonc b/src/plugins/unified_doc_viewer/kibana.jsonc index e2febffda4df6b..56ea8951e3a2d8 100644 --- a/src/plugins/unified_doc_viewer/kibana.jsonc +++ b/src/plugins/unified_doc_viewer/kibana.jsonc @@ -8,7 +8,7 @@ "server": false, "browser": true, "requiredBundles": ["kibanaUtils"], - "requiredPlugins": ["data", "discoverShared", "fieldFormats", "share"], + "requiredPlugins": ["data", "fieldFormats", "share"], "optionalPlugins": ["fieldsMetadata"] } } diff --git a/src/plugins/unified_doc_viewer/public/__mocks__/services.ts b/src/plugins/unified_doc_viewer/public/__mocks__/services.ts index 29ae5f2981a6e0..5e7222f2615328 100644 --- a/src/plugins/unified_doc_viewer/public/__mocks__/services.ts +++ b/src/plugins/unified_doc_viewer/public/__mocks__/services.ts @@ -8,7 +8,6 @@ import { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; -import { discoverSharedPluginMock } from '@kbn/discover-shared-plugin/public/mocks'; import { fieldFormatsMock } from '@kbn/field-formats-plugin/common/mocks'; import { fieldsMetadataPluginPublicMock } from '@kbn/fields-metadata-plugin/public/mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; @@ -24,7 +23,6 @@ export const mockUnifiedDocViewer: jest.Mocked = { export const mockUnifiedDocViewerServices: jest.Mocked = { analytics: analyticsServiceMock.createAnalyticsServiceStart(), data: dataPluginMock.createStartContract(), - discoverShared: discoverSharedPluginMock.createStartContract(), fieldFormats: fieldFormatsMock, fieldsMetadata: fieldsMetadataPluginPublicMock.createStartContract(), storage: new Storage(localStorage), diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/index.ts b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/index.ts index 69f01c944ad253..99416ee140231a 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/index.ts +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/index.ts @@ -5,6 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + import { LogsOverview } from './logs_overview'; // Required for usage in React.lazy diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx index b46570f4f0d374..73bcf21dab30c9 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx @@ -10,13 +10,17 @@ import React from 'react'; import { DocViewRenderProps } from '@kbn/unified-doc-viewer/types'; import { getLogDocumentOverview } from '@kbn/discover-utils'; import { EuiHorizontalRule, EuiSpacer } from '@elastic/eui'; +import { ObservabilityLogsAIAssistantFeatureRenderDeps } from '@kbn/discover-shared-plugin/public'; import { LogsOverviewHeader } from './logs_overview_header'; import { LogsOverviewHighlights } from './logs_overview_highlights'; import { FieldActionsProvider } from '../../hooks/use_field_actions'; import { getUnifiedDocViewerServices } from '../../plugin'; -import { LogsOverviewAIAssistant } from './logs_overview_ai_assistant'; import { LogsOverviewDegradedFields } from './logs_overview_degraded_fields'; +export type LogsOverviewProps = DocViewRenderProps & { + renderAIAssistant?: (deps: ObservabilityLogsAIAssistantFeatureRenderDeps) => JSX.Element; +}; + export function LogsOverview({ columns, dataView, @@ -24,9 +28,11 @@ export function LogsOverview({ filter, onAddColumn, onRemoveColumn, -}: DocViewRenderProps) { + renderAIAssistant, +}: LogsOverviewProps) { const { fieldFormats } = getUnifiedDocViewerServices(); const parsedDoc = getLogDocumentOverview(hit, { dataView, fieldFormats }); + const LogsOverviewAIAssistant = renderAIAssistant; return ( - + {LogsOverviewAIAssistant && } ); } diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_ai_assistant.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_ai_assistant.tsx deleted file mode 100644 index 0e2627a1054fdb..00000000000000 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_ai_assistant.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { DataTableRecord } from '@kbn/discover-utils'; -import { getUnifiedDocViewerServices } from '../../plugin'; - -export function LogsOverviewAIAssistant({ doc }: { doc: DataTableRecord }) { - const { discoverShared } = getUnifiedDocViewerServices(); - - const logsAIAssistantFeature = discoverShared.features.registry.getById( - 'observability-logs-ai-assistant' - ); - - if (!logsAIAssistantFeature) { - return null; - } - - return logsAIAssistantFeature.render({ doc }); -} diff --git a/src/plugins/unified_doc_viewer/public/components/lazy_doc_viewer_logs_overview.tsx b/src/plugins/unified_doc_viewer/public/components/lazy_doc_viewer_logs_overview.tsx new file mode 100644 index 00000000000000..8da9e9b3cb7225 --- /dev/null +++ b/src/plugins/unified_doc_viewer/public/components/lazy_doc_viewer_logs_overview.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { EuiDelayRender, EuiSkeletonText } from '@elastic/eui'; +import { dynamic } from '@kbn/shared-ux-utility'; + +export const UnifiedDocViewerLogsOverview = dynamic(() => import('./doc_viewer_logs_overview'), { + fallback: ( + + + + ), +}); diff --git a/src/plugins/unified_doc_viewer/public/index.tsx b/src/plugins/unified_doc_viewer/public/index.tsx index b594d8f06c42fe..6c5f1d59991c69 100644 --- a/src/plugins/unified_doc_viewer/public/index.tsx +++ b/src/plugins/unified_doc_viewer/public/index.tsx @@ -29,4 +29,7 @@ export { useEsDocSearch } from './hooks'; export { UnifiedDocViewer } from './components/lazy_doc_viewer'; export { UnifiedDocViewerFlyout } from './components/lazy_doc_viewer_flyout'; +export type { LogsOverviewProps as UnifiedDocViewerLogsOverviewProps } from './components/doc_viewer_logs_overview/logs_overview'; +export { UnifiedDocViewerLogsOverview } from './components/lazy_doc_viewer_logs_overview'; + export const plugin = () => new UnifiedDocViewerPublicPlugin(); diff --git a/src/plugins/unified_doc_viewer/public/plugin.tsx b/src/plugins/unified_doc_viewer/public/plugin.tsx index 9c4d7117c37dd2..e8a23342e7976f 100644 --- a/src/plugins/unified_doc_viewer/public/plugin.tsx +++ b/src/plugins/unified_doc_viewer/public/plugin.tsx @@ -17,7 +17,6 @@ import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { CoreStart } from '@kbn/core/public'; import { dynamic } from '@kbn/shared-ux-utility'; -import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public'; import { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; import { SharePluginStart } from '@kbn/share-plugin/public'; import type { UnifiedDocViewerServices } from './types'; @@ -31,9 +30,6 @@ const fallback = ( ); -const LazyDocViewerLogsOverview = dynamic(() => import('./components/doc_viewer_logs_overview'), { - fallback, -}); const LazyDocViewerLegacyTable = dynamic(() => import('./components/doc_viewer_table/legacy'), { fallback, }); @@ -50,7 +46,6 @@ export interface UnifiedDocViewerStart { export interface UnifiedDocViewerStartDeps { data: DataPublicPluginStart; - discoverShared: DiscoverSharedPublicStart; fieldFormats: FieldFormatsStart; fieldsMetadata: FieldsMetadataPublicStart; share: SharePluginStart; @@ -62,18 +57,6 @@ export class UnifiedDocViewerPublicPlugin private docViewsRegistry = new DocViewsRegistry(); public setup(core: CoreSetup) { - this.docViewsRegistry.add({ - id: 'doc_view_logs_overview', - title: i18n.translate('unifiedDocViewer.docViews.logsOverview.title', { - defaultMessage: 'Overview', - }), - order: 0, - enabled: false, // Disabled doc view by default, can be programmatically enabled using the DocViewsRegistry.prototype.enableById method. - component: (props) => { - return ; - }, - }); - this.docViewsRegistry.add({ id: 'doc_view_table', title: i18n.translate('unifiedDocViewer.docViews.table.tableTitle', { @@ -123,7 +106,7 @@ export class UnifiedDocViewerPublicPlugin public start(core: CoreStart, deps: UnifiedDocViewerStartDeps) { const { analytics, uiSettings } = core; - const { data, discoverShared, fieldFormats, fieldsMetadata, share } = deps; + const { data, fieldFormats, fieldsMetadata, share } = deps; const storage = new Storage(localStorage); const unifiedDocViewer = { registry: this.docViewsRegistry, @@ -131,7 +114,6 @@ export class UnifiedDocViewerPublicPlugin const services = { analytics, data, - discoverShared, fieldFormats, fieldsMetadata, storage, diff --git a/src/plugins/unified_doc_viewer/public/types.ts b/src/plugins/unified_doc_viewer/public/types.ts index e471fa87b85c16..9266328306aaf6 100644 --- a/src/plugins/unified_doc_viewer/public/types.ts +++ b/src/plugins/unified_doc_viewer/public/types.ts @@ -11,7 +11,6 @@ export type { UnifiedDocViewerSetup, UnifiedDocViewerStart } from './plugin'; import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import type { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -22,7 +21,6 @@ import type { UnifiedDocViewerStart } from './plugin'; export interface UnifiedDocViewerServices { analytics: AnalyticsServiceStart; data: DataPublicPluginStart; - discoverShared: DiscoverSharedPublicStart; fieldFormats: FieldFormatsStart; fieldsMetadata: FieldsMetadataPublicStart; storage: Storage; diff --git a/src/plugins/unified_histogram/public/chart/histogram.tsx b/src/plugins/unified_histogram/public/chart/histogram.tsx index 50c8f7242c589a..aab4757706bd18 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.tsx @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { useEuiTheme, useResizeObserver } from '@elastic/eui'; +import { useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; -import React, { useState, useRef, useEffect } from 'react'; +import React, { useState } from 'react'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { DefaultInspectorAdapters, Datatable } from '@kbn/expressions-plugin/common'; import type { IKibanaSearchResponse } from '@kbn/search-types'; @@ -106,7 +106,6 @@ export function Histogram({ abortController, }: HistogramProps) { const [bucketInterval, setBucketInterval] = useState(); - const [chartSize, setChartSize] = useState('100%'); const { timeRangeText, timeRangeDisplay } = useTimeRange({ uiSettings, bucketInterval, @@ -115,19 +114,8 @@ export function Histogram({ isPlainRecord, timeField: dataView.timeFieldName, }); - const chartRef = useRef(null); - const { height: containerHeight, width: containerWidth } = useResizeObserver(chartRef.current); const { attributes } = visContext; - useEffect(() => { - if (attributes.visualizationType === 'lnsMetric') { - const size = containerHeight < containerWidth ? containerHeight : containerWidth; - setChartSize(`${size}px`); - } else { - setChartSize('100%'); - } - }, [attributes, containerHeight, containerWidth]); - const onLoad = useStableCallback( ( isLoading: boolean, @@ -197,7 +185,7 @@ export function Histogram({ } & .lnsExpressionRenderer { - width: ${chartSize}; + width: ${attributes.visualizationType === 'lnsMetric' ? '90%' : '100%'}; margin: auto; box-shadow: ${attributes.visualizationType === 'lnsMetric' ? boxShadow : 'none'}; } @@ -222,7 +210,6 @@ export function Histogram({ data-request-data={requestData} data-suggestion-type={visContext.suggestionType} css={chartCss} - ref={chartRef} > { - await testSubjects.click('docTableExpandToggleColumn'); - await PageObjects.discover.clickDocViewerTab('doc_view_table'); + await dataGrid.clickRowToggle(); await a11y.testAppSnapshot(); }); diff --git a/test/functional/apps/dashboard/group1/url_field_formatter.ts b/test/functional/apps/dashboard/group1/url_field_formatter.ts index b408e0aed14d6c..1cc49998770bf2 100644 --- a/test/functional/apps/dashboard/group1/url_field_formatter.ts +++ b/test/functional/apps/dashboard/group1/url_field_formatter.ts @@ -25,6 +25,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const deployment = getService('deployment'); const retry = getService('retry'); const security = getService('security'); + const dataGrid = getService('dataGrid'); const checkUrl = async (fieldValue: string) => { const windowHandlers = await browser.getAllWindowHandles(); @@ -79,7 +80,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await common.setTime({ from, to }); await common.navigateToApp('discover'); await discover.selectIndexPattern('logstash-*'); - await testSubjects.click('docTableExpandToggleColumn'); + await dataGrid.clickRowToggle(); await retry.waitForWithTimeout(`${fieldName} is visible`, 30000, async () => { return await testSubjects.isDisplayed(`tableDocViewRow-${fieldName}-value`); }); @@ -87,8 +88,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { `[data-test-subj="tableDocViewRow-${fieldName}-value"] a` ); const fieldValue = await fieldLink.getVisibleText(); - await fieldLink.click(); await retry.try(async () => { + await fieldLink.click(); await checkUrl(fieldValue); }); }); diff --git a/test/functional/apps/discover/context_awareness/_data_source_profile.ts b/test/functional/apps/discover/context_awareness/_data_source_profile.ts index f3f7e35d7030bc..594e6dee5dd78f 100644 --- a/test/functional/apps/discover/context_awareness/_data_source_profile.ts +++ b/test/functional/apps/discover/context_awareness/_data_source_profile.ts @@ -73,7 +73,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.missingOrFail('docViewerTab-doc_view_example'); expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); }); @@ -89,7 +89,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.existOrFail('docViewerTab-doc_view_example'); expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); }); }); @@ -136,7 +136,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.missingOrFail('docViewerTab-doc_view_example'); expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); }); @@ -147,7 +147,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.existOrFail('docViewerTab-doc_view_example'); expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' ); diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts b/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts new file mode 100644 index 00000000000000..7f60f92cf61911 --- /dev/null +++ b/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import kbnRison from '@kbn/rison'; +import type { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'discover']); + const testSubjects = getService('testSubjects'); + const dataViews = getService('dataViews'); + const dataGrid = getService('dataGrid'); + + describe('extension getDocViewer', () => { + describe('ES|QL mode', () => { + it('should render logs overview tab for logs data source', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await dataGrid.clickDocViewerTab('doc_view_logs_overview'); + await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + }); + + it('should not render logs overview tab for non-logs data source', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-metrics | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + }); + }); + + describe('data view mode', () => { + it('should render logs overview tab for logs data source', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-logs'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await dataGrid.clickDocViewerTab('doc_view_logs_overview'); + await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + }); + + it('should not render logs overview tab for non-logs data source', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-metrics'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + }); + }); + }); +} diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts b/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts new file mode 100644 index 00000000000000..72dafc0f46e7f9 --- /dev/null +++ b/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; +import type { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'timePicker', 'discover', 'unifiedFieldList']); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const dataGrid = getService('dataGrid'); + const browser = getService('browser'); + + describe('extension getRowIndicatorProvider', () => { + before(async () => { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + after(async () => { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + it('should not render log.level row indicators for logs data source without a log.level field', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from logstash* | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // logstash does not have log.level field, so the color indicator should not be rendered + await testSubjects.existOrFail('euiDataGridBody'); + await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); + + // switch the time frame back + await browser.goBack(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should not render log.level row indicators if not a logs data source', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example* | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // my-example* has a log.level field, but it's not matching the logs profile, so the color indicator should not be rendered + await testSubjects.existOrFail('euiDataGridBody'); + await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); + }); + + it('should render log.level row indicators', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', + }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // in this case it's matching the logs data source profile and has a log.level field, so the color indicator should be rendered + await testSubjects.existOrFail('dataGridHeaderCell-colorIndicator'); + const firstCell = await dataGrid.getCellElement(0, 0); + const firstColorIndicator = await firstCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await firstColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + expect(await firstColorIndicator.getAttribute('title')).to.be('Debug'); + + const secondCell = await dataGrid.getCellElement(1, 0); + const secondColorIndicator = await secondCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await secondColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(223, 147, 82, 1)' + ); + expect(await secondColorIndicator.getAttribute('title')).to.be('Error'); + }); + }); +} diff --git a/test/functional/apps/discover/context_awareness/index.ts b/test/functional/apps/discover/context_awareness/index.ts index f280024ec7c80e..b642bcbce7476d 100644 --- a/test/functional/apps/discover/context_awareness/index.ts +++ b/test/functional/apps/discover/context_awareness/index.ts @@ -35,5 +35,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid loadTestFile(require.resolve('./_root_profile')); loadTestFile(require.resolve('./_data_source_profile')); + loadTestFile(require.resolve('./extensions/_get_row_indicator_provider')); + loadTestFile(require.resolve('./extensions/_get_doc_viewer')); }); } diff --git a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts index befce148bdf81d..921e6f988aad6c 100644 --- a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts +++ b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts @@ -89,11 +89,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await addSearchEmbeddableToDashboard(); await PageObjects.dashboard.switchToEditMode(); - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('Sep 22, 2015 @ 23:50:13.253'); await dataGrid.clickMoveColumnLeft('agent'); - const cellAfter = await dataGrid.getCellElement(0, 2); + const cellAfter = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cellAfter.getVisibleText()).to.be( 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)' ); diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index 4bd351febc66c4..34e74cc4029a82 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -104,7 +104,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // here Lens suggests a XY so it is rendered expect(await testSubjects.exists('unifiedHistogramChart')).to.be(true); expect(await testSubjects.exists('xyVisChart')).to.be(true); - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('1'); }); @@ -115,7 +115,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('querySubmitButton'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - let cell = await dataGrid.getCellElement(0, 2); + let cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('1'); await PageObjects.timePicker.setAbsoluteRange( 'Sep 19, 2015 @ 06:31:44.000', @@ -127,7 +127,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.timePicker.setDefaultAbsoluteRange(); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - cell = await dataGrid.getCellElement(0, 2); + cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('1'); }); @@ -139,7 +139,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('querySubmitButton'); await PageObjects.header.waitUntilLoadingHasFinished(); - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('1'); }); @@ -151,7 +151,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('querySubmitButton'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be(' - '); expect(await dataGrid.getHeaders()).to.eql([ 'Control column', @@ -170,7 +170,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.dragFieldToTable('a'); - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); expect(await cell.getVisibleText()).to.be('1'); }); }); @@ -393,7 +393,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains an initial value', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '1,623'; }); @@ -407,7 +407,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains the highest value', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '483'; }); @@ -422,7 +422,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains the same highest value', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '483'; }); @@ -433,7 +433,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains the same highest value after reload', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '483'; }); @@ -451,7 +451,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor( 'first cell contains the same highest value after reopening', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '483'; } @@ -462,7 +462,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains the lowest value', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '0'; }); @@ -479,7 +479,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.clickDocSortDesc('extension', 'Sort A-Z'); await retry.waitFor('first cell contains the lowest value for extension', async () => { - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); const text = await cell.getVisibleText(); return text === 'css'; }); @@ -494,7 +494,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains the same lowest value after reload', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '0'; }); @@ -502,7 +502,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor( 'first cell contains the same lowest value for extension after reload', async () => { - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); const text = await cell.getVisibleText(); return text === 'css'; } @@ -520,7 +520,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor( 'first cell contains the same lowest value as dashboard panel', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === '0'; } @@ -529,7 +529,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.waitFor( 'first cell contains the lowest value for extension as dashboard panel', async () => { - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); const text = await cell.getVisibleText(); return text === 'css'; } @@ -558,7 +558,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); await testSubjects.click('TextBasedLangEditor-expand'); - await dataGrid.clickCellFilterForButton(0, 3); + await dataGrid.clickCellFilterForButtonExcludingControlColumns(0, 1); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); @@ -569,7 +569,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); // negate - await dataGrid.clickCellFilterOutButton(0, 3); + await dataGrid.clickCellFilterOutButtonExcludingControlColumns(0, 1); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); @@ -591,7 +591,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); await testSubjects.click('TextBasedLangEditor-expand'); - await dataGrid.clickCellFilterForButton(0, 3); + await dataGrid.clickCellFilterForButtonExcludingControlColumns(0, 1); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); diff --git a/test/functional/apps/discover/group2_data_grid1/_data_grid_doc_table.ts b/test/functional/apps/discover/group2_data_grid1/_data_grid_doc_table.ts index 24056a39866243..5d96a3d3fb321b 100644 --- a/test/functional/apps/discover/group2_data_grid1/_data_grid_doc_table.ts +++ b/test/functional/apps/discover/group2_data_grid1/_data_grid_doc_table.ts @@ -10,7 +10,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const find = getService('find'); const dataGrid = getService('dataGrid'); const log = getService('log'); const retry = getService('retry'); @@ -78,7 +77,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitForWithTimeout('timestamp matches expected doc', 5000, async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); log.debug(`row document timestamp: ${text}`); return text === 'Sep 22, 2015 @ 23:50:13.253'; @@ -95,10 +94,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); log.debug(`expanded document id: ${expandDocId}`); - await dataGrid.clickRowToggle(); - await find.clickByCssSelectorWhenNotDisabledWithoutRetry( - '#kbn_doc_viewer_tab_doc_view_source' - ); + await dataGrid.clickRowToggle({ defaultTabId: 'doc_view_source' }); await retry.waitForWithTimeout( 'document id in flyout matching the expanded document id', @@ -125,7 +121,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardAddPanel.addSavedSearch('expand-cell-search'); await retry.waitForWithTimeout('timestamp matches expected doc', 5000, async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); log.debug(`row document timestamp: ${text}`); return text === 'Sep 22, 2015 @ 23:50:13.253'; @@ -139,10 +135,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); log.debug(`expanded document id: ${expandDocId}`); - await dataGrid.clickRowToggle(); - await find.clickByCssSelectorWhenNotDisabledWithoutRetry( - '#kbn_doc_viewer_tab_doc_view_source' - ); + await dataGrid.clickRowToggle({ defaultTabId: 'doc_view_source' }); await retry.waitForWithTimeout( 'document id in flyout matching the expanded document id', diff --git a/test/functional/apps/discover/group2_data_grid2/_data_grid_field_data.ts b/test/functional/apps/discover/group2_data_grid2/_data_grid_field_data.ts index f12f378bbf94b0..8399e9dd651fc8 100644 --- a/test/functional/apps/discover/group2_data_grid2/_data_grid_field_data.ts +++ b/test/functional/apps/discover/group2_data_grid2/_data_grid_field_data.ts @@ -79,7 +79,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('first cell contains expected timestamp', async () => { - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const text = await cell.getVisibleText(); return text === expectedTimeStamp; }); diff --git a/test/functional/apps/discover/group2_data_grid2/_data_grid_new_line.ts b/test/functional/apps/discover/group2_data_grid2/_data_grid_new_line.ts index 8049a86fc11644..dd7a783128d031 100644 --- a/test/functional/apps/discover/group2_data_grid2/_data_grid_new_line.ts +++ b/test/functional/apps/discover/group2_data_grid2/_data_grid_new_line.ts @@ -71,7 +71,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const rows = await dataGrid.getDocTableRows(); expect(rows.length).to.be.above(0); - const cell = await dataGrid.getCellElement(0, 2); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); const content = await cell.findByCssSelector('.unifiedDataTable__descriptionListDescription'); expect(await content.getVisibleText()).to.be(VALUE_WITHOUT_NEW_LINES); expect(await content.getComputedStyle('white-space')).to.be('normal'); @@ -81,7 +81,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.unifiedFieldList.clickFieldListItemAdd('message'); await PageObjects.discover.waitUntilSearchingHasFinished(); - let cell = await dataGrid.getCellElement(0, 2); + let cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); let content = await cell.findByCssSelector('.unifiedDataTable__cellValue'); expect(await content.getVisibleText()).to.be(VALUE_WITH_NEW_LINES); expect(await content.getComputedStyle('white-space')).to.be('pre-wrap'); @@ -91,7 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.changeRowHeightValue('Auto fit'); await dataGrid.clickGridSettings(); - cell = await dataGrid.getCellElement(0, 2); + cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); content = await cell.findByCssSelector('.unifiedDataTable__cellValue'); expect(await content.getVisibleText()).to.be(VALUE_WITH_NEW_LINES); expect(await content.getComputedStyle('white-space')).to.be('pre-wrap'); @@ -101,7 +101,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.changeRowHeightValue('Single'); await dataGrid.clickGridSettings(); - cell = await dataGrid.getCellElement(0, 2); + cell = await dataGrid.getCellElementExcludingControlColumns(0, 0); content = await cell.findByCssSelector('.unifiedDataTable__cellValue'); expect(await content.getVisibleText()).to.be(VALUE_WITHOUT_NEW_LINES); expect(await content.getComputedStyle('white-space')).to.be('nowrap'); diff --git a/test/functional/apps/discover/group3/_doc_viewer.ts b/test/functional/apps/discover/group3/_doc_viewer.ts index 140129c6a251f8..ddcdf5c4e40b7a 100644 --- a/test/functional/apps/discover/group3/_doc_viewer.ts +++ b/test/functional/apps/discover/group3/_doc_viewer.ts @@ -61,7 +61,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 4; }); - await PageObjects.discover.findFieldByNameInDocViewer('.s'); + await PageObjects.discover.findFieldByNameInDocViewer('.sr'); await retry.waitFor('second updates', async () => { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 2; @@ -70,7 +70,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should be able to search by wildcard', async function () { await PageObjects.discover.findFieldByNameInDocViewer('relatedContent*image'); - await retry.waitFor('updates', async () => { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 2; }); @@ -78,12 +77,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should be able to search with spaces as wildcard', async function () { await PageObjects.discover.findFieldByNameInDocViewer('relatedContent image'); - await retry.waitFor('updates', async () => { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 4; }); }); + it('should be able to search with fuzzy search (1 typo)', async function () { + await PageObjects.discover.findFieldByNameInDocViewer('rel4tedContent.art'); + + await retry.waitFor('updates', async () => { + return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 3; + }); + }); + it('should ignore empty search', async function () { await PageObjects.discover.findFieldByNameInDocViewer(' '); // only spaces diff --git a/test/functional/apps/discover/group5/_filter_editor.ts b/test/functional/apps/discover/group5/_filter_editor.ts index 7e338f553d940a..41d5f38b1103ba 100644 --- a/test/functional/apps/discover/group5/_filter_editor.ts +++ b/test/functional/apps/discover/group5/_filter_editor.ts @@ -131,7 +131,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await filterBar.removeAllFilters(); await PageObjects.unifiedFieldList.clickFieldListItemAdd('extension'); await retry.try(async function () { - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be('jpg'); expect(await PageObjects.discover.getHitCount()).to.be('14,004'); }); @@ -145,7 +145,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } await retry.try(async function () { expect(await filterBar.hasFilter('extension.raw', 'css', true, pinned)).to.be(true); - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be('css'); expect(await PageObjects.discover.getHitCount()).to.be('2,159'); }); @@ -153,7 +153,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async function () { expect(await filterBar.hasFilter('extension.raw', 'css', true, pinned)).to.be(true); expect(await PageObjects.discover.getHitCount()).to.be('2,159'); - const cell = await dataGrid.getCellElement(0, 3); + const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be('css'); }); }; diff --git a/test/functional/apps/discover/group6/_field_stats_table.ts b/test/functional/apps/discover/group6/_field_stats_table.ts new file mode 100644 index 00000000000000..45b05d7ddc4bf9 --- /dev/null +++ b/test/functional/apps/discover/group6/_field_stats_table.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'header']); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const kibanaServer = getService('kibanaServer'); + const security = getService('security'); + const defaultSettings = { + defaultIndex: 'logstash-*', + }; + + describe('discover field statistics table', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + [true, false].forEach((shouldSearchFieldsFromSource) => { + describe(`discover:searchFieldsFromSource: ${shouldSearchFieldsFromSource}`, function () { + before(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + ...defaultSettings, + 'discover:searchFieldsFromSource': shouldSearchFieldsFromSource, + }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + after(async () => { + await kibanaServer.uiSettings.replace({}); + }); + + it('should show Field Statistics data in data view mode', async () => { + await testSubjects.click('dscViewModeFieldStatsButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('dataVisualizerTableContainer'); + + await testSubjects.click('dscViewModeDocumentButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('discoverDocTable'); + }); + + it('should show Field Statistics data in ES|QL mode', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.click('dscViewModeFieldStatsButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('dataVisualizerTableContainer'); + }); + }); + }); + }); +} diff --git a/test/functional/apps/discover/group6/_sidebar.ts b/test/functional/apps/discover/group6/_sidebar.ts index ab2dc70e9e782d..a2841bddf8777a 100644 --- a/test/functional/apps/discover/group6/_sidebar.ts +++ b/test/functional/apps/discover/group6/_sidebar.ts @@ -223,6 +223,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); + it('should be able to search with fuzzy search (1 typo)', async function () { + await PageObjects.unifiedFieldList.findFieldByName('rel4tedContent.art'); + + await retry.waitFor('updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '4 available fields. 0 meta fields.' + ); + }); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('available')).join(', ') + ).to.be( + 'relatedContent.article:modified_time, relatedContent.article:published_time, relatedContent.article:section, relatedContent.article:tag' + ); + }); + it('should ignore empty search', async function () { await PageObjects.unifiedFieldList.findFieldByName(' '); // only spaces diff --git a/test/functional/apps/discover/group6/index.ts b/test/functional/apps/discover/group6/index.ts index f71d96e63d2fd4..6ed514463705f6 100644 --- a/test/functional/apps/discover/group6/index.ts +++ b/test/functional/apps/discover/group6/index.ts @@ -25,5 +25,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_time_field_column')); loadTestFile(require.resolve('./_unsaved_changes_badge')); loadTestFile(require.resolve('./_view_mode_toggle')); + loadTestFile(require.resolve('./_field_stats_table')); }); } diff --git a/test/functional/apps/home/_welcome.ts b/test/functional/apps/home/_welcome.ts index d61afd879090ea..6c8bda90de699f 100644 --- a/test/functional/apps/home/_welcome.ts +++ b/test/functional/apps/home/_welcome.ts @@ -15,7 +15,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'home']); const deployment = getService('deployment'); - describe('Welcome interstitial', () => { + // FLAKY: https://github.com/elastic/kibana/issues/186168 + describe.skip('Welcome interstitial', () => { beforeEach(async () => { // Need to navigate to page first to clear storage before test can be run await PageObjects.common.navigateToUrl('home', undefined); diff --git a/test/functional/fixtures/kbn_archiver/discover/context_awareness.json b/test/functional/fixtures/kbn_archiver/discover/context_awareness.json index 5232a109e5799e..a4a086afc11ce3 100644 --- a/test/functional/fixtures/kbn_archiver/discover/context_awareness.json +++ b/test/functional/fixtures/kbn_archiver/discover/context_awareness.json @@ -46,4 +46,29 @@ "updated_at": "2024-06-12T22:23:21.331Z", "updated_by": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0", "version": "WzEwLDFd" +} + +{ + "attributes": { + "allowHidden": false, + "fieldAttrs": "{}", + "fieldFormatMap": "{}", + "fields": "[]", + "name": "my-example-metrics", + "runtimeFieldMap": "{}", + "sourceFilters": "[]", + "timeFieldName": "@timestamp", + "title": "my-example-metrics" + }, + "coreMigrationVersion": "8.8.0", + "created_at": "2024-06-12T22:23:31.331Z", + "created_by": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0", + "id": "795df528-add1-491a-8e25-72a862c4bf3b", + "managed": false, + "references": [], + "type": "index-pattern", + "typeMigrationVersion": "8.0.0", + "updated_at": "2024-06-12T22:23:21.331Z", + "updated_by": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0", + "version": "WzEwLDFc" } \ No newline at end of file diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index 9263e34f96158f..81f4bad5b5b1e8 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -379,7 +379,7 @@ export class DiscoverPageObject extends FtrService { }) ); // Remove control columns - return result.slice(2).join(' '); + return result.slice(await this.dataGrid.getControlColumnsCount()).join(' '); } public async getDocTableIndexLegacy(index: number) { @@ -389,7 +389,7 @@ export class DiscoverPageObject extends FtrService { public async getDocTableField(index: number, cellIdx: number = -1) { const isLegacyDefault = await this.useLegacyTable(); - const usedDefaultCellIdx = isLegacyDefault ? 0 : 2; + const usedDefaultCellIdx = isLegacyDefault ? 0 : await this.dataGrid.getControlColumnsCount(); const usedCellIdx = cellIdx === -1 ? usedDefaultCellIdx : cellIdx; if (isLegacyDefault) { const fields = await this.find.allByCssSelector( @@ -431,12 +431,12 @@ export class DiscoverPageObject extends FtrService { return await this.testSubjects.find('discoverDocTableFooter'); } - public async isShowingDocViewer() { - return await this.testSubjects.exists('kbnDocViewer'); + public isShowingDocViewer() { + return this.dataGrid.isShowingDocViewer(); } - public async clickDocViewerTab(id: string) { - return await this.find.clickByCssSelector(`#kbn_doc_viewer_tab_${id}`); + public clickDocViewerTab(id: string) { + return this.dataGrid.clickDocViewerTab(id); } public async expectSourceViewerToExist() { diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index cb225c45d1ea0b..7df0c5f49bf001 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -95,6 +95,21 @@ export class DataGridService extends FtrService { return await this.find.byCssSelector(this.getCellElementSelector(rowIndex, columnIndex)); } + public async getControlColumnsCount() { + const controlsHeaderSelector = '.euiDataGridHeaderCell--controlColumn'; + return (await this.find.allByCssSelector(controlsHeaderSelector)).length; + } + + public async getCellElementExcludingControlColumns( + rowIndex: number = 0, + columnIndexAfterControlColumns: number = 0 + ) { + const controlsCount = await this.getControlColumnsCount(); + return await this.find.byCssSelector( + this.getCellElementSelector(rowIndex, controlsCount + columnIndexAfterControlColumns) + ); + } + private async getCellActionButton( rowIndex: number = 0, columnIndex: number = 0, @@ -136,11 +151,42 @@ export class DataGridService extends FtrService { await actionButton.click(); } + /** + * Clicks grid cell 'filter for' action button + * @param rowIndex data row index starting from 0 (0 means 1st row) + * @param columnIndex column index starting from 0 (0 means 1st column) + */ + public async clickCellFilterForButtonExcludingControlColumns( + rowIndex: number = 0, + columnIndex: number = 0 + ) { + const controlsCount = await this.getControlColumnsCount(); + const actionButton = await this.getCellActionButton( + rowIndex, + controlsCount + columnIndex, + 'filterForButton' + ); + await actionButton.click(); + } + public async clickCellFilterOutButton(rowIndex: number = 0, columnIndex: number = 0) { const actionButton = await this.getCellActionButton(rowIndex, columnIndex, 'filterOutButton'); await actionButton.click(); } + public async clickCellFilterOutButtonExcludingControlColumns( + rowIndex: number = 0, + columnIndex: number = 0 + ) { + const controlsCount = await this.getControlColumnsCount(); + const actionButton = await this.getCellActionButton( + rowIndex, + controlsCount + columnIndex, + 'filterOutButton' + ); + await actionButton.click(); + } + /** * The same as getCellElement, but useful when multiple data grids are on the page. */ @@ -161,11 +207,13 @@ export class DataGridService extends FtrService { const rows: string[][] = []; let rowIdx = -1; + let prevVisibleRowIndex = -1; for (const cell of cells) { - if (await cell.elementHasClass('euiDataGridRowCell--firstColumn')) { - // first column contains expand icon + const visibleRowIndex = Number(await cell.getAttribute('data-gridcell-visible-row-index')); + if (prevVisibleRowIndex !== visibleRowIndex) { rowIdx++; rows[rowIdx] = []; + prevVisibleRowIndex = visibleRowIndex; } if (!(await cell.elementHasClass('euiDataGridRowCell--controlColumn'))) { rows[rowIdx].push(await cell.getVisibleText()); @@ -254,17 +302,46 @@ export class DataGridService extends FtrService { } public async clickRowToggle( - options: SelectOptions = { isAnchorRow: false, rowIndex: 0, columnIndex: 0 } + { defaultTabId, ...options }: SelectOptions & { defaultTabId?: string } = { + isAnchorRow: false, + rowIndex: 0, + } ): Promise { - const rowColumns = await this.getRow(options); const testSubj = options.isAnchorRow - ? '~docTableExpandToggleColumnAnchor' - : '~docTableExpandToggleColumn'; + ? 'docTableExpandToggleColumnAnchor' + : 'docTableExpandToggleColumn'; + + let toggle: WebElementWrapper | undefined; + + await this.retry.try(async () => { + toggle = await this.find.byCssSelector( + `${ + options.isAnchorRow + ? '' + : `.euiDataGridRow[data-grid-visible-row-index="${options.rowIndex || 0}"] ` + }[data-test-subj="${testSubj}"]` + ); + }); + + if (toggle) { + await this.retry.waitFor('doc viewer to open', async () => { + await toggle!.scrollIntoViewIfNecessary(); + await toggle!.click(); + return this.isShowingDocViewer(); + }); + } else { + throw new Error('Unable to find row toggle element'); + } - const toggle = await rowColumns[options.columnIndex ?? 0].findByTestSubject(testSubj); + await this.clickDocViewerTab(defaultTabId ?? 'doc_view_table'); + } + + public async isShowingDocViewer() { + return await this.testSubjects.exists('kbnDocViewer'); + } - await toggle.scrollIntoViewIfNecessary(); - await toggle.click(); + public async clickDocViewerTab(id: string) { + return await this.find.clickByCssSelector(`#kbn_doc_viewer_tab_${id}`); } public async getDetailsRows(): Promise { @@ -500,8 +577,10 @@ export class DataGridService extends FtrService { } public async selectRow(rowIndex: number) { - const columns = await this.getRow({ rowIndex }); - const checkbox = await columns[1].findByClassName('euiCheckbox__input'); + const checkbox = await this.find.byCssSelector( + `.euiDataGridRow[data-grid-visible-row-index="${rowIndex}"] [data-gridcell-column-id="select"] .euiCheckbox__input` + ); + await checkbox.click(); } diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index b9bb6183b22b03..a5b5cba1469ba9 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -267,6 +267,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.fleet.internal.onlyAllowAgentUpgradeToKnownVersions (boolean)', 'xpack.fleet.developer.maxAgentPoliciesWithInactivityTimeout (number)', 'xpack.global_search.search_timeout (duration)', + 'xpack.global_search_bar.input_max_limit (number)', 'xpack.graph.canEditDrillDownUrls (boolean)', 'xpack.graph.savePolicy (alternatives)', 'xpack.ilm.ui.enabled (boolean)', diff --git a/tsconfig.base.json b/tsconfig.base.json index 6d4637281115e2..bbd855176c35a5 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1498,6 +1498,8 @@ "@kbn/securitysolution-es-utils/*": ["packages/kbn-securitysolution-es-utils/*"], "@kbn/securitysolution-exception-list-components": ["packages/kbn-securitysolution-exception-list-components"], "@kbn/securitysolution-exception-list-components/*": ["packages/kbn-securitysolution-exception-list-components/*"], + "@kbn/securitysolution-exceptions-common": ["packages/kbn-securitysolution-exceptions-common"], + "@kbn/securitysolution-exceptions-common/*": ["packages/kbn-securitysolution-exceptions-common/*"], "@kbn/securitysolution-hook-utils": ["packages/kbn-securitysolution-hook-utils"], "@kbn/securitysolution-hook-utils/*": ["packages/kbn-securitysolution-hook-utils/*"], "@kbn/securitysolution-io-ts-alerting-types": ["packages/kbn-securitysolution-io-ts-alerting-types"], diff --git a/versions.json b/versions.json index 63fe56783861b3..3816626bb83cac 100644 --- a/versions.json +++ b/versions.json @@ -14,7 +14,7 @@ "previousMinor": true }, { - "version": "8.14.3", + "version": "8.14.4", "branch": "8.14", "currentMajor": true, "previousMinor": true diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml index 00f986a6660751..168a1028952f10 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/custom/system.yml @@ -20,6 +20,18 @@ level: custom type: float description: "Percentage of CPU usage by system processes" + - name: load.1 + level: custom + type: float + description: "Load 1m by system processes" + - name: memory.actual.used.pct + level: custom + type: float + description: "Percentage of actual memory by system processes" + - name: filesystem.used.pct + level: custom + type: float + description: "Percentage of filesytem used by system processes" - name: network.name type: keyword level: custom diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/template-settings.json index 50978547015d05..2391a4ad80ce95 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/beats/fields.ecs.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/beats/fields.ecs.yml index f69fb05d790eac..9df9f1628cd894 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/beats/fields.ecs.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/beats/fields.ecs.yml @@ -398,6 +398,21 @@ type: float description: Percentage of CPU usage by user processes default_field: false + - name: filesystem.used.pct + level: custom + type: float + description: Percentage of filesytem used by system processes + default_field: false + - name: load.1 + level: custom + type: float + description: Load 1m by system processes + default_field: false + - name: memory.actual.used.pct + level: custom + type: float + description: Percentage of actual memory by system processes + default_field: false - name: network.in.bytes level: custom type: long diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/csv/fields.csv b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/csv/fields.csv index 809fe586cd1036..6d792fe7d2336b 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/csv/fields.csv +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/csv/fields.csv @@ -46,6 +46,9 @@ ECS_Version,Indexed,Field_Set,Field,Type,Level,Normalization,Example,Description 8.0.0,true,system,system.cpu.system.pct,float,custom,,,Percentage of CPU usage by system processes 8.0.0,true,system,system.cpu.total.norm.pct,float,custom,,,Percentage of CPU usage 8.0.0,true,system,system.cpu.user.pct,float,custom,,,Percentage of CPU usage by user processes +8.0.0,true,system,system.filesystem.used.pct,float,custom,,,Percentage of filesytem used by system processes +8.0.0,true,system,system.load.1,float,custom,,,Load 1m by system processes +8.0.0,true,system,system.memory.actual.used.pct,float,custom,,,Percentage of actual memory by system processes 8.0.0,true,system,system.network.in.bytes,long,custom,,,Number of incoming bytes 8.0.0,true,system,system.network.name,keyword,custom,,,Name of the network interface 8.0.0,true,system,system.network.out.bytes,long,custom,,,Number of outgoing bytes diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_flat.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_flat.yml index a4598f341a7172..976b185fe3cd90 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_flat.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_flat.yml @@ -554,6 +554,33 @@ system.cpu.user.pct: normalize: [] short: Percentage of CPU usage by user processes type: float +system.filesystem.used.pct: + dashed_name: system-filesystem-used-pct + description: Percentage of filesytem used by system processes + flat_name: system.filesystem.used.pct + level: custom + name: filesystem.used.pct + normalize: [] + short: Percentage of filesytem used by system processes + type: float +system.load.1: + dashed_name: system-load-1 + description: Load 1m by system processes + flat_name: system.load.1 + level: custom + name: load.1 + normalize: [] + short: Load 1m by system processes + type: float +system.memory.actual.used.pct: + dashed_name: system-memory-actual-used-pct + description: Percentage of actual memory by system processes + flat_name: system.memory.actual.used.pct + level: custom + name: memory.actual.used.pct + normalize: [] + short: Percentage of actual memory by system processes + type: float system.network.in.bytes: dashed_name: system-network-in-bytes description: Number of incoming bytes diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_nested.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_nested.yml index 778fef1eac743a..4780444e98cb0a 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_nested.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/ecs_nested.yml @@ -638,6 +638,33 @@ system: normalize: [] short: Percentage of CPU usage by user processes type: float + system.filesystem.used.pct: + dashed_name: system-filesystem-used-pct + description: Percentage of filesytem used by system processes + flat_name: system.filesystem.used.pct + level: custom + name: filesystem.used.pct + normalize: [] + short: Percentage of filesytem used by system processes + type: float + system.load.1: + dashed_name: system-load-1 + description: Load 1m by system processes + flat_name: system.load.1 + level: custom + name: load.1 + normalize: [] + short: Load 1m by system processes + type: float + system.memory.actual.used.pct: + dashed_name: system-memory-actual-used-pct + description: Percentage of actual memory by system processes + flat_name: system.memory.actual.used.pct + level: custom + name: memory.actual.used.pct + normalize: [] + short: Percentage of actual memory by system processes + type: float system.network.in.bytes: dashed_name: system-network-in-bytes description: Number of incoming bytes diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_flat.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_flat.yml index a4598f341a7172..976b185fe3cd90 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_flat.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_flat.yml @@ -554,6 +554,33 @@ system.cpu.user.pct: normalize: [] short: Percentage of CPU usage by user processes type: float +system.filesystem.used.pct: + dashed_name: system-filesystem-used-pct + description: Percentage of filesytem used by system processes + flat_name: system.filesystem.used.pct + level: custom + name: filesystem.used.pct + normalize: [] + short: Percentage of filesytem used by system processes + type: float +system.load.1: + dashed_name: system-load-1 + description: Load 1m by system processes + flat_name: system.load.1 + level: custom + name: load.1 + normalize: [] + short: Load 1m by system processes + type: float +system.memory.actual.used.pct: + dashed_name: system-memory-actual-used-pct + description: Percentage of actual memory by system processes + flat_name: system.memory.actual.used.pct + level: custom + name: memory.actual.used.pct + normalize: [] + short: Percentage of actual memory by system processes + type: float system.network.in.bytes: dashed_name: system-network-in-bytes description: Number of incoming bytes diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_nested.yml b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_nested.yml index 778fef1eac743a..4780444e98cb0a 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_nested.yml +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/ecs/subset/fake_hosts/ecs_nested.yml @@ -638,6 +638,33 @@ system: normalize: [] short: Percentage of CPU usage by user processes type: float + system.filesystem.used.pct: + dashed_name: system-filesystem-used-pct + description: Percentage of filesytem used by system processes + flat_name: system.filesystem.used.pct + level: custom + name: filesystem.used.pct + normalize: [] + short: Percentage of filesytem used by system processes + type: float + system.load.1: + dashed_name: system-load-1 + description: Load 1m by system processes + flat_name: system.load.1 + level: custom + name: load.1 + normalize: [] + short: Load 1m by system processes + type: float + system.memory.actual.used.pct: + dashed_name: system-memory-actual-used-pct + description: Percentage of actual memory by system processes + flat_name: system.memory.actual.used.pct + level: custom + name: memory.actual.used.pct + normalize: [] + short: Percentage of actual memory by system processes + type: float system.network.in.bytes: dashed_name: system-network-in-bytes description: Number of incoming bytes diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/component/system.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/component/system.json index 46335a6da442c6..2c49220952ffea 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/component/system.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/component/system.json @@ -39,6 +39,39 @@ } } }, + "filesystem": { + "properties": { + "used": { + "properties": { + "pct": { + "type": "float" + } + } + } + } + }, + "load": { + "properties": { + "1": { + "type": "float" + } + } + }, + "memory": { + "properties": { + "actual": { + "properties": { + "used": { + "properties": { + "pct": { + "type": "float" + } + } + } + } + } + } + }, "network": { "properties": { "in": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/template.json index 2088628dc39d24..02a695ff8077ae 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/composable/template.json @@ -41,6 +41,7 @@ "settings": { "index": { "codec": "best_compression", + "final_pipeline": "kbn-data-forge-add-event-ingested", "mapping": { "total_fields": { "limit": 2000 diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/legacy/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/legacy/template.json index 44f07e8f7c9415..7e4d8a38716ed1 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/legacy/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_hosts/ecs/generated/elasticsearch/legacy/template.json @@ -264,6 +264,39 @@ } } }, + "filesystem": { + "properties": { + "used": { + "properties": { + "pct": { + "type": "float" + } + } + } + } + }, + "load": { + "properties": { + "1": { + "type": "float" + } + } + }, + "memory": { + "properties": { + "actual": { + "properties": { + "used": { + "properties": { + "pct": { + "type": "float" + } + } + } + } + } + } + }, "network": { "properties": { "in": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/fields/template-settings.json index 0cc42f219b9ec7..bb01eba7cf4860 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/generated/elasticsearch/composable/template.json index 80f2ba5ff214eb..2edfa2da721815 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_logs/ecs/generated/elasticsearch/composable/template.json @@ -40,6 +40,7 @@ }, "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec": "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/fields/template-settings.json index 8701589586d51a..c6824e9f03a737 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/generated/elasticsearch/composable/template.json index e087950fd53396..edbdb2d43ef0a6 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/admin_console/ecs/generated/elasticsearch/composable/template.json @@ -43,6 +43,7 @@ }, "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec": "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/fields/template-settings.json index 4b09a7697ff8bb..b72358580e6de8 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/generated/elasticsearch/composable/template.json index 2c43c16cf69309..ce311e03186e96 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/heartbeat/ecs/generated/elasticsearch/composable/template.json @@ -38,6 +38,7 @@ }, "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec": "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/fields/template-settings.json index b78d35671d7270..b57e6ba96ff3b8 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/generated/elasticsearch/composable/template.json index 3635f9eb219ad6..27177ecf573bda 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/message_processor/ecs/generated/elasticsearch/composable/template.json @@ -39,6 +39,7 @@ }, "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec": "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/fields/template-settings.json index 67f5e6c3aeb5ca..aa596671f01a00 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/generated/elasticsearch/composable/template.json index 4a0b634cbd6e23..6103c3c0f3855d 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/mongodb/ecs/generated/elasticsearch/composable/template.json @@ -39,6 +39,7 @@ }, "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec": "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/fields/template-settings.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/fields/template-settings.json index 03bcce96fa85f4..ca58c4dc359723 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/fields/template-settings.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/fields/template-settings.json @@ -4,6 +4,7 @@ "template": { "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec" : "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/generated/elasticsearch/composable/template.json b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/generated/elasticsearch/composable/template.json index 5f28e868e64930..70993582a31fbd 100644 --- a/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/generated/elasticsearch/composable/template.json +++ b/x-pack/packages/kbn-data-forge/src/data_sources/fake_stack/nginx_proxy/ecs/generated/elasticsearch/composable/template.json @@ -40,6 +40,7 @@ }, "settings": { "index": { + "final_pipeline": "kbn-data-forge-add-event-ingested", "codec": "best_compression", "mapping": { "total_fields": { diff --git a/x-pack/packages/kbn-data-forge/src/lib/create_config.ts b/x-pack/packages/kbn-data-forge/src/lib/create_config.ts index 56b59b7d01365f..43e51b2c934385 100644 --- a/x-pack/packages/kbn-data-forge/src/lib/create_config.ts +++ b/x-pack/packages/kbn-data-forge/src/lib/create_config.ts @@ -63,6 +63,7 @@ export function createConfig(partialConfig: PartialConfig = {}) { reduceWeekendTrafficBy: DEFAULTS.REDUCE_WEEKEND_TRAFFIC_BY, ephemeralProjectIds: DEFAULTS.EPHEMERAL_PROJECT_IDS, alignEventsToInterval: DEFAULTS.ALIGN_EVENTS_TO_INTERVAL, + artificialIndexDelay: 0, ...(partialConfig.indexing ?? {}), }, schedule: partialConfig.schedule ?? [schedule], diff --git a/x-pack/packages/kbn-data-forge/src/lib/create_events.ts b/x-pack/packages/kbn-data-forge/src/lib/create_events.ts index 5c10df31539836..f787063dfaabc7 100644 --- a/x-pack/packages/kbn-data-forge/src/lib/create_events.ts +++ b/x-pack/packages/kbn-data-forge/src/lib/create_events.ts @@ -10,7 +10,13 @@ import moment from 'moment'; import { isNumber, random, range } from 'lodash'; import { ToolingLog } from '@kbn/tooling-log'; import { Client } from '@elastic/elasticsearch'; -import { Config, EventsPerCycle, EventsPerCycleTransitionDefRT, ParsedSchedule } from '../types'; +import { + Config, + Doc, + EventsPerCycle, + EventsPerCycleTransitionDefRT, + ParsedSchedule, +} from '../types'; import { generateEvents } from '../data_sources'; import { createQueue } from './queue'; import { wait } from './wait'; @@ -69,6 +75,7 @@ export async function createEvents( const interval = schedule.interval ?? config.indexing.interval; const calculateEventsPerCycle = createEventsPerCycleFn(schedule, eventsPerCycle, logger); const totalEvents = calculateEventsPerCycle(currentTimestamp); + const endTs = end === false ? moment() : end; if (totalEvents > 0) { let epc = schedule.randomness @@ -86,34 +93,34 @@ export async function createEvents( // When --align-events-to-interval is set, we will index all the events on the same // timestamp. Otherwise they will be distributed across the interval randomly. + let events: Doc[]; + const eventTimestamp = currentTimestamp + .clone() + .subtract(config.indexing.artificialIndexDelay + interval); if (config.indexing.alignEventsToInterval) { - range(epc) + events = range(epc) .map((i) => { const generateEvent = generateEvents[config.indexing.dataset] || generateEvents.fake_logs; - return generateEvent(config, schedule, i, currentTimestamp); + return generateEvent(config, schedule, i, eventTimestamp); }) - .flat() - .forEach((event) => queue.push(event)); + .flat(); } else { - range(epc) + events = range(epc) .map(() => - moment(random(currentTimestamp.valueOf(), currentTimestamp.valueOf() + interval - 1)) + moment(random(eventTimestamp.valueOf(), eventTimestamp.valueOf() + interval - 1)) ) .sort() .map((ts, i) => { const generateEvent = generateEvents[config.indexing.dataset] || generateEvents.fake_logs; return generateEvent(config, schedule, i, ts); }) - .flat() - .forEach((event) => queue.push(event)); + .flat(); } - - await queue.drain(); + await queue.push(events); } else { logger.info({ took: 0, latency: 0, indexed: 0 }, 'Indexing 0 documents.'); } - const endTs = end === false ? moment() : end; if (currentTimestamp.isBefore(endTs)) { return createEvents( config, diff --git a/x-pack/packages/kbn-data-forge/src/lib/install_default_component_template.ts b/x-pack/packages/kbn-data-forge/src/lib/install_default_component_template.ts new file mode 100644 index 00000000000000..04cdf8c0928cd4 --- /dev/null +++ b/x-pack/packages/kbn-data-forge/src/lib/install_default_component_template.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Client } from '@elastic/elasticsearch'; +import { ToolingLog } from '@kbn/tooling-log'; +import { Config } from '../types'; + +const eventIngestedCommonComponentTemplate = { + _meta: { + documentation: 'https://www.elastic.co/guide/en/ecs/current/ecs-event.html', + ecs_version: '8.0.0', + }, + template: { + mappings: { + properties: { + event: { + properties: { + ingested: { + type: 'date', + }, + }, + }, + }, + }, + }, +}; + +export async function installDefaultComponentTemplate( + _config: Config, + client: Client, + logger: ToolingLog +) { + logger.info('Installing base component template: kbn-data-forge_base'); + await client.cluster.putComponentTemplate({ + name: `kbn-data-forge_base`, + ...eventIngestedCommonComponentTemplate, + }); +} diff --git a/x-pack/packages/kbn-data-forge/src/lib/install_default_ingest_pipeline.ts b/x-pack/packages/kbn-data-forge/src/lib/install_default_ingest_pipeline.ts new file mode 100644 index 00000000000000..079d27f39aa6d3 --- /dev/null +++ b/x-pack/packages/kbn-data-forge/src/lib/install_default_ingest_pipeline.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Client } from '@elastic/elasticsearch'; +import { ToolingLog } from '@kbn/tooling-log'; +import { Config } from '../types'; + +const processors = [ + { + set: { + field: 'event.ingested', + value: '{{{_ingest.timestamp}}}', + }, + }, +]; + +export async function installDefaultIngestPipeline( + _config: Config, + client: Client, + logger: ToolingLog +) { + logger.info('Installing default ingest pipeline: kbn-data-forge-add-event-ingested'); + return client.ingest.putPipeline({ + id: 'kbn-data-forge-add-event-ingested', + processors, + version: 1, + }); +} diff --git a/x-pack/packages/kbn-data-forge/src/lib/install_index_template.ts b/x-pack/packages/kbn-data-forge/src/lib/install_index_template.ts index 9b591bf1732f43..f8e5ea719170b8 100644 --- a/x-pack/packages/kbn-data-forge/src/lib/install_index_template.ts +++ b/x-pack/packages/kbn-data-forge/src/lib/install_index_template.ts @@ -7,6 +7,7 @@ import { Client } from '@elastic/elasticsearch'; import { ToolingLog } from '@kbn/tooling-log'; +import { isArray } from 'lodash'; import { indexTemplates } from '../data_sources'; import { Config } from '../types'; @@ -26,9 +27,14 @@ export async function installIndexTemplate( await client.cluster.putComponentTemplate({ name: component.name, ...component.template }); } logger.info(`Installing index template (${indexTemplateDef.namespace})`); + // Clone the template and add the base component name + const template = { ...indexTemplateDef.template }; + if (isArray(template.composed_of)) { + template.composed_of.push('kbn-data-forge_base'); + } await client.indices.putIndexTemplate({ name: indexTemplateDef.namespace, - body: indexTemplateDef.template, + body: template, }); } } diff --git a/x-pack/packages/kbn-data-forge/src/lib/queue.ts b/x-pack/packages/kbn-data-forge/src/lib/queue.ts index 4cbfa5fb0a3b1c..7c1905689565dd 100644 --- a/x-pack/packages/kbn-data-forge/src/lib/queue.ts +++ b/x-pack/packages/kbn-data-forge/src/lib/queue.ts @@ -26,7 +26,7 @@ export const createQueue = (config: Config, client: Client, logger: ToolingLog): docs.forEach((doc) => { const namespace = `${config.indexing.dataset}.${doc.namespace}`; const indexName = `${INDEX_PREFIX}-${namespace}-${moment(doc['@timestamp']).format( - 'YYYY-MM-DD' + 'YYYY-MM-01' )}`; indices.add(indexName); body.push({ create: { _index: indexName } }); diff --git a/x-pack/packages/kbn-data-forge/src/run.ts b/x-pack/packages/kbn-data-forge/src/run.ts index af569e80bea2df..ca9e0f355fab7c 100644 --- a/x-pack/packages/kbn-data-forge/src/run.ts +++ b/x-pack/packages/kbn-data-forge/src/run.ts @@ -13,8 +13,12 @@ import { installAssets } from './lib/install_assets'; import { indexSchedule } from './lib/index_schedule'; import { installIndexTemplate } from './lib/install_index_template'; import { indices } from './lib/indices'; +import { installDefaultIngestPipeline } from './lib/install_default_ingest_pipeline'; +import { installDefaultComponentTemplate } from './lib/install_default_component_template'; export async function run(config: Config, client: Client, logger: ToolingLog) { + await installDefaultComponentTemplate(config, client, logger); + await installDefaultIngestPipeline(config, client, logger); await installIndexTemplate(config, client, logger); if (config.elasticsearch.installKibanaUser) { await setupKibanaSystemUser(config, client, logger); @@ -23,6 +27,6 @@ export async function run(config: Config, client: Client, logger: ToolingLog) { await indexSchedule(config, client, logger); const indicesCreated = [...indices]; indices.clear(); - await client.indices.refresh({ index: indicesCreated }); + await client.indices.refresh({ index: indicesCreated, ignore_unavailable: true }); return indicesCreated; } diff --git a/x-pack/packages/kbn-data-forge/src/types/index.ts b/x-pack/packages/kbn-data-forge/src/types/index.ts index ac445478329c2d..1e259f14f08b9c 100644 --- a/x-pack/packages/kbn-data-forge/src/types/index.ts +++ b/x-pack/packages/kbn-data-forge/src/types/index.ts @@ -120,6 +120,7 @@ export const ConfigRT = rt.type({ reduceWeekendTrafficBy: rt.number, ephemeralProjectIds: rt.number, alignEventsToInterval: rt.boolean, + artificialIndexDelay: rt.number, }), schedule: rt.array(ScheduleRT), }); diff --git a/x-pack/packages/kbn-elastic-assistant-common/constants.ts b/x-pack/packages/kbn-elastic-assistant-common/constants.ts index 96af59095ab87c..144bbcaeb02262 100755 --- a/x-pack/packages/kbn-elastic-assistant-common/constants.ts +++ b/x-pack/packages/kbn-elastic-assistant-common/constants.ts @@ -10,20 +10,22 @@ export const ELASTIC_AI_ASSISTANT_INTERNAL_API_VERSION = '1'; export const ELASTIC_AI_ASSISTANT_URL = '/api/security_ai_assistant'; export const ELASTIC_AI_ASSISTANT_INTERNAL_URL = '/internal/elastic_assistant'; -export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL = `${ELASTIC_AI_ASSISTANT_INTERNAL_URL}/current_user/conversations`; +export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL = `${ELASTIC_AI_ASSISTANT_URL}/current_user/conversations`; export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID = `${ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL}/{id}`; -export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID_MESSAGES = `${ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID}/messages`; + +export const ELASTIC_AI_ASSISTANT_INTERNAL_CONVERSATIONS_URL = `${ELASTIC_AI_ASSISTANT_INTERNAL_URL}/current_user/conversations`; +export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID_MESSAGES = `${ELASTIC_AI_ASSISTANT_INTERNAL_CONVERSATIONS_URL}/{id}/messages`; export const ELASTIC_AI_ASSISTANT_CHAT_COMPLETE_URL = `${ELASTIC_AI_ASSISTANT_URL}/chat/complete`; -export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BULK_ACTION = `${ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL}/_bulk_action`; +export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BULK_ACTION = `${ELASTIC_AI_ASSISTANT_INTERNAL_CONVERSATIONS_URL}/_bulk_action`; export const ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_FIND = `${ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL}/_find`; -export const ELASTIC_AI_ASSISTANT_PROMPTS_URL = `${ELASTIC_AI_ASSISTANT_INTERNAL_URL}/prompts`; +export const ELASTIC_AI_ASSISTANT_PROMPTS_URL = `${ELASTIC_AI_ASSISTANT_URL}/prompts`; export const ELASTIC_AI_ASSISTANT_PROMPTS_URL_BULK_ACTION = `${ELASTIC_AI_ASSISTANT_PROMPTS_URL}/_bulk_action`; export const ELASTIC_AI_ASSISTANT_PROMPTS_URL_FIND = `${ELASTIC_AI_ASSISTANT_PROMPTS_URL}/_find`; -export const ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL = `${ELASTIC_AI_ASSISTANT_INTERNAL_URL}/anonymization_fields`; +export const ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL = `${ELASTIC_AI_ASSISTANT_URL}/anonymization_fields`; export const ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_BULK_ACTION = `${ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL}/_bulk_action`; export const ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_FIND = `${ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL}/_find`; diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.test.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.test.ts index 544c8c1606c3df..88e9c0febba136 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.test.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.test.ts @@ -48,7 +48,7 @@ describe('bulkUpdateAnonymizationFields', () => { ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify({ create: [], update: [], @@ -71,7 +71,7 @@ describe('bulkUpdateAnonymizationFields', () => { ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify({ create: [anonymizationField1, anonymizationField2], update: [], @@ -93,7 +93,7 @@ describe('bulkUpdateAnonymizationFields', () => { ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify({ update: [anonymizationField1, anonymizationField2], delete: { ids: [] }, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.ts index 72d73cc2a5929f..9745e7ce386622 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/bulk_update_anonymization_fields.ts @@ -26,7 +26,7 @@ export const bulkUpdateAnonymizationFields = async ( ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify(anonymizationFieldsActions), } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx index 7c10597eaed872..5352e60bcea45c 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.test.tsx @@ -45,14 +45,14 @@ describe('useFetchAnonymizationFields', () => { const { waitForNextUpdate } = renderHook(() => useFetchAnonymizationFields()); await waitForNextUpdate(); expect(http.fetch).toHaveBeenCalledWith( - '/internal/elastic_assistant/anonymization_fields/_find', + '/api/security_ai_assistant/anonymization_fields/_find', { method: 'GET', query: { page: 1, per_page: 1000, }, - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal: undefined, } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.ts index d2f07124f04b02..657216b9079cd9 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/anonymization_fields/use_fetch_anonymization_fields.ts @@ -36,7 +36,7 @@ export const CACHING_KEYS = [ ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_FIND, QUERY.page, QUERY.per_page, - API_VERSIONS.internal.v1, + API_VERSIONS.public.v1, ]; export const useFetchAnonymizationFields = (payload?: UseFetchAnonymizationFieldsParams) => { @@ -50,7 +50,7 @@ export const useFetchAnonymizationFields = (payload?: UseFetchAnonymizationField async () => http.fetch(ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_FIND, { method: 'GET', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, query: QUERY, signal: payload?.signal, }), diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx index 5f7d7cefaf450b..7e87ca79e88ab6 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.test.tsx @@ -36,11 +36,11 @@ describe('conversations api', () => { await waitForNextUpdate(); expect(deleteProps.http.fetch).toHaveBeenCalledWith( - '/internal/elastic_assistant/current_user/conversations/test', + '/api/security_ai_assistant/current_user/conversations/test', { method: 'DELETE', signal: undefined, - version: '1', + version: '2023-10-31', } ); expect(toasts.addError).not.toHaveBeenCalled(); @@ -62,11 +62,11 @@ describe('conversations api', () => { await waitForNextUpdate(); expect(getProps.http.fetch).toHaveBeenCalledWith( - '/internal/elastic_assistant/current_user/conversations/test', + '/api/security_ai_assistant/current_user/conversations/test', { method: 'GET', signal: undefined, - version: '1', + version: '2023-10-31', } ); expect(toasts.addError).not.toHaveBeenCalled(); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.ts index e6c6b2925f3371..54bac7e563acc5 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/conversations.ts @@ -44,7 +44,7 @@ export const getConversationById = async ({ try { const response = await http.fetch(`${ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL}/${id}`, { method: 'GET', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal, }); @@ -84,7 +84,7 @@ export const getUserConversations = async ({ ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_FIND, { method: 'GET', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal, } ); @@ -125,7 +125,7 @@ export const createConversation = async ({ try { const response = await http.post(ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL, { body: JSON.stringify(conversation), - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal, }); @@ -168,7 +168,7 @@ export const deleteConversation = async ({ try { const response = await http.fetch(`${ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL}/${id}`, { method: 'DELETE', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal, }); @@ -237,7 +237,7 @@ export const updateConversation = async ({ headers: { 'Content-Type': 'application/json', }, - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal, } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx index 2c6ed953b56f33..652764212e9965 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.test.tsx @@ -47,14 +47,14 @@ describe('useFetchCurrentUserConversations', () => { ); await waitForNextUpdate(); expect(defaultProps.http.fetch).toHaveBeenCalledWith( - '/internal/elastic_assistant/current_user/conversations/_find', + '/api/security_ai_assistant/current_user/conversations/_find', { method: 'GET', query: { page: 1, perPage: 100, }, - version: '1', + version: '2023-10-31', signal: undefined, } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.ts index 58be08317d40cb..68612e3e223978 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/conversations/use_fetch_current_user_conversations.ts @@ -47,7 +47,7 @@ export const CONVERSATIONS_QUERY_KEYS = [ ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_FIND, query.page, query.perPage, - API_VERSIONS.internal.v1, + API_VERSIONS.public.v1, ]; export const useFetchCurrentUserConversations = ({ @@ -62,7 +62,7 @@ export const useFetchCurrentUserConversations = ({ async () => http.fetch(ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_FIND, { method: 'GET', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, query, signal, }), diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.test.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.test.ts index d6ba2e726a76f9..fef992bc14b264 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.test.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.test.ts @@ -49,7 +49,7 @@ describe('bulkUpdatePrompts', () => { expect(httpMock.fetch).toHaveBeenCalledWith(ELASTIC_AI_ASSISTANT_PROMPTS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify({ create: [], update: [], @@ -69,7 +69,7 @@ describe('bulkUpdatePrompts', () => { expect(httpMock.fetch).toHaveBeenCalledWith(ELASTIC_AI_ASSISTANT_PROMPTS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify({ create: [prompt1, prompt2], update: [], @@ -88,7 +88,7 @@ describe('bulkUpdatePrompts', () => { expect(httpMock.fetch).toHaveBeenCalledWith(ELASTIC_AI_ASSISTANT_PROMPTS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify({ update: [prompt1, prompt2], delete: { ids: [] }, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.ts index 2d7b053d7acbdc..f9b470c46516cc 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/bulk_update_prompts.ts @@ -26,7 +26,7 @@ export const bulkUpdatePrompts = async ( ELASTIC_AI_ASSISTANT_PROMPTS_URL_BULK_ACTION, { method: 'POST', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, body: JSON.stringify(prompts), } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx index 3ec1586d6cb445..8e228d2787a36e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.test.tsx @@ -44,14 +44,14 @@ describe('useFetchPrompts', () => { await act(async () => { const { waitForNextUpdate } = renderHook(() => useFetchPrompts()); await waitForNextUpdate(); - expect(http.fetch).toHaveBeenCalledWith('/internal/elastic_assistant/prompts/_find', { + expect(http.fetch).toHaveBeenCalledWith('/api/security_ai_assistant/prompts/_find', { method: 'GET', query: { page: 1, per_page: 1000, filter: 'consumer:*', }, - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal: undefined, }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.ts index 18a229e524dc7a..4c0ca9c0a9c892 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api/prompts/use_fetch_prompts.ts @@ -44,7 +44,7 @@ export const useFetchPrompts = (payload?: UseFetchPromptsParams) => { QUERY.page, QUERY.per_page, QUERY.filter, - API_VERSIONS.internal.v1, + API_VERSIONS.public.v1, ]; return useQuery( @@ -52,7 +52,7 @@ export const useFetchPrompts = (payload?: UseFetchPromptsParams) => { async () => http.fetch(ELASTIC_AI_ASSISTANT_PROMPTS_URL_FIND, { method: 'GET', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, query: QUERY, signal: payload?.signal, }), @@ -87,7 +87,7 @@ export const getPrompts = async ({ try { return await http.fetch(ELASTIC_AI_ASSISTANT_PROMPTS_URL_FIND, { method: 'GET', - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, signal, }); } catch (error) { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts index f369bf430ea542..e7dad6dabd4fe2 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/helpers.ts @@ -122,10 +122,4 @@ export const getOptionalRequestParams = ({ }; }; -export const hasParsableResponse = ({ - isEnabledRAGAlerts, - isEnabledKnowledgeBase, -}: { - isEnabledRAGAlerts: boolean; - isEnabledKnowledgeBase: boolean; -}): boolean => isEnabledKnowledgeBase || isEnabledRAGAlerts; +export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); 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 3fe4e1586e239b..7626f481f15d25 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -43,6 +43,7 @@ import { getDefaultConnector, getBlockBotConversation, mergeBaseWithPersistedConversations, + sleep, } from './helpers'; import { useAssistantContext, UserAvatar } from '../assistant_context'; @@ -197,7 +198,11 @@ const AssistantComponent: React.FC = ({ }, [currentConversation?.title, setConversationTitle]); const refetchCurrentConversation = useCallback( - async ({ cId, cTitle }: { cId?: string; cTitle?: string } = {}) => { + async ({ + cId, + cTitle, + isStreamRefetch = false, + }: { cId?: string; cTitle?: string; isStreamRefetch?: boolean } = {}) => { if (cId === '' || (cTitle && !conversations[cTitle])) { return; } @@ -205,7 +210,22 @@ const AssistantComponent: React.FC = ({ const conversationId = cId ?? (cTitle && conversations[cTitle].id) ?? currentConversation?.id; if (conversationId) { - const updatedConversation = await getConversation(conversationId); + let updatedConversation = await getConversation(conversationId); + let retries = 0; + const maxRetries = 5; + + // this retry is a workaround for the stream not YET being persisted to the stored conversation + while ( + isStreamRefetch && + updatedConversation && + updatedConversation.messages[updatedConversation.messages.length - 1].role !== + 'assistant' && + retries < maxRetries + ) { + retries++; + await sleep(2000); + updatedConversation = await getConversation(conversationId); + } if (updatedConversation) { setCurrentConversation(updatedConversation); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_textarea/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_textarea/index.tsx index fe9f2f8a1a7622..e3962e7408dd41 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_textarea/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/prompt_textarea/index.tsx @@ -29,13 +29,16 @@ export const PromptTextArea = forwardRef( const onKeyDown = useCallback( (event) => { - if (event.key === 'Enter' && !event.shiftKey && value.trim().length > 0) { + // keyCode 13 is needed in case of IME input + if (event.keyCode === 13 && !event.shiftKey) { event.preventDefault(); - onPromptSubmit(event.target.value?.trim()); - handlePromptChange(''); - } else if (event.key === 'Enter' && !event.shiftKey && value.trim().length === 0) { - event.preventDefault(); - event.stopPropagation(); + + if (value.trim().length) { + onPromptSubmit(event.target.value?.trim()); + handlePromptChange(''); + } else { + event.stopPropagation(); + } } }, [value, onPromptSubmit, handlePromptChange] 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 65fca756233069..08076a95377f35 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 @@ -68,7 +68,7 @@ export interface AssistantProviderProps { currentConversation?: Conversation; isEnabledLangChain: boolean; isFetchingResponse: boolean; - refetchCurrentConversation: () => void; + refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean }) => void; regenerateMessage: (conversationId: string) => void; showAnonymizedValues: boolean; setIsStreaming: (isStreaming: boolean) => void; @@ -108,7 +108,7 @@ export interface UseAssistantContext { currentConversation?: Conversation; isEnabledLangChain: boolean; isFetchingResponse: boolean; - refetchCurrentConversation: () => void; + refetchCurrentConversation: ({ isStreamRefetch }: { isStreamRefetch?: boolean }) => void; regenerateMessage: () => void; showAnonymizedValues: boolean; currentUserAvatar?: UserAvatar; diff --git a/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts b/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts index 8fee16117b9c61..d433cc473a538f 100644 --- a/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts +++ b/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts @@ -35,7 +35,6 @@ export const entityDefinitionSchema = z.object({ interval: durationSchema.refine((val) => val.asMinutes() >= 1, { message: 'The history.interval can not be less than 1m', }), - lookbackPeriod: z.optional(durationSchema), settings: z.optional( z.object({ syncField: z.optional(z.string()), diff --git a/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.test.ts b/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.test.ts index 98da9a4e81b53f..634d8260cc3b85 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.test.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.test.ts @@ -13,8 +13,8 @@ import { ActionsClientSimpleChatModel } from './simple_chat_model'; import { mockActionResponse } from './mocks'; import { BaseMessage } from '@langchain/core/messages'; import { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager'; -import { parseBedrockStream } from '../utils/bedrock'; -import { parseGeminiStream } from '../utils/gemini'; +import { parseBedrockStream, parseBedrockStreamAsAsyncIterator } from '../utils/bedrock'; +import { parseGeminiStream, parseGeminiStreamAsAsyncIterator } from '../utils/gemini'; const connectorId = 'mock-connector-id'; @@ -301,5 +301,119 @@ describe('ActionsClientSimpleChatModel', () => { expect(handleLLMNewToken).toHaveBeenCalledTimes(1); expect(handleLLMNewToken).toHaveBeenCalledWith('token6'); }); + it('extra tokens in the final answer start chunk get pushed to handleLLMNewToken', async () => { + (parseBedrockStream as jest.Mock).mockImplementation((_1, _2, _3, handleToken) => { + handleToken('token1'); + handleToken(`"action":`); + handleToken(`"Final Answer"`); + handleToken(`, "action_input": "token5 `); + handleToken('token6'); + }); + actionsClient.execute.mockImplementationOnce(mockStreamExecute); + + const actionsClientSimpleChatModel = new ActionsClientSimpleChatModel({ + ...defaultArgs, + actionsClient, + llmType: 'bedrock', + streaming: true, + }); + await actionsClientSimpleChatModel._call(callMessages, callOptions, callRunManager); + expect(handleLLMNewToken).toHaveBeenCalledTimes(2); + expect(handleLLMNewToken).toHaveBeenCalledWith('token5 '); + expect(handleLLMNewToken).toHaveBeenCalledWith('token6'); + }); + it('extra tokens in the final answer end chunk get pushed to handleLLMNewToken', async () => { + (parseBedrockStream as jest.Mock).mockImplementation((_1, _2, _3, handleToken) => { + handleToken('token5'); + handleToken(`"action":`); + handleToken(`"Final Answer"`); + handleToken(`, "action_input": "`); + handleToken('token6'); + handleToken('token7"'); + handleToken('token8'); + }); + actionsClient.execute.mockImplementationOnce(mockStreamExecute); + const actionsClientSimpleChatModel = new ActionsClientSimpleChatModel({ + ...defaultArgs, + actionsClient, + llmType: 'bedrock', + streaming: true, + }); + await actionsClientSimpleChatModel._call(callMessages, callOptions, callRunManager); + expect(handleLLMNewToken).toHaveBeenCalledTimes(2); + expect(handleLLMNewToken).toHaveBeenCalledWith('token6'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token7'); + }); + }); + + describe('*_streamResponseChunks', () => { + it('iterates over bedrock chunks', async () => { + function* mockFetchData() { + yield 'token1'; + yield 'token2'; + yield 'token3'; + } + (parseBedrockStreamAsAsyncIterator as jest.Mock).mockImplementation(mockFetchData); + actionsClient.execute.mockImplementationOnce(mockStreamExecute); + + const actionsClientSimpleChatModel = new ActionsClientSimpleChatModel({ + ...defaultArgs, + actionsClient, + llmType: 'bedrock', + streaming: true, + }); + + const gen = actionsClientSimpleChatModel._streamResponseChunks( + callMessages, + callOptions, + callRunManager + ); + + const chunks = []; + + for await (const chunk of gen) { + chunks.push(chunk); + } + + expect(chunks.map((c) => c.text)).toEqual(['token1', 'token2', 'token3']); + expect(handleLLMNewToken).toHaveBeenCalledTimes(3); + expect(handleLLMNewToken).toHaveBeenCalledWith('token1'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token2'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token3'); + }); + it('iterates over gemini chunks', async () => { + function* mockFetchData() { + yield 'token1'; + yield 'token2'; + yield 'token3'; + } + (parseGeminiStreamAsAsyncIterator as jest.Mock).mockImplementation(mockFetchData); + actionsClient.execute.mockImplementationOnce(mockStreamExecute); + + const actionsClientSimpleChatModel = new ActionsClientSimpleChatModel({ + ...defaultArgs, + actionsClient, + llmType: 'gemini', + streaming: true, + }); + + const gen = actionsClientSimpleChatModel._streamResponseChunks( + callMessages, + callOptions, + callRunManager + ); + + const chunks = []; + + for await (const chunk of gen) { + chunks.push(chunk); + } + + expect(chunks.map((c) => c.text)).toEqual(['token1', 'token2', 'token3']); + expect(handleLLMNewToken).toHaveBeenCalledTimes(3); + expect(handleLLMNewToken).toHaveBeenCalledWith('token1'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token2'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token3'); + }); }); }); diff --git a/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.ts b/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.ts index 4bd77919d9fce9..5133b1ae6543a7 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/simple_chat_model.ts @@ -10,15 +10,16 @@ import { SimpleChatModel, type BaseChatModelParams, } from '@langchain/core/language_models/chat_models'; -import { type BaseMessage } from '@langchain/core/messages'; +import { AIMessageChunk, type BaseMessage } from '@langchain/core/messages'; import type { ActionsClient } from '@kbn/actions-plugin/server'; import { Logger } from '@kbn/logging'; import { v4 as uuidv4 } from 'uuid'; import { get } from 'lodash/fp'; +import { ChatGenerationChunk } from '@langchain/core/outputs'; import { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager'; import { PublicMethodsOf } from '@kbn/utility-types'; -import { parseGeminiStream } from '../utils/gemini'; -import { parseBedrockStream } from '../utils/bedrock'; +import { parseGeminiStreamAsAsyncIterator, parseGeminiStream } from '../utils/gemini'; +import { parseBedrockStreamAsAsyncIterator, parseBedrockStream } from '../utils/bedrock'; import { getDefaultArguments } from './constants'; export const getMessageContentAndRole = (prompt: string, role = 'user') => ({ @@ -38,6 +39,18 @@ export interface CustomChatModelInput extends BaseChatModelParams { maxTokens?: number; } +function _formatMessages(messages: BaseMessage[]) { + if (!messages.length) { + throw new Error('No messages provided.'); + } + return messages.map((message, i) => { + if (typeof message.content !== 'string') { + throw new Error('Multimodal messages are not supported.'); + } + return getMessageContentAndRole(message.content, message._getType()); + }); +} + export class ActionsClientSimpleChatModel extends SimpleChatModel { #actionsClient: PublicMethodsOf; #connectorId: string; @@ -91,16 +104,7 @@ export class ActionsClientSimpleChatModel extends SimpleChatModel { options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun ): Promise { - if (!messages.length) { - throw new Error('No messages provided.'); - } - const formattedMessages: Array<{ content: string; role: string }> = []; - messages.forEach((message, i) => { - if (typeof message.content !== 'string') { - throw new Error('Multimodal messages are not supported.'); - } - formattedMessages.push(getMessageContentAndRole(message.content, message._getType())); - }); + const formattedMessages = _formatMessages(messages); this.#logger.debug( () => `ActionsClientSimpleChatModel#_call\ntraceId: ${ @@ -150,18 +154,30 @@ export class ActionsClientSimpleChatModel extends SimpleChatModel { let finalOutputIndex = -1; const finalOutputStartToken = '"action":"FinalAnswer","action_input":"'; let streamingFinished = false; - const finalOutputStopRegex = /(? { if (finalOutputIndex === -1) { + currentOutput += token; // Remove whitespace to simplify parsing - currentOutput += token.replace(/\s/g, ''); - if (currentOutput.includes(finalOutputStartToken)) { - finalOutputIndex = currentOutput.indexOf(finalOutputStartToken); + const noWhitespaceOutput = currentOutput.replace(/\s/g, ''); + if (noWhitespaceOutput.includes(finalOutputStartToken)) { + const nonStrippedToken = '"action_input": "'; + finalOutputIndex = currentOutput.indexOf(nonStrippedToken); + const contentStartIndex = finalOutputIndex + nonStrippedToken.length; + const extraOutput = currentOutput.substring(contentStartIndex); + if (extraOutput.length > 0) { + await runManager?.handleLLMNewToken(extraOutput); + } } } else if (!streamingFinished) { const finalOutputEndIndex = token.search(finalOutputStopRegex); if (finalOutputEndIndex !== -1) { streamingFinished = true; + const extraOutput = token.substring(0, finalOutputEndIndex); + streamingFinished = true; + if (extraOutput.length > 0) { + await runManager?.handleLLMNewToken(extraOutput); + } } else { await runManager?.handleLLMNewToken(token); } @@ -173,4 +189,55 @@ export class ActionsClientSimpleChatModel extends SimpleChatModel { return parsed; // per the contact of _call, return a string } + + async *_streamResponseChunks( + messages: BaseMessage[], + options: this['ParsedCallOptions'], + runManager?: CallbackManagerForLLMRun | undefined + ): AsyncGenerator { + const formattedMessages = _formatMessages(messages); + this.#logger.debug( + () => + `ActionsClientSimpleChatModel#stream\ntraceId: ${ + this.#traceId + }\nassistantMessage:\n${JSON.stringify(formattedMessages)} ` + ); + // create a new connector request body with the assistant message: + const requestBody = { + actionId: this.#connectorId, + params: { + subAction: 'invokeStream', + subActionParams: { + model: this.model, + messages: formattedMessages, + ...getDefaultArguments(this.llmType, this.temperature, options.stop, this.#maxTokens), + }, + }, + }; + const actionResult = await this.#actionsClient.execute(requestBody); + + if (actionResult.status === 'error') { + throw new Error( + `ActionsClientSimpleChatModel: action result status is error: ${actionResult?.message} - ${actionResult?.serviceMessage}` + ); + } + + const readable = get('data', actionResult) as Readable; + + if (typeof readable?.read !== 'function') { + throw new Error('Action result status is error: result is not streamable'); + } + + const streamParser = + this.llmType === 'bedrock' + ? parseBedrockStreamAsAsyncIterator + : parseGeminiStreamAsAsyncIterator; + for await (const token of streamParser(readable, this.#logger, this.#signal)) { + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ content: token }), + text: token, + }); + await runManager?.handleLLMNewToken(token); + } + } } diff --git a/x-pack/packages/kbn-langchain/server/tracers/langsmith/langsmith_tracer.ts b/x-pack/packages/kbn-langchain/server/tracers/langsmith/langsmith_tracer.ts index 15501d22dbe09f..6c8a8dbead3268 100644 --- a/x-pack/packages/kbn-langchain/server/tracers/langsmith/langsmith_tracer.ts +++ b/x-pack/packages/kbn-langchain/server/tracers/langsmith/langsmith_tracer.ts @@ -32,7 +32,7 @@ export const getLangSmithTracer = ({ logger: Logger | ToolingLog; }): LangChainTracer[] => { try { - if (!isLangSmithEnabled() || apiKey == null) { + if (!apiKey) { return []; } const lcTracer = new LangChainTracer({ diff --git a/x-pack/packages/kbn-langchain/server/utils/bedrock.ts b/x-pack/packages/kbn-langchain/server/utils/bedrock.ts index f9a3837750cdaf..1cb218f37d2fdf 100644 --- a/x-pack/packages/kbn-langchain/server/utils/bedrock.ts +++ b/x-pack/packages/kbn-langchain/server/utils/bedrock.ts @@ -5,12 +5,37 @@ * 2.0. */ +import { Readable } from 'stream'; import { finished } from 'stream/promises'; import { Logger } from '@kbn/core/server'; import { EventStreamCodec } from '@smithy/eventstream-codec'; import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; import { StreamParser } from './types'; +export const parseBedrockStreamAsAsyncIterator = async function* ( + responseStream: Readable, + logger: Logger, + abortSignal?: AbortSignal +) { + if (abortSignal) { + abortSignal.addEventListener('abort', () => { + responseStream.destroy(new Error('Aborted')); + }); + } + try { + for await (const chunk of responseStream) { + const bedrockChunk = handleBedrockChunk({ chunk, bedrockBuffer: new Uint8Array(0), logger }); + yield bedrockChunk.decodedChunk; + } + } catch (err) { + if (abortSignal?.aborted) { + logger.info('Bedrock stream parsing was aborted.'); + } else { + throw err; + } + } +}; + export const parseBedrockStream: StreamParser = async ( responseStream, logger, diff --git a/x-pack/packages/kbn-langchain/server/utils/gemini.test.ts b/x-pack/packages/kbn-langchain/server/utils/gemini.test.ts index 3fcdb87b24551c..20a9bbc3488164 100644 --- a/x-pack/packages/kbn-langchain/server/utils/gemini.test.ts +++ b/x-pack/packages/kbn-langchain/server/utils/gemini.test.ts @@ -51,8 +51,9 @@ describe('parseGeminiStream', () => { const tokenHandler = jest.fn(); await parseGeminiStream(mockStream, mockLogger, undefined, tokenHandler); - expect(tokenHandler).toHaveBeenCalledWith('Hello '); - expect(tokenHandler).toHaveBeenCalledWith('world '); + expect(tokenHandler).toHaveBeenCalledWith('Hello'); + expect(tokenHandler).toHaveBeenCalledWith(' worl'); + expect(tokenHandler).toHaveBeenCalledWith('d'); }); it('should handle stream error correctly', async () => { diff --git a/x-pack/packages/kbn-langchain/server/utils/gemini.ts b/x-pack/packages/kbn-langchain/server/utils/gemini.ts index 68fa4c0363e138..7d089230838317 100644 --- a/x-pack/packages/kbn-langchain/server/utils/gemini.ts +++ b/x-pack/packages/kbn-langchain/server/utils/gemini.ts @@ -5,8 +5,38 @@ * 2.0. */ +import { Logger } from '@kbn/core/server'; +import { Readable } from 'stream'; import { StreamParser } from './types'; +export const parseGeminiStreamAsAsyncIterator = async function* ( + stream: Readable, + logger: Logger, + abortSignal?: AbortSignal +) { + if (abortSignal) { + abortSignal.addEventListener('abort', () => { + stream.destroy(); + }); + } + try { + for await (const chunk of stream) { + const decoded = chunk.toString(); + const parsed = parseGeminiResponse(decoded); + // Split the parsed string into chunks of 5 characters + for (let i = 0; i < parsed.length; i += 5) { + yield parsed.substring(i, i + 5); + } + } + } catch (err) { + if (abortSignal?.aborted) { + logger.info('Gemini stream parsing was aborted.'); + } else { + throw err; + } + } +}; + export const parseGeminiStream: StreamParser = async ( stream, logger, @@ -18,15 +48,10 @@ export const parseGeminiStream: StreamParser = async ( const decoded = chunk.toString(); const parsed = parseGeminiResponse(decoded); if (tokenHandler) { - const splitByQuotes = parsed.split(`"`); - splitByQuotes.forEach((chunkk, index) => { - // add quote back on except for last chunk - const splitBySpace = `${chunkk}${index === splitByQuotes.length - 1 ? '' : '"'}`.split(` `); - - for (const char of splitBySpace) { - tokenHandler(`${char} `); - } - }); + // Split the parsed string into chunks of 5 characters + for (let i = 0; i < parsed.length; i += 5) { + tokenHandler(parsed.substring(i, i + 5)); + } } responseBody += parsed; }); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/get_initial_analysis_start.ts b/x-pack/packages/ml/aiops_log_rate_analysis/get_log_rate_analysis_parameters_from_alert.ts similarity index 55% rename from x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/get_initial_analysis_start.ts rename to x-pack/packages/ml/aiops_log_rate_analysis/get_log_rate_analysis_parameters_from_alert.ts index 9b684fd04fdce0..cfd347324a57f3 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/get_initial_analysis_start.ts +++ b/x-pack/packages/ml/aiops_log_rate_analysis/get_log_rate_analysis_parameters_from_alert.ts @@ -5,19 +5,51 @@ * 2.0. */ -import moment, { Moment } from 'moment'; +import moment, { type Moment } from 'moment'; -export interface GetInitialAnalysisStartArgs { +export interface GetLogRateAnalysisParametersFromAlertArgs { + alertStartedAt: string; + alertEndedAt?: string; + timeSize?: number; + timeUnit?: moment.unitOfTime.DurationConstructor; +} + +export const getLogRateAnalysisParametersFromAlert = ({ + alertStartedAt, + alertEndedAt, + timeSize, + timeUnit, +}: GetLogRateAnalysisParametersFromAlertArgs) => { + // Identify `intervalFactor` to adjust time ranges based on alert settings. + // The default time ranges for `initialAnalysisStart` are suitable for a `1m` lookback. + // If an alert would have a `5m` lookback, this would result in a factor of `5`. + const lookbackDuration = + timeSize && timeUnit ? moment.duration(timeSize, timeUnit) : moment.duration(1, 'm'); + const intervalFactor = Math.max(1, lookbackDuration.asSeconds() / 60); + + const alertStart = moment(alertStartedAt); + const alertEnd = alertEndedAt ? moment(alertEndedAt) : undefined; + + const helperArgs = { alertStart, alertEnd, intervalFactor }; + + const timeRange = { + min: alertStart.clone().subtract(15 * intervalFactor, 'minutes'), + max: getTimeRangeEnd(helperArgs), + }; + + return { + timeRange, + windowParameters: getWindowParameters(helperArgs), + }; +}; + +interface GetParameterHelperArgs { alertStart: Moment; intervalFactor: number; alertEnd?: Moment; } -export const getTimeRangeEnd = ({ - alertStart, - intervalFactor, - alertEnd, -}: GetInitialAnalysisStartArgs) => { +function getTimeRangeEnd({ alertStart, alertEnd, intervalFactor }: GetParameterHelperArgs) { if (alertEnd) { if ( alertStart @@ -39,13 +71,9 @@ export const getTimeRangeEnd = ({ } else { return alertStart.clone().add(15 * intervalFactor, 'minutes'); } -}; +} -export const getDeviationMax = ({ - alertStart, - intervalFactor, - alertEnd, -}: GetInitialAnalysisStartArgs) => { +function getDeviationMax({ alertStart, alertEnd, intervalFactor }: GetParameterHelperArgs) { if (alertEnd) { if ( alertStart @@ -76,9 +104,9 @@ export const getDeviationMax = ({ .add(10 * intervalFactor, 'minutes') .valueOf(); } -}; +} -export const getInitialAnalysisStart = (args: GetInitialAnalysisStartArgs) => { +function getWindowParameters(args: GetParameterHelperArgs) { const { alertStart, intervalFactor } = args; return { baselineMin: alertStart @@ -95,4 +123,4 @@ export const getInitialAnalysisStart = (args: GetInitialAnalysisStartArgs) => { .valueOf(), deviationMax: getDeviationMax(args), }; -}; +} diff --git a/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx b/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx index 0825cba6828b41..4bd6354ef73dae 100644 --- a/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx +++ b/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx @@ -70,10 +70,7 @@ export const ElasticsearchModels: React.FC = ({ } }, [numberOfAllocations, numberOfThreads, serviceType]); - const elasticSearchModelTypesDescriptions: Record< - ElasticsearchModelDefaultOptions | string, - ElasticsearchModelDescriptions - > = { + const elasticSearchModelTypesDescriptions: Record = { [ElasticsearchModelDefaultOptions.elser]: { description: i18n.translate( 'xpack.ml.addInferenceEndpoint.elasticsearchModels.elser.description', diff --git a/x-pack/packages/ml/trained_models_utils/index.ts b/x-pack/packages/ml/trained_models_utils/index.ts index ada09d62af0724..293f6662f50112 100644 --- a/x-pack/packages/ml/trained_models_utils/index.ts +++ b/x-pack/packages/ml/trained_models_utils/index.ts @@ -27,4 +27,13 @@ export { ELASTIC_MODEL_TYPE, MODEL_STATE, type ModelState, + ELSER_LINUX_OPTIMIZED_MODEL_ID, + ELSER_MODEL_ID, + E5_LINUX_OPTIMIZED_MODEL_ID, + E5_MODEL_ID, + LANG_IDENT_MODEL_ID, + LATEST_ELSER_VERSION, + LATEST_ELSER_MODEL_ID, + LATEST_E5_MODEL_ID, + ElserModels, } from './src/constants/trained_models'; diff --git a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts index 49acb6e1d5169e..938f9c0ef81e05 100644 --- a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts +++ b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts @@ -7,6 +7,18 @@ import { i18n } from '@kbn/i18n'; +export const ELSER_MODEL_ID = '.elser_model_2'; +export const ELSER_LINUX_OPTIMIZED_MODEL_ID = '.elser_model_2_linux-x86_64'; +export const E5_MODEL_ID = '.multilingual-e5-small'; +export const E5_LINUX_OPTIMIZED_MODEL_ID = '.multilingual-e5-small_linux-x86_64'; +export const LANG_IDENT_MODEL_ID = 'lang_ident_model_1'; +export const ELSER_ID_V1 = '.elser_model_1' as const; +export const LATEST_ELSER_VERSION: ElserVersion = 2; +export const LATEST_ELSER_MODEL_ID = ELSER_LINUX_OPTIMIZED_MODEL_ID; +export const LATEST_E5_MODEL_ID = E5_LINUX_OPTIMIZED_MODEL_ID; + +export const ElserModels = [ELSER_MODEL_ID, ELSER_LINUX_OPTIMIZED_MODEL_ID, ELSER_ID_V1]; + export const DEPLOYMENT_STATE = { STARTED: 'started', STARTING: 'starting', @@ -46,10 +58,8 @@ export const BUILT_IN_MODEL_TAG = 'prepackaged'; export const ELASTIC_MODEL_TAG = 'elastic'; -export const ELSER_ID_V1 = '.elser_model_1' as const; - export const ELASTIC_MODEL_DEFINITIONS: Record = Object.freeze({ - '.elser_model_1': { + [ELSER_ID_V1]: { modelName: 'elser', hidden: true, version: 1, @@ -63,7 +73,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object }), type: ['elastic', 'pytorch', 'text_expansion'], }, - '.elser_model_2': { + [ELSER_MODEL_ID]: { modelName: 'elser', version: 2, default: true, @@ -77,7 +87,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object }), type: ['elastic', 'pytorch', 'text_expansion'], }, - '.elser_model_2_linux-x86_64': { + [ELSER_LINUX_OPTIMIZED_MODEL_ID]: { modelName: 'elser', version: 2, os: 'Linux', @@ -92,7 +102,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object }), type: ['elastic', 'pytorch', 'text_expansion'], }, - '.multilingual-e5-small': { + [E5_MODEL_ID]: { modelName: 'e5', version: 1, default: true, @@ -108,7 +118,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object licenseUrl: 'https://huggingface.co/elastic/multilingual-e5-small', type: ['pytorch', 'text_embedding'], }, - '.multilingual-e5-small_linux-x86_64': { + [E5_LINUX_OPTIMIZED_MODEL_ID]: { modelName: 'e5', version: 1, os: 'Linux', @@ -178,23 +188,17 @@ export interface GetModelDownloadConfigOptions { version?: ElserVersion; } +export interface LocalInferenceServiceSettings { + service: 'elser' | 'elasticsearch'; + service_settings: { + num_allocations: number; + num_threads: number; + model_id: string; + }; +} + export type InferenceServiceSettings = - | { - service: 'elser'; - service_settings: { - num_allocations: number; - num_threads: number; - model_id: string; - }; - } - | { - service: 'elasticsearch'; - service_settings: { - num_allocations: number; - num_threads: number; - model_id: string; - }; - } + | LocalInferenceServiceSettings | { service: 'openai'; service_settings: { diff --git a/x-pack/packages/security-solution/data_table/common/types/detail_panel.ts b/x-pack/packages/security-solution/data_table/common/types/detail_panel.ts index 075f7e5ad71836..55fff6ffc7fd3d 100644 --- a/x-pack/packages/security-solution/data_table/common/types/detail_panel.ts +++ b/x-pack/packages/security-solution/data_table/common/types/detail_panel.ts @@ -42,20 +42,7 @@ export type ExpandedNetworkType = } | EmptyObject; -export type ExpandedUserType = - | { - panelView?: 'userDetail'; - params?: { - userName: string; - }; - } - | EmptyObject; - -export type ExpandedDetailType = - | ExpandedEventType - | ExpandedHostType - | ExpandedNetworkType - | ExpandedUserType; +export type ExpandedDetailType = ExpandedEventType | ExpandedHostType | ExpandedNetworkType; export enum TimelineTabs { query = 'query', diff --git a/x-pack/performance/journeys_e2e/tags_listing_page.ts b/x-pack/performance/journeys_e2e/tags_listing_page.ts index 5ceab6a4d9bba5..c102c2a68b9fd3 100644 --- a/x-pack/performance/journeys_e2e/tags_listing_page.ts +++ b/x-pack/performance/journeys_e2e/tags_listing_page.ts @@ -14,8 +14,6 @@ const TAG_DESCRIPTION = 'test description'; export const journey = new Journey({ esArchives: ['x-pack/performance/es_archives/sample_data_flights'], kbnArchives: ['x-pack/performance/kbn_archives/many_tags_and_visualizations'], - // FLAKY: https://github.com/elastic/kibana/issues/181546 - skipped: true, }) .step('Go to Tags Page', async ({ page, kbnUrl }) => { await page.goto(kbnUrl.get(`/app/management/kibana/tags`)); diff --git a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts index bc5cc108dba2bb..64fa85688e2ee2 100644 --- a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts +++ b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.test.ts @@ -75,6 +75,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {} and 5000ms requestTimeout` ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses asCurrentUser when specified', async () => { @@ -100,6 +101,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {} and 5000ms requestTimeout` ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses search options when specified', async () => { @@ -126,9 +128,14 @@ describe('wrapScopedClusterClient', () => { }); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {\"ignore\":[404],\"requestTimeout\":10000} and 5000ms requestTimeout` + ); + expect(logger.warn).not.toHaveBeenCalled(); }); - test('re-throws error when an error is thrown', async () => { + test('re-throws error and logs query when an error is thrown', async () => { const { abortController, scopedClusterClient, childClient } = getMockClusterClients(); childClient.search.mockRejectedValueOnce(new Error('something went wrong!')); @@ -141,8 +148,15 @@ describe('wrapScopedClusterClient', () => { }).client(); await expect( - wrappedSearchClient.asInternalUser.search + wrappedSearchClient.asInternalUser.search(esQuery) ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {}` + ); + expect(logger.warn).toHaveBeenCalledWith( + `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {}` + ); }); test('handles empty search result object', async () => { @@ -169,6 +183,11 @@ describe('wrapScopedClusterClient', () => { const stats = wrappedSearchClientFactory.getMetrics(); expect(stats.numSearches).toEqual(1); expect(stats.esSearchDurationMs).toEqual(0); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {}` + ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('keeps track of number of queries', async () => { @@ -200,6 +219,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {}` ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('throws error when search throws abort error', async () => { @@ -216,10 +236,15 @@ describe('wrapScopedClusterClient', () => { }).client(); await expect( - abortableSearchClient.asInternalUser.search + abortableSearchClient.asInternalUser.search(esQuery) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Search has been aborted due to cancelled execution"` ); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + `executing query for rule .test-rule-type:abcdefg in space my-space - {\"body\":{\"query\":{\"bool\":{\"filter\":{\"range\":{\"@timestamp\":{\"gte\":0}}}}}}} - with options {}` + ); + expect(logger.warn).not.toHaveBeenCalled(); }); }); @@ -248,6 +273,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( 'executing eql query for rule .test-rule-type:abcdefg in space my-space - {"index":"foo","query":"process where process.name == \\"regsvr32.exe\\""} - with options {} and 5000ms requestTimeout' ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses asCurrentUser when specified', async () => { @@ -273,6 +299,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( 'executing eql query for rule .test-rule-type:abcdefg in space my-space - {"index":"foo","query":"process where process.name == \\"regsvr32.exe\\""} - with options {} and 5000ms requestTimeout' ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses search options when specified', async () => { @@ -299,9 +326,14 @@ describe('wrapScopedClusterClient', () => { }); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + 'executing eql query for rule .test-rule-type:abcdefg in space my-space - {"index":"foo","query":"process where process.name == \\"regsvr32.exe\\""} - with options {"ignore":[404],"requestTimeout":10000} and 5000ms requestTimeout' + ); + expect(logger.warn).not.toHaveBeenCalled(); }); - test('re-throws error when an error is thrown', async () => { + test('re-throws error and logs when an error is thrown', async () => { const { abortController, scopedClusterClient, childClient } = getMockClusterClients(); childClient.eql.search.mockRejectedValueOnce(new Error('something went wrong!')); @@ -314,8 +346,15 @@ describe('wrapScopedClusterClient', () => { }).client(); await expect( - wrappedSearchClient.asInternalUser.eql.search + wrappedSearchClient.asInternalUser.eql.search(eqlQuery) ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + 'executing eql query for rule .test-rule-type:abcdefg in space my-space - {"index":"foo","query":"process where process.name == \\"regsvr32.exe\\""} - with options {}' + ); + expect(logger.warn).toHaveBeenCalledWith( + 'executing eql query for rule .test-rule-type:abcdefg in space my-space - {"index":"foo","query":"process where process.name == \\"regsvr32.exe\\""} - with options {}' + ); }); test('keeps track of number of queries', async () => { @@ -347,6 +386,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( `executing eql query for rule .test-rule-type:abcdefg in space my-space - {\"index\":\"foo\",\"query\":\"process where process.name == \\\"regsvr32.exe\\\"\"} - with options {}` ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('throws error when eql search throws abort error', async () => { @@ -365,10 +405,15 @@ describe('wrapScopedClusterClient', () => { }).client(); await expect( - abortableSearchClient.asInternalUser.eql.search + abortableSearchClient.asInternalUser.eql.search(eqlQuery) ).rejects.toThrowErrorMatchingInlineSnapshot( `"EQL search has been aborted due to cancelled execution"` ); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + `executing eql query for rule .test-rule-type:abcdefg in space my-space - {\"index\":\"foo\",\"query\":\"process where process.name == \\\"regsvr32.exe\\\"\"} - with options {}` + ); + expect(logger.warn).not.toHaveBeenCalled(); }); }); @@ -395,9 +440,11 @@ describe('wrapScopedClusterClient', () => { }); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( 'executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {"method":"POST","path":"/_query","body":{"query":"from .kibana_task_manager"}} - with options {} and 5000ms requestTimeout' ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses asCurrentUser when specified', async () => { @@ -423,6 +470,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( 'executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {"method":"POST","path":"/_query","body":{"query":"from .kibana_task_manager"}} - with options {} and 5000ms requestTimeout' ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses search options when specified', async () => { @@ -449,9 +497,14 @@ describe('wrapScopedClusterClient', () => { }); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + 'executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {"method":"POST","path":"/_query","body":{"query":"from .kibana_task_manager"}} - with options {"ignore":[404],"requestTimeout":10000} and 5000ms requestTimeout' + ); + expect(logger.warn).not.toHaveBeenCalled(); }); - test('re-throws error when an error is thrown', async () => { + test('re-throws error and logs when an error is thrown', async () => { const { abortController, scopedClusterClient, childClient } = getMockClusterClients(); childClient.transport.request.mockRejectedValueOnce(new Error('something went wrong!')); @@ -466,6 +519,13 @@ describe('wrapScopedClusterClient', () => { await expect( wrappedSearchClient.asInternalUser.transport.request({ method: 'POST', path: '/_query' }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + 'executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {"method":"POST","path":"/_query"} - with options {}' + ); + expect(logger.warn).toHaveBeenCalledWith( + 'executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {"method":"POST","path":"/_query"} - with options {}' + ); }); test('keeps track of number of queries', async () => { @@ -497,6 +557,7 @@ describe('wrapScopedClusterClient', () => { expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( `executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {\"method\":\"POST\",\"path\":\"/_query\",\"body\":{\"query\":\"from .kibana_task_manager\"}} - with options {}` ); + expect(logger.warn).not.toHaveBeenCalled(); }); test('throws error when es|ql search throws abort error', async () => { @@ -522,6 +583,11 @@ describe('wrapScopedClusterClient', () => { ).rejects.toThrowErrorMatchingInlineSnapshot( `"ES|QL search has been aborted due to cancelled execution"` ); + + expect(loggingSystemMock.collect(logger).debug[0][0]).toEqual( + `executing ES|QL query for rule .test-rule-type:abcdefg in space my-space - {\"method\":\"POST\",\"path\":\"/_query\"} - with options {}` + ); + expect(logger.warn).not.toHaveBeenCalled(); }); }); @@ -542,12 +608,13 @@ describe('wrapScopedClusterClient', () => { expect(asInternalUserWrappedSearchFn).toHaveBeenCalledWith( { method: '', path: '' }, - { - requestTimeout: 5000, - } + { requestTimeout: 5000 } ); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + expect(loggingSystemMock.collect(logger).debug).toEqual([]); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses asCurrentUser when specified', async () => { @@ -572,6 +639,9 @@ describe('wrapScopedClusterClient', () => { ); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + expect(loggingSystemMock.collect(logger).debug).toEqual([]); + expect(logger.warn).not.toHaveBeenCalled(); }); test('uses search options when specified', async () => { @@ -603,6 +673,9 @@ describe('wrapScopedClusterClient', () => { ); expect(scopedClusterClient.asInternalUser.search).not.toHaveBeenCalled(); expect(scopedClusterClient.asCurrentUser.search).not.toHaveBeenCalled(); + + expect(loggingSystemMock.collect(logger).debug).toEqual([]); + expect(logger.warn).not.toHaveBeenCalled(); }); test('re-throws error when an error is thrown', async () => { @@ -620,6 +693,9 @@ describe('wrapScopedClusterClient', () => { await expect( wrappedSearchClient.asInternalUser.transport.request({ method: '', path: '' }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); + + expect(loggingSystemMock.collect(logger).debug).toEqual([]); + expect(logger.warn).not.toHaveBeenCalled(); }); test(`doesn't throw error when non es|ql request throws an error`, async () => { @@ -641,6 +717,9 @@ describe('wrapScopedClusterClient', () => { path: '/_cat/indices', }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Some other error"`); + + expect(loggingSystemMock.collect(logger).debug).toEqual([]); + expect(logger.warn).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts index fb7575891dfc8d..dc4c016eea7f4b 100644 --- a/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts +++ b/x-pack/plugins/alerting/server/lib/wrap_scoped_cluster_client.ts @@ -163,8 +163,9 @@ function getWrappedTransportRequestFn(opts: WrapEsClientOpts) { ): Promise> { // Wrap ES|QL requests with an abort signal if (params.method === 'POST' && params.path === '/_query') { + let requestOptions: TransportRequestOptions = {}; try { - const requestOptions = options ?? {}; + requestOptions = options ?? {}; const start = Date.now(); opts.logger.debug( () => @@ -193,6 +194,14 @@ function getWrappedTransportRequestFn(opts: WrapEsClientOpts) { if (opts.abortController.signal.aborted) { throw new Error('ES|QL search has been aborted due to cancelled execution'); } + + opts.logger.warn( + `executing ES|QL query for rule ${opts.rule.alertTypeId}:${opts.rule.id} in space ${ + opts.rule.spaceId + } - ${JSON.stringify(params)} - with options ${JSON.stringify(requestOptions)}${ + requestTimeout ? ` and ${requestTimeout}ms requestTimeout` : '' + }` + ); throw e; } } @@ -232,8 +241,9 @@ function getWrappedEqlSearchFn(opts: WrapEsClientOpts) { params: EqlSearchRequest | EqlSearchRequestWithBody, options?: TransportRequestOptions ): Promise | TransportResult, unknown>> { + let searchOptions: TransportRequestOptions = {}; try { - const searchOptions = options ?? {}; + searchOptions = options ?? {}; const start = Date.now(); opts.logger.debug( () => @@ -271,6 +281,14 @@ function getWrappedEqlSearchFn(opts: WrapEsClientOpts) { if (opts.abortController.signal.aborted) { throw new Error('EQL search has been aborted due to cancelled execution'); } + + opts.logger.warn( + `executing eql query for rule ${opts.rule.alertTypeId}:${opts.rule.id} in space ${ + opts.rule.spaceId + } - ${JSON.stringify(params)} - with options ${JSON.stringify(searchOptions)}${ + requestTimeout ? ` and ${requestTimeout}ms requestTimeout` : '' + }` + ); throw e; } } @@ -314,8 +332,9 @@ function getWrappedSearchFn(opts: WrapEsClientOpts) { | TransportResult, unknown> | SearchResponse > { + let searchOptions: TransportRequestOptions = {}; try { - const searchOptions = options ?? {}; + searchOptions = options ?? {}; const start = Date.now(); opts.logger.debug( () => @@ -356,6 +375,14 @@ function getWrappedSearchFn(opts: WrapEsClientOpts) { if (opts.abortController.signal.aborted) { throw new Error('Search has been aborted due to cancelled execution'); } + + opts.logger.warn( + `executing query for rule ${opts.rule.alertTypeId}:${opts.rule.id} in space ${ + opts.rule.spaceId + } - ${JSON.stringify(params)} - with options ${JSON.stringify(searchOptions)}${ + requestTimeout ? ` and ${requestTimeout}ms requestTimeout` : '' + }` + ); throw e; } } diff --git a/x-pack/plugins/alerting/server/task_runner/lib/index.ts b/x-pack/plugins/alerting/server/task_runner/lib/index.ts index eb52a18a0bde32..08134fd068f353 100644 --- a/x-pack/plugins/alerting/server/task_runner/lib/index.ts +++ b/x-pack/plugins/alerting/server/task_runner/lib/index.ts @@ -8,3 +8,4 @@ export { partiallyUpdateAdHocRun } from './partially_update_ad_hoc_run'; export { processRunResults } from './process_run_result'; export { withAlertingSpan } from './with_alerting_span'; +export { createTaskRunnerLogger } from './task_runner_logger'; diff --git a/x-pack/plugins/alerting/server/task_runner/lib/task_runner_logger.test.ts b/x-pack/plugins/alerting/server/task_runner/lib/task_runner_logger.test.ts new file mode 100644 index 00000000000000..96a75d53cb402f --- /dev/null +++ b/x-pack/plugins/alerting/server/task_runner/lib/task_runner_logger.test.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { loggingSystemMock } from '@kbn/core/server/mocks'; +import { LogLevel, LogRecord } from '@kbn/logging'; +import { createTaskRunnerLogger } from './task_runner_logger'; + +describe('createTaskRunnerLogger', () => { + test('should inject baseline tags into log messages', () => { + const logger: ReturnType = + loggingSystemMock.createLogger(); + const taskRunnerLogger = createTaskRunnerLogger({ logger, tags: ['tag-1', 'tag-2'] }); + + taskRunnerLogger.trace('test trace message', { tags: ['tag-3'] }); + taskRunnerLogger.debug('test debug message', { tags: ['tag-4'] }); + taskRunnerLogger.info('test info message', { tags: ['tag-5'] }); + taskRunnerLogger.warn('test warn message', { tags: ['tag-6'] }); + taskRunnerLogger.error('test error message', { tags: ['tag-7'] }); + taskRunnerLogger.fatal('test fatal message', { tags: ['tag-8'] }); + + expect(logger.trace).toHaveBeenCalledWith('test trace message', { + tags: ['tag-1', 'tag-2', 'tag-3'], + }); + expect(logger.debug).toHaveBeenCalledWith('test debug message', { + tags: ['tag-1', 'tag-2', 'tag-4'], + }); + expect(logger.info).toHaveBeenCalledWith('test info message', { + tags: ['tag-1', 'tag-2', 'tag-5'], + }); + expect(logger.warn).toHaveBeenCalledWith('test warn message', { + tags: ['tag-1', 'tag-2', 'tag-6'], + }); + expect(logger.error).toHaveBeenCalledWith('test error message', { + tags: ['tag-1', 'tag-2', 'tag-7'], + }); + expect(logger.fatal).toHaveBeenCalledWith('test fatal message', { + tags: ['tag-1', 'tag-2', 'tag-8'], + }); + }); + + test('should pass through other meta fields', () => { + const logger: ReturnType = + loggingSystemMock.createLogger(); + const taskRunnerLogger = createTaskRunnerLogger({ logger, tags: ['tag-1', 'tag-2'] }); + + taskRunnerLogger.trace('test trace message', { labels: { foo: 'bar' } }); + taskRunnerLogger.debug('test debug message', { tags: ['tag-4'], host: { cpu: { usage: 3 } } }); + taskRunnerLogger.info('test info message'); + taskRunnerLogger.warn('test warn message', { user: { email: 'abc@124.com' } }); + taskRunnerLogger.error('test error message', { agent: { id: 'agent-1' } }); + taskRunnerLogger.fatal('test fatal message'); + + expect(logger.trace).toHaveBeenCalledWith('test trace message', { + tags: ['tag-1', 'tag-2'], + labels: { foo: 'bar' }, + }); + expect(logger.debug).toHaveBeenCalledWith('test debug message', { + tags: ['tag-1', 'tag-2', 'tag-4'], + host: { cpu: { usage: 3 } }, + }); + expect(logger.info).toHaveBeenCalledWith('test info message', { tags: ['tag-1', 'tag-2'] }); + expect(logger.warn).toHaveBeenCalledWith('test warn message', { + tags: ['tag-1', 'tag-2'], + user: { email: 'abc@124.com' }, + }); + expect(logger.error).toHaveBeenCalledWith('test error message', { + tags: ['tag-1', 'tag-2'], + agent: { id: 'agent-1' }, + }); + expect(logger.fatal).toHaveBeenCalledWith('test fatal message', { tags: ['tag-1', 'tag-2'] }); + }); + + test('should pass through other functions', () => { + const logger: ReturnType = + loggingSystemMock.createLogger(); + const taskRunnerLogger = createTaskRunnerLogger({ logger, tags: ['tag-1', 'tag-2'] }); + + taskRunnerLogger.isLevelEnabled('debug'); + expect(logger.isLevelEnabled).toHaveBeenCalledWith('debug'); + + taskRunnerLogger.get('prefix', 'another'); + expect(logger.get).toHaveBeenCalledWith('prefix', 'another'); + + const logRecord: LogRecord = { + timestamp: new Date(), + level: LogLevel.Info, + context: 'context', + message: 'message', + pid: 1, + }; + taskRunnerLogger.log(logRecord); + expect(logger.log).toHaveBeenCalledWith(logRecord); + }); +}); diff --git a/x-pack/plugins/alerting/server/task_runner/lib/task_runner_logger.ts b/x-pack/plugins/alerting/server/task_runner/lib/task_runner_logger.ts new file mode 100644 index 00000000000000..c99b4ac88b86be --- /dev/null +++ b/x-pack/plugins/alerting/server/task_runner/lib/task_runner_logger.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Logger, LogMeta } from '@kbn/core/server'; +import { LogLevelId, LogMessageSource, LogRecord } from '@kbn/logging'; + +interface TaskRunnerLoggerOpts { + logger: Logger; + tags: string[]; +} + +export function createTaskRunnerLogger(opts: TaskRunnerLoggerOpts): Logger { + return new TaskRunnerLogger(opts); +} + +class TaskRunnerLogger implements Logger { + private loggerMetaTags: string[] = []; + + constructor(private readonly opts: TaskRunnerLoggerOpts) { + this.loggerMetaTags = opts.tags; + } + + trace(message: LogMessageSource, meta?: Meta) { + this.opts.logger.trace(message, { ...meta, tags: this.combineTags(meta?.tags) }); + } + + debug(message: LogMessageSource, meta?: Meta) { + this.opts.logger.debug(message, { ...meta, tags: this.combineTags(meta?.tags) }); + } + + info(message: LogMessageSource, meta?: Meta) { + this.opts.logger.info(message, { ...meta, tags: this.combineTags(meta?.tags) }); + } + + warn(errorOrMessage: LogMessageSource | Error, meta?: Meta) { + this.opts.logger.warn(errorOrMessage, { ...meta, tags: this.combineTags(meta?.tags) }); + } + + error(errorOrMessage: LogMessageSource | Error, meta?: Meta) { + this.opts.logger.error(errorOrMessage, { ...meta, tags: this.combineTags(meta?.tags) }); + } + + fatal(errorOrMessage: LogMessageSource | Error, meta?: Meta) { + this.opts.logger.fatal(errorOrMessage, { ...meta, tags: this.combineTags(meta?.tags) }); + } + + log(record: LogRecord) { + this.opts.logger.log(record); + } + + isLevelEnabled(level: LogLevelId): boolean { + return this.opts.logger.isLevelEnabled(level); + } + + get(...childContextPaths: string[]): Logger { + return this.opts.logger.get(...childContextPaths); + } + + private combineTags(tags?: string[] | string): string[] { + if (!tags) { + return this.loggerMetaTags; + } + + if (typeof tags === 'string') { + return [...new Set([...this.loggerMetaTags, tags])]; + } + + return [...new Set([...this.loggerMetaTags, ...tags])]; + } +} diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index d6f4e4942da1b1..0898c29a85a868 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -320,18 +320,23 @@ describe('Task Runner', () => { expect(call.services).toBeTruthy(); expect(logger.debug).toHaveBeenCalledTimes(5); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ status: 'ok' }); @@ -399,22 +404,28 @@ describe('Task Runner', () => { ); expect(logger.debug).toHaveBeenCalledTimes(6); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":1,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":1,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 5, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":1,"numberOfGeneratedActions":1,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":1,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":1,"numberOfGeneratedActions":1,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":1,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -484,26 +495,33 @@ describe('Task Runner', () => { expect(actionsClient.ephemeralEnqueuedExecution).toHaveBeenCalledTimes(0); expect(logger.debug).toHaveBeenCalledTimes(7); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - `no scheduling of actions for rule test:1: '${RULE_NAME}': rule is snoozed.` + `no scheduling of actions for rule test:1: '${RULE_NAME}': rule is snoozed.`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 5, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":1,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":1,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 6, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":1,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":1,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -619,7 +637,7 @@ describe('Task Runner', () => { if (expectedExecutions) { expect(logger.debug).not.toHaveBeenCalledWith(expectedMessage); } else { - expect(logger.debug).toHaveBeenCalledWith(expectedMessage); + expect(logger.debug).toHaveBeenCalledWith(expectedMessage, { tags: ['1', 'test'] }); } } ); @@ -939,26 +957,33 @@ describe('Task Runner', () => { expect(enqueueFunction).toHaveBeenCalledTimes(1); expect(logger.debug).toHaveBeenCalledTimes(7); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - `rule test:1: '${RULE_NAME}' has 2 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"},{\"instanceId\":\"2\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 2 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"},{\"instanceId\":\"2\",\"actionGroup\":\"default\"}]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is muted` + `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is muted`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 5, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":2,"new":2,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":2,"new":2,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 6, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":1,"numberOfGeneratedActions":1,"numberOfActiveAlerts":2,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":2,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":1,"numberOfGeneratedActions":1,"numberOfActiveAlerts":2,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":2,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); } @@ -1028,7 +1053,8 @@ describe('Task Runner', () => { // expect(logger.debug).toHaveBeenCalledTimes(5); expect(logger.debug).nthCalledWith( 3, - `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is throttled` + `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is throttled`, + { tags: ['1', 'test'] } ); } ); @@ -1075,7 +1101,8 @@ describe('Task Runner', () => { expect(logger.debug).toHaveBeenCalledTimes(7); expect(logger.debug).nthCalledWith( 3, - `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is muted` + `skipping scheduling of actions for '2' in rule test:1: '${RULE_NAME}': rule is muted`, + { tags: ['1', 'test'] } ); } ); @@ -1390,26 +1417,33 @@ describe('Task Runner', () => { ); expect(logger.debug).toHaveBeenCalledTimes(7); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - `rule test:1: '${RULE_NAME}' has 1 recovered alerts: [\"2\"]` + `rule test:1: '${RULE_NAME}' has 1 recovered alerts: [\"2\"]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 5, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":0,"recovered":1,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":0,"recovered":1,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 6, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":2,"numberOfGeneratedActions":2,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":1,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":2,"numberOfGeneratedActions":2,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":1,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -1520,24 +1554,29 @@ describe('Task Runner', () => { ); expect(logger.debug).toHaveBeenCalledWith( - `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: '${RULE_NAME}' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - `rule test:1: '${RULE_NAME}' has 1 recovered alerts: [\"2\"]` + `rule test:1: '${RULE_NAME}' has 1 recovered alerts: [\"2\"]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - `deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}` + `deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 5, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":0,"recovered":1,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":1,"new":0,"recovered":1,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 6, - `ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":2,"numberOfGeneratedActions":2,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":1,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}` + `ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":2,"numberOfGeneratedActions":2,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":1,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}`, + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -1955,7 +1994,7 @@ describe('Task Runner', () => { expect(loggerCallPrefix[0].trim()).toMatchInlineSnapshot( `"Executing Rule default:test:1 has resulted in Error: test"` ); - expect(loggerMeta?.tags).toEqual(['test', '1', 'rule-run-failed', 'framework-error']); + expect(loggerMeta?.tags).toEqual(['1', 'test', 'rule-run-failed', 'framework-error']); }); test('recovers gracefully when the RuleType executor throws an exception', async () => { @@ -2006,7 +2045,7 @@ describe('Task Runner', () => { expect(loggerCallPrefix[0].trim()).toMatchInlineSnapshot( `"Executing Rule default:test:1 has resulted in Error: GENERIC ERROR MESSAGE"` ); - expect(loggerMeta?.tags).toEqual(['test', '1', 'rule-run-failed', 'framework-error']); + expect(loggerMeta?.tags).toEqual(['1', 'test', 'rule-run-failed', 'framework-error']); expect(loggerMeta?.error?.stack_trace).toBeDefined(); expect(logger.error).toBeCalledTimes(1); expect(getErrorSource(runnerResult.taskRunError as Error)).toBe(TaskErrorSource.FRAMEWORK); @@ -2145,7 +2184,8 @@ describe('Task Runner', () => { expect(logger.warn).toHaveBeenCalledTimes(1); expect(logger.warn).nthCalledWith( 1, - `Unable to execute rule "1" in the "foo" space because Saved object [alert/1] not found - this rule will not be rescheduled. To restart rule execution, try disabling and re-enabling this rule.` + `Unable to execute rule "1" in the "foo" space because Saved object [alert/1] not found - this rule will not be rescheduled. To restart rule execution, try disabling and re-enabling this rule.`, + { tags: ['1', 'test'] } ); expect(isUnrecoverableError(ex)).toBeTruthy(); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); @@ -2230,7 +2270,8 @@ describe('Task Runner', () => { expect(logger.warn).toHaveBeenCalledTimes(1); expect(logger.warn).nthCalledWith( 1, - `Unable to execute rule "1" in the "test space" space because Saved object [alert/1] not found - this rule will not be rescheduled. To restart rule execution, try disabling and re-enabling this rule.` + `Unable to execute rule "1" in the "test space" space because Saved object [alert/1] not found - this rule will not be rescheduled. To restart rule execution, try disabling and re-enabling this rule.`, + { tags: ['1', 'test'] } ); expect(mockUsageCounter.incrementCounter).not.toHaveBeenCalled(); }); @@ -2694,18 +2735,23 @@ describe('Task Runner', () => { expect(call.services).toBeTruthy(); expect(logger.debug).toHaveBeenCalledTimes(5); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -3026,7 +3072,8 @@ describe('Task Runner', () => { expect(logger.debug).nthCalledWith( 3, - 'Rule "1" skipped scheduling action "4" because the maximum number of allowed actions has been reached.' + 'Rule "1" skipped scheduling action "4" because the maximum number of allowed actions has been reached.', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -3213,7 +3260,8 @@ describe('Task Runner', () => { expect(logger.debug).nthCalledWith( 3, - 'Rule "1" skipped scheduling action "1" because the maximum number of allowed actions for connector type .server-log has been reached.' + 'Rule "1" skipped scheduling action "1" because the maximum number of allowed actions for connector type .server-log has been reached.', + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ @@ -3387,7 +3435,7 @@ describe('Task Runner', () => { ); expect(logger.error).toHaveBeenCalledWith( 'Executing Rule test:1 has resulted in the following error(s): an error occurred,second error occurred', - { tags: ['test', '1', 'rule-run-failed', 'framework-error'] } + { tags: ['1', 'test', 'rule-run-failed', 'framework-error'] } ); }); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index da0db3371912b6..5eb15bff0107bf 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -68,7 +68,7 @@ import { MaintenanceWindow } from '../application/maintenance_window/types'; import { filterMaintenanceWindowsIds, getMaintenanceWindows } from './get_maintenance_windows'; import { RuleTypeRunner } from './rule_type_runner'; import { initializeAlertsClient } from '../alerts_client'; -import { withAlertingSpan, processRunResults } from './lib'; +import { createTaskRunnerLogger, withAlertingSpan, processRunResults } from './lib'; const FALLBACK_RETRY_INTERVAL = '5m'; const CONNECTIVITY_RETRY_INTERVAL = '5m'; @@ -669,6 +669,8 @@ export class TaskRunner< schedule: taskSchedule, } = this.taskInstance; + this.logger = createTaskRunnerLogger({ logger: this.logger, tags: [ruleId, this.ruleType.id] }); + let stateWithMetrics: Result; let schedule: Result; try { diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts index 69bc11bc48dc8e..9f5ad725465e7c 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_alerts_client.test.ts @@ -102,6 +102,7 @@ import { } from '@kbn/rule-data-utils'; import { backfillClientMock } from '../backfill_client/backfill_client.mock'; import { ConnectorAdapterRegistry } from '../connector_adapters/connector_adapter_registry'; +import { createTaskRunnerLogger } from './lib'; jest.mock('uuid', () => ({ v4: () => '5f6aa57d-3e22-484e-bae8-cbed868f4d28', @@ -115,6 +116,7 @@ jest.mock('../lib/alerting_event_logger/alerting_event_logger'); let fakeTimer: sinon.SinonFakeTimers; const logger: ReturnType = loggingSystemMock.createLogger(); +const taskRunnerLogger = createTaskRunnerLogger({ logger, tags: ['1', 'test'] }); const mockUsageCountersSetup = usageCountersServiceMock.createSetupContract(); const mockUsageCounter = mockUsageCountersSetup.createUsageCounter('test'); @@ -308,7 +310,7 @@ describe('Task Runner', () => { await taskRunner.run(); expect(mockAlertsService.createAlertsClient).toHaveBeenCalledWith({ - logger, + logger: taskRunnerLogger, ruleType: ruleTypeWithAlerts, namespace: 'default', rule: { @@ -334,18 +336,23 @@ describe('Task Runner', () => { expect(ruleType.executor).toHaveBeenCalledTimes(1); expect(logger.debug).toHaveBeenCalledTimes(5); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"hasReachedAlertLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"hasReachedAlertLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( @@ -442,7 +449,8 @@ describe('Task Runner', () => { expect(logger.debug).nthCalledWith(debugCall++, `Initializing resources for AlertsService`); expect(logger.debug).nthCalledWith( debugCall++, - 'executing rule test:1 at 1970-01-01T00:00:00.000Z' + 'executing rule test:1 at 1970-01-01T00:00:00.000Z', + { tags: ['1', 'test'] } ); if (!useDataStreamForAlerts) { @@ -465,15 +473,18 @@ describe('Task Runner', () => { ); expect(logger.debug).nthCalledWith( debugCall++, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"ok"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( debugCall++, - 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}' + 'ruleRunStatus for test:1: {"outcome":"succeeded","outcomeOrder":0,"outcomeMsg":null,"warning":null,"alertsCount":{"active":0,"new":0,"recovered":0,"ignored":0}}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( debugCall++, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":0,"numberOfGeneratedActions":0,"numberOfActiveAlerts":0,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":0,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( ...generateSavedObjectParams({}) @@ -646,10 +657,11 @@ describe('Task Runner', () => { expect(mockAlertsService.createAlertsClient).toHaveBeenCalled(); expect(logger.error).toHaveBeenCalledWith( - `Error initializing AlertsClient for context test. Using legacy alerts client instead. - Could not initialize!` + `Error initializing AlertsClient for context test. Using legacy alerts client instead. - Could not initialize!`, + { tags: ['1', 'test'] } ); expect(LegacyAlertsClientModule.LegacyAlertsClient).toHaveBeenCalledWith({ - logger, + logger: taskRunnerLogger, ruleType: ruleTypeWithAlerts, }); @@ -661,7 +673,9 @@ describe('Task Runner', () => { expect(ruleType.executor).toHaveBeenCalledTimes(1); expect(logger.debug).toHaveBeenCalledTimes(5); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( ...generateSavedObjectParams({}) @@ -734,7 +748,7 @@ describe('Task Runner', () => { expect(mockAlertsService.createAlertsClient).not.toHaveBeenCalled(); expect(logger.error).not.toHaveBeenCalled(); expect(LegacyAlertsClientModule.LegacyAlertsClient).toHaveBeenCalledWith({ - logger, + logger: taskRunnerLogger, ruleType: ruleTypeWithAlerts, }); @@ -746,7 +760,9 @@ describe('Task Runner', () => { expect(ruleType.executor).toHaveBeenCalledTimes(1); expect(logger.debug).toHaveBeenCalledTimes(5); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(internalSavedObjectsRepository.update).toHaveBeenCalledWith( ...generateSavedObjectParams({}) diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts index b41b26bd1ea498..fdc05d208aba1b 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_cancel.test.ts @@ -220,7 +220,8 @@ describe('Task Runner Cancel', () => { expect(logger.debug).toHaveBeenNthCalledWith( 3, - `Aborting any in-progress ES searches for rule type test with id 1` + `Aborting any in-progress ES searches for rule type test with id 1`, + { tags: ['1', 'test'] } ); testAlertingEventLogCalls({ status: 'ok' }); @@ -457,30 +458,38 @@ describe('Task Runner Cancel', () => { function testLogger() { expect(logger.debug).toHaveBeenCalledTimes(8); - expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith(1, 'executing rule test:1 at 1970-01-01T00:00:00.000Z', { + tags: ['1', 'test'], + }); expect(logger.debug).nthCalledWith( 2, - `Cancelling rule type test with id 1 - execution exceeded rule type timeout of 5m` + `Cancelling rule type test with id 1 - execution exceeded rule type timeout of 5m`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 3, - 'Aborting any in-progress ES searches for rule type test with id 1' + 'Aborting any in-progress ES searches for rule type test with id 1', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 4, - `Updating rule task for test rule with id 1 - execution error due to timeout` + `Updating rule task for test rule with id 1 - execution error due to timeout`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 5, - `rule test:1: 'rule-name' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + `rule test:1: 'rule-name' has 1 active alerts: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]`, + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 6, - 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + 'deprecated ruleRunStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}', + { tags: ['1', 'test'] } ); expect(logger.debug).nthCalledWith( 8, - 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":1,"numberOfGeneratedActions":1,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":1,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}' + 'ruleRunMetrics for test:1: {"numSearches":3,"totalSearchDurationMs":23423,"esSearchDurationMs":33,"numberOfTriggeredActions":1,"numberOfGeneratedActions":1,"numberOfActiveAlerts":1,"numberOfRecoveredAlerts":0,"numberOfNewAlerts":1,"numberOfDelayedAlerts":0,"hasReachedAlertLimit":false,"hasReachedQueuedActionsLimit":false,"triggeredActionsStatus":"complete"}', + { tags: ['1', 'test'] } ); } diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index e83bbfd0013d19..2e11c3a64caae0 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -153,6 +153,14 @@ export const ACTIONS = i18n.translate('xpack.cases.allCases.actions', { defaultMessage: 'Actions', }); +export const ACTIONS_BUTTON_ARIA_LABEL = (title: string) => + i18n.translate('xpack.cases.allCases.actions.button.ariaLabel', { + defaultMessage: 'Actions for "{title}" column', + values: { + title, + }, + }); + export const NO_TAGS_AVAILABLE = i18n.translate('xpack.cases.allCases.noTagsAvailable', { defaultMessage: 'No tags available', }); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx index 70a163bcd69a03..4c43201b1eab40 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx @@ -174,7 +174,7 @@ const ActionColumnComponent: React.FC<{ theCase: CaseUI; disableActions: boolean { +// FLAKY: https://github.com/elastic/kibana/issues/188133 +describe.skip('CustomFields', () => { let appMockRender: AppMockRenderer; const onSubmit = jest.fn(); diff --git a/x-pack/plugins/cases/public/components/configure_cases/flyout.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/flyout.test.tsx index 568d08b188dbfb..5d6c1784603e49 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/flyout.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/flyout.test.tsx @@ -600,6 +600,11 @@ describe('CommonFlyout ', () => { type: 'toggle', value: true, }, + { + key: 'test_key_3', + type: 'text', + value: null, + }, { key: 'test_key_4', type: 'toggle', diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index b424b2ca62fc04..97e43a2ade5596 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -724,6 +724,166 @@ describe('ConfigureCases', () => { }); }); + it('deletes a custom field from template while deleting custom field from configuration', async () => { + useGetCaseConfigurationMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + data: { + ...useCaseConfigureResponse.data, + customFields: customFieldsConfigurationMock, + templates: [ + { + key: 'test_template_4', + name: 'Fourth test template', + caseFields: { + title: 'Case with sample template 4', + description: 'case desc', + customFields: [ + { + key: customFieldsConfigurationMock[0].key, + type: CustomFieldTypes.TEXT, + value: 'this is a text field value', + }, + ], + }, + }, + ], + }, + })); + + appMockRender.render(); + + const list = await screen.findByTestId('custom-fields-list'); + + userEvent.click( + within(list).getByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-delete`) + ); + + expect(await screen.findByTestId('confirm-delete-modal')).toBeInTheDocument(); + + userEvent.click(screen.getByText('Delete')); + + await waitFor(() => { + expect(persistCaseConfigure).toHaveBeenCalledWith({ + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + closureType: 'close-by-user', + customFields: [ + { ...customFieldsConfigurationMock[1] }, + { ...customFieldsConfigurationMock[2] }, + { ...customFieldsConfigurationMock[3] }, + ], + templates: [ + { + key: 'test_template_4', + name: 'Fourth test template', + caseFields: { + title: 'Case with sample template 4', + description: 'case desc', + customFields: [], + }, + }, + ], + id: '', + version: '', + }); + }); + }); + + it('adds a custom field to template while adding a new custom field', async () => { + useGetCaseConfigurationMock.mockImplementation(() => ({ + ...useCaseConfigureResponse, + data: { + ...useCaseConfigureResponse.data, + customFields: customFieldsConfigurationMock, + templates: [ + { + key: 'test_template_4', + name: 'Fourth test template', + caseFields: null, + }, + ], + }, + })); + + appMockRender.render(); + + userEvent.click(await screen.findByTestId(`add-custom-field`)); + + expect(await screen.findByTestId('common-flyout')).toBeInTheDocument(); + + userEvent.paste(screen.getByTestId('custom-field-label-input'), 'New custom field'); + userEvent.click(screen.getByTestId('text-custom-field-required')); + userEvent.paste( + screen.getByTestId('text-custom-field-default-value'), + 'This is a default value' + ); + + userEvent.click(screen.getByTestId('common-flyout-save')); + + await waitFor(() => { + expect(persistCaseConfigure).toHaveBeenCalledWith({ + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + closureType: 'close-by-user', + customFields: [ + ...customFieldsConfigurationMock, + { + key: expect.anything(), + label: 'New custom field', + type: CustomFieldTypes.TEXT as const, + required: true, + defaultValue: 'This is a default value', + }, + ], + templates: [ + { + key: 'test_template_4', + name: 'Fourth test template', + caseFields: { + customFields: [ + { + key: customFieldsConfigurationMock[0].key, + type: customFieldsConfigurationMock[0].type, + value: customFieldsConfigurationMock[0].defaultValue, + }, + { + key: customFieldsConfigurationMock[1].key, + type: customFieldsConfigurationMock[1].type, + value: customFieldsConfigurationMock[1].defaultValue, + }, + { + key: customFieldsConfigurationMock[2].key, + type: customFieldsConfigurationMock[2].type, + value: null, + }, + { + key: customFieldsConfigurationMock[3].key, + type: customFieldsConfigurationMock[3].type, + value: false, + }, + { + key: expect.anything(), + type: CustomFieldTypes.TEXT as const, + value: 'This is a default value', + }, + ], + }, + }, + ], + id: '', + version: '', + }); + }); + }); + it('updates a custom field correctly', async () => { useGetCaseConfigurationMock.mockImplementation(() => ({ ...useCaseConfigureResponse, @@ -929,6 +1089,11 @@ describe('ConfigureCases', () => { type: customFieldsConfigurationMock[1].type, value: customFieldsConfigurationMock[1].defaultValue, }, + { + key: customFieldsConfigurationMock[2].key, + type: customFieldsConfigurationMock[2].type, + value: null, + }, { key: customFieldsConfigurationMock[3].key, type: customFieldsConfigurationMock[3].type, diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index 1003a10646e8c8..2eadd6ccbe79a0 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -24,7 +24,11 @@ import { import type { ActionConnectorTableItem } from '@kbn/triggers-actions-ui-plugin/public/types'; import { CasesConnectorFeatureId } from '@kbn/actions-plugin/common'; -import type { CustomFieldConfiguration, TemplateConfiguration } from '../../../common/types/domain'; +import type { + CustomFieldConfiguration, + TemplateConfiguration, + CustomFieldTypes, +} from '../../../common/types/domain'; import { useKibana } from '../../common/lib/kibana'; import { useGetActionTypes } from '../../containers/configure/use_action_types'; import { useGetCaseConfiguration } from '../../containers/configure/use_get_case_configuration'; @@ -48,6 +52,8 @@ import { Templates } from '../templates'; import type { TemplateFormProps } from '../templates/types'; import { CustomFieldsForm } from '../custom_fields/form'; import { TemplateForm } from '../templates/form'; +import type { CasesConfigurationUI, CaseUI } from '../../containers/types'; +import { builderMap as customFieldsBuilderMap } from '../custom_fields/builder'; const sectionWrapperCss = css` box-sizing: content-box; @@ -68,6 +74,40 @@ interface Flyout { visible: boolean; } +const addNewCustomFieldToTemplates = ({ + templates, + customFields, +}: Pick) => { + return templates.map((template) => { + const templateCustomFields = template.caseFields?.customFields ?? []; + + customFields.forEach((field) => { + if ( + !templateCustomFields.length || + !templateCustomFields.find((templateCustomField) => templateCustomField.key === field.key) + ) { + const customFieldFactory = customFieldsBuilderMap[field.type]; + const { getDefaultValue } = customFieldFactory(); + const value = getDefaultValue?.() ?? null; + + templateCustomFields.push({ + key: field.key, + type: field.type as CustomFieldTypes, + value: field.defaultValue ?? value, + } as CaseUI['customFields'][number]); + } + }); + + return { + ...template, + caseFields: { + ...template.caseFields, + customFields: [...templateCustomFields], + }, + }; + }); +}; + export const ConfigureCases: React.FC = React.memo(() => { const { permissions } = useCasesContext(); const { triggersActionsUi } = useKibana().services; @@ -334,10 +374,16 @@ export const ConfigureCases: React.FC = React.memo(() => { (data: CustomFieldConfiguration) => { const updatedCustomFields = addOrReplaceField(customFields, data); + // add the new custom field to each template as well + const updatedTemplates = addNewCustomFieldToTemplates({ + templates, + customFields: updatedCustomFields, + }); + persistCaseConfigure({ connector, customFields: updatedCustomFields, - templates, + templates: updatedTemplates, id: configurationId, version: configurationVersion, closureType, diff --git a/x-pack/plugins/cases/public/components/create/form_fields.tsx b/x-pack/plugins/cases/public/components/create/form_fields.tsx index e20384a3b49505..da81e65b8e0f0c 100644 --- a/x-pack/plugins/cases/public/components/create/form_fields.tsx +++ b/x-pack/plugins/cases/public/components/create/form_fields.tsx @@ -17,7 +17,7 @@ import { import { css } from '@emotion/react'; import { useFormContext } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; -import type { CasePostRequest } from '../../../common'; +import type { CasePostRequest, CaseUI } from '../../../common'; import type { ActionConnector } from '../../../common/types/domain'; import { Connector } from '../case_form_fields/connector'; import * as i18n from './translations'; @@ -28,6 +28,7 @@ import { useCasesFeatures } from '../../common/use_cases_features'; import { TemplateSelector } from './templates'; import { getInitialCaseValue } from './utils'; import { CaseFormFields } from '../case_form_fields'; +import { builderMap as customFieldsBuilderMap } from '../custom_fields/builder'; export interface CreateCaseFormFieldsProps { configuration: CasesConfigurationUI; @@ -42,7 +43,22 @@ const transformTemplateCaseFieldsToCaseFormFields = ( caseTemplateFields: CasesConfigurationUITemplate['caseFields'] ): CasePostRequest => { const caseFields = removeEmptyFields(caseTemplateFields ?? {}); - return getInitialCaseValue({ owner, ...caseFields }); + const transFormedCustomFields = caseFields?.customFields?.map((customField) => { + const customFieldFactory = customFieldsBuilderMap[customField.type]; + const { convertNullToEmpty } = customFieldFactory(); + const value = convertNullToEmpty ? convertNullToEmpty(customField.value) : customField.value; + + return { + ...customField, + value, + }; + }); + + return getInitialCaseValue({ + owner, + ...caseFields, + customFields: transFormedCustomFields as CaseUI['customFields'], + }); }; const DEFAULT_EMPTY_TEMPLATE_KEY = 'defaultEmptyTemplateKey'; diff --git a/x-pack/plugins/cases/public/components/create/templates.tsx b/x-pack/plugins/cases/public/components/create/templates.tsx index 3df1504ccf14fd..6f9ad1e9ed8c01 100644 --- a/x-pack/plugins/cases/public/components/create/templates.tsx +++ b/x-pack/plugins/cases/public/components/create/templates.tsx @@ -5,9 +5,17 @@ * 2.0. */ -import type { EuiSelectOption } from '@elastic/eui'; -import { EuiFormRow, EuiSelect } from '@elastic/eui'; import React, { useCallback, useState } from 'react'; +import type { EuiSelectOption } from '@elastic/eui'; +import { + EuiFlexItem, + EuiFormRow, + EuiSelect, + EuiFlexGroup, + useIsWithinMaxBreakpoint, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { ExperimentalBadge } from '../experimental_badge/experimental_badge'; import type { CasesConfigurationUI, CasesConfigurationUITemplate } from '../../containers/types'; import { OptionalFieldLabel } from '../optional_field_label'; import { TEMPLATE_HELP_TEXT, TEMPLATE_LABEL } from './translations'; @@ -24,6 +32,7 @@ export const TemplateSelectorComponent: React.FC = ({ onTemplateChange, }) => { const [selectedTemplate, onSelectTemplate] = useState(); + const isSmallScreen = useIsWithinMaxBreakpoint('s'); const options: EuiSelectOption[] = templates.map((template) => ({ text: template.name, @@ -47,7 +56,26 @@ export const TemplateSelectorComponent: React.FC = ({ id="createCaseTemplate" fullWidth label={TEMPLATE_LABEL} - labelAppend={OptionalFieldLabel} + labelAppend={ + + + + + {OptionalFieldLabel} + + } helpText={TEMPLATE_HELP_TEXT} > { label: 'Text', getEuiTableColumn: expect.any(Function), build: expect.any(Function), + convertNullToEmpty: expect.any(Function), }); }); }); diff --git a/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts b/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts index 908d7c678d3dd3..c0f50820d45f3e 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/text/configure_text_field.ts @@ -25,4 +25,5 @@ export const configureTextCustomFieldFactory: CustomFieldFactory (value == null ? '' : String(value)), }); diff --git a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts index 3ac05ad6b867c6..9a9994db2a3d2d 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_text_field.test.ts @@ -24,6 +24,7 @@ describe('configureToggleCustomFieldFactory ', () => { { key: 'on', label: 'On', value: true }, { key: 'off', label: 'Off', value: false }, ], + getDefaultValue: expect.any(Function), }); }); }); diff --git a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts index 6b82f423256cb4..0ad2e0fd2a68f1 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/toggle/configure_toggle_field.ts @@ -30,4 +30,5 @@ export const configureToggleCustomFieldFactory: CustomFieldFactory false, }); diff --git a/x-pack/plugins/cases/public/components/custom_fields/types.ts b/x-pack/plugins/cases/public/components/custom_fields/types.ts index a1dcffaec6b975..70caeabd8edd26 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/types.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/types.ts @@ -54,6 +54,8 @@ export type CustomFieldFactory = () => { getEuiTableColumn: (params: { label: string }) => CustomFieldEuiTableColumn; build: () => CustomFieldType; filterOptions?: CustomFieldFactoryFilterOption[]; + getDefaultValue?: () => string | boolean | null; + convertNullToEmpty?: (value: string | boolean | null) => string; }; export type CustomFieldBuilderMap = { diff --git a/x-pack/plugins/cases/public/components/experimental_badge/experimental_badge.tsx b/x-pack/plugins/cases/public/components/experimental_badge/experimental_badge.tsx index f46fdba47d5196..ef3f4a85841410 100644 --- a/x-pack/plugins/cases/public/components/experimental_badge/experimental_badge.tsx +++ b/x-pack/plugins/cases/public/components/experimental_badge/experimental_badge.tsx @@ -14,13 +14,18 @@ import { EXPERIMENTAL_LABEL, EXPERIMENTAL_DESC } from '../../common/translations interface Props { icon?: boolean; size?: EuiBetaBadgeProps['size']; + compact?: boolean; } -const ExperimentalBadgeComponent: React.FC = ({ icon = false, size = 's' }) => { +const ExperimentalBadgeComponent: React.FC = ({ + icon = false, + size = 's', + compact = false, +}) => { const props: EuiBetaBadgeProps = { - label: EXPERIMENTAL_LABEL, + label: compact ? null : EXPERIMENTAL_LABEL, size, - ...(icon && { iconType: 'beaker' }), + ...((icon || compact) && { iconType: 'beaker' }), tooltipContent: EXPERIMENTAL_DESC, tooltipPosition: 'bottom' as const, 'data-test-subj': 'case-experimental-badge', diff --git a/x-pack/plugins/cases/public/components/templates/form.test.tsx b/x-pack/plugins/cases/public/components/templates/form.test.tsx index a01aa25132cb54..2f04bead5005e0 100644 --- a/x-pack/plugins/cases/public/components/templates/form.test.tsx +++ b/x-pack/plugins/cases/public/components/templates/form.test.tsx @@ -561,6 +561,11 @@ describe('TemplateForm', () => { type: 'toggle', value: true, }, + { + key: 'test_key_3', + type: 'text', + value: null, + }, { key: 'test_key_4', type: 'toggle', @@ -645,6 +650,11 @@ describe('TemplateForm', () => { type: 'toggle', value: true, }, + { + key: 'test_key_3', + type: 'text', + value: null, + }, { key: 'test_key_4', type: 'toggle', diff --git a/x-pack/plugins/cases/public/components/templates/utils.test.ts b/x-pack/plugins/cases/public/components/templates/utils.test.ts index 9e3cd70c120af4..639facc6907523 100644 --- a/x-pack/plugins/cases/public/components/templates/utils.test.ts +++ b/x-pack/plugins/cases/public/components/templates/utils.test.ts @@ -117,9 +117,9 @@ describe('utils', () => { name: 'template 1', templateDescription: '', customFields: { - custom_field_1: 'foobar', - custom_fields_2: '', - custom_field_3: true, + test_key_1: 'foobar', + test_key_3: '', + test_key_2: true, }, }); @@ -131,7 +131,11 @@ describe('utils', () => { name: 'none', type: '.none', }, - customFields: [], + customFields: [ + { key: 'test_key_1', type: 'text', value: 'foobar' }, + { key: 'test_key_3', type: 'text', value: null }, + { key: 'test_key_2', type: 'toggle', value: true }, + ], settings: { syncAlerts: false, }, diff --git a/x-pack/plugins/cases/public/components/templates/utils.ts b/x-pack/plugins/cases/public/components/templates/utils.ts index 3ee3002388e2d1..29dda56fbe0e69 100644 --- a/x-pack/plugins/cases/public/components/templates/utils.ts +++ b/x-pack/plugins/cases/public/components/templates/utils.ts @@ -79,14 +79,19 @@ export const templateSerializer = ( return data; } - const { fields: connectorFields = null, key, name, ...rest } = data; + const { + fields: connectorFields = null, + key, + name, + customFields: templateCustomFields, + ...rest + } = data; const serializedConnectorFields = getConnectorsFormSerializer({ fields: connectorFields }); const nonEmptyFields = removeEmptyFields({ ...rest }); const { connectorId, - customFields: templateCustomFields, syncAlerts = false, templateTags, templateDescription, diff --git a/x-pack/plugins/cases/server/client/configure/client.test.ts b/x-pack/plugins/cases/server/client/configure/client.test.ts index 8b312d2d957a29..aab8937591f9ea 100644 --- a/x-pack/plugins/cases/server/client/configure/client.test.ts +++ b/x-pack/plugins/cases/server/client/configure/client.test.ts @@ -556,16 +556,32 @@ describe('client', () => { }); describe('customFields', () => { - it('throws when there are no customFields in configure and template has customField in the request', async () => { + it('throws when template has duplicated custom field keys in the request', async () => { clientArgs.services.caseConfigureService.get.mockResolvedValue({ // @ts-ignore: these are all the attributes needed for the test attributes: { + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + }, + ], templates: [ { key: 'template_1', name: 'template 1', description: 'this is test description', - caseFields: null, + caseFields: { + customFields: [ + { + key: 'custom_field_key_1', + type: CustomFieldTypes.TEXT, + value: 'custom field value 1', + }, + ], + }, }, ], }, @@ -576,11 +592,19 @@ describe('client', () => { 'test-id', { version: 'test-version', + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + }, + ], templates: [ { key: 'template_1', name: 'template 1', - description: 'this is test description', + description: 'test', caseFields: { customFields: [ { @@ -588,6 +612,11 @@ describe('client', () => { type: CustomFieldTypes.TEXT, value: 'custom field value 1', }, + { + key: 'custom_field_key_1', + type: CustomFieldTypes.TEXT, + value: 'custom field value 2', + }, ], }, }, @@ -597,11 +626,11 @@ describe('client', () => { casesClientInternal ) ).rejects.toThrow( - 'Failed to get patch configure in route: Error: No custom fields configured.' + `Failed to get patch configure in route: Error: Invalid duplicated templates[0]'s customFields keys in request: custom_field_key_1` ); }); - it('throws when template has duplicated custom field keys in the request', async () => { + it('throws when template has customField with invalid type in the request', async () => { clientArgs.services.caseConfigureService.get.mockResolvedValue({ // @ts-ignore: these are all the attributes needed for the test attributes: { @@ -637,22 +666,25 @@ describe('client', () => { 'test-id', { version: 'test-version', + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + }, + ], templates: [ { key: 'template_1', name: 'template 1', - description: 'test', + description: 'this is test description', caseFields: { customFields: [ { key: 'custom_field_key_1', - type: CustomFieldTypes.TEXT, - value: 'custom field value 1', - }, - { - key: 'custom_field_key_1', - type: CustomFieldTypes.TEXT, - value: 'custom field value 2', + type: CustomFieldTypes.TOGGLE, + value: true, }, ], }, @@ -663,20 +695,40 @@ describe('client', () => { casesClientInternal ) ).rejects.toThrow( - `Failed to get patch configure in route: Error: Invalid duplicated templates[0]'s customFields keys in request: custom_field_key_1` + 'Failed to get patch configure in route: Error: The following custom fields have the wrong type in the request: "text label"' ); }); - it('throws when there are invalid customField keys in the request', async () => { + it('adds new custom field to template when configuration custom fields have new custom field', async () => { clientArgs.services.caseConfigureService.get.mockResolvedValue({ // @ts-ignore: these are all the attributes needed for the test attributes: { + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + customFields: [], + templates: [], + closure_type: 'close-by-user', + owner: 'cases', + }, + id: 'test-id', + version: 'test-version', + }); + + await update( + 'test-id', + { + version: 'test-version', customFields: [ { key: 'custom_field_key_1', label: 'text label', type: CustomFieldTypes.TEXT, required: false, + defaultValue: 'custom field 1 default value 1', }, ], templates: [ @@ -684,60 +736,82 @@ describe('client', () => { key: 'template_1', name: 'template 1', description: 'this is test description', + caseFields: null, + }, + ], + }, + clientArgs, + casesClientInternal + ); + + expect(clientArgs.services.caseConfigureService.patch).toHaveBeenCalledWith({ + configurationId: 'test-id', + originalConfiguration: { + attributes: { + closure_type: 'close-by-user', + connector: { + fields: null, + id: 'none', + name: 'none', + type: '.none', + }, + customFields: [], + owner: 'cases', + templates: [], + }, + id: 'test-id', + version: 'test-version', + }, + unsecuredSavedObjectsClient: expect.anything(), + updatedAttributes: { + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + defaultValue: 'custom field 1 default value 1', + }, + ], + templates: [ + { caseFields: { customFields: [ { key: 'custom_field_key_1', type: CustomFieldTypes.TEXT, - value: 'custom field value 1', + value: 'custom field 1 default value 1', }, ], }, + description: 'this is test description', + key: 'template_1', + name: 'template 1', }, ], + updated_at: expect.anything(), + updated_by: expect.anything(), }, }); - - await expect( - update( - 'test-id', - { - version: 'test-version', - templates: [ - { - key: 'template_1', - name: 'template 1', - description: 'this is test description', - caseFields: { - customFields: [ - { - key: 'custom_field_key_2', - type: CustomFieldTypes.TEXT, - value: 'custom field value 1', - }, - ], - }, - }, - ], - }, - clientArgs, - casesClientInternal - ) - ).rejects.toThrow( - 'Failed to get patch configure in route: Error: Invalid custom field keys: custom_field_key_2' - ); }); - it('throws when template has customField with invalid type in the request', async () => { + it('updates default value of existing custom fields in the configuration correctly', async () => { clientArgs.services.caseConfigureService.get.mockResolvedValue({ // @ts-ignore: these are all the attributes needed for the test attributes: { + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, customFields: [ { key: 'custom_field_key_1', label: 'text label', type: CustomFieldTypes.TEXT, required: false, + defaultValue: 'custom field 1 default value 1', }, ], templates: [ @@ -750,20 +824,74 @@ describe('client', () => { { key: 'custom_field_key_1', type: CustomFieldTypes.TEXT, - value: 'custom field value 1', + value: 'custom field 1 default value 1', }, ], }, }, ], + closure_type: 'close-by-user', + owner: 'cases', }, + id: 'test-id', + version: 'test-version', }); - await expect( - update( - 'test-id', - { - version: 'test-version', + await update( + 'test-id', + { + version: 'test-version', + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + defaultValue: 'updated default value!!', + }, + ], + templates: [ + { + key: 'template_1', + name: 'template 1', + description: 'this is test description', + caseFields: { + customFields: [ + { + key: 'custom_field_key_1', + type: CustomFieldTypes.TEXT, + value: 'custom field 1 default value 1', + }, + ], + }, + }, + ], + }, + clientArgs, + casesClientInternal + ); + + expect(clientArgs.services.caseConfigureService.patch).toHaveBeenCalledWith({ + configurationId: 'test-id', + originalConfiguration: { + attributes: { + closure_type: 'close-by-user', + connector: { + fields: null, + id: 'none', + name: 'none', + type: '.none', + }, + owner: 'cases', + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + defaultValue: 'custom field 1 default value 1', + }, + ], templates: [ { key: 'template_1', @@ -773,20 +901,130 @@ describe('client', () => { customFields: [ { key: 'custom_field_key_1', - type: CustomFieldTypes.TOGGLE, - value: true, + type: CustomFieldTypes.TEXT, + value: 'custom field 1 default value 1', }, ], }, }, ], }, - clientArgs, - casesClientInternal - ) - ).rejects.toThrow( - 'Failed to get patch configure in route: Error: The following custom fields have the wrong type in the request: "text label"' + id: 'test-id', + version: 'test-version', + }, + unsecuredSavedObjectsClient: expect.anything(), + updatedAttributes: { + customFields: [ + { + key: 'custom_field_key_1', + label: 'text label', + type: CustomFieldTypes.TEXT, + required: false, + defaultValue: 'updated default value!!', + }, + ], + templates: [ + { + caseFields: { + customFields: [ + { + key: 'custom_field_key_1', + type: CustomFieldTypes.TEXT, + value: 'custom field 1 default value 1', + }, + ], + }, + description: 'this is test description', + key: 'template_1', + name: 'template 1', + }, + ], + updated_at: expect.anything(), + updated_by: expect.anything(), + }, + }); + }); + + it('removes custom field from template when there are no customFields in the request', async () => { + clientArgs.services.caseConfigureService.get.mockResolvedValue({ + // @ts-ignore: these are all the attributes needed for the test + attributes: { + connector: { + id: 'none', + name: 'none', + type: ConnectorTypes.none, + fields: null, + }, + customFields: [], + templates: [], + closure_type: 'close-by-user', + owner: 'cases', + }, + id: 'test-id', + version: 'test-version', + }); + + await update( + 'test-id', + { + version: 'test-version', + customFields: [], + templates: [ + { + key: 'template_1', + name: 'template 1', + description: 'this is test description', + caseFields: { + customFields: [ + { + key: 'custom_field_key_1', + type: CustomFieldTypes.TEXT, + value: 'custom field value 1', + }, + ], + }, + }, + ], + }, + clientArgs, + casesClientInternal ); + + expect(clientArgs.services.caseConfigureService.patch).toHaveBeenCalledWith({ + configurationId: 'test-id', + originalConfiguration: { + attributes: { + closure_type: 'close-by-user', + connector: { + fields: null, + id: 'none', + name: 'none', + type: '.none', + }, + customFields: [], + owner: 'cases', + templates: [], + }, + id: 'test-id', + version: 'test-version', + }, + unsecuredSavedObjectsClient: expect.anything(), + updatedAttributes: { + customFields: [], + templates: [ + { + key: 'template_1', + name: 'template 1', + description: 'this is test description', + caseFields: { + customFields: [], + }, + }, + ], + updated_at: expect.anything(), + updated_by: expect.anything(), + }, + }); }); it('removes deleted custom field from template correctly', async () => { @@ -1166,7 +1404,7 @@ describe('client', () => { ).resolves.not.toThrow(); }); - it('throws when there are no customFields in configure and template has customField in the request', async () => { + it('throws error when there are no customFields but template has custom fields in the request', async () => { await expect( create( { @@ -1241,7 +1479,7 @@ describe('client', () => { ); }); - it('throws when there are invalid customField keys in the request', async () => { + it('throw error when there are new customFields in the request but template does not have custom fields', async () => { await expect( create( { @@ -1259,15 +1497,7 @@ describe('client', () => { key: 'template_1', name: 'template 1', description: 'this is test description', - caseFields: { - customFields: [ - { - key: 'custom_field_key_2', - type: CustomFieldTypes.TEXT, - value: 'custom field value 1', - }, - ], - }, + caseFields: null, }, ], }, @@ -1275,7 +1505,7 @@ describe('client', () => { casesClientInternal ) ).rejects.toThrow( - 'Failed to create case configuration: Error: Invalid custom field keys: custom_field_key_2' + 'Failed to create case configuration: Error: No custom fields added to template.' ); }); diff --git a/x-pack/plugins/cases/server/client/configure/client.ts b/x-pack/plugins/cases/server/client/configure/client.ts index 68db617af8bc2f..00810cb7423238 100644 --- a/x-pack/plugins/cases/server/client/configure/client.ts +++ b/x-pack/plugins/cases/server/client/configure/client.ts @@ -44,7 +44,7 @@ import type { CasesClientArgs } from '../types'; import { getMappings } from './get_mappings'; import { Operations } from '../../authorization'; -import { combineAuthorizedAndOwnerFilter, removeCustomFieldFromTemplates } from '../utils'; +import { combineAuthorizedAndOwnerFilter, transformTemplateCustomFields } from '../utils'; import type { MappingsArgs, CreateMappingsArgs, UpdateMappingsArgs } from './types'; import { createMappings } from './create_mappings'; import { updateMappings } from './update_mappings'; @@ -320,14 +320,14 @@ export async function update( originalCustomFields: configuration.attributes.customFields, }); - await validateTemplates({ + const updatedTemplates = transformTemplateCustomFields({ templates, - clientArgs, - customFields: configuration.attributes.customFields, + customFields: request.customFields, }); - const updatedTemplates = removeCustomFieldFromTemplates({ - templates, + await validateTemplates({ + templates: updatedTemplates, + clientArgs, customFields: request.customFields, }); diff --git a/x-pack/plugins/cases/server/client/configure/validators.test.ts b/x-pack/plugins/cases/server/client/configure/validators.test.ts index ca81926519d374..63dc5b9dd8457e 100644 --- a/x-pack/plugins/cases/server/client/configure/validators.test.ts +++ b/x-pack/plugins/cases/server/client/configure/validators.test.ts @@ -198,6 +198,35 @@ describe('validators', () => { ).toThrowErrorMatchingInlineSnapshot(`"No custom fields configured."`); }); + it('throws if configuration has custom fields and template has no custom fields', () => { + expect(() => + validateTemplatesCustomFieldsInRequest({ + templates: [ + { + key: 'template_key_1', + name: 'first template', + description: 'this is a first template value', + caseFields: null, + }, + ], + customFieldsConfiguration: [ + { + key: 'first_key', + type: CustomFieldTypes.TEXT, + label: 'foo', + required: false, + }, + { + key: 'second_key', + type: CustomFieldTypes.TOGGLE, + label: 'foo', + required: false, + }, + ], + }) + ).toThrowErrorMatchingInlineSnapshot(`"No custom fields added to template."`); + }); + it('throws for a single invalid type', () => { expect(() => validateTemplatesCustomFieldsInRequest({ diff --git a/x-pack/plugins/cases/server/client/configure/validators.ts b/x-pack/plugins/cases/server/client/configure/validators.ts index 1dec647561ab8e..4075f2edeeb27b 100644 --- a/x-pack/plugins/cases/server/client/configure/validators.ts +++ b/x-pack/plugins/cases/server/client/configure/validators.ts @@ -60,20 +60,21 @@ export const validateTemplatesCustomFieldsInRequest = ({ } templates.forEach((template, index) => { - if ( - !template.caseFields || - !template.caseFields.customFields || - !template.caseFields.customFields.length - ) { - return; + if (customFieldsConfiguration === undefined && template.caseFields?.customFields?.length) { + throw Boom.badRequest('No custom fields configured.'); } - if (customFieldsConfiguration === undefined) { - throw Boom.badRequest('No custom fields configured.'); + if ( + (!template.caseFields || + !template.caseFields.customFields || + !template.caseFields.customFields.length) && + customFieldsConfiguration?.length + ) { + throw Boom.badRequest('No custom fields added to template.'); } const params = { - requestCustomFields: template.caseFields.customFields, + requestCustomFields: template?.caseFields?.customFields, customFieldsConfiguration, }; diff --git a/x-pack/plugins/cases/server/client/utils.test.ts b/x-pack/plugins/cases/server/client/utils.test.ts index 56615189d1d5e8..eb7aaea6d6938a 100644 --- a/x-pack/plugins/cases/server/client/utils.test.ts +++ b/x-pack/plugins/cases/server/client/utils.test.ts @@ -19,7 +19,7 @@ import { constructQueryOptions, constructSearch, convertSortField, - removeCustomFieldFromTemplates, + transformTemplateCustomFields, } from './utils'; import { CasePersistedSeverity, CasePersistedStatus } from '../common/types/case'; import type { CustomFieldsConfiguration } from '../../common/types/domain'; @@ -1132,7 +1132,7 @@ describe('utils', () => { }); }); - describe('removeCustomFieldFromTemplates', () => { + describe('transformTemplateCustomFields', () => { const customFields = [ { type: CustomFieldTypes.TEXT as const, @@ -1204,7 +1204,7 @@ describe('utils', () => { ]; it('removes custom field from template correctly', () => { - const res = removeCustomFieldFromTemplates({ + const res = transformTemplateCustomFields({ templates, customFields: [customFields[0], customFields[1]], }); @@ -1253,7 +1253,7 @@ describe('utils', () => { }); it('removes multiple custom fields from template correctly', () => { - const res = removeCustomFieldFromTemplates({ + const res = transformTemplateCustomFields({ templates, customFields: [customFields[0]], }); @@ -1292,7 +1292,7 @@ describe('utils', () => { }); it('removes all custom fields from templates when custom fields are empty', () => { - const res = removeCustomFieldFromTemplates({ + const res = transformTemplateCustomFields({ templates, customFields: [], }); @@ -1319,7 +1319,7 @@ describe('utils', () => { }); it('removes all custom fields from templates when custom fields are undefined', () => { - const res = removeCustomFieldFromTemplates({ + const res = transformTemplateCustomFields({ templates, customFields: undefined, }); @@ -1330,8 +1330,8 @@ describe('utils', () => { ]); }); - it('does not remove custom field when templates do not have custom fields', () => { - const res = removeCustomFieldFromTemplates({ + it('adds custom fields to templates when templates do not have custom fields', () => { + const res = transformTemplateCustomFields({ templates: [ { key: 'test_template_1', @@ -1353,7 +1353,20 @@ describe('utils', () => { expect(res).toEqual([ { - caseFields: null, + caseFields: { + customFields: [ + { + key: customFields[0].key, + type: customFields[0].type, + value: customFields[0].defaultValue, + }, + { + key: customFields[1].key, + type: customFields[1].type, + value: customFields[1].defaultValue, + }, + ], + }, description: 'This is a first test template', key: 'test_template_1', name: 'First test template', @@ -1364,13 +1377,25 @@ describe('utils', () => { caseFields: { description: 'this is test', title: 'Test title', + customFields: [ + { + key: customFields[0].key, + type: customFields[0].type, + value: customFields[0].defaultValue, + }, + { + key: customFields[1].key, + type: customFields[1].type, + value: customFields[1].defaultValue, + }, + ], }, }, ]); }); - it('does not remove custom field when templates have empty custom fields', () => { - const res = removeCustomFieldFromTemplates({ + it('adds custom fields to templates when template custom fields are empty', () => { + const res = transformTemplateCustomFields({ templates: [ { key: 'test_template_2', @@ -1382,7 +1407,7 @@ describe('utils', () => { }, }, ], - customFields: [customFields[0], customFields[1]], + customFields: [customFields[0], customFields[1], customFields[2]], }); expect(res).toEqual([ @@ -1392,14 +1417,149 @@ describe('utils', () => { caseFields: { title: 'Test title', description: 'this is test', - customFields: [], + customFields: [ + { + key: customFields[0].key, + type: customFields[0].type, + value: customFields[0].defaultValue, + }, + { + key: customFields[1].key, + type: customFields[1].type, + value: customFields[1].defaultValue, + }, + { + key: customFields[2].key, + type: customFields[2].type, + value: null, + }, + ], + }, + }, + ]); + }); + + it('adds custom fields to templates with correct values', () => { + const res = transformTemplateCustomFields({ + templates: [ + { + key: 'test_template_2', + name: 'Second test template', + caseFields: { + title: 'Test title', + description: 'this is test', + customFields: [], + }, + }, + ], + customFields: [ + ...customFields, + { + type: CustomFieldTypes.TOGGLE as const, + key: 'test_key_4', + label: 'My test label 4', + required: true, + }, + ], + }); + + expect(res).toEqual([ + { + key: 'test_template_2', + name: 'Second test template', + caseFields: { + title: 'Test title', + description: 'this is test', + customFields: [ + { + key: customFields[0].key, + type: customFields[0].type, + value: customFields[0].defaultValue, + }, + { + key: customFields[1].key, + type: customFields[1].type, + value: customFields[1].defaultValue, + }, + { + key: customFields[2].key, + type: customFields[2].type, + value: null, + }, + { + type: CustomFieldTypes.TOGGLE as const, + key: 'test_key_4', + value: false, + }, + ], + }, + }, + ]); + }); + + it('does not change the existing template custom field', () => { + const res = transformTemplateCustomFields({ + templates: [ + { + key: 'test_template_2', + name: 'Second test template', + caseFields: { + title: 'Test title', + description: 'this is test', + customFields: [ + { + key: customFields[0].key, + type: CustomFieldTypes.TEXT as const, + value: 'updated text value', + }, + { + key: customFields[1].key, + type: CustomFieldTypes.TOGGLE as const, + value: false, + }, + { + key: customFields[2].key, + type: customFields[2].type, + value: null, + }, + ], + }, + }, + ], + customFields, + }); + + expect(res).toEqual([ + { + key: 'test_template_2', + name: 'Second test template', + caseFields: { + title: 'Test title', + description: 'this is test', + customFields: [ + { + key: customFields[0].key, + type: customFields[0].type, + value: 'updated text value', + }, + { + key: customFields[1].key, + type: customFields[1].type, + value: false, + }, + { + key: customFields[2].key, + type: customFields[2].type, + value: null, + }, + ], }, }, ]); }); it('does not remove custom field from empty templates', () => { - const res = removeCustomFieldFromTemplates({ + const res = transformTemplateCustomFields({ templates: [], customFields: [customFields[0], customFields[1]], }); @@ -1408,7 +1568,7 @@ describe('utils', () => { }); it('returns empty array when templates are undefined', () => { - const res = removeCustomFieldFromTemplates({ + const res = transformTemplateCustomFields({ templates: undefined, customFields: [customFields[0], customFields[1]], }); diff --git a/x-pack/plugins/cases/server/client/utils.ts b/x-pack/plugins/cases/server/client/utils.ts index 258761a563fd35..5f854aa3236fe4 100644 --- a/x-pack/plugins/cases/server/client/utils.ts +++ b/x-pack/plugins/cases/server/client/utils.ts @@ -17,11 +17,13 @@ import { nodeBuilder, fromKueryExpression, escapeKuery } from '@kbn/es-query'; import { spaceIdToNamespace } from '@kbn/spaces-plugin/server/lib/utils/namespace'; import type { + CaseCustomField, CaseSeverity, CaseStatuses, CustomFieldsConfiguration, ExternalReferenceAttachmentPayload, TemplatesConfiguration, + CustomFieldTypes, } from '../../common/types/domain'; import { ActionsAttachmentPayloadRt, @@ -607,9 +609,9 @@ export const constructSearch = ( }; /** - * remove deleted custom field from template + * remove deleted custom field from template or add newly added custom field to template */ -export const removeCustomFieldFromTemplates = ({ +export const transformTemplateCustomFields = ({ templates, customFields, }: { @@ -621,21 +623,40 @@ export const removeCustomFieldFromTemplates = ({ } return templates.map((template) => { - if (!template.caseFields?.customFields || !template.caseFields?.customFields.length) { - return template; - } + const templateCustomFields = template.caseFields?.customFields ?? []; - if (!customFields || !customFields?.length) { + if (!customFields || !customFields.length) { return { ...template, caseFields: { ...template.caseFields, customFields: [] } }; } - const templateCustomFields = template.caseFields.customFields.filter((templateCustomField) => + // remove deleted custom field from template + const transformedTemplateCustomFields = templateCustomFields.filter((templateCustomField) => customFields?.find((customField) => customField.key === templateCustomField.key) ); + // add new custom fields to template + if (customFields.length >= transformedTemplateCustomFields.length) { + customFields.forEach((field) => { + if ( + !transformedTemplateCustomFields.find( + (templateCustomField) => templateCustomField.key === field.key + ) + ) { + const { getDefaultValue } = casesCustomFields.get(field.type) ?? {}; + const value = getDefaultValue?.() ?? null; + + transformedTemplateCustomFields.push({ + key: field.key, + type: field.type as CustomFieldTypes, + value: field.defaultValue ?? value, + } as CaseCustomField); + } + }); + } + return { ...template, - caseFields: { ...template.caseFields, customFields: templateCustomFields }, + caseFields: { ...template.caseFields, customFields: transformedTemplateCustomFields }, }; }); }; diff --git a/x-pack/plugins/cases/server/custom_fields/toggle.ts b/x-pack/plugins/cases/server/custom_fields/toggle.ts index c250bf85ea168f..512e226badaf5a 100644 --- a/x-pack/plugins/cases/server/custom_fields/toggle.ts +++ b/x-pack/plugins/cases/server/custom_fields/toggle.ts @@ -19,4 +19,5 @@ export const getCasesToggleCustomField = () => ({ } }); }, + getDefaultValue: () => false, }); diff --git a/x-pack/plugins/cases/server/custom_fields/types.ts b/x-pack/plugins/cases/server/custom_fields/types.ts index 7a0df91682a689..0999ccb4b90c49 100644 --- a/x-pack/plugins/cases/server/custom_fields/types.ts +++ b/x-pack/plugins/cases/server/custom_fields/types.ts @@ -12,6 +12,7 @@ export interface ICasesCustomField { isSortable: boolean; savedObjectMappingType: string; validateFilteringValues: (values: Array) => void; + getDefaultValue?: () => boolean | string | null; } export interface CasesCustomFieldsMap { diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx b/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx index d3a41322452f30..2dc4eb566210a7 100755 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/README.mdx @@ -9,6 +9,9 @@ tags: ['kibana', 'dev', 'contributor', 'api docs', 'cloud', 'a/b testing', 'expe # Kibana Cloud Experiments Service +> [!WARNING] +> These APIs are deprecated and should not be used as we're working on a replacement Core Feature Flags Service that will arrive _soon_. + The Cloud Experiments Service provides the necessary APIs to implement A/B testing scenarios, fetching the variations in configuration and reporting back metrics to track conversion rates of the experiments. The `cloudExperiments` plugin is disabled by default and only enabled on Elastic Cloud deployments. diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts b/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts index 4c43def8dab792..e7b87eee12fc97 100755 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/common/types.ts @@ -19,6 +19,7 @@ export type CloudExperimentsFeatureFlagNames = keyof typeof FEATURE_FLAG_NAMES; * The contract of the start lifecycle method * * @public + * @deprecated in favor of the upcoming Core Feature Flags Service. */ export interface CloudExperimentsPluginStart { /** @@ -27,6 +28,7 @@ export interface CloudExperimentsPluginStart { * @param defaultValue The fallback value in case no variation is found. * * @public + * @deprecated in favor of the upcoming Core Feature Flags Service. */ getVariation: ( featureFlagName: CloudExperimentsFeatureFlagNames, @@ -37,6 +39,7 @@ export interface CloudExperimentsPluginStart { * @param metric {@link CloudExperimentsMetric} * * @public + * @deprecated in favor of the upcoming Core Feature Flags Service. */ reportMetric: (metric: CloudExperimentsMetric) => void; } diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts index 27fc64d44966f2..30cbcbce75f0a5 100644 --- a/x-pack/plugins/cloud_security_posture/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -75,6 +75,8 @@ export const DATA_VIEW_INDEX_PATTERN = 'logs-*'; export const SECURITY_DEFAULT_DATA_VIEW_ID = 'security-solution-default'; +export const ALERTS_INDEX_PATTERN = '.alerts-security.alerts-*'; + export const CSP_INGEST_TIMESTAMP_PIPELINE = 'cloud_security_posture_add_ingest_timestamp_pipeline'; export const CSP_LATEST_FINDINGS_INGEST_TIMESTAMP_PIPELINE = 'cloud_security_posture_latest_index_add_ingest_timestamp_pipeline'; diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx index b31f00c21c8670..2b060778933d31 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useEffect, useRef } from 'react'; +import React, { Suspense, useEffect, useRef } from 'react'; import semverLt from 'semver/functions/lt'; import semverCoerce from 'semver/functions/coerce'; import semverValid from 'semver/functions/valid'; @@ -15,13 +15,13 @@ import { EuiForm, EuiFormRow, EuiHorizontalRule, + EuiLoadingSpinner, EuiSelect, EuiSpacer, EuiText, - EuiTextArea, EuiTitle, } from '@elastic/eui'; -import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; +import { LazyPackagePolicyInputVarField, type NewPackagePolicy } from '@kbn/fleet-plugin/public'; import { NewPackagePolicyInput, PackageInfo } from '@kbn/fleet-plugin/common'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; @@ -30,6 +30,7 @@ import { GcpCredentialsType } from '../../../../common/types_old'; import { CLOUDBEAT_GCP } from '../../../../common/constants'; import { CspRadioOption, RadioGroup } from '../csp_boxed_radio_group'; import { + findVariableDef, getCspmCloudShellDefaultValue, getPosturePolicy, NewPackagePolicyPostureInput, @@ -193,7 +194,10 @@ const credentialOptionsList = [ }, ]; -type GcpFields = Record; +type GcpFields = Record< + string, + { label: string; type?: 'password' | 'text'; value?: string; isSecret?: boolean } +>; interface GcpInputFields { fields: GcpFields; } @@ -222,7 +226,8 @@ export const gcpField: GcpInputFields = { label: i18n.translate('xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText', { defaultMessage: 'JSON blob containing the credentials and key used to subscribe', }), - type: 'text', + type: 'password', + isSecret: true, }, 'gcp.credentials.type': { label: i18n.translate( @@ -263,6 +268,7 @@ export interface GcpFormProps { setIsValid: (isValid: boolean) => void; onChange: any; disabled: boolean; + isEditPage?: boolean; } export const getInputVarsFields = (input: NewPackagePolicyInput, fields: GcpFields) => @@ -367,6 +373,7 @@ export const GcpCredentialsForm = ({ setIsValid, onChange, disabled, + isEditPage, }: GcpFormProps) => { /* Create a subset of properties from GcpField to use for hiding value of credentials json and credentials file when user switch from Manual to Cloud Shell, we wanna keep Project and Organization ID */ const subsetOfGcpField = (({ ['gcp.credentials.file']: a, ['gcp.credentials.json']: b }) => ({ @@ -489,6 +496,8 @@ export const GcpCredentialsForm = ({ updatePolicy(getPosturePolicy(newPolicy, input.type, { [key]: { value } })) } isOrganization={isOrganization} + packageInfo={packageInfo} + isEditPage={isEditPage} /> )} @@ -504,11 +513,15 @@ export const GcpInputVarFields = ({ onChange, isOrganization, disabled, + packageInfo, + isEditPage, }: { fields: Array; onChange: (key: string, value: string) => void; isOrganization: boolean; disabled: boolean; + packageInfo: PackageInfo; + isEditPage?: boolean; }) => { const getFieldById = (id: keyof GcpInputFields['fields']) => { return fields.find((element) => element.id === id); @@ -581,15 +594,41 @@ export const GcpInputVarFields = ({ )} {credentialsTypeValue === credentialJSONValue && credentialJSONFields && ( - - onChange(credentialJSONFields.id, event.target.value)} - /> - +
+ + + }> + { + onChange(credentialJSONFields.id, value); + }} + errors={[]} + forceShowErrors={false} + isEditPage={isEditPage} + /> + + +
)}
diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx index ca25f3ea1469e3..d246ea82689bb3 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx @@ -33,8 +33,8 @@ export const GcpCredentialsFormAgentless = ({ input, newPolicy, updatePolicy, - packageInfo, disabled, + packageInfo, }: GcpFormProps) => { const accountType = input.streams?.[0]?.vars?.['gcp.account_type']?.value; const isOrganization = accountType === ORGANIZATION_ACCOUNT; @@ -102,6 +102,7 @@ export const GcpCredentialsFormAgentless = ({ updatePolicy(getPosturePolicy(newPolicy, input.type, { [key]: { value } })) } isOrganization={isOrganization} + packageInfo={packageInfo} /> diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx index f3aafc11c9334a..84abf584b50803 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx @@ -1226,48 +1226,6 @@ describe('', () => { }); }); - it(`renders ${CLOUDBEAT_GCP} Credentials JSON fields`, () => { - let policy = getMockPolicyGCP(); - policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { - setup_access: { value: 'manual' }, - 'gcp.credentials.type': { value: 'credentials-json' }, - }); - - const { getByRole, getByLabelText } = render( - - ); - - expect(getByRole('option', { name: 'Credentials JSON', selected: true })).toBeInTheDocument(); - - expect( - getByLabelText('JSON blob containing the credentials and key used to subscribe') - ).toBeInTheDocument(); - }); - - it(`updates ${CLOUDBEAT_GCP} Credentials JSON fields`, () => { - let policy = getMockPolicyGCP(); - policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { - 'gcp.project_id': { value: 'a' }, - 'gcp.credentials.type': { value: 'credentials-json' }, - setup_access: { value: 'manual' }, - }); - - const { getByTestId } = render( - - ); - - userEvent.type(getByTestId(CIS_GCP_INPUT_FIELDS_TEST_SUBJECTS.CREDENTIALS_JSON), 'b'); - - policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { - 'gcp.credentials.json': { value: 'b' }, - }); - - expect(onChange).toHaveBeenCalledWith({ - isValid: true, - updatedPolicy: policy, - }); - }); - it(`${CLOUDBEAT_GCP} form do not displays upgrade message for supported versions and gcp organization option is enabled`, () => { let policy = getMockPolicyGCP(); policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { @@ -1541,7 +1499,7 @@ describe('', () => { }); }); - it('should render setup technology selector for GCP for organisation account type', async () => { + it.skip('should render setup technology selector for GCP for organisation account type', async () => { const newPackagePolicy = getMockPolicyGCP(); const { getByTestId, queryByTestId, getByRole } = render( @@ -1593,7 +1551,7 @@ describe('', () => { }); }); - it('should render setup technology selector for GCP for single-account', async () => { + it.skip('should render setup technology selector for GCP for single-account', async () => { const newPackagePolicy = getMockPolicyGCP({ 'gcp.account_type': { value: GCP_SINGLE_ACCOUNT, type: 'text' }, }); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx index a5096e5d29ef72..0bd4c57129cc42 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx @@ -408,7 +408,7 @@ const GcpAccountTypeSelect = ({ @@ -779,6 +779,7 @@ export const CspPolicyTemplateForm = memo diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx index fd816d03fb507d..ee76d40e1dcac0 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx @@ -79,6 +79,7 @@ interface PolicyTemplateVarsFormProps { setIsValid: (isValid: boolean) => void; disabled: boolean; setupTechnology: SetupTechnology; + isEditPage?: boolean; } export const PolicyTemplateVarsForm = ({ diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx b/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx index e2d453c0781157..a2b1aa1d0d8315 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx @@ -74,8 +74,11 @@ const CnvmIntegrationNotInstalledEmptyPrompt = ({

, + }} />

} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx index 5aa8aae1dc590a..83745e5f5d1139 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx @@ -333,8 +333,13 @@ const CurrentPageOfTotal = ({ diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts index a89c37d4397163..31b80b880bcc96 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts @@ -44,6 +44,9 @@ export const defineBulkActionCspBenchmarkRulesRoute = (router: CspRouter) => .post({ access: 'internal', path: CSP_BENCHMARK_RULES_BULK_ACTION_ROUTE_PATH, + options: { + tags: ['access:cloud-security-posture-read'], + }, }) .addVersion( { diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts index 8dc8f36554600f..c1b481b01f2cdb 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/find.ts @@ -29,6 +29,9 @@ export const defineFindCspBenchmarkRuleRoute = (router: CspRouter) => .get({ access: 'internal', path: FIND_CSP_BENCHMARK_RULE_ROUTE_PATH, + options: { + tags: ['access:cloud-security-posture-read'], + }, }) .addVersion( { diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts index e7c28d345c52d1..a55bcd92ab3c81 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts @@ -16,6 +16,9 @@ export const defineGetCspBenchmarkRulesStatesRoute = (router: CspRouter) => .get({ access: 'internal', path: CSP_GET_BENCHMARK_RULES_STATE_ROUTE_PATH, + options: { + tags: ['access:cloud-security-posture-read'], + }, }) .addVersion( { diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts index 4c9294248e1e76..851fa865566f79 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/compliance_dashboard.ts @@ -65,6 +65,9 @@ export const defineGetComplianceDashboardRoute = (router: CspRouter) => .get({ access: 'internal', path: STATS_ROUTE_PATH, + options: { + tags: ['access:cloud-security-posture-read'], + }, }) .addVersion( { diff --git a/x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts b/x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts index d4645631550231..026cf68819ab2b 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts @@ -57,6 +57,9 @@ export const defineGetDetectionEngineAlertsStatus = (router: CspRouter) => .get({ access: 'internal', path: GET_DETECTION_RULE_ALERTS_STATUS_PATH, + options: { + tags: ['access:cloud-security-posture-read'], + }, }) .addVersion( { diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.test.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.test.ts new file mode 100644 index 00000000000000..42eb8c81c42059 --- /dev/null +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.test.ts @@ -0,0 +1,198 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { streamGraph } from './helpers'; +import agent from 'elastic-apm-node'; +import { KibanaRequest } from '@kbn/core-http-server'; +import { ExecuteConnectorRequestBody } from '@kbn/elastic-assistant-common'; +import { PassThrough } from 'stream'; +import { loggerMock } from '@kbn/logging-mocks'; +import { AGENT_NODE_TAG } from './nodes/run_agent'; +import { waitFor } from '@testing-library/react'; +import { APMTracer } from '@kbn/langchain/server/tracers/apm'; +import { DefaultAssistantGraph } from './graph'; + +jest.mock('elastic-apm-node'); + +jest.mock('@kbn/securitysolution-es-utils'); +const mockStream = new PassThrough(); +const mockPush = jest.fn(); +const mockResponseWithHeaders = { + body: mockStream, + headers: { + 'X-Accel-Buffering': 'no', + 'X-Content-Type-Options': 'nosniff', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + 'Transfer-Encoding': 'chunked', + }, +}; +jest.mock('@kbn/ml-response-stream/server', () => ({ + streamFactory: jest.fn().mockImplementation(() => ({ + DELIMITER: '\n', + end: jest.fn(), + push: mockPush, + responseWithHeaders: mockResponseWithHeaders, + })), +})); + +describe('streamGraph', () => { + const mockRequest = {} as KibanaRequest; + const mockLogger = loggerMock.create(); + const mockApmTracer = {} as APMTracer; + const mockStreamEvents = jest.fn(); + const mockAssistantGraph = { + streamEvents: mockStreamEvents, + } as unknown as DefaultAssistantGraph; + const mockOnLlmResponse = jest.fn().mockResolvedValue(null); + + beforeEach(() => { + jest.clearAllMocks(); + (agent.isStarted as jest.Mock).mockReturnValue(true); + (agent.startSpan as jest.Mock).mockReturnValue({ + end: jest.fn(), + ids: { 'trace.id': 'traceId' }, + transaction: { ids: { 'transaction.id': 'transactionId' } }, + }); + }); + describe('ActionsClientChatOpenAI', () => { + it('should execute the graph in streaming mode', async () => { + mockStreamEvents.mockReturnValue({ + next: jest + .fn() + .mockResolvedValueOnce({ + value: { + name: 'ActionsClientChatOpenAI', + event: 'on_llm_stream', + data: { chunk: { message: { content: 'content' } } }, + tags: [AGENT_NODE_TAG], + }, + done: false, + }) + .mockResolvedValueOnce({ + value: { + name: 'ActionsClientChatOpenAI', + event: 'on_llm_end', + data: { + output: { + generations: [ + [{ generationInfo: { finish_reason: 'stop' }, text: 'final message' }], + ], + }, + }, + tags: [AGENT_NODE_TAG], + }, + }) + .mockResolvedValue({ + done: true, + }), + return: jest.fn(), + }); + + const response = await streamGraph({ + apmTracer: mockApmTracer, + assistantGraph: mockAssistantGraph, + inputs: { input: 'input' }, + logger: mockLogger, + onLlmResponse: mockOnLlmResponse, + request: mockRequest, + }); + + expect(response).toBe(mockResponseWithHeaders); + expect(mockPush).toHaveBeenCalledWith({ payload: 'content', type: 'content' }); + await waitFor(() => { + expect(mockOnLlmResponse).toHaveBeenCalledWith( + 'final message', + { transactionId: 'transactionId', traceId: 'traceId' }, + false + ); + }); + }); + }); + + describe('ActionsClientSimpleChatModel', () => { + it('should execute the graph in streaming mode', async () => { + mockStreamEvents.mockReturnValue({ + next: jest + .fn() + .mockResolvedValueOnce({ + value: { + name: 'ActionsClientSimpleChatModel', + event: 'on_llm_stream', + data: { + chunk: { + content: + '```json\n\n "action": "Final Answer",\n "action_input": "Look at these', + }, + }, + tags: [AGENT_NODE_TAG], + }, + done: false, + }) + .mockResolvedValueOnce({ + value: { + name: 'ActionsClientSimpleChatModel', + event: 'on_llm_stream', + data: { + chunk: { + content: ' rare IP', + }, + }, + tags: [AGENT_NODE_TAG], + }, + done: false, + }) + .mockResolvedValueOnce({ + value: { + name: 'ActionsClientSimpleChatModel', + event: 'on_llm_stream', + data: { + chunk: { + content: ' addresses." }```', + }, + }, + tags: [AGENT_NODE_TAG], + }, + done: false, + }) + .mockResolvedValueOnce({ + value: { + name: 'ActionsClientSimpleChatModel', + event: 'on_llm_end', + tags: [AGENT_NODE_TAG], + }, + }) + .mockResolvedValue({ + done: true, + }), + return: jest.fn(), + }); + + const response = await streamGraph({ + apmTracer: mockApmTracer, + assistantGraph: mockAssistantGraph, + inputs: { input: 'input' }, + logger: mockLogger, + onLlmResponse: mockOnLlmResponse, + request: mockRequest, + }); + + expect(response).toBe(mockResponseWithHeaders); + + await waitFor(() => { + expect(mockPush).toHaveBeenCalledWith({ type: 'content', payload: 'Look at these' }); + expect(mockPush).toHaveBeenCalledWith({ type: 'content', payload: ' rare IP' }); + expect(mockPush).toHaveBeenCalledWith({ type: 'content', payload: ' addresses.' }); + expect(mockOnLlmResponse).toHaveBeenCalledWith( + 'Look at these rare IP addresses.', + { transactionId: 'transactionId', traceId: 'traceId' }, + false + ); + }); + }); + }); +}); diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.ts index fe46a5deae9fe1..882726a85ef212 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/helpers.ts @@ -77,7 +77,6 @@ export const streamGraph = async ({ streamingSpan?.end(); }; - let finalMessage = ''; const stream = assistantGraph.streamEvents(inputs, { callbacks: [apmTracer, ...(traceOptions?.tracers ?? [])], runName: DEFAULT_ASSISTANT_GRAPH_ID, @@ -85,7 +84,14 @@ export const streamGraph = async ({ tags: traceOptions?.tags ?? [], version: 'v1', }); + let finalMessage = ''; + let currentOutput = ''; + let finalOutputIndex = -1; + const finalOutputStartToken = '"action":"FinalAnswer","action_input":"'; + let streamingFinished = false; + const finalOutputStopRegex = /(? { try { const { value, done } = await stream.next(); @@ -94,27 +100,57 @@ export const streamGraph = async ({ const event = value; // only process events that are part of the agent run if ((event.tags || []).includes(AGENT_NODE_TAG)) { - if (event.event === 'on_llm_stream') { - const chunk = event.data?.chunk; - // TODO: For Bedrock streaming support, override `handleLLMNewToken` in callbacks, - // TODO: or maybe we can update ActionsClientSimpleChatModel to handle this `on_llm_stream` event - if (event.name === 'ActionsClientChatOpenAI') { + if (event.name === 'ActionsClientChatOpenAI') { + if (event.event === 'on_llm_stream') { + const chunk = event.data?.chunk; const msg = chunk.message; - - if (msg.tool_call_chunks && msg.tool_call_chunks.length > 0) { + if (msg?.tool_call_chunks && msg?.tool_call_chunks.length > 0) { + // I don't think we hit this anymore because of our check for AGENT_NODE_TAG + // however, no harm to keep it in /* empty */ } else if (!didEnd) { - if (msg.response_metadata.finish_reason === 'stop') { - handleStreamEnd(finalMessage); + push({ payload: msg.content, type: 'content' }); + finalMessage += msg.content; + } + } else if (event.event === 'on_llm_end' && !didEnd) { + const generations = event.data.output?.generations[0]; + if (generations && generations[0]?.generationInfo.finish_reason === 'stop') { + handleStreamEnd(generations[0]?.text ?? finalMessage); + } + } + } + if (event.name === 'ActionsClientSimpleChatModel') { + if (event.event === 'on_llm_stream') { + const chunk = event.data?.chunk; + + const msg = chunk.content; + if (finalOutputIndex === -1) { + currentOutput += msg; + // Remove whitespace to simplify parsing + const noWhitespaceOutput = currentOutput.replace(/\s/g, ''); + if (noWhitespaceOutput.includes(finalOutputStartToken)) { + const nonStrippedToken = '"action_input": "'; + finalOutputIndex = currentOutput.indexOf(nonStrippedToken); + const contentStartIndex = finalOutputIndex + nonStrippedToken.length; + extraOutput = currentOutput.substring(contentStartIndex); + push({ payload: extraOutput, type: 'content' }); + finalMessage += extraOutput; + } + } else if (!streamingFinished && !didEnd) { + const finalOutputEndIndex = msg.search(finalOutputStopRegex); + if (finalOutputEndIndex !== -1) { + extraOutput = msg.substring(0, finalOutputEndIndex); + streamingFinished = true; + if (extraOutput.length > 0) { + push({ payload: extraOutput, type: 'content' }); + finalMessage += extraOutput; + } } else { - push({ payload: msg.content, type: 'content' }); - finalMessage += msg.content; + push({ payload: chunk.content, type: 'content' }); + finalMessage += chunk.content; } } - } - } else if (event.event === 'on_llm_end') { - const generations = event.data.output?.generations[0]; - if (generations && generations[0]?.generationInfo.finish_reason === 'stop') { + } else if (event.event === 'on_llm_end' && streamingFinished && !didEnd) { handleStreamEnd(finalMessage); } } diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/persist_conversation_changes.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/persist_conversation_changes.ts index a86897e67adbf2..615c4b2449c4cf 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/persist_conversation_changes.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/graphs/default_assistant_graph/nodes/persist_conversation_changes.ts @@ -49,6 +49,19 @@ export const persistConversationChanges = async ({ }); } + const lastMessage = state.conversation.messages + ? state.conversation.messages[state.conversation.messages.length - 1] + : undefined; + if (lastMessage && lastMessage.content === state.input && lastMessage.role === 'user') { + // this is a regenerated message, do not update the conversation again + const langChainMessages = getLangChainMessages(state.conversation.messages ?? []); + const messages = langChainMessages.slice(0, -1); // all but the last message + return { + conversation: state.conversation, + messages, + }; + } + const updatedConversation = await conversationsDataClient?.appendConversationMessages({ existingConversation: conversation ? conversation : state.conversation, messages: [ 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 7d8a78f7387ec2..83eba779e23527 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 @@ -22,13 +22,14 @@ 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' + - 'Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input).\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": $INPUT\n\n' + + ' "action_input": $TOOL_INPUT\n\n' + '}}\n\n' + '```\n\n' + 'Follow this format:\n\n' + @@ -45,13 +46,14 @@ export const structuredChatAgentPrompt = ChatPromptTemplate.fromMessages([ '```\n\n' + '{{\n\n' + ' "action": "Final Answer",\n\n' + - ' "action_input": "Final response to human"\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. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation', + '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', - 'Use the below context as a sample of information about the user from their knowledge base:\n\n```\n{knowledge_history}\n```\n\n{input}\n\n{agent_scratchpad}\n(reminder to respond in a JSON blob no matter what)', + 'Use the below context as a sample of information about the user from their knowledge base:\n\n```\n{knowledge_history}\n```\n\n{input}\n\n{agent_scratchpad}\n(reminder to respond in a JSON blob with no additional output no matter what)', ], ]); diff --git a/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/bulk_actions_route.ts b/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/bulk_actions_route.ts index 47213cb0d278eb..94788d2d1d9260 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/bulk_actions_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/bulk_actions_route.ts @@ -118,7 +118,7 @@ export const bulkActionAnonymizationFieldsRoute = ( ) => { router.versioned .post({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_BULK_ACTION, options: { tags: ['access:securitySolution-updateAIAssistantAnonymization'], @@ -129,7 +129,7 @@ export const bulkActionAnonymizationFieldsRoute = ( }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { body: buildRouteValidationWithZod(PerformBulkActionRequestBody), diff --git a/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/find_route.ts b/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/find_route.ts index c0383b1b3b38c4..904a80d6a3ea4f 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/find_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/anonymization_fields/find_route.ts @@ -30,7 +30,7 @@ export const findAnonymizationFieldsRoute = ( ) => { router.versioned .get({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_ANONYMIZATION_FIELDS_URL_FIND, options: { tags: ['access:elasticAssistant'], @@ -38,7 +38,7 @@ export const findAnonymizationFieldsRoute = ( }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { query: buildRouteValidationWithZod(FindAnonymizationFieldsRequestQuery), diff --git a/x-pack/plugins/elastic_assistant/server/routes/prompts/bulk_actions_route.ts b/x-pack/plugins/elastic_assistant/server/routes/prompts/bulk_actions_route.ts index cfcd6d8cc05d68..d90b01b78cfa70 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/prompts/bulk_actions_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/prompts/bulk_actions_route.ts @@ -112,7 +112,7 @@ const buildBulkResponse = ( export const bulkPromptsRoute = (router: ElasticAssistantPluginRouter, logger: Logger) => { router.versioned .post({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_PROMPTS_URL_BULK_ACTION, options: { tags: ['access:elasticAssistant'], @@ -123,7 +123,7 @@ export const bulkPromptsRoute = (router: ElasticAssistantPluginRouter, logger: L }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { body: buildRouteValidationWithZod(PerformBulkActionRequestBody), 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 8838db3c44943b..142b63a7d04b52 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 @@ -23,7 +23,7 @@ import { UPGRADE_LICENSE_MESSAGE, hasAIAssistantLicense } from '../helpers'; export const findPromptsRoute = (router: ElasticAssistantPluginRouter, logger: Logger) => { router.versioned .get({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_PROMPTS_URL_FIND, options: { tags: ['access:elasticAssistant'], @@ -31,7 +31,7 @@ export const findPromptsRoute = (router: ElasticAssistantPluginRouter, logger: L }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { query: buildRouteValidationWithZod(FindPromptsRequestQuery), diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts index 9c02586a60b881..f2f469da159661 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts @@ -21,7 +21,7 @@ import { performChecks } from '../helpers'; export const createConversationRoute = (router: ElasticAssistantPluginRouter): void => { router.versioned .post({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL, options: { @@ -30,7 +30,7 @@ export const createConversationRoute = (router: ElasticAssistantPluginRouter): v }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { body: buildRouteValidationWithZod(ConversationCreateProps), diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/delete_route.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/delete_route.ts index b39f898eaeaa1d..5d761c09f682c8 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/delete_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/delete_route.ts @@ -19,7 +19,7 @@ import { UPGRADE_LICENSE_MESSAGE, hasAIAssistantLicense } from '../helpers'; export const deleteConversationRoute = (router: ElasticAssistantPluginRouter) => { router.versioned .delete({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID, options: { tags: ['access:elasticAssistant'], @@ -27,7 +27,7 @@ export const deleteConversationRoute = (router: ElasticAssistantPluginRouter) => }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { params: buildRouteValidationWithZod(DeleteConversationRequestParams), diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/find_route.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/find_route.ts index 8db36466c9bad2..6eda3e37645c5b 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/find_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/find_route.ts @@ -26,7 +26,7 @@ import { UPGRADE_LICENSE_MESSAGE, hasAIAssistantLicense } from '../helpers'; export const findUserConversationsRoute = (router: ElasticAssistantPluginRouter) => { router.versioned .get({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_FIND, options: { tags: ['access:elasticAssistant'], @@ -34,7 +34,7 @@ export const findUserConversationsRoute = (router: ElasticAssistantPluginRouter) }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { query: buildRouteValidationWithZod(FindConversationsRequestQuery), diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/read_route.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/read_route.ts index 12020d7fa51d9f..dd540897b0eced 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/read_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/read_route.ts @@ -21,7 +21,7 @@ import { UPGRADE_LICENSE_MESSAGE, hasAIAssistantLicense } from '../helpers'; export const readConversationRoute = (router: ElasticAssistantPluginRouter) => { router.versioned .get({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID, options: { tags: ['access:elasticAssistant'], @@ -29,7 +29,7 @@ export const readConversationRoute = (router: ElasticAssistantPluginRouter) => { }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { params: buildRouteValidationWithZod(ReadConversationRequestParams), diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/update_route.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/update_route.ts index 069c189609f238..4ad819ef0caa09 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/update_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/update_route.ts @@ -24,7 +24,7 @@ import { performChecks } from '../helpers'; export const updateConversationRoute = (router: ElasticAssistantPluginRouter) => { router.versioned .put({ - access: 'internal', + access: 'public', path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL_BY_ID, options: { tags: ['access:elasticAssistant'], @@ -32,7 +32,7 @@ export const updateConversationRoute = (router: ElasticAssistantPluginRouter) => }) .addVersion( { - version: API_VERSIONS.internal.v1, + version: API_VERSIONS.public.v1, validate: { request: { body: buildRouteValidationWithZod(ConversationUpdateProps), diff --git a/x-pack/plugins/encrypted_saved_objects/server/plugin.test.ts b/x-pack/plugins/encrypted_saved_objects/server/plugin.test.ts index 6ae68f89151e0d..a54406cc079d23 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/plugin.test.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/plugin.test.ts @@ -52,6 +52,31 @@ describe('EncryptedSavedObjects Plugin', () => { `Hashed 'xpack.encryptedSavedObjects.encryptionKey' for this instance: WLbjNGKEm7aA4NfJHYyW88jHUkHtyF7ENHcF0obYGBU=`, ]); }); + + it('logs the hash for the saved object encryption key and all decryption-only keys', () => { + const mockInitializerContext = coreMock.createPluginInitializerContext( + ConfigSchema.validate( + { + encryptionKey: 'z'.repeat(32), + keyRotation: { decryptionOnlyKeys: ['a'.repeat(32), 'b'.repeat(32)] }, + }, + { dist: true } + ) + ); + + const plugin = new EncryptedSavedObjectsPlugin(mockInitializerContext); + plugin.setup(coreMock.createSetup(), { security: securityMock.createSetup() }); + + const infoLogs = loggingSystemMock.collect(mockInitializerContext.logger).info; + + expect(infoLogs.length).toBe(2); + expect(infoLogs[0]).toEqual([ + `Hashed 'xpack.encryptedSavedObjects.encryptionKey' for this instance: WLbjNGKEm7aA4NfJHYyW88jHUkHtyF7ENHcF0obYGBU=`, + ]); + expect(infoLogs[1]).toEqual([ + "Hashed 'xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys' for this instance: Lu5CspnLRLs9XdCgIhDOKd68IRC3xGRP84xTCElAviE=,3SPdLHuCi17QOhWjiG3GMBTIk/5B7Oteg3k4rX+arNU=", + ]); + }); }); describe('start()', () => { diff --git a/x-pack/plugins/encrypted_saved_objects/server/plugin.ts b/x-pack/plugins/encrypted_saved_objects/server/plugin.ts index 50514bc6199787..7aecb03868fa84 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/plugin.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/plugin.ts @@ -78,6 +78,18 @@ export class EncryptedSavedObjectsPlugin ); } + const readOnlyKeys = config.keyRotation?.decryptionOnlyKeys; + + if (readOnlyKeys !== undefined && readOnlyKeys.length > 0) { + const readOnlyKeyHashses = readOnlyKeys.map((readOnlyKey, i) => + createHash('sha3-256').update(readOnlyKey).digest('base64') + ); + + this.logger.info( + `Hashed 'xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys' for this instance: ${readOnlyKeyHashses}` + ); + } + const primaryCrypto = config.encryptionKey ? nodeCrypto({ encryptionKey: config.encryptionKey }) : undefined; diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx index e6882acb0ac3b6..b117518d3a6e09 100644 --- a/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx @@ -9,11 +9,8 @@ import React from 'react'; import { useValues } from 'kea'; -import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; - import { KibanaLogic } from '../../../shared/kibana'; import { EnterpriseSearchApplicationsPageTemplate } from '../layout/page_template'; @@ -31,32 +28,9 @@ export const Playground: React.FC = () => { defaultMessage: 'Playground', }), ]} - pageHeader={{ - pageTitle: ( - - - - - - - - - ), - rightSideItems: [], - }} pageViewTelemetry="Playground" restrictWidth={false} + panelled={false} customPageSections bottomBorder="extended" docLink="playground" diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts index 9e017424a8f3d5..9f1325f2c7a3dd 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts @@ -9,15 +9,16 @@ import { mockLogger } from '../../__mocks__'; import { MlTrainedModels } from '@kbn/ml-plugin/server'; -import { MlModelDeploymentState } from '../../../common/types/ml'; - -import { fetchMlModels } from './fetch_ml_models'; import { E5_LINUX_OPTIMIZED_MODEL_ID, E5_MODEL_ID, ELSER_LINUX_OPTIMIZED_MODEL_ID, ELSER_MODEL_ID, -} from './utils'; +} from '@kbn/ml-trained-models-utils'; + +import { MlModelDeploymentState } from '../../../common/types/ml'; + +import { fetchMlModels } from './fetch_ml_models'; describe('fetchMlModels', () => { const mockTrainedModelsProvider = { diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts index 595c35b33755e7..889b7bb1b89e17 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts @@ -11,6 +11,14 @@ import { Logger } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; import { MlTrainedModels } from '@kbn/ml-plugin/server'; +import { + E5_LINUX_OPTIMIZED_MODEL_ID, + E5_MODEL_ID, + ELSER_LINUX_OPTIMIZED_MODEL_ID, + ELSER_MODEL_ID, + LANG_IDENT_MODEL_ID, +} from '@kbn/ml-trained-models-utils'; + import { getMlModelTypesForModelConfig } from '../../../common/ml_inference_pipeline'; import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; @@ -18,15 +26,10 @@ import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; import { BASE_MODEL, ELSER_LINUX_OPTIMIZED_MODEL_PLACEHOLDER, - ELSER_MODEL_ID, ELSER_MODEL_PLACEHOLDER, E5_LINUX_OPTIMIZED_MODEL_PLACEHOLDER, - E5_MODEL_ID, E5_MODEL_PLACEHOLDER, - LANG_IDENT_MODEL_ID, MODEL_TITLES_BY_TYPE, - E5_LINUX_OPTIMIZED_MODEL_ID, - ELSER_LINUX_OPTIMIZED_MODEL_ID, } from './utils'; let compatibleElserModelId = ELSER_MODEL_ID; diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts b/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts index d063fd158385a2..20c9fe7ce01933 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts @@ -8,13 +8,14 @@ import { i18n } from '@kbn/i18n'; import { SUPPORTED_PYTORCH_TASKS } from '@kbn/ml-trained-models-utils'; -import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; +import { + E5_LINUX_OPTIMIZED_MODEL_ID, + E5_MODEL_ID, + ELSER_LINUX_OPTIMIZED_MODEL_ID, + ELSER_MODEL_ID, +} from '@kbn/ml-trained-models-utils'; -export const ELSER_MODEL_ID = '.elser_model_2'; -export const ELSER_LINUX_OPTIMIZED_MODEL_ID = '.elser_model_2_linux-x86_64'; -export const E5_MODEL_ID = '.multilingual-e5-small'; -export const E5_LINUX_OPTIMIZED_MODEL_ID = '.multilingual-e5-small_linux-x86_64'; -export const LANG_IDENT_MODEL_ID = 'lang_ident_model_1'; +import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; export const MODEL_TITLES_BY_TYPE: Record = { fill_mask: i18n.translate('xpack.enterpriseSearch.content.ml_inference.fill_mask', { diff --git a/x-pack/plugins/fleet/common/constants/locators.ts b/x-pack/plugins/fleet/common/constants/locators.ts index daa00bcae46e07..cca0687a172d8c 100644 --- a/x-pack/plugins/fleet/common/constants/locators.ts +++ b/x-pack/plugins/fleet/common/constants/locators.ts @@ -8,6 +8,7 @@ export const LOCATORS_IDS = { APM_LOCATOR: 'APM_LOCATOR', DASHBOARD_APP: 'DASHBOARD_APP_LOCATOR', + DISCOVER_APP_LOCATOR: 'DISCOVER_APP_LOCATOR', } as const; // Dashboards ids diff --git a/x-pack/plugins/fleet/common/constants/routes.ts b/x-pack/plugins/fleet/common/constants/routes.ts index 0ff598fc0dd47f..59ae42239db20a 100644 --- a/x-pack/plugins/fleet/common/constants/routes.ts +++ b/x-pack/plugins/fleet/common/constants/routes.ts @@ -123,6 +123,8 @@ export const SETTINGS_API_ROUTES = { INFO_PATTERN: `${API_ROOT}/settings`, UPDATE_PATTERN: `${API_ROOT}/settings`, ENROLLMENT_INFO_PATTERN: `${INTERNAL_ROOT}/settings/enrollment`, + SPACE_INFO_PATTERN: `${API_ROOT}/space_settings`, + SPACE_UPDATE_PATTERN: `${API_ROOT}/space_settings`, }; // App API routes diff --git a/x-pack/plugins/fleet/common/constants/settings.ts b/x-pack/plugins/fleet/common/constants/settings.ts index 423e71edf10e6a..b95052e66bedbd 100644 --- a/x-pack/plugins/fleet/common/constants/settings.ts +++ b/x-pack/plugins/fleet/common/constants/settings.ts @@ -7,4 +7,8 @@ export const GLOBAL_SETTINGS_SAVED_OBJECT_TYPE = 'ingest_manager_settings'; +export const SPACE_SETTINGS_SAVED_OBJECT_TYPE = 'fleet-space-settings'; + +export const SPACE_SETTINGS_ID_SUFFIX = '-default-settings'; + export const GLOBAL_SETTINGS_ID = 'fleet-default-settings'; diff --git a/x-pack/plugins/fleet/common/errors.ts b/x-pack/plugins/fleet/common/errors.ts index c43e4a6284869f..c41f6238f86475 100644 --- a/x-pack/plugins/fleet/common/errors.ts +++ b/x-pack/plugins/fleet/common/errors.ts @@ -16,6 +16,7 @@ export class FleetError extends Error { } } +export class PolicyNamespaceValidationError extends FleetError {} export class PackagePolicyValidationError extends FleetError {} export class MessageSigningError extends FleetError {} diff --git a/x-pack/plugins/fleet/common/types/index.ts b/x-pack/plugins/fleet/common/types/index.ts index e0b6fe6c03e7e1..4ec0647480165d 100644 --- a/x-pack/plugins/fleet/common/types/index.ts +++ b/x-pack/plugins/fleet/common/types/index.ts @@ -35,6 +35,10 @@ export interface FleetConfigType { url: string; }; }; + spaceSettings?: Array<{ + space_id: string; + allowed_namespace_prefixes: string[] | null; + }>; agentPolicies?: PreconfiguredAgentPolicy[]; packages?: PreconfiguredPackage[]; outputs?: PreconfiguredOutput[]; diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 06a8b979c8eb5a..fda07095de95dd 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -435,6 +435,7 @@ export enum RegistryVarsEntryKeys { os = 'os', secret = 'secret', hide_in_deployment_modes = 'hide_in_deployment_modes', + full_width = 'full_width', } // EPR types this as `[]map[string]interface{}` @@ -457,6 +458,7 @@ export interface RegistryVarsEntry { }; }; [RegistryVarsEntryKeys.hide_in_deployment_modes]?: string[]; + [RegistryVarsEntryKeys.full_width]?: boolean; } // Deprecated as part of the removing public references to saved object schemas diff --git a/x-pack/plugins/fleet/common/types/rest_spec/settings.ts b/x-pack/plugins/fleet/common/types/rest_spec/settings.ts index 73ad6a3a219fce..889da89b130c79 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/settings.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/settings.ts @@ -46,3 +46,14 @@ export interface GetEnrollmentSettingsResponse { }; download_source?: DownloadSource; } +export interface PutSpaceSettingsRequest { + body: { + allowed_namespace_prefixes?: string[]; + }; +} + +export interface GetSpaceSettingsResponse { + item: { + allowed_namespace_prefixes?: string[]; + }; +} diff --git a/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts b/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts index 4fc4fa33ea5b05..6119a8b13e8b85 100644 --- a/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts @@ -182,7 +182,7 @@ queue: cy.contains('Name is required'); cy.contains('URL is required'); - cy.contains('Service Token is required'); + cy.contains('Service token is required'); shouldDisplayError(SETTINGS_OUTPUTS.NAME_INPUT); shouldDisplayError('serviceTokenSecretInput'); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx index 114d973f325414..af0b2dbce2ff1c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx @@ -185,7 +185,7 @@ function getInputComponent({ fieldTestSelector, setIsDirty, }: InputComponentProps) { - const { multi, type, options } = varDef; + const { multi, type, options, full_width: fullWidth } = varDef; if (multi) { return ( setIsDirty(true)} disabled={frozen} resize="vertical" + fullWidth={fullWidth} data-test-subj={`textAreaInput-${fieldTestSelector}`} /> ); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx index 30688c7a99b11d..237ab76465fdd0 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx @@ -105,7 +105,7 @@ describe('step select agent policy', () => { const select = renderResult.container.querySelector('[data-test-subj="agentPolicySelect"]'); expect((select as any)?.value).toEqual(''); - expect(renderResult.getByText('An agent policy is required.')).toBeVisible(); + expect(renderResult.getByText('At least one agent policy is required.')).toBeVisible(); }); }); @@ -178,7 +178,7 @@ describe('step select agent policy', () => { ); expect((select as any)?.value).toEqual(undefined); - expect(renderResult.getByText('An agent policy is required.')).toBeVisible(); + expect(renderResult.getByText('At least one agent policy is required.')).toBeVisible(); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx index 349105eafee4ce..ecfd18ef9aac46 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx @@ -244,7 +244,7 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ selectedPolicyIds.length === 0 ? ( ) : someNewAgentPoliciesHaveLimitedPackage ? ( { }); waitFor(() => { - expect(renderResult.getByText('An agent policy is required.')).toBeInTheDocument(); + expect(renderResult.getByText('At least one agent policy is required.')).toBeInTheDocument(); }); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx index 7824b8abd2a5c3..78e32727212c9e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx @@ -12,8 +12,6 @@ import { createFleetTestRendererMock } from '../../../../../../../mock'; import { AgentLogsUI } from './agent_logs'; -jest.mock('../../../../../../../hooks/use_authz'); - jest.mock('@kbn/kibana-utils-plugin/public', () => { return { ...jest.requireActual('@kbn/kibana-utils-plugin/public'), @@ -28,6 +26,13 @@ jest.mock('@kbn/logs-shared-plugin/public', () => { LogStream: () =>
, }; }); +jest.mock('@kbn/logs-shared-plugin/common', () => { + return { + getLogsLocatorsFromUrlService: jest.fn().mockReturnValue({ + logsLocator: { getRedirectUrl: jest.fn(() => 'https://discover-redirect-url') }, + }), + }; +}); jest.mock('@kbn/shared-ux-link-redirect-app', () => { return { @@ -52,6 +57,13 @@ jest.mock('../../../../../hooks', () => { ...jest.requireActual('../../../../../hooks'), useLink: jest.fn(), useStartServices: jest.fn(), + useAuthz: jest.fn(), + useDiscoverLocator: jest.fn().mockImplementation(() => { + return { + id: 'DISCOVER_APP_LOCATOR', + getRedirectUrl: jest.fn().mockResolvedValue('app/discover/logs/someview'), + }; + }), }; }); @@ -62,6 +74,7 @@ describe('AgentLogsUI', () => { jest.mocked(useAuthz).mockReturnValue({ fleet: { allAgents: true, + readAgents: true, }, } as any); }); @@ -100,34 +113,36 @@ describe('AgentLogsUI', () => { }, }, }, - http: { - basePath: { - prepend: (url: string) => 'http://localhost:5620' + url, + share: { + url: { + locators: { + get: () => ({ + useUrl: () => 'https://locator.url', + }), + }, }, }, - cloud: { - isServerlessEnabled, - }, }); }; - it('should render Open in Logs UI if capabilities not set', () => { + it('should render Open in Logs button if privileges are set', () => { mockStartServices(); const result = renderComponent(); expect(result.getByTestId('viewInLogsBtn')).toHaveAttribute( 'href', - `http://localhost:5620/app/logs/stream?logPosition=(end%3A'2023-20-04T14%3A20%3A00.340Z'%2Cstart%3A'2023-20-04T14%3A00%3A00.340Z'%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Ainfo%20or%20log.level%3Aerror)'%2Ckind%3Akuery)` + `https://discover-redirect-url` ); }); - it('should render Open in Discover if serverless enabled', () => { - mockStartServices(true); + it('should not render Open in Logs button if privileges are not set', () => { + jest.mocked(useAuthz).mockReturnValue({ + fleet: { + readAgents: false, + }, + } as any); + mockStartServices(); const result = renderComponent(); - const viewInDiscover = result.getByTestId('viewInDiscoverBtn'); - expect(viewInDiscover).toHaveAttribute( - 'href', - `http://localhost:5620/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'2023-20-04T14:00:00.340Z',to:'2023-20-04T14:20:00.340Z'))&_a=(columns:!(event.dataset,message),index:'logs-*',query:(language:kuery,query:'elastic_agent.id:agent1 and (data_stream.dataset:elastic_agent) and (log.level:info or log.level:error)'))` - ); + expect(result.queryByTestId('viewInLogsBtn')).not.toBeInTheDocument(); }); it('should show log level dropdown with correct value', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx index 34cc206967d62e..5a9bfecd22144a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx @@ -35,7 +35,7 @@ import { LogLevelFilter } from './filter_log_level'; import { LogQueryBar } from './query_bar'; import { buildQuery } from './build_query'; import { SelectLogLevel } from './select_log_level'; -import { ViewLogsButton } from './view_logs_button'; +import { ViewLogsButton, getFormattedRange } from './view_logs_button'; const WrapperFlexGroup = styled(EuiFlexGroup)` height: 100%; @@ -112,9 +112,8 @@ const AgentPolicyLogsNotEnabledCallout: React.FunctionComponent<{ agentPolicy: A export const AgentLogsUI: React.FunctionComponent = memo( ({ agent, agentPolicy, state }) => { - const { data, application, cloud } = useStartServices(); + const { data, application } = useStartServices(); const { update: updateState } = AgentLogsUrlStateHelper.useTransitions(); - const isLogsUIAvailable = !cloud?.isServerlessEnabled; // Util to convert date expressions (returned by datepicker) to timestamps (used by LogStream) const getDateRangeTimestamps = useCallback( @@ -321,10 +320,9 @@ export const AgentLogsUI: React.FunctionComponent = memo( }} > diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx index 762c34ad7bc366..7b859596987c04 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx @@ -5,81 +5,61 @@ * 2.0. */ -import url from 'url'; -import { stringify } from 'querystring'; - import React, { useMemo } from 'react'; -import { encode } from '@kbn/rison'; import { EuiButton } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useStartServices } from '../../../../../hooks'; +import { getLogsLocatorsFromUrlService } from '@kbn/logs-shared-plugin/common'; + +import moment from 'moment'; + +import { useDiscoverLocator, useStartServices, useAuthz } from '../../../../../hooks'; interface ViewLogsProps { - viewInLogs: boolean; logStreamQuery: string; - startTime: string; - endTime: string; + startTime: number; + endTime: number; } +export const getFormattedRange = (date: string) => new Date(date).getTime(); + /* - Button that takes to the Logs view Ui when that is available, otherwise fallback to the Discover UI - The urls are built using same logStreamQuery (provided by a prop), startTime and endTime, ensuring that they'll both will target same log lines + Button that takes to the Logs view UI or the Discover logs, depending on what's available + If none is available, don't display the button at all */ export const ViewLogsButton: React.FunctionComponent = ({ - viewInLogs, logStreamQuery, startTime, endTime, }) => { - const { http } = useStartServices(); + const discoverLocator = useDiscoverLocator(); - // Generate URL to pass page state to Logs UI - const viewInLogsUrl = useMemo( - () => - http.basePath.prepend( - url.format({ - pathname: '/app/logs/stream', - search: stringify({ - logPosition: encode({ - start: startTime, - end: endTime, - streamLive: false, - }), - logFilter: encode({ - expression: logStreamQuery, - kind: 'kuery', - }), - }), - }) - ), - [http.basePath, startTime, endTime, logStreamQuery] - ); + const { share } = useStartServices(); + const { logsLocator } = getLogsLocatorsFromUrlService(share.url); + const authz = useAuthz(); - const viewInDiscoverUrl = useMemo(() => { - const index = 'logs-*'; - const query = encode({ - query: logStreamQuery, - language: 'kuery', + const logsUrl = useMemo(() => { + const now = moment().toISOString(); + const oneDayAgo = moment().subtract(1, 'day').toISOString(); + const defaultStartTime = getFormattedRange(oneDayAgo); + const defaultEndTime = getFormattedRange(now); + + return logsLocator.getRedirectUrl({ + time: endTime ? endTime : defaultEndTime, + timeRange: { + startTime: startTime ? startTime : defaultStartTime, + endTime: endTime ? endTime : defaultEndTime, + }, + filter: logStreamQuery, }); - return http.basePath.prepend( - `/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'${startTime}',to:'${endTime}'))&_a=(columns:!(event.dataset,message),index:'${index}',query:${query})` - ); - }, [logStreamQuery, http.basePath, startTime, endTime]); + }, [endTime, logStreamQuery, logsLocator, startTime]); - return viewInLogs ? ( - + return authz.fleet.readAgents && (logsLocator || discoverLocator) ? ( + - ) : ( - - - - ); + ) : null; }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx index 433cd687208fc7..c649b3829a41e8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx @@ -11,7 +11,7 @@ import { act, render, fireEvent } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { useActionStatus } from '../../hooks'; -import { useGetAgentPolicies, useStartServices } from '../../../../../hooks'; +import { useGetAgentPolicies, useStartServices, useAuthz } from '../../../../../hooks'; import { AgentActivityFlyout } from '.'; @@ -25,6 +25,15 @@ jest.mock('@kbn/shared-ux-link-redirect-app', () => ({ const mockUseActionStatus = useActionStatus as jest.Mock; const mockUseGetAgentPolicies = useGetAgentPolicies as jest.Mock; const mockUseStartServices = useStartServices as jest.Mock; +const mockedUseAuthz = useAuthz as jest.Mock; + +jest.mock('@kbn/logs-shared-plugin/common', () => { + return { + getLogsLocatorsFromUrlService: jest.fn().mockReturnValue({ + logsLocator: { getRedirectUrl: jest.fn(() => 'https://discover-redirect-url') }, + }), + }; +}); describe('AgentActivityFlyout', () => { const mockOnClose = jest.fn(); @@ -65,7 +74,22 @@ describe('AgentActivityFlyout', () => { docLinks: { links: { fleet: { upgradeElasticAgent: 'https://elastic.co' } } }, application: { navigateToUrl: jest.fn() }, http: { basePath: { prepend: jest.fn() } }, + share: { + url: { + locators: { + get: () => ({ + useUrl: () => 'https://locator.url', + }), + }, + }, + }, }); + mockedUseAuthz.mockReturnValue({ + fleet: { + readAgents: true, + allAgents: true, + }, + } as any); }); beforeEach(() => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx index b5018f812da4e8..e8f73eae3a2b9f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx @@ -12,7 +12,7 @@ import { I18nProvider } from '@kbn/i18n-react'; import type { ActionStatus } from '../../../../../../../common/types'; -import { useStartServices } from '../../../../hooks'; +import { useStartServices, useAuthz } from '../../../../hooks'; import { ViewErrors } from './view_errors'; @@ -21,6 +21,13 @@ jest.mock('../../../../hooks', () => { ...jest.requireActual('../../../../hooks'), useLink: jest.fn(), useStartServices: jest.fn(), + useAuthz: jest.fn(), + useDiscoverLocator: jest.fn().mockImplementation(() => { + return { + id: 'DISCOVER_APP_LOCATOR', + getRedirectUrl: jest.fn().mockResolvedValue('app/discover/logs/someview'), + }; + }), }; }); @@ -32,6 +39,14 @@ jest.mock('@kbn/shared-ux-link-redirect-app', () => ({ }, })); +jest.mock('@kbn/logs-shared-plugin/common', () => { + return { + getLogsLocatorsFromUrlService: jest.fn().mockReturnValue({ + logsLocator: { getRedirectUrl: jest.fn(() => 'https://discover-redirect-url') }, + }), + }; +}); + const mockStartServices = (isServerlessEnabled?: boolean) => { mockUseStartServices.mockReturnValue({ application: {}, @@ -47,18 +62,27 @@ const mockStartServices = (isServerlessEnabled?: boolean) => { }, }, }, - http: { - basePath: { - prepend: (url: string) => 'http://localhost:5620' + url, + share: { + url: { + locators: { + get: () => ({ + useUrl: () => 'https://locator.url', + }), + }, }, }, - cloud: { - isServerlessEnabled, - }, }); }; describe('ViewErrors', () => { + beforeEach(() => { + jest.mocked(useAuthz).mockReturnValue({ + fleet: { + allAgents: true, + readAgents: true, + }, + } as any); + }); const renderComponent = (action: ActionStatus) => { return render( @@ -67,7 +91,7 @@ describe('ViewErrors', () => { ); }; - it('should render error message with btn to Logs view if serverless not enabled', () => { + it('should render error message with btn to Logs view', () => { mockStartServices(); const result = renderComponent({ actionId: 'action1', @@ -82,15 +106,32 @@ describe('ViewErrors', () => { const errorText = result.getByTestId('errorText'); expect(errorText.textContent).toEqual('Agent agent1 is not upgradeable'); + }); + + it('should render open in Logs button if correct privileges are set', () => { + mockStartServices(); + const result = renderComponent({ + actionId: 'action1', + latestErrors: [ + { + agentId: 'agent1', + error: 'Agent agent1 is not upgradeable', + timestamp: '2023-03-06T14:51:24.709Z', + }, + ], + } as any); const viewErrorBtn = result.getByTestId('viewInLogsBtn'); - expect(viewErrorBtn.getAttribute('href')).toEqual( - `http://localhost:5620/app/logs/stream?logPosition=(end%3A'2023-03-06T14%3A56%3A24.709Z'%2Cstart%3A'2023-03-06T14%3A46%3A24.709Z'%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Aerror)'%2Ckind%3Akuery)` - ); + expect(viewErrorBtn.getAttribute('href')).toEqual(`https://discover-redirect-url`); }); - it('should render error message with btn to Discover view if serverless enabled', () => { - mockStartServices(true); + it('should not render open in Logs button if privileges are not set', () => { + jest.mocked(useAuthz).mockReturnValue({ + fleet: { + readAgents: false, + }, + } as any); + mockStartServices(); const result = renderComponent({ actionId: 'action1', latestErrors: [ @@ -102,12 +143,6 @@ describe('ViewErrors', () => { ], } as any); - const errorText = result.getByTestId('errorText'); - expect(errorText.textContent).toEqual('Agent agent1 is not upgradeable'); - - const viewErrorBtn = result.getByTestId('viewInDiscoverBtn'); - expect(viewErrorBtn.getAttribute('href')).toEqual( - `http://localhost:5620/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'2023-03-06T14:46:24.709Z',to:'2023-03-06T14:56:24.709Z'))&_a=(columns:!(event.dataset,message),index:'logs-*',query:(language:kuery,query:'elastic_agent.id:agent1 and (data_stream.dataset:elastic_agent) and (log.level:error)'))` - ); + expect(result.queryByTestId('viewInLogsBtn')).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx index 4d43c9a60a6183..e73d7778d1405e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx @@ -17,7 +17,10 @@ import { i18n } from '@kbn/i18n'; import type { ActionErrorResult } from '../../../../../../../common/types'; import { buildQuery } from '../../agent_details_page/components/agent_logs/build_query'; -import { ViewLogsButton } from '../../agent_details_page/components/agent_logs/view_logs_button'; +import { + ViewLogsButton, + getFormattedRange, +} from '../../agent_details_page/components/agent_logs/view_logs_button'; import type { ActionStatus } from '../../../../types'; import { useStartServices } from '../../../../hooks'; @@ -30,11 +33,12 @@ const TruncatedEuiText = styled(EuiText)` export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ action }) => { const coreStart = useStartServices(); - const isLogsUIAvailable = !coreStart.cloud?.isServerlessEnabled; - const getLogsButton = (agentId: string, timestamp: string, viewInLogs: boolean) => { - const startTime = moment(timestamp).subtract(5, 'm').toISOString(); - const endTime = moment(timestamp).add(5, 'm').toISOString(); + const getLogsButton = (agentId: string, timestamp: string) => { + const start = moment(timestamp).subtract(5, 'm').toISOString(); + const end = moment(timestamp).add(5, 'm').toISOString(); + const startTime = getFormattedRange(start); + const endTime = getFormattedRange(end); const logStreamQuery = buildQuery({ agentId, @@ -43,12 +47,7 @@ export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ userQuery: '', }); return ( - + ); }; @@ -86,7 +85,7 @@ export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ const errorItem = (action.latestErrors ?? []).find((item) => item.agentId === agentId); return ( - {getLogsButton(agentId, errorItem!.timestamp, !!isLogsUIAvailable)} + {getLogsButton(agentId, errorItem!.timestamp)} ); }, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx index 3a21103503ae5a..a9adc6140c7c5e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx @@ -128,6 +128,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { const agentPolicy = agentPoliciesById[enrollmentKey.policy_id]; return !agentPolicy?.is_managed; }) || []; + const filteredTotal = rowItems.length; const columns = [ { @@ -294,7 +295,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { pagination={{ pageIndex: pagination.currentPage - 1, pageSize: pagination.pageSize, - totalItemCount: total, + totalItemCount: filteredTotal, pageSizeOptions, }} onChange={({ page }: { page: { index: number; size: number } }) => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx index c57d26603c889c..e742005a379130 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx @@ -83,7 +83,7 @@ const kafkaSectionsLabels = [ 'Broker settings', ]; -const remoteEsOutputLabels = ['Hosts', 'Service Token']; +const remoteEsOutputLabels = ['Hosts', 'Service token']; describe('EditOutputFlyout', () => { const mockStartServices = (isServerlessEnabled?: boolean) => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_remote_es.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_remote_es.tsx index 354c6ce7d38216..658a42115381b2 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_remote_es.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_remote_es.tsx @@ -82,7 +82,7 @@ export const OutputFormRemoteEsSection: React.FunctionComponent = (props) label={ } {...inputs.serviceTokenInput.formRowProps} @@ -105,7 +105,7 @@ export const OutputFormRemoteEsSection: React.FunctionComponent = (props) { @@ -42,8 +43,8 @@ describe('SecretFormRow', () => { expect(queryByText(initialValue)).not.toBeInTheDocument(); }); - it('should not enable the replace button if the row is disabled', () => { - const { getByText } = renderReactTestingLibraryWithI18n( + it('should not enable action links if the row is disabled', () => { + const { getByText, queryByText } = renderReactTestingLibraryWithI18n( { ); - expect(getByText('Replace Test Secret').closest('button')).toBeDisabled(); + expect(getByText('The saved Test Secret is hidden.')).toBeInTheDocument(); + expect(queryByText('Replace Test Secret')).not.toBeInTheDocument(); + expect(queryByText('Click to use secret storage instead')).not.toBeInTheDocument(); + expect(queryByText('Click to use plain text storage instead')).not.toBeInTheDocument(); }); it('should call the cancelEdit function when the cancel button is clicked', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_secret_form_row.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_secret_form_row.tsx index 34383ae62f287b..3614499905b2e7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_secret_form_row.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_secret_form_row.tsx @@ -55,32 +55,45 @@ export const SecretFormRow: React.FC<{ const [editMode, setEditMode] = useState(isConvertedToSecret || !initialValue); const valueHiddenPanel = ( - - - - - setEditMode(true)} - color="primary" - iconType="refresh" - iconSide="left" - size="xs" - > - - + {disabled ? ( + + + + ) : ( + <> + + + + + setEditMode(true)} + color="primary" + iconType="refresh" + iconSide="left" + size="xs" + > + + + + )} ); @@ -134,6 +147,7 @@ export const SecretFormRow: React.FC<{ ); const helpText = useMemo(() => { + if (disabled) return null; if (isConvertedToSecret) return ( @@ -172,9 +186,9 @@ export const SecretFormRow: React.FC<{ /> ); return undefined; - }, [initialValue, isConvertedToSecret, onToggleSecretStorage]); + }, [disabled, initialValue, isConvertedToSecret, onToggleSecretStorage]); - const plainTextHelp = ( + const plainTextHelp = disabled ? null : ( = ({ const onSuccessCallback = useRef(null); const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); + const isShared = useMemo(() => { + if (agentPolicies?.length !== 1) { + return false; + } + const packagePolicy = agentPolicies[0].package_policies?.find( + (policy) => policy.id === packagePolicies[0] + ); + return (packagePolicy?.policy_ids?.length ?? 0) > 1; + }, [agentPolicies, packagePolicies]); + const hasMultipleAgentPolicies = canUseMultipleAgentPolicies && agentPolicies && agentPolicies.length > 1; @@ -59,7 +69,7 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ const request = await sendGetAgents({ kuery, - showInactive: false, + showInactive: true, }); setAgentsCount(request.data?.total || 0); setIsLoadingAgentsCount(false); @@ -196,7 +206,7 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ /> ) : agentsCount && agentPolicies ? ( <> - {hasMultipleAgentPolicies && ( + {(hasMultipleAgentPolicies || isShared) && ( <> { const { http, cloud } = useStartServices(); const isLogsUIAvailable = !cloud?.isServerlessEnabled; // if logs ui is not available, link to discover + // TODO: move away from hardcoded link and use locators instead const logStreamUrl = isLogsUIAvailable ? http.basePath.prepend('/app/logs/stream') : http.basePath.prepend('/app/discover'); diff --git a/x-pack/plugins/fleet/public/hooks/use_locator.ts b/x-pack/plugins/fleet/public/hooks/use_locator.ts index a3fed97679456a..25a673b6946709 100644 --- a/x-pack/plugins/fleet/public/hooks/use_locator.ts +++ b/x-pack/plugins/fleet/public/hooks/use_locator.ts @@ -21,3 +21,7 @@ export function useLocator( export function useDashboardLocator() { return useLocator(LOCATORS_IDS.DASHBOARD_APP); } + +export function useDiscoverLocator() { + return useLocator(LOCATORS_IDS.DISCOVER_APP_LOCATOR); +} diff --git a/x-pack/plugins/fleet/server/config.ts b/x-pack/plugins/fleet/server/config.ts index 87df985be7a51a..628abfb38d7186 100644 --- a/x-pack/plugins/fleet/server/config.ts +++ b/x-pack/plugins/fleet/server/config.ts @@ -19,6 +19,7 @@ import { PreconfiguredOutputsSchema, PreconfiguredFleetServerHostsSchema, PreconfiguredFleetProxiesSchema, + PreconfiguredSpaceSettingsSchema, } from './types'; import { BULK_CREATE_MAX_ARTIFACTS_BYTES } from './services/artifacts/artifacts'; @@ -154,6 +155,7 @@ export const config: PluginConfigDescriptor = { outputs: PreconfiguredOutputsSchema, fleetServerHosts: PreconfiguredFleetServerHostsSchema, proxies: PreconfiguredFleetProxiesSchema, + spaceSettings: PreconfiguredSpaceSettingsSchema, agentIdVerificationEnabled: schema.boolean({ defaultValue: true }), setup: schema.maybe( schema.object({ diff --git a/x-pack/plugins/fleet/server/constants/index.ts b/x-pack/plugins/fleet/server/constants/index.ts index d727cd30c63852..8ea5297ecd59bc 100644 --- a/x-pack/plugins/fleet/server/constants/index.ts +++ b/x-pack/plugins/fleet/server/constants/index.ts @@ -50,6 +50,7 @@ export { OUTPUT_SAVED_OBJECT_TYPE, PACKAGES_SAVED_OBJECT_TYPE, ASSETS_SAVED_OBJECT_TYPE, + SPACE_SETTINGS_SAVED_OBJECT_TYPE, GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, UNINSTALL_TOKENS_SAVED_OBJECT_TYPE, diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 4256a4a90e537d..fa3eefd90c2273 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -88,6 +88,7 @@ import { PLUGIN_ID, PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE, FLEET_PROXY_SAVED_OBJECT_TYPE, + SPACE_SETTINGS_SAVED_OBJECT_TYPE, } from './constants'; import { registerEncryptedSavedObjects, registerSavedObjects } from './saved_objects'; import { registerRoutes } from './routes'; @@ -190,6 +191,7 @@ const allSavedObjectTypes = [ DOWNLOAD_SOURCE_SAVED_OBJECT_TYPE, FLEET_SERVER_HOST_SAVED_OBJECT_TYPE, FLEET_PROXY_SAVED_OBJECT_TYPE, + SPACE_SETTINGS_SAVED_OBJECT_TYPE, ]; /** diff --git a/x-pack/plugins/fleet/server/routes/index.ts b/x-pack/plugins/fleet/server/routes/index.ts index 29efa03967ea03..9257d672848a70 100644 --- a/x-pack/plugins/fleet/server/routes/index.ts +++ b/x-pack/plugins/fleet/server/routes/index.ts @@ -40,7 +40,7 @@ export function registerRoutes(fleetAuthzRouter: FleetAuthzRouter, config: Fleet registerAgentPolicyRoutes(fleetAuthzRouter); registerPackagePolicyRoutes(fleetAuthzRouter); registerOutputRoutes(fleetAuthzRouter); - registerSettingsRoutes(fleetAuthzRouter); + registerSettingsRoutes(fleetAuthzRouter, config); registerDataStreamRoutes(fleetAuthzRouter); registerPreconfigurationRoutes(fleetAuthzRouter); registerFleetServerHostRoutes(fleetAuthzRouter); diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts index a26fc6760397c9..2fe60943b19092 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts @@ -376,10 +376,43 @@ describe('When calling package policy', () => { it('should not throw if enterprise license and multiple policy_ids is provided', async () => { jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ enableReusableIntegrationPolicies: true } as any); const request = getUpdateKibanaRequest({ policy_ids: ['1', '2'] } as any); await routeHandler(context, request, response); expect(response.ok).toHaveBeenCalled(); }); + + it('should throw if enterprise license and feature flag is disabled and multiple policy_ids is provided', async () => { + jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ enableReusableIntegrationPolicies: false } as any); + const request = getUpdateKibanaRequest({ policy_ids: ['1', '2'] } as any); + await routeHandler(context, request, response); + expect(response.customError).toHaveBeenCalledWith({ + statusCode: 400, + body: { + message: 'Reusable integration policies are not supported', + }, + }); + }); + + it('should throw if empty policy_ids are provided', async () => { + jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ enableReusableIntegrationPolicies: true } as any); + const request = getUpdateKibanaRequest({ policy_ids: [] } as any); + await routeHandler(context, request, response); + expect(response.customError).toHaveBeenCalledWith({ + statusCode: 400, + body: { + message: 'At least one agent policy id must be provided', + }, + }); + }); }); describe('list api handler', () => { diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts index abad84ef9db9d1..a40b2a41d89db1 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts @@ -421,6 +421,10 @@ export const updatePackagePolicyHandler: FleetRequestHandler< throw new PackagePolicyRequestError(errorMessage); } + if (newData.policy_ids && newData.policy_ids.length === 0) { + throw new PackagePolicyRequestError('At least one agent policy id must be provided'); + } + const updatedPackagePolicy = await packagePolicyService.update( soClient, esClient, diff --git a/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts b/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts index da1fca175b9cf5..7a88899d8ba280 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts @@ -8,7 +8,7 @@ import type { TypeOf } from '@kbn/config-schema'; import type { CreatePackagePolicyRequestSchema, PackagePolicyInput } from '../../../types'; -import { licenseService } from '../../../services'; +import { appContextService, licenseService } from '../../../services'; import type { SimplifiedPackagePolicy } from '../../../../common/services/simplified_package_policy_helper'; export function isSimplifiedCreatePackagePolicyRequest( @@ -44,9 +44,12 @@ const LICENCE_FOR_MULTIPLE_AGENT_POLICIES = 'enterprise'; export function canUseMultipleAgentPolicies() { const hasEnterpriseLicence = licenseService.hasAtLeast(LICENCE_FOR_MULTIPLE_AGENT_POLICIES); + const { enableReusableIntegrationPolicies } = appContextService.getExperimentalFeatures(); return { - canUseReusablePolicies: hasEnterpriseLicence, - errorMessage: 'Reusable integration policies are only available with an Enterprise license', + canUseReusablePolicies: hasEnterpriseLicence && enableReusableIntegrationPolicies, + errorMessage: !hasEnterpriseLicence + ? 'Reusable integration policies are only available with an Enterprise license' + : 'Reusable integration policies are not supported', }; } diff --git a/x-pack/plugins/fleet/server/routes/settings/index.ts b/x-pack/plugins/fleet/server/routes/settings/index.ts index a72d2da7805d5c..b9f672627daa7d 100644 --- a/x-pack/plugins/fleet/server/routes/settings/index.ts +++ b/x-pack/plugins/fleet/server/routes/settings/index.ts @@ -5,71 +5,68 @@ * 2.0. */ -import type { TypeOf } from '@kbn/config-schema'; - +import { parseExperimentalConfigValue } from '../../../common/experimental_features'; import { API_VERSIONS } from '../../../common/constants'; import type { FleetAuthzRouter } from '../../services/security'; - import { SETTINGS_API_ROUTES } from '../../constants'; -import type { FleetRequestHandler } from '../../types'; import { PutSettingsRequestSchema, GetSettingsRequestSchema, GetEnrollmentSettingsRequestSchema, + GetSpaceSettingsRequestSchema, + PutSpaceSettingsRequestSchema, } from '../../types'; -import { defaultFleetErrorHandler } from '../../errors'; -import { settingsService, agentPolicyService, appContextService } from '../../services'; +import type { FleetConfigType } from '../../config'; import { getEnrollmentSettingsHandler } from './enrollment_settings_handler'; -export const getSettingsHandler: FleetRequestHandler = async (context, request, response) => { - const soClient = (await context.fleet).internalSoClient; - - try { - const settings = await settingsService.getSettings(soClient); - const body = { - item: settings, - }; - return response.ok({ body }); - } catch (error) { - if (error.isBoom && error.output.statusCode === 404) { - return response.notFound({ - body: { message: `Settings not found` }, - }); - } - - return defaultFleetErrorHandler({ error, response }); - } -}; - -export const putSettingsHandler: FleetRequestHandler< - undefined, - undefined, - TypeOf -> = async (context, request, response) => { - const soClient = (await context.fleet).internalSoClient; - const esClient = (await context.core).elasticsearch.client.asInternalUser; - const user = appContextService.getSecurityCore().authc.getCurrentUser(request) || undefined; +import { + getSettingsHandler, + getSpaceSettingsHandler, + putSettingsHandler, + putSpaceSettingsHandler, +} from './settings_handler'; - try { - const settings = await settingsService.saveSettings(soClient, request.body); - await agentPolicyService.bumpAllAgentPolicies(esClient, { user }); - const body = { - item: settings, - }; - return response.ok({ body }); - } catch (error) { - if (error.isBoom && error.output.statusCode === 404) { - return response.notFound({ - body: { message: `Settings not found` }, - }); - } +export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType) => { + const experimentalFeatures = parseExperimentalConfigValue(config.enableExperimental); + if (experimentalFeatures.useSpaceAwareness) { + router.versioned + .get({ + path: SETTINGS_API_ROUTES.SPACE_INFO_PATTERN, + fleetAuthz: (authz) => { + return ( + authz.fleet.readSettings || + authz.integrations.writeIntegrationPolicies || + authz.fleet.allAgentPolicies + ); + }, + description: `Get space settings`, + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: GetSpaceSettingsRequestSchema }, + }, + getSpaceSettingsHandler + ); - return defaultFleetErrorHandler({ error, response }); + router.versioned + .put({ + path: SETTINGS_API_ROUTES.SPACE_UPDATE_PATTERN, + fleetAuthz: { + fleet: { allSettings: true }, + }, + description: `Put space settings`, + }) + .addVersion( + { + version: API_VERSIONS.public.v1, + validate: { request: PutSpaceSettingsRequestSchema }, + }, + putSpaceSettingsHandler + ); } -}; -export const registerRoutes = (router: FleetAuthzRouter) => { router.versioned .get({ path: SETTINGS_API_ROUTES.INFO_PATTERN, diff --git a/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts b/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts new file mode 100644 index 00000000000000..c959638d0fc6b8 --- /dev/null +++ b/x-pack/plugins/fleet/server/routes/settings/settings_handler.ts @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { TypeOf } from '@kbn/config-schema'; + +import type { + FleetRequestHandler, + PutSettingsRequestSchema, + PutSpaceSettingsRequestSchema, +} from '../../types'; +import { defaultFleetErrorHandler } from '../../errors'; +import { settingsService, agentPolicyService, appContextService } from '../../services'; +import { getSpaceSettings, saveSpaceSettings } from '../../services/spaces/space_settings'; + +export const getSpaceSettingsHandler: FleetRequestHandler = async (context, request, response) => { + try { + const soClient = (await context.fleet).internalSoClient; + const settings = await getSpaceSettings(soClient.getCurrentNamespace()); + const body = { + item: settings, + }; + return response.ok({ body }); + } catch (error) { + return defaultFleetErrorHandler({ error, response }); + } +}; + +export const putSpaceSettingsHandler: FleetRequestHandler< + undefined, + undefined, + TypeOf +> = async (context, request, response) => { + try { + const soClient = (await context.fleet).internalSoClient; + await saveSpaceSettings({ + settings: { + allowed_namespace_prefixes: request.body.allowed_namespace_prefixes, + }, + spaceId: soClient.getCurrentNamespace(), + }); + const settings = await settingsService.getSettings(soClient); + const body = { + item: settings, + }; + return response.ok({ body }); + } catch (error) { + return defaultFleetErrorHandler({ error, response }); + } +}; + +export const getSettingsHandler: FleetRequestHandler = async (context, request, response) => { + const soClient = (await context.fleet).internalSoClient; + + try { + const settings = await settingsService.getSettings(soClient); + const body = { + item: settings, + }; + return response.ok({ body }); + } catch (error) { + if (error.isBoom && error.output.statusCode === 404) { + return response.notFound({ + body: { message: `Settings not found` }, + }); + } + + return defaultFleetErrorHandler({ error, response }); + } +}; + +export const putSettingsHandler: FleetRequestHandler< + undefined, + undefined, + TypeOf +> = async (context, request, response) => { + const soClient = (await context.fleet).internalSoClient; + const esClient = (await context.core).elasticsearch.client.asInternalUser; + const user = appContextService.getSecurityCore().authc.getCurrentUser(request) || undefined; + + try { + const settings = await settingsService.saveSettings(soClient, request.body); + await agentPolicyService.bumpAllAgentPolicies(esClient, { user }); + const body = { + item: settings, + }; + return response.ok({ body }); + } catch (error) { + if (error.isBoom && error.output.statusCode === 404) { + return response.notFound({ + body: { message: `Settings not found` }, + }); + } + + return defaultFleetErrorHandler({ error, response }); + } +}; diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index 3f91146536a9dd..4b76a952a0f3b4 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -24,6 +24,7 @@ import { INGEST_SAVED_OBJECT_INDEX, UNINSTALL_TOKENS_SAVED_OBJECT_TYPE, FLEET_SETUP_LOCK_TYPE, + SPACE_SETTINGS_SAVED_OBJECT_TYPE, } from '../constants'; import { migrateSyntheticsPackagePolicyToV8120 } from './migrations/synthetics/to_v8_12_0'; @@ -123,6 +124,22 @@ export const getSavedObjectTypes = ( }, }, }, + [SPACE_SETTINGS_SAVED_OBJECT_TYPE]: { + name: SPACE_SETTINGS_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: 'single', + management: { + importableAndExportable: false, + }, + mappings: { + dynamic: false, + properties: { + // allowed_namespace_prefixes: { enabled: false }, + // managed_by: { type: 'keyword', index: false }, + }, + }, + }, // Deprecated [GLOBAL_SETTINGS_SAVED_OBJECT_TYPE]: { name: GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index ed3cefb2faf949..9ddbdef52ce735 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -107,6 +107,7 @@ import { getFullAgentPolicy, validateOutputForPolicy } from './agent_policies'; import { auditLoggingService } from './audit_logging'; import { licenseService } from './license'; import { createSoFindIterable } from './utils/create_so_find_iterable'; +import { validatePolicyNamespaceForSpace } from './spaces/policy_namespaces'; const SAVED_OBJECT_TYPE = AGENT_POLICY_SAVED_OBJECT_TYPE; @@ -329,7 +330,10 @@ class AgentPolicyService { this.checkAgentless(agentPolicy); await this.requireUniqueName(soClient, agentPolicy); - + await validatePolicyNamespaceForSpace({ + spaceId: soClient.getCurrentNamespace(), + namespace: agentPolicy.namespace, + }); await validateOutputForPolicy(soClient, agentPolicy); const newSo = await soClient.create( @@ -592,6 +596,12 @@ class AgentPolicyService { name: agentPolicy.name, }); } + if (agentPolicy.namespace) { + await validatePolicyNamespaceForSpace({ + spaceId: soClient.getCurrentNamespace(), + namespace: agentPolicy.namespace, + }); + } const existingAgentPolicy = await this.get(soClient, id, true); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts index 654ce7ea8ed814..e44e70b85efe0a 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts @@ -39,7 +39,7 @@ import { retryTransientEsErrors } from '../retry'; import { PackageESError, PackageInvalidArchiveError } from '../../../../errors'; import { getDefaultProperties, histogram, keyword, scaledFloat } from './mappings'; -import { isUserSettingsTemplate } from './utils'; +import { isUserSettingsTemplate, fillConstantKeywordValues } from './utils'; interface Properties { [key: string]: any; @@ -986,7 +986,7 @@ const updateAllDataStreams = async ( }); }, { - // Limit concurrent putMapping/rollover requests to avoid overhwhelming ES cluster + // Limit concurrent putMapping/rollover requests to avoid overwhelming ES cluster concurrency: 20, } ); @@ -1017,19 +1017,23 @@ const updateExistingDataStream = async ({ const currentSourceType = currentBackingIndexConfig.mappings?._source?.mode; let settings: IndicesIndexSettings; - let mappings: MappingTypeMapping; + let mappings: MappingTypeMapping = {}; let lifecycle: any; let subobjectsFieldChanged: boolean = false; + let simulateResult: any = {}; try { - const simulateResult = await retryTransientEsErrors(async () => + simulateResult = await retryTransientEsErrors(async () => esClient.indices.simulateTemplate({ name: await getIndexTemplate(esClient, dataStreamName), }) ); settings = simulateResult.template.settings; - mappings = simulateResult.template.mappings; - // @ts-expect-error template is not yet typed with DLM + mappings = fillConstantKeywordValues( + currentBackingIndexConfig?.mappings || {}, + simulateResult.template.mappings + ); + lifecycle = simulateResult.template.lifecycle; // for now, remove from object so as not to update stream or data stream properties of the index until type and name @@ -1063,6 +1067,7 @@ const updateExistingDataStream = async ({ subobjectsFieldChanged ) { logger.info(`Mappings update for ${dataStreamName} failed due to ${err}`); + logger.trace(`Attempted mappings: ${mappings}`); if (options?.skipDataStreamRollover === true) { logger.info( `Skipping rollover for ${dataStreamName} as "skipDataStreamRollover" is enabled` @@ -1075,6 +1080,7 @@ const updateExistingDataStream = async ({ } } logger.error(`Mappings update for ${dataStreamName} failed due to unexpected error: ${err}`); + logger.trace(`Attempted mappings: ${mappings}`); if (options?.ignoreMappingUpdateErrors === true) { logger.info(`Ignore mapping update errors as "ignoreMappingUpdateErrors" is enabled`); return; diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.test.ts new file mode 100644 index 00000000000000..a411ba32d2954d --- /dev/null +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.test.ts @@ -0,0 +1,226 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { fillConstantKeywordValues } from './utils'; + +describe('fillConstantKeywordValues', () => { + const oldMappings = { + dynamic: false, + _meta: { + managed_by: 'fleet', + managed: true, + package: { + name: 'elastic_agent', + }, + }, + dynamic_templates: [ + { + ecs_timestamp: { + match: '@timestamp', + mapping: { + ignore_malformed: false, + type: 'date', + }, + }, + }, + ], + date_detection: false, + properties: { + '@timestamp': { + type: 'date', + ignore_malformed: false, + }, + load: { + properties: { + '1': { + type: 'double', + }, + '5': { + type: 'double', + }, + '15': { + type: 'double', + }, + }, + }, + event: { + properties: { + agent_id_status: { + type: 'keyword', + ignore_above: 1024, + }, + dataset: { + type: 'constant_keyword', + value: 'elastic_agent.metricbeat', + }, + ingested: { + type: 'date', + format: 'strict_date_time_no_millis||strict_date_optional_time||epoch_millis', + ignore_malformed: false, + }, + }, + }, + message: { + type: 'match_only_text', + }, + 'dot.field': { + type: 'keyword', + }, + constant_keyword_without_value: { + type: 'constant_keyword', + }, + }, + }; + + const newMappings = { + dynamic: false, + _meta: { + managed_by: 'fleet', + managed: true, + package: { + name: 'elastic_agent', + }, + }, + dynamic_templates: [ + { + ecs_timestamp: { + match: '@timestamp', + mapping: { + ignore_malformed: false, + type: 'date', + }, + }, + }, + ], + date_detection: false, + properties: { + '@timestamp': { + type: 'date', + ignore_malformed: false, + }, + load: { + properties: { + '1': { + type: 'double', + }, + '5': { + type: 'double', + }, + '15': { + type: 'double', + }, + }, + }, + event: { + properties: { + agent_id_status: { + type: 'keyword', + ignore_above: 1024, + }, + dataset: { + type: 'constant_keyword', + }, + ingested: { + type: 'date', + format: 'strict_date_time_no_millis||strict_date_optional_time||epoch_millis', + ignore_malformed: false, + }, + }, + }, + message: { + type: 'match_only_text', + }, + 'dot.field': { + type: 'keyword', + }, + some_new_field: { + type: 'keyword', + }, + constant_keyword_without_value: { + type: 'constant_keyword', + }, + }, + }; + + it('should fill in missing constant_keyword values from old mappings correctly', () => { + // @ts-ignore + expect(fillConstantKeywordValues(oldMappings, newMappings)).toEqual({ + dynamic: false, + _meta: { + managed_by: 'fleet', + managed: true, + package: { + name: 'elastic_agent', + }, + }, + dynamic_templates: [ + { + ecs_timestamp: { + match: '@timestamp', + mapping: { + ignore_malformed: false, + type: 'date', + }, + }, + }, + ], + date_detection: false, + properties: { + '@timestamp': { + type: 'date', + ignore_malformed: false, + }, + load: { + properties: { + '1': { + type: 'double', + }, + '5': { + type: 'double', + }, + '15': { + type: 'double', + }, + }, + }, + event: { + properties: { + agent_id_status: { + type: 'keyword', + ignore_above: 1024, + }, + dataset: { + type: 'constant_keyword', + value: 'elastic_agent.metricbeat', + }, + ingested: { + type: 'date', + format: 'strict_date_time_no_millis||strict_date_optional_time||epoch_millis', + ignore_malformed: false, + }, + }, + }, + message: { + type: 'match_only_text', + }, + 'dot.field': { + type: 'keyword', + }, + some_new_field: { + type: 'keyword', + }, + constant_keyword_without_value: { + type: 'constant_keyword', + }, + }, + }); + }); + + it('should return the same mappings if old mappings are not provided', () => { + // @ts-ignore + expect(fillConstantKeywordValues({}, newMappings)).toMatchObject(newMappings); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.ts index e435e54a828dff..6a34beb3710829 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/utils.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import type { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { USER_SETTINGS_TEMPLATE_SUFFIX } from '../../../../constants'; @@ -12,3 +13,34 @@ type UserSettingsTemplateName = `${TemplateBaseName}${typeof USER_SETTINGS_TEMPL export const isUserSettingsTemplate = (name: string): name is UserSettingsTemplateName => name.endsWith(USER_SETTINGS_TEMPLATE_SUFFIX); + +// For any `constant_keyword` fields in `newMappings` that don't have a `value`, access the same field in +// the `oldMappings` and fill in the value from there +export const fillConstantKeywordValues = ( + oldMappings: MappingTypeMapping, + newMappings: MappingTypeMapping +) => { + const filledMappings = JSON.parse(JSON.stringify(newMappings)) as MappingTypeMapping; + const deepGet = (obj: any, keys: string[]) => keys.reduce((xs, x) => xs?.[x] ?? undefined, obj); + + const fillEmptyConstantKeywordFields = (mappings: unknown, currentPath: string[] = []) => { + if (!mappings) return; + for (const [key, potentialField] of Object.entries(mappings)) { + const path = [...currentPath, key]; + if (typeof potentialField === 'object') { + if (potentialField.type === 'constant_keyword' && potentialField.value === undefined) { + const valueFromOldMappings = deepGet(oldMappings.properties, [...path, 'value']); + if (valueFromOldMappings !== undefined) { + potentialField.value = valueFromOldMappings; + } + } else if (potentialField.properties && typeof potentialField.properties === 'object') { + fillEmptyConstantKeywordFields(potentialField.properties, [...path, 'properties']); + } + } + } + }; + + fillEmptyConstantKeywordFields(filledMappings.properties); + + return filledMappings; +}; diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts index 2096820e82dade..58385fb544a574 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts @@ -21,7 +21,7 @@ import { partition } from 'lodash'; import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { KibanaAssetType, KibanaSavedObjectType } from '../../../../types'; -import type { AssetReference, AssetParts, Installation, PackageSpecTags } from '../../../../types'; +import type { AssetReference, Installation, PackageSpecTags } from '../../../../types'; import type { KibanaAssetReference, PackageInstallContext } from '../../../../../common/types'; import { indexPatternTypes, @@ -242,7 +242,8 @@ export async function installKibanaAssetsAndReferences({ }) { const { savedObjectsImporter, savedObjectTagAssignmentService, savedObjectTagClient } = getSpaceAwareSaveobjectsClients(spaceId); - const kibanaAssets = await getKibanaAssets(packageInstallContext); + // This is where the memory consumption is rising up in the first place + const kibanaAssets = getKibanaAssets(packageInstallContext); if (installedPkg) { await deleteKibanaSavedObjectsAssets({ savedObjectsClient, installedPkg, spaceId }); } @@ -323,9 +324,9 @@ export async function deleteKibanaAssetsAndReferencesForSpace({ await saveKibanaAssetsRefs(savedObjectsClient, pkgName, [], true); } -export async function getKibanaAssets( +export function getKibanaAssets( packageInstallContext: PackageInstallContext -): Promise> { +): Record { const kibanaAssetTypes = Object.values(KibanaAssetType); const isKibanaAssetType = (path: string) => { const parts = getPathParts(path); @@ -333,36 +334,20 @@ export async function getKibanaAssets( return parts.service === 'kibana' && (kibanaAssetTypes as string[]).includes(parts.type); }; - const filteredPaths = packageInstallContext.paths - .filter(isKibanaAssetType) - .map<[string, AssetParts]>((path) => [path, getPathParts(path)]); + const result = Object.fromEntries( + kibanaAssetTypes.map((type) => [type, []]) + ) as Record; - const assetArrays: Array> = []; - for (const assetType of kibanaAssetTypes) { - const matching = filteredPaths.filter(([path, parts]) => parts.type === assetType); + packageInstallContext.paths.filter(isKibanaAssetType).forEach((path) => { + const buffer = getAssetFromAssetsMap(packageInstallContext.assetsMap, path); + const asset = JSON.parse(buffer.toString('utf8')); - assetArrays.push( - Promise.all( - matching.map(([path]) => { - const buffer = getAssetFromAssetsMap(packageInstallContext.assetsMap, path); - - // cache values are buffers. convert to string / JSON - return JSON.parse(buffer.toString('utf8')); - }) - ) - ); - } - - const resolvedAssets = await Promise.all(assetArrays); - - const result = {} as Record; - - for (const [index, assetType] of kibanaAssetTypes.entries()) { - const expectedType = KibanaSavedObjectTypeMapping[assetType]; - const properlyTypedAssets = resolvedAssets[index].filter(({ type }) => type === expectedType); - - result[assetType] = properlyTypedAssets; - } + const assetType = getPathParts(path).type as KibanaAssetType; + const soType = KibanaSavedObjectTypeMapping[assetType]; + if (asset.type === soType) { + result[assetType].push(asset); + } + }); return result; } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts index 5369da9da82e20..e66c25e407ff5e 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts @@ -14,6 +14,9 @@ import { SavedObjectsClient } from '@kbn/core/server'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common/constants'; import { SavedObjectsUtils, SavedObjectsErrorHelpers } from '@kbn/core/server'; +import minVersion from 'semver/ranges/min-version'; + +import { chunk } from 'lodash'; import { updateIndexSettings } from '../elasticsearch/index/update_settings'; @@ -29,6 +32,8 @@ import type { EsAssetReference, KibanaAssetReference, Installation, + ArchivePackage, + RegistryPackage, } from '../../../types'; import { deletePipeline } from '../elasticsearch/ingest_pipeline'; import { removeUnusedIndexPatterns } from '../kibana/index_pattern/install'; @@ -43,9 +48,12 @@ import { auditLoggingService } from '../../audit_logging'; import { FleetError, PackageRemovalError } from '../../../errors'; import { populatePackagePolicyAssignedAgentsCount } from '../../package_policies/populate_package_policy_assigned_agents_count'; +import * as Registry from '../registry'; import { getInstallation, kibanaSavedObjectTypes } from '.'; +const MAX_ASSETS_TO_DELETE = 1000; + export async function removeInstallation(options: { savedObjectsClient: SavedObjectsClientContract; pkgName: string; @@ -112,35 +120,71 @@ export async function removeInstallation(options: { return installedAssets; } -async function deleteKibanaAssets( - installedObjects: KibanaAssetReference[], - spaceId: string = DEFAULT_SPACE_ID -) { +/** + * This method deletes saved objects resolving them whenever necessary. + * + * Resolving is needed when deleting assets that were installed in 7.x to + * mitigate the breaking change that occurred in 8.0. This is a memory-intensive + * operation as it requires loading all the saved objects into memory. It is + * generally better to delete assets directly if the package is known to be + * installed in 8.x or later. + */ +async function deleteKibanaAssets({ + installedObjects, + packageInfo, + spaceId = DEFAULT_SPACE_ID, +}: { + installedObjects: KibanaAssetReference[]; + spaceId?: string; + packageInfo: RegistryPackage | ArchivePackage; +}) { const savedObjectsClient = new SavedObjectsClient( appContextService.getSavedObjects().createInternalRepository() ); + const namespace = SavedObjectsUtils.namespaceStringToId(spaceId); - const { resolved_objects: resolvedObjects } = await savedObjectsClient.bulkResolve( - installedObjects, - { namespace } - ); - for (const { saved_object: savedObject } of resolvedObjects) { - auditLoggingService.writeCustomSoAuditLog({ - action: 'get', - id: savedObject.id, - savedObjectType: savedObject.type, - }); - } + const minKibana = packageInfo.conditions?.kibana?.version + ? minVersion(packageInfo.conditions.kibana.version) + : null; - const foundObjects = resolvedObjects.filter( - ({ saved_object: savedObject }) => savedObject?.error?.statusCode !== 404 - ); + // Compare Kibana versions to determine if the package could been installed + // only in 8.x or later. If so, we can skip SO resolution step altogether + // and delete the assets directly. Otherwise, we need to resolve the assets + // which might create high memory pressure if a package has a lot of assets. + if (minKibana && minKibana.major >= 8) { + await bulkDeleteSavedObjects(installedObjects, namespace, savedObjectsClient); + } else { + const { resolved_objects: resolvedObjects } = await savedObjectsClient.bulkResolve( + installedObjects, + { namespace } + ); - // in the case of a partial install, it is expected that some assets will be not found - // we filter these out before calling delete - const assetsToDelete = foundObjects.map(({ saved_object: { id, type } }) => ({ id, type })); + for (const { saved_object: savedObject } of resolvedObjects) { + auditLoggingService.writeCustomSoAuditLog({ + action: 'get', + id: savedObject.id, + savedObjectType: savedObject.type, + }); + } + + const foundObjects = resolvedObjects.filter( + ({ saved_object: savedObject }) => savedObject?.error?.statusCode !== 404 + ); + + // in the case of a partial install, it is expected that some assets will be not found + // we filter these out before calling delete + const assetsToDelete = foundObjects.map(({ saved_object: { id, type } }) => ({ id, type })); + + await bulkDeleteSavedObjects(assetsToDelete, namespace, savedObjectsClient); + } +} +async function bulkDeleteSavedObjects( + assetsToDelete: Array<{ id: string; type: string }>, + namespace: string | undefined, + savedObjectsClient: SavedObjectsClientContract +) { for (const asset of assetsToDelete) { auditLoggingService.writeCustomSoAuditLog({ action: 'delete', @@ -149,7 +193,14 @@ async function deleteKibanaAssets( }); } - return savedObjectsClient.bulkDelete(assetsToDelete, { namespace }); + // Delete assets in chunks to avoid high memory pressure. This is mostly + // relevant for packages containing many assets, as large payload and response + // objects are created in memory during the delete operation. While chunking + // may work slower, it allows garbage collection to clean up memory between + // requests. + for (const assetsChunk of chunk(assetsToDelete, MAX_ASSETS_TO_DELETE)) { + await savedObjectsClient.bulkDelete(assetsChunk, { namespace }); + } } function deleteESAssets( @@ -182,6 +233,8 @@ async function deleteAssets( installed_kibana: installedKibana, installed_kibana_space_id: spaceId = DEFAULT_SPACE_ID, additional_spaces_installed_kibana: installedInAdditionalSpacesKibana = {}, + name, + version, }: Installation, savedObjectsClient: SavedObjectsClientContract, esClient: ElasticsearchClient @@ -234,12 +287,18 @@ async function deleteAssets( // then delete index templates and pipelines await Promise.all(deleteESAssets(indexTemplatesAndPipelines, esClient)); + + const packageInfo = await Registry.fetchInfo(name, version); // then the other asset types await Promise.all([ ...deleteESAssets(otherAssets, esClient), - deleteKibanaAssets(installedKibana, spaceId), + deleteKibanaAssets({ installedObjects: installedKibana, spaceId, packageInfo }), Object.entries(installedInAdditionalSpacesKibana).map(([additionalSpaceId, kibanaAssets]) => - deleteKibanaAssets(kibanaAssets, additionalSpaceId) + deleteKibanaAssets({ + installedObjects: kibanaAssets, + spaceId: additionalSpaceId, + packageInfo, + }) ), ]); } catch (err) { @@ -300,7 +359,16 @@ export async function deleteKibanaSavedObjectsAssets({ .map(({ id, type }) => ({ id, type } as KibanaAssetReference)); try { - await deleteKibanaAssets(assetsToDelete, spaceIdToDelete); + const packageInfo = await Registry.fetchInfo( + installedPkg.attributes.name, + installedPkg.attributes.version + ); + + await deleteKibanaAssets({ + installedObjects: assetsToDelete, + spaceId: spaceIdToDelete, + packageInfo, + }); } catch (err) { // in the rollback case, partial installs are likely, so missing assets are not an error if (!SavedObjectsErrorHelpers.isNotFoundError(err)) { diff --git a/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts b/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts index f00d78cd59ad96..7faea8c5268192 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts @@ -115,6 +115,13 @@ describe('checkFleetServerVersionsForSecretsStorage', () => { version ); expect(result).toBe(true); + expect(mockedGetAgentsByKuery).toHaveBeenCalledWith( + esClientMock, + soClientMock, + expect.objectContaining({ + kuery: 'policy_id:("1" or "2")', + }) + ); }); }); diff --git a/x-pack/plugins/fleet/server/services/fleet_server/index.ts b/x-pack/plugins/fleet/server/services/fleet_server/index.ts index 004a0deeea7b7f..a0d508f0929e93 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/index.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/index.ts @@ -128,11 +128,19 @@ export async function checkFleetServerVersionsForSecretsStorage( hasMore = false; } } + if (policyIds.size === 0) { + return false; + } + + const kuery = `policy_id:(${Array.from(policyIds) + .map((id) => `"${id}"`) + .join(' or ')})`; const managedAgentPolicies = await agentPolicyService.getAllManagedAgentPolicies(soClient); const fleetServerAgents = await getAgentsByKuery(esClient, soClient, { showInactive: true, perPage: SO_SEARCH_LIMIT, + kuery, }); if (fleetServerAgents.agents.length === 0) { diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index e244be59b80126..794269ba78ca69 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -132,6 +132,7 @@ import { import { getPackageAssetsMap } from './epm/packages/get'; import { validateOutputForNewPackagePolicy } from './agent_policies/outputs_helpers'; import type { PackagePolicyClientFetchAllItemIdsOptions } from './package_policy_service'; +import { validatePolicyNamespaceForSpace } from './spaces/policy_namespaces'; export type InputsOverride = Partial & { vars?: Array; @@ -242,6 +243,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { if (!options?.skipUniqueNameVerification) { await requireUniqueName(soClient, enrichedPackagePolicy); } + if (enrichedPackagePolicy.namespace) { + await validatePolicyNamespaceForSpace({ + namespace: enrichedPackagePolicy.namespace, + spaceId: soClient.getCurrentNamespace(), + }); + } let elasticsearchPrivileges: NonNullable['privileges']; let inputs = getInputsWithStreamIds(enrichedPackagePolicy, packagePolicyId); @@ -847,6 +854,13 @@ class PackagePolicyClientImpl implements PackagePolicyClient { await requireUniqueName(soClient, enrichedPackagePolicy, id); } + if (packagePolicy.namespace) { + await validatePolicyNamespaceForSpace({ + namespace: packagePolicy.namespace, + spaceId: soClient.getCurrentNamespace(), + }); + } + // eslint-disable-next-line prefer-const let { version, ...restOfPackagePolicy } = packagePolicy; let inputs = getInputsWithStreamIds(restOfPackagePolicy, oldPackagePolicy.id); diff --git a/x-pack/plugins/fleet/server/services/preconfiguration/space_settings.ts b/x-pack/plugins/fleet/server/services/preconfiguration/space_settings.ts new file mode 100644 index 00000000000000..f3cdb4de81d1b6 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/preconfiguration/space_settings.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { TypeOf } from '@kbn/config-schema'; +import type { SavedObjectsFindResult } from '@kbn/core-saved-objects-api-server'; +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; +import deepEqual from 'fast-deep-equal'; + +import { appContextService } from '..'; +import { SO_SEARCH_LIMIT, SPACE_SETTINGS_SAVED_OBJECT_TYPE } from '../../constants'; +import type { PreconfiguredSpaceSettingsSchema, SpaceSettingsSOAttributes } from '../../types'; +import { saveSpaceSettings } from '../spaces/space_settings'; + +export async function ensureSpaceSettings( + configSpaceSettingsArray: TypeOf +) { + const soClient = appContextService.getInternalUserSOClientWithoutSpaceExtension(); + + // Get all existing config space + const existingConfigSpaceSettingsSOs = await soClient.find({ + type: SPACE_SETTINGS_SAVED_OBJECT_TYPE, + perPage: SO_SEARCH_LIMIT, + namespaces: ['*'], + }); + + const existingConfigSpaceSettingsSOMap = existingConfigSpaceSettingsSOs.saved_objects.reduce( + (acc, so) => { + acc.set(so.namespaces?.[0] ?? DEFAULT_SPACE_ID, so); + + return acc; + }, + new Map>() + ); + + for (const configSpaceSettings of configSpaceSettingsArray) { + // Check for existing + const existingConfigSpaceSettingsSO = existingConfigSpaceSettingsSOMap.get( + configSpaceSettings.space_id + ); + + if (!existingConfigSpaceSettingsSO) { + await saveSpaceSettings({ + spaceId: configSpaceSettings.space_id, + settings: { + allowed_namespace_prefixes: configSpaceSettings.allowed_namespace_prefixes, + managed_by: 'kibana_config', + }, + managedBy: 'kibana_config', + }); + } else if ( + !deepEqual( + existingConfigSpaceSettingsSO.attributes.allowed_namespace_prefixes, + configSpaceSettings.allowed_namespace_prefixes + ) || + !existingConfigSpaceSettingsSO.attributes.managed_by + ) { + await saveSpaceSettings({ + spaceId: configSpaceSettings.space_id, + settings: { + allowed_namespace_prefixes: configSpaceSettings.allowed_namespace_prefixes, + managed_by: 'kibana_config', + }, + managedBy: 'kibana_config', + }); + } + } + + for (const spaceId of existingConfigSpaceSettingsSOMap.keys()) { + if ( + !configSpaceSettingsArray.some( + (config) => + config.space_id === spaceId && + existingConfigSpaceSettingsSOMap.get(spaceId)?.attributes?.managed_by === 'kibana_config' + ) + ) { + await saveSpaceSettings({ + spaceId, + settings: { + managed_by: null, + }, + managedBy: 'kibana_config', + }); + } + } +} diff --git a/x-pack/plugins/fleet/server/services/setup.test.ts b/x-pack/plugins/fleet/server/services/setup.test.ts index 03a52c27abffeb..5e88fac35e1405 100644 --- a/x-pack/plugins/fleet/server/services/setup.test.ts +++ b/x-pack/plugins/fleet/server/services/setup.test.ts @@ -20,6 +20,7 @@ import { setupFleet } from './setup'; jest.mock('./preconfiguration'); jest.mock('./preconfiguration/outputs'); jest.mock('./preconfiguration/fleet_proxies'); +jest.mock('./preconfiguration/space_settings'); jest.mock('./settings'); jest.mock('./output'); jest.mock('./download_source'); diff --git a/x-pack/plugins/fleet/server/services/setup.ts b/x-pack/plugins/fleet/server/services/setup.ts index a1df9c7d9d609f..e59eb229ad8e58 100644 --- a/x-pack/plugins/fleet/server/services/setup.ts +++ b/x-pack/plugins/fleet/server/services/setup.ts @@ -52,6 +52,7 @@ import { import { cleanUpOldFileIndices } from './setup/clean_old_fleet_indices'; import type { UninstallTokenInvalidError } from './security/uninstall_token_service'; import { ensureAgentPoliciesFleetServerKeysAndPolicies } from './setup/fleet_server_policies_enrollment_keys'; +import { ensureSpaceSettings } from './preconfiguration/space_settings'; export interface SetupStatus { isInitialized: boolean; @@ -191,6 +192,9 @@ async function createSetupSideEffects( getPreconfiguredFleetServerHostFromConfig(appContextService.getConfig()) ); + logger.debug('Setting up Space settings'); + await ensureSpaceSettings(appContextService.getConfig()?.spaceSettings ?? []); + logger.debug('Setting up Fleet outputs'); await Promise.all([ ensurePreconfiguredOutputs( diff --git a/x-pack/plugins/fleet/server/services/spaces/policy_namespaces.test.ts b/x-pack/plugins/fleet/server/services/spaces/policy_namespaces.test.ts new file mode 100644 index 00000000000000..8cee5b4e618be4 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/spaces/policy_namespaces.test.ts @@ -0,0 +1,118 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; + +import { appContextService } from '../app_context'; + +import { validatePolicyNamespaceForSpace } from './policy_namespaces'; + +jest.mock('../app_context'); + +describe('validatePolicyNamespaceForSpace', () => { + function createSavedsClientMock(settingsAttributes?: any) { + const client = savedObjectsClientMock.create(); + + if (settingsAttributes) { + client.get.mockResolvedValue({ + attributes: settingsAttributes, + } as any); + } else { + client.get.mockRejectedValue( + SavedObjectsErrorHelpers.createGenericNotFoundError('Not found') + ); + } + + jest.mocked(appContextService.getInternalUserSOClientForSpaceId).mockReturnValue(client); + + return client; + } + + beforeEach(() => { + jest + .mocked(appContextService.getExperimentalFeatures) + .mockReturnValue({ useSpaceAwareness: true } as any); + }); + + it('should retrieve settings based on given spaceId', async () => { + const soClient = createSavedsClientMock(); + await validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'test', + }); + + expect(soClient.get).toBeCalledWith('fleet-space-settings', 'test1-default-settings'); + }); + + it('should retrieve default space settings based if no spaceId is provided', async () => { + const soClient = createSavedsClientMock(); + await validatePolicyNamespaceForSpace({ + namespace: 'test', + }); + + expect(soClient.get).toBeCalledWith('fleet-space-settings', 'default-default-settings'); + }); + + it('should accept valid namespace if there is some allowed_namespace_prefixes configured', async () => { + createSavedsClientMock({ + allowed_namespace_prefixes: ['tata', 'test', 'toto'], + }); + await validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'test', + }); + }); + + it('should accept valid namespace matching prefix if there is some allowed_namespace_prefixes configured', async () => { + createSavedsClientMock({ + allowed_namespace_prefixes: ['tata', 'test', 'toto'], + }); + await validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'testvalid', + }); + }); + + it('should accept any namespace if there is no settings configured', async () => { + createSavedsClientMock(); + await validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'testvalid', + }); + }); + + it('should accept any namespace if there is no allowed_namespace_prefixes configured', async () => { + createSavedsClientMock(); + await validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'testvalid', + }); + }); + + it('should throw if the namespace is not matching allowed_namespace_prefixes', async () => { + createSavedsClientMock({ allowed_namespace_prefixes: ['tata', 'test', 'toto'] }); + await expect( + validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'notvalid', + }) + ).rejects.toThrowError(/Invalid namespace, supported namespace prefixes: tata, test, toto/); + }); + + it('should not validate if feature flag is off', async () => { + jest + .mocked(appContextService.getExperimentalFeatures) + .mockReturnValue({ useSpaceAwareness: false } as any); + createSavedsClientMock({ allowed_namespace_prefixes: ['tata', 'test', 'toto'] }); + + await validatePolicyNamespaceForSpace({ + spaceId: 'test1', + namespace: 'notvalid', + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/spaces/policy_namespaces.ts b/x-pack/plugins/fleet/server/services/spaces/policy_namespaces.ts new file mode 100644 index 00000000000000..f3d7ee303985c5 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/spaces/policy_namespaces.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { appContextService } from '../app_context'; +import { PolicyNamespaceValidationError } from '../../../common/errors'; + +import { getSpaceSettings } from './space_settings'; + +export async function validatePolicyNamespaceForSpace({ + namespace, + spaceId, +}: { + namespace: string; + spaceId?: string; +}) { + const experimentalFeature = appContextService.getExperimentalFeatures(); + if (!experimentalFeature.useSpaceAwareness) { + return; + } + const settings = await getSpaceSettings(spaceId); + if (!settings.allowed_namespace_prefixes || settings.allowed_namespace_prefixes.length === 0) { + return; + } + + let valid = false; + for (const allowedNamespacePrefix of settings.allowed_namespace_prefixes) { + if (namespace.startsWith(allowedNamespacePrefix)) { + valid = true; + break; + } + } + + if (!valid) { + throw new PolicyNamespaceValidationError( + `Invalid namespace, supported namespace prefixes: ${settings.allowed_namespace_prefixes.join( + ', ' + )}` + ); + } +} diff --git a/x-pack/plugins/fleet/server/services/spaces/space_settings.test.ts b/x-pack/plugins/fleet/server/services/spaces/space_settings.test.ts new file mode 100644 index 00000000000000..a0db98c84e972e --- /dev/null +++ b/x-pack/plugins/fleet/server/services/spaces/space_settings.test.ts @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; + +import { appContextService } from '../app_context'; + +import { saveSpaceSettings } from './space_settings'; + +jest.mock('../app_context'); + +describe('saveSpaceSettings', () => { + function createSavedsClientMock(settingsAttributes?: any) { + const client = savedObjectsClientMock.create(); + + if (settingsAttributes) { + client.get.mockResolvedValue({ + attributes: settingsAttributes, + } as any); + } else { + client.get.mockRejectedValue( + SavedObjectsErrorHelpers.createGenericNotFoundError('Not found') + ); + } + + jest.mocked(appContextService.getInternalUserSOClientForSpaceId).mockReturnValue(client); + + return client; + } + describe('saved managedBy settings', () => { + it('should work if saved with managedBy:kibana_config and previous settings did not exists', async () => { + const soClient = createSavedsClientMock(); + await saveSpaceSettings({ + spaceId: 'test', + managedBy: 'kibana_config', + settings: { + allowed_namespace_prefixes: ['test'], + managed_by: 'kibana_config', + }, + }); + expect(soClient.update).toBeCalledWith( + 'fleet-space-settings', + 'test-default-settings', + { allowed_namespace_prefixes: ['test'], managed_by: 'kibana_config' }, + expect.anything() + ); + }); + + it('should work if saved with managedBy:kibana_config and previous settings is managedBy:kibana_config', async () => { + const soClient = createSavedsClientMock({ + managed_by: 'kibana_config', + }); + await saveSpaceSettings({ + spaceId: 'test', + managedBy: 'kibana_config', + settings: { + allowed_namespace_prefixes: ['test'], + managed_by: 'kibana_config', + }, + }); + expect(soClient.update).toBeCalledWith( + 'fleet-space-settings', + 'test-default-settings', + { allowed_namespace_prefixes: ['test'], managed_by: 'kibana_config' }, + expect.anything() + ); + }); + + it('should work if saved with managedBy:kibana_config and previous settings is not managedBy:kibana_config', async () => { + const so = createSavedsClientMock({}); + await saveSpaceSettings({ + spaceId: 'test', + managedBy: 'kibana_config', + settings: { + allowed_namespace_prefixes: ['test'], + managed_by: 'kibana_config', + }, + }); + expect(so.update).toBeCalledWith( + 'fleet-space-settings', + 'test-default-settings', + { allowed_namespace_prefixes: ['test'], managed_by: 'kibana_config' }, + expect.anything() + ); + }); + + it('should throw if called without managedBy:kibana_config and previous settings is managedBy:kibana_config', async () => { + createSavedsClientMock({ managed_by: 'kibana_config' }); + await expect( + saveSpaceSettings({ + spaceId: 'test', + settings: { + allowed_namespace_prefixes: ['test'], + }, + }) + ).rejects.toThrowError(/Settings are managed by: kibana_config and should be edited there/); + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/spaces/space_settings.ts b/x-pack/plugins/fleet/server/services/spaces/space_settings.ts new file mode 100644 index 00000000000000..ece0291ff4f7cb --- /dev/null +++ b/x-pack/plugins/fleet/server/services/spaces/space_settings.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; +import { SavedObjectsErrorHelpers } from '@kbn/core/server'; + +import { SPACE_SETTINGS_ID_SUFFIX } from '../../../common/constants'; +import { appContextService } from '../app_context'; +import { SPACE_SETTINGS_SAVED_OBJECT_TYPE } from '../../constants'; +import type { SpaceSettingsSOAttributes } from '../../types'; +import { FleetUnauthorizedError } from '../..'; + +function _getSavedObjectId(spaceId?: string) { + if (!spaceId || spaceId === DEFAULT_SPACE_ID) { + return `${DEFAULT_SPACE_ID}${SPACE_SETTINGS_ID_SUFFIX}`; + } + + return `${spaceId}${SPACE_SETTINGS_ID_SUFFIX}`; +} + +export async function getSpaceSettings(spaceId?: string) { + const soClient = appContextService.getInternalUserSOClientForSpaceId(spaceId); + + const settings = await soClient + .get(SPACE_SETTINGS_SAVED_OBJECT_TYPE, _getSavedObjectId(spaceId)) + .catch((err) => { + if (SavedObjectsErrorHelpers.isNotFoundError(err)) { + return undefined; + } + throw err; + }); + + return { + allowed_namespace_prefixes: settings?.attributes?.allowed_namespace_prefixes ?? [], + managed_by: settings?.attributes?.managed_by, + }; +} + +export async function saveSpaceSettings({ + settings, + spaceId, + managedBy, +}: { + settings: Partial; + spaceId?: string; + managedBy?: 'kibana_config'; +}) { + const soClient = appContextService.getInternalUserSOClientForSpaceId(spaceId); + + const originalSettings = await getSpaceSettings(spaceId); + if (originalSettings.managed_by && originalSettings.managed_by !== managedBy) { + throw new FleetUnauthorizedError( + `Settings are managed by: ${originalSettings.managed_by} and should be edited there` + ); + } + + await soClient.update( + SPACE_SETTINGS_SAVED_OBJECT_TYPE, + _getSavedObjectId(spaceId), + settings, + { + upsert: settings, + } + ); +} diff --git a/x-pack/plugins/fleet/server/types/models/preconfiguration.ts b/x-pack/plugins/fleet/server/types/models/preconfiguration.ts index 37786ab2072491..6216eb4bbd3269 100644 --- a/x-pack/plugins/fleet/server/types/models/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/types/models/preconfiguration.ts @@ -195,3 +195,23 @@ export const PreconfiguredAgentPoliciesSchema = schema.arrayOf( defaultValue: [], } ); + +export const PreconfiguredSpaceSettingsSchema = schema.arrayOf( + schema.object({ + space_id: schema.string(), + allowed_namespace_prefixes: schema.nullable( + schema.arrayOf( + schema.string({ + validate: (v) => { + if (v.includes('-')) { + return 'Must not contain -'; + } + }, + }) + ) + ), + }), + { + defaultValue: [], + } +); diff --git a/x-pack/plugins/fleet/server/types/rest_spec/settings.test.ts b/x-pack/plugins/fleet/server/types/rest_spec/settings.test.ts new file mode 100644 index 00000000000000..703f01fe82d372 --- /dev/null +++ b/x-pack/plugins/fleet/server/types/rest_spec/settings.test.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PutSpaceSettingsRequestSchema } from './settings'; + +describe('PutSpaceSettingsRequestSchema', () => { + it('should work with valid allowed_namespace_prefixes', () => { + PutSpaceSettingsRequestSchema.body.validate({ + allowed_namespace_prefixes: ['test', 'test2'], + }); + }); + + it('should not accept allowed_namespace_prefixes with -', () => { + expect(() => + PutSpaceSettingsRequestSchema.body.validate({ + allowed_namespace_prefixes: ['test', 'test-'], + }) + ).toThrowErrorMatchingInlineSnapshot(`"[allowed_namespace_prefixes.1]: Must not contain -"`); + }); +}); diff --git a/x-pack/plugins/fleet/server/types/rest_spec/settings.ts b/x-pack/plugins/fleet/server/types/rest_spec/settings.ts index c6eb10e0cc52f0..10db7b0f4def7b 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/settings.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/settings.ts @@ -39,6 +39,24 @@ export const PutSettingsRequestSchema = { }), }; +export const GetSpaceSettingsRequestSchema = {}; + +export const PutSpaceSettingsRequestSchema = { + body: schema.object({ + allowed_namespace_prefixes: schema.maybe( + schema.arrayOf( + schema.string({ + validate: (v) => { + if (v.includes('-')) { + return 'Must not contain -'; + } + }, + }) + ) + ), + }), +}; + export const GetEnrollmentSettingsRequestSchema = { query: schema.maybe( schema.object({ diff --git a/x-pack/plugins/fleet/server/types/so_attributes.ts b/x-pack/plugins/fleet/server/types/so_attributes.ts index 024718c6f49700..79640a0f90e129 100644 --- a/x-pack/plugins/fleet/server/types/so_attributes.ts +++ b/x-pack/plugins/fleet/server/types/so_attributes.ts @@ -239,6 +239,11 @@ export interface SettingsSOAttributes { output_secret_storage_requirements_met?: boolean; } +export interface SpaceSettingsSOAttributes { + allowed_namespace_prefixes?: string[] | null; + managed_by?: 'kibana_config' | null; +} + export interface DownloadSourceSOAttributes { name: string; host: string; diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index 8986527bed9777..b45bd90010b42e 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -64,7 +64,6 @@ "@kbn/utility-types-jest", "@kbn/es-query", "@kbn/ui-theme", - "@kbn/rison", "@kbn/config-schema", "@kbn/telemetry-plugin", "@kbn/task-manager-plugin", diff --git a/x-pack/plugins/global_search_bar/kibana.jsonc b/x-pack/plugins/global_search_bar/kibana.jsonc index 552ee46e6e41d8..6412f7c8ed8902 100644 --- a/x-pack/plugins/global_search_bar/kibana.jsonc +++ b/x-pack/plugins/global_search_bar/kibana.jsonc @@ -4,7 +4,7 @@ "owner": "@elastic/appex-sharedux", "plugin": { "id": "globalSearchBar", - "server": false, + "server": true, "browser": true, "configPath": [ "xpack", diff --git a/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx b/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx index 7783cc94cfdba7..748d3ba18ca033 100644 --- a/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx +++ b/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx @@ -12,9 +12,13 @@ import { FormattedMessage } from '@kbn/i18n-react'; interface PopoverPlaceholderProps { basePath: string; + customPlaceholderMessage?: React.ReactNode; } -export const PopoverPlaceholder: FC = ({ basePath }) => { +export const PopoverPlaceholder: FC = ({ + basePath, + customPlaceholderMessage, +}) => { const { colorMode } = useEuiTheme(); return ( @@ -37,21 +41,25 @@ export const PopoverPlaceholder: FC = ({ basePath }) => }.svg`} /> - -

- -

-
+ {customPlaceholderMessage ?? ( + <> + +

+ +

+
-

- -

+

+ +

+ + )} ); diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx index 479c3e546dc9cf..e9faef5e7073d4 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx @@ -45,6 +45,9 @@ const createResult = (result: Result): GlobalSearchResult => { const createBatch = (...results: Result[]): GlobalSearchBatchedResults => ({ results: results.map(createResult), }); + +const searchCharLimit = 1000; + jest.useFakeTimers({ legacyFakeTimers: true }); describe('SearchBar', () => { @@ -89,6 +92,37 @@ describe('SearchBar', () => { expect(await screen.findAllByTestId('nav-search-option')).toHaveLength(list.length); }; + describe('default behavior', () => { + it('displays an error message without making a network call when the search input exceeds the specified char limit', async () => { + const chromeStyle$ = of('classic'); + + render( + + + + ); + + expect(searchService.find).toHaveBeenCalledTimes(0); + + await focusAndUpdate(); + + expect(searchService.find).toHaveBeenCalledTimes(1); + + simulateTypeChar(Array.from(new Array(searchCharLimit + 1)).reduce((acc) => acc + 'a', '')); + + // we use allBy because EUI renders a screen reader only version, along side the visual one + expect(await screen.findAllByTestId('searchCharLimitExceededMessageHeading')).toHaveLength(2); + + expect(searchService.find).toHaveBeenCalledTimes(1); + }); + }); + describe('chromeStyle: classic', () => { const chromeStyle$ = of('classic'); @@ -105,7 +139,7 @@ describe('SearchBar', () => { render( { render( { render( { render( { render( { return ; }; +const SearchCharLimitExceededMessage = (props: { basePathUrl: string }) => { + const charLimitMessage = ( + <> + +

+ +

+
+

+ +

+ + ); + + return ( + + ); +}; + const EmptyMessage = () => ( @@ -72,6 +99,7 @@ export const SearchBar: FC = (opts) => { const [showAppend, setShowAppend] = useState(true); const UNKNOWN_TAG_ID = '__unknown__'; const [isLoading, setIsLoading] = useState(false); + const [searchCharLimitExceeded, setSearchCharLimitExceeded] = useState(false); useEffect(() => { if (initialLoad) { @@ -127,11 +155,20 @@ export const SearchBar: FC = (opts) => { searchSubscription.current = null; } + if (searchValue.length > globalSearch.searchCharLimit) { + // setting this will display an error message to the user + setSearchCharLimitExceeded(true); + return; + } else { + setSearchCharLimitExceeded(false); + } + setIsLoading(true); const suggestions = loadSuggestions(searchValue.toLowerCase()); setIsLoading(false); let aggregatedResults: GlobalSearchResult[] = []; + if (searchValue.length !== 0) { reportEvent.searchRequest(); } @@ -361,6 +398,7 @@ export const SearchBar: FC = (opts) => { fullWidth: true, append: getAppendForChromeStyle(), }} + errorMessage={searchCharLimitExceeded ? : null} emptyMessage={} noMatchesMessage={} popoverProps={{ diff --git a/x-pack/plugins/global_search_bar/public/components/types.ts b/x-pack/plugins/global_search_bar/public/components/types.ts index de0af36624db28..fbcf7c523053b8 100644 --- a/x-pack/plugins/global_search_bar/public/components/types.ts +++ b/x-pack/plugins/global_search_bar/public/components/types.ts @@ -14,7 +14,7 @@ import { EventReporter } from '../telemetry'; /* @internal */ export interface SearchBarProps { - globalSearch: GlobalSearchPluginStart; + globalSearch: GlobalSearchPluginStart & { searchCharLimit: number }; navigateToUrl: ApplicationStart['navigateToUrl']; reportEvent: EventReporter; taggingApi?: SavedObjectTaggingPluginStart; diff --git a/x-pack/plugins/global_search_bar/public/index.ts b/x-pack/plugins/global_search_bar/public/index.ts index f6676587f83a46..c0923806655633 100644 --- a/x-pack/plugins/global_search_bar/public/index.ts +++ b/x-pack/plugins/global_search_bar/public/index.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { PluginInitializer } from '@kbn/core/public'; +import type { PluginInitializer } from '@kbn/core/public'; import { GlobalSearchBarPlugin } from './plugin'; -export const plugin: PluginInitializer<{}, {}, {}, {}> = () => new GlobalSearchBarPlugin(); +export const plugin: PluginInitializer<{}, {}, {}, {}> = (initializerContext) => + new GlobalSearchBarPlugin(initializerContext); diff --git a/x-pack/plugins/global_search_bar/public/plugin.test.ts b/x-pack/plugins/global_search_bar/public/plugin.test.ts new file mode 100644 index 00000000000000..f665fbb1e28180 --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/plugin.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { coreMock } from '@kbn/core/public/mocks'; +import { globalSearchPluginMock } from '@kbn/global-search-plugin/public/mocks'; +import { GlobalSearchBarPlugin } from './plugin'; + +describe('GlobalSearchBarPlugin', () => { + describe('start', () => { + it('registers nav controls', async () => { + const coreSetup = coreMock.createSetup(); + + const service = new GlobalSearchBarPlugin( + coreMock.createPluginInitializerContext({ + input_max_limit: 2000, + }) + ); + + service.setup(coreSetup); + + const coreStart = coreMock.createStart(); + + const navControlsRegisterSpy = jest.spyOn(coreStart.chrome.navControls, 'registerCenter'); + + const start = service.start(coreStart, { + globalSearch: globalSearchPluginMock.createStartContract(), + }); + + expect(start).toEqual({}); + + expect(navControlsRegisterSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/global_search_bar/public/plugin.tsx b/x-pack/plugins/global_search_bar/public/plugin.tsx index 00cddfb65534fa..e8fbe2f7e2bf13 100644 --- a/x-pack/plugins/global_search_bar/public/plugin.tsx +++ b/x-pack/plugins/global_search_bar/public/plugin.tsx @@ -5,7 +5,13 @@ * 2.0. */ -import { ChromeNavControl, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; +import { + ChromeNavControl, + CoreSetup, + CoreStart, + Plugin, + PluginInitializerContext, +} from '@kbn/core/public'; import { GlobalSearchPluginStart } from '@kbn/global-search-plugin/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; @@ -13,6 +19,7 @@ import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import React from 'react'; import ReactDOM from 'react-dom'; import { SearchBar } from './components/search_bar'; +import type { GlobalSearchBarConfigType } from './types'; import { EventReporter, eventTypes } from './telemetry'; export interface GlobalSearchBarPluginStartDeps { @@ -22,6 +29,12 @@ export interface GlobalSearchBarPluginStartDeps { } export class GlobalSearchBarPlugin implements Plugin<{}, {}, {}, GlobalSearchBarPluginStartDeps> { + private config: GlobalSearchBarConfigType; + + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + } + public setup({ analytics }: CoreSetup) { eventTypes.forEach((eventType) => { analytics.registerEventType(eventType); @@ -46,7 +59,7 @@ export class GlobalSearchBarPlugin implements Plugin<{}, {}, {}, GlobalSearchBar ReactDOM.render( ({ results: results.map(createResult), }); +const searchCharLimit = 1000; + describe('SearchBar', () => { const usageCollection = usageCollectionPluginMock.createSetupContract(); const core = coreMock.createStart(); @@ -110,7 +112,7 @@ describe('SearchBar', () => { render( { render( { render( { render( { render( { render( { render( ; + +export const config: PluginConfigDescriptor = { + schema: configSchema, + exposeToBrowser: { + input_max_limit: true, + }, +}; diff --git a/x-pack/plugins/lists/common/api/exceptions/export_list_item/export_list_item_route.ts b/x-pack/plugins/global_search_bar/server/index.ts similarity index 59% rename from x-pack/plugins/lists/common/api/exceptions/export_list_item/export_list_item_route.ts rename to x-pack/plugins/global_search_bar/server/index.ts index d2870f139da5f1..6d9d80cadf884e 100644 --- a/x-pack/plugins/lists/common/api/exceptions/export_list_item/export_list_item_route.ts +++ b/x-pack/plugins/global_search_bar/server/index.ts @@ -5,6 +5,9 @@ * 2.0. */ -import { exportListItemQuerySchema } from '@kbn/securitysolution-io-ts-list-types'; +export const plugin = async () => { + const { GlobalSearchBarPlugin } = await import('./plugin'); + return new GlobalSearchBarPlugin(); +}; -export { exportListItemQuerySchema as exportListItemRequestQuery }; +export { config } from './config'; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/index_management/read_privileges/read_privileges_route.ts b/x-pack/plugins/global_search_bar/server/plugin.ts similarity index 64% rename from x-pack/plugins/security_solution/common/api/detection_engine/index_management/read_privileges/read_privileges_route.ts rename to x-pack/plugins/global_search_bar/server/plugin.ts index 8645f5c4abff18..6fb323de8a3bf0 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/index_management/read_privileges/read_privileges_route.ts +++ b/x-pack/plugins/global_search_bar/server/plugin.ts @@ -5,7 +5,12 @@ * 2.0. */ -export interface ReadPrivilegesResponse { - is_authenticated: boolean; - has_encryption_key: boolean; +import { Plugin } from '@kbn/core/server'; + +export class GlobalSearchBarPlugin implements Plugin { + setup() {} + + start() {} + + stop() {} } diff --git a/x-pack/plugins/global_search_bar/tsconfig.json b/x-pack/plugins/global_search_bar/tsconfig.json index f566b0d86eddcb..188f9e005c893f 100644 --- a/x-pack/plugins/global_search_bar/tsconfig.json +++ b/x-pack/plugins/global_search_bar/tsconfig.json @@ -15,6 +15,7 @@ "@kbn/saved-objects-tagging-oss-plugin", "@kbn/core-chrome-browser", "@kbn/react-kibana-context-render", + "@kbn/config-schema", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts b/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts index f83c6405369b7f..fdbde1c58de81c 100644 --- a/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts +++ b/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts @@ -5,8 +5,8 @@ * 2.0. */ -import levenshtein from 'js-levenshtein'; import { PublicAppInfo, PublicAppDeepLinkInfo, AppCategory } from '@kbn/core/public'; +import { distance } from 'fastest-levenshtein'; import { GlobalSearchProviderResult } from '@kbn/global-search-plugin/public'; /** Type used internally to represent an application unrolled into its separate deepLinks */ @@ -80,10 +80,10 @@ const scoreAppByTerms = (term: string, title: string): number => { return 75; } const length = Math.max(term.length, title.length); - const distance = levenshtein(term, title); + const dist = distance(term, title); // maximum lev distance is length, we compute the match ratio (lower distance is better) - const ratio = Math.floor((1 - distance / length) * 100); + const ratio = Math.floor((1 - dist / length) * 100); if (ratio >= 60) { return ratio; } diff --git a/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.helpers.ts b/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.helpers.ts index 12237a05e73593..6791cb283d8362 100644 --- a/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.helpers.ts +++ b/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.helpers.ts @@ -7,6 +7,7 @@ import { HttpSetup } from '@kbn/core/public'; import { + createDeleteSearchableSnapshotActions, createMinAgeActions, createSavePolicyAction, createSnapshotPolicyActions, @@ -31,6 +32,7 @@ export const setupDeleteTestBed = async (httpSetup: HttpSetup) => { isShown: () => exists('delete-phase'), ...createMinAgeActions(testBed, 'delete'), ...createSnapshotPolicyActions(testBed), + ...createDeleteSearchableSnapshotActions(testBed), }, }, }; diff --git a/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.test.ts b/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.test.ts index df6dd516c8a58e..a875470dabb353 100644 --- a/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.test.ts +++ b/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/features/delete_phase.test.ts @@ -156,4 +156,34 @@ describe(' delete phase', () => { expect(actions.delete.hasPolicyErrorCallout()).toBeTruthy(); }); }); + + describe('delete searchable snapshot', () => { + test('correctly updates the value', async () => { + const { actions } = testBed; + + await actions.delete.toggleDeleteSearchableSnapshot(); + await actions.savePolicy(); + + const expected = { + phases: { + ...DELETE_PHASE_POLICY.policy.phases, + delete: { + ...DELETE_PHASE_POLICY.policy.phases.delete, + actions: { + ...DELETE_PHASE_POLICY.policy.phases.delete?.actions, + delete: { + delete_searchable_snapshot: false, + }, + }, + }, + }, + name: DELETE_PHASE_POLICY.name, + }; + + expect(httpSetup.post).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/policies`, + expect.objectContaining({ body: JSON.stringify(expected) }) + ); + }); + }); }); diff --git a/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/serialization/policy_serialization.test.ts b/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/serialization/policy_serialization.test.ts index 05aa66fcc5f252..9892e4394d66c7 100644 --- a/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/serialization/policy_serialization.test.ts +++ b/x-pack/plugins/index_lifecycle_management/integration_tests/edit_policy/serialization/policy_serialization.test.ts @@ -671,7 +671,9 @@ describe(' serialization', () => { expect(parsedReqBody.phases.delete).toEqual({ min_age: '365d', actions: { - delete: {}, + delete: { + delete_searchable_snapshot: true, + }, wait_for_snapshot: { policy: 'test', }, diff --git a/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/delete_searchable_snapshot_actions.ts b/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/delete_searchable_snapshot_actions.ts new file mode 100644 index 00000000000000..341b91b893234e --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/delete_searchable_snapshot_actions.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TestBed } from '@kbn/test-jest-helpers'; +import { createFormToggleAction } from './form_toggle_action'; + +export const createDeleteSearchableSnapshotActions = (testBed: TestBed) => { + const toggleSelector = `deleteSearchableSnapshotSwitch`; + return { + toggleDeleteSearchableSnapshot: createFormToggleAction(testBed, toggleSelector), + }; +}; diff --git a/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/index.ts b/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/index.ts index fefbd0363d4499..6c0809d44002a6 100644 --- a/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/index.ts +++ b/x-pack/plugins/index_lifecycle_management/integration_tests/helpers/actions/index.ts @@ -30,3 +30,4 @@ export { createDeletePhaseActions, } from './phases'; export { createRequestFlyoutActions } from './request_flyout_actions'; +export { createDeleteSearchableSnapshotActions } from './delete_searchable_snapshot_actions'; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_phase.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_phase.tsx index 874b98361de40d..368b8872a0cd56 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_phase.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_phase.tsx @@ -6,9 +6,20 @@ */ import React, { FunctionComponent } from 'react'; +import { DeleteSearchableSnapshotField } from './delete_searchable_snapshot_field'; import { Phase } from '../phase'; import { SnapshotPoliciesField } from '../shared_fields'; export const DeletePhase: FunctionComponent = () => { - return } />; + return ( + + + + + } + /> + ); }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_searchable_snapshot_field.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_searchable_snapshot_field.tsx new file mode 100644 index 00000000000000..5e19894843ff63 --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/delete_phase/delete_searchable_snapshot_field.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiTextColor } from '@elastic/eui'; +import { LearnMoreLink } from '../../learn_more_link'; +import { ToggleFieldWithDescribedFormRow } from '../../described_form_row'; +import { useKibana } from '../../../../../../shared_imports'; + +export const DeleteSearchableSnapshotField: React.FunctionComponent = () => { + const { docLinks } = useKibana().services; + return ( + + + + } + description={ + + {' '} + + + } + fullWidth + titleSize="xs" + switchProps={{ + 'data-test-subj': `deleteSearchableSnapshotSwitch`, + path: `phases.delete.actions.delete.delete_searchable_snapshot`, + }} + > +
+ + ); +}; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/schema.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/schema.ts index 2299cd2fed3444..c5a499f94d7a0f 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/schema.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/schema.ts @@ -520,6 +520,17 @@ export const getSchema = (isCloudEnabled: boolean): FormSchema => ({ ), }, }, + delete: { + delete_searchable_snapshot: { + label: i18n.translate( + 'xpack.indexLifecycleMgmt.editPolicy.deleteSearchableSnapshotFieldLabel', + { + defaultMessage: 'Delete searchable snapshot', + } + ), + defaultValue: true, + }, + }, }, }, }, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts index 91dd4d26c2a5b7..d80b08b96dacc0 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts @@ -61,7 +61,7 @@ export interface IndexDetailsPageTestBed extends TestBed { selectInferenceIdButtonExists: () => void; openSelectInferencePopover: () => void; expectDefaultInferenceModelToExists: () => void; - expectCustomInferenceModelToExists: (customInference: string) => Promise; + expectCustomInferenceModelToExists: (customInference: string) => void; }; settings: { getCodeBlockContent: () => string; @@ -317,23 +317,23 @@ export const setup = async ({ expect(exists('fieldTypesOptions-semantic_text')).toBe(false); }); }, - isReferenceFieldVisible: async () => { - expect(exists('referenceField.select')).toBe(true); + isReferenceFieldVisible: () => { + expect(exists('referenceFieldSelect')).toBe(true); }, - selectInferenceIdButtonExists: async () => { + selectInferenceIdButtonExists: () => { expect(exists('selectInferenceId')).toBe(true); expect(exists('inferenceIdButton')).toBe(true); find('inferenceIdButton').simulate('click'); }, - openSelectInferencePopover: async () => { + openSelectInferencePopover: () => { expect(exists('addInferenceEndpointButton')).toBe(true); expect(exists('manageInferenceEndpointButton')).toBe(true); }, - expectDefaultInferenceModelToExists: async () => { - expect(exists('default-inference_elser_model_2')).toBe(true); - expect(exists('default-inference_e5')).toBe(true); + expectDefaultInferenceModelToExists: () => { + expect(exists('custom-inference_elser_model_2')).toBe(true); + expect(exists('custom-inference_e5')).toBe(true); }, - expectCustomInferenceModelToExists: async (customInference: string) => { + expectCustomInferenceModelToExists: (customInference: string) => { expect(exists(customInference)).toBe(true); }, }; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index 9998dbf0e98741..298ad1f9af02c7 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -69,6 +69,7 @@ describe('', () => { httpRequestsMockHelpers.setLoadIndexStatsResponse(testIndexName, testIndexStats); httpRequestsMockHelpers.setLoadIndexMappingResponse(testIndexName, testIndexMappings); httpRequestsMockHelpers.setLoadIndexSettingsResponse(testIndexName, testIndexSettings); + httpRequestsMockHelpers.setInferenceModels([]); await act(async () => { testBed = await setup({ @@ -692,6 +693,7 @@ describe('', () => { ml: { mlApi: { trainedModels: { + getModelsDownloadStatus: jest.fn().mockResolvedValue({}), getTrainedModels: jest.fn().mockResolvedValue([ { model_id: '.elser_model_2', diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx index c734943ec45920..43bf8073de0aaf 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx @@ -5,13 +5,20 @@ * 2.0. */ +import { + Form, + useForm, +} from '../../../public/application/components/mappings_editor/shared_imports'; import { registerTestBed } from '@kbn/test-jest-helpers'; import { act } from 'react-dom/test-utils'; -import { SelectInferenceId } from '../../../public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id'; +import { + SelectInferenceId, + SelectInferenceIdProps, +} from '../../../public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id'; +import React from 'react'; -const onChangeMock = jest.fn(); -const setValueMock = jest.fn(); -const setNewInferenceEndpointMock = jest.fn(); +const createInferenceEndpointMock = jest.fn(); +const mockDispatch = jest.fn(); jest.mock('../../../public/application/app_context', () => ({ useAppContext: jest.fn().mockReturnValue({ @@ -41,23 +48,40 @@ jest.mock( }), }) ); + +jest.mock('../../../public/application/components/mappings_editor/mappings_state_context', () => ({ + useMappingsState: () => ({ inferenceToModelIdMap: {} }), + useDispatch: () => mockDispatch, +})); + +function getTestForm(Component: React.FC) { + return (defaultProps: SelectInferenceIdProps) => { + const { form } = useForm(); + form.setFieldValue('inference_id', 'elser_model_2'); + return ( +
+ + + ); + }; +} + describe('SelectInferenceId', () => { let exists: any; let find: any; beforeAll(async () => { - const setup = registerTestBed(SelectInferenceId, { - defaultProps: { - onChange: onChangeMock, - 'data-test-subj': 'data-inference-endpoint-list', - setValue: setValueMock, - setNewInferenceEndpoint: setNewInferenceEndpointMock, - }, + const defaultProps: SelectInferenceIdProps = { + 'data-test-subj': 'data-inference-endpoint-list', + createInferenceEndpoint: createInferenceEndpointMock, + }; + const setup = registerTestBed(getTestForm(SelectInferenceId), { + defaultProps, memoryRouter: { wrapComponent: false }, }); await act(async () => { - const testBed = setup(); + const testBed = await setup(); exists = testBed.exists; find = testBed.find; }); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx index 17299a0f04b4f3..cd9d099ee92f84 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx @@ -6,26 +6,159 @@ */ import { registerTestBed } from '@kbn/test-jest-helpers'; -import { TrainedModelsDeploymentModal } from '../../../public/application/sections/home/index_list/details_page/trained_models_deployment_modal'; +import { + TrainedModelsDeploymentModal, + TrainedModelsDeploymentModalProps, +} from '../../../public/application/sections/home/index_list/details_page/trained_models_deployment_modal'; import { act } from 'react-dom/test-utils'; +import * as mappingsContext from '../../../public/application/components/mappings_editor/mappings_state_context'; +import { NormalizedField } from '../../../public/application/components/mappings_editor/types'; -const refreshModal = jest.fn(); -const setIsModalVisible = jest.fn(); -const tryAgainForErrorModal = jest.fn(); -const setIsVisibleForErrorModal = jest.fn(); +jest.mock('../../../public/hooks/use_ml_model_status_toasts', () => ({ + useMLModelNotificationToasts: jest.fn().mockReturnValue({ + showErrorToasts: jest.fn(), + }), +})); -describe('When semantic_text is enabled', () => { - describe('When there is no error in the model deployment', () => { - const setup = registerTestBed(TrainedModelsDeploymentModal, { - defaultProps: { - setIsModalVisible, - refreshModal, - pendingDeployments: ['.elser-test-3'], - errorsInTrainedModelDeployment: [], +jest.mock('../../../public/application/app_context', () => ({ + useAppContext: jest.fn().mockReturnValue({ + url: undefined, + plugins: { + ml: { + mlApi: { + trainedModels: { + getModelsDownloadStatus: jest.fn().mockResolvedValue({}), + getTrainedModels: jest.fn().mockResolvedValue([ + { + model_id: '.elser_model_2', + model_type: 'pytorch', + model_package: { + packaged_model_id: 'elser_model_2', + model_repository: 'https://ml-models.elastic.co', + minimum_version: '11.0.0', + size: 438123914, + sha256: '', + metadata: {}, + tags: [], + vocabulary_file: 'elser_model_2.vocab.json', + }, + description: 'Elastic Learned Sparse EncodeR v2', + tags: ['elastic'], + }, + ]), + getTrainedModelStats: jest.fn().mockResolvedValue({ + count: 1, + trained_model_stats: [ + { + model_id: '.elser_model_2', + + deployment_stats: { + deployment_id: 'elser_model_2', + model_id: '.elser_model_2', + threads_per_allocation: 1, + number_of_allocations: 1, + queue_capacity: 1024, + state: 'started', + }, + }, + ], + }), + }, + }, }, + }, + }), +})); + +jest.mock('../../../public/application/components/mappings_editor/mappings_state_context'); + +const mappingsContextMocked = jest.mocked(mappingsContext); + +const defaultState = { + inferenceToModelIdMap: { + e5: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.multilingual-e5-small', + }, + elser_model_2: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + openai: { + isDeployed: false, + isDeployable: false, + trainedModelId: '', + }, + my_elser_endpoint: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + }, + fields: { + aliases: {}, + byId: {}, + rootLevelFields: [], + maxNestedDepth: 0, + }, + mappingViewFields: { byId: {} }, +} as any; + +const setErrorsInTrainedModelDeployment = jest.fn().mockReturnValue(undefined); +const fetchData = jest.fn().mockReturnValue(undefined); + +describe('When semantic_text is enabled', () => { + const setup = (defaultProps: Partial) => + registerTestBed(TrainedModelsDeploymentModal, { + defaultProps, memoryRouter: { wrapComponent: false }, + })(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('When there are no pending deployments and no errors in the model deployment', () => { + mappingsContextMocked.useMappingsState.mockReturnValue(defaultState); + const { exists } = setup({ + errorsInTrainedModelDeployment: {}, + fetchData, + setErrorsInTrainedModelDeployment: () => undefined, + }); + + it('should not display the modal', () => { + expect(exists('trainedModelsDeploymentModal')).toBe(false); + }); + }); + + describe('When there are pending deployments in the model deployment', () => { + mappingsContextMocked.useMappingsState.mockReturnValue({ + ...defaultState, + fields: { + ...defaultState.fields, + byId: { + new_field: { + id: 'new_field', + isMultiField: false, + path: ['new_field'], + source: { + name: 'new_field', + type: 'semantic_text', + reference_field: 'title', + inference_id: 'elser_model_2', + }, + } as NormalizedField, + }, + rootLevelFields: ['new_field'], + }, + } as any); + const { exists, find } = setup({ + errorsInTrainedModelDeployment: {}, + fetchData, + setErrorsInTrainedModelDeployment, }); - const { exists, find } = setup(); it('should display the modal', () => { expect(exists('trainedModelsDeploymentModal')).toBe(true); @@ -37,55 +170,61 @@ describe('When semantic_text is enabled', () => { ); }); - it('should call refresh method if refresh button is pressed', async () => { + it('should call fetch data if refresh button is pressed', async () => { await act(async () => { find('confirmModalConfirmButton').simulate('click'); }); - expect(refreshModal.mock.calls).toHaveLength(1); - }); - - it('should call setIsModalVisible method if cancel button is pressed', async () => { - await act(async () => { - find('confirmModalCancelButton').simulate('click'); - }); - expect(setIsModalVisible).toHaveBeenLastCalledWith(false); + expect(fetchData.mock.calls).toHaveLength(1); }); }); describe('When there is error in the model deployment', () => { - const setup = registerTestBed(TrainedModelsDeploymentModal, { - defaultProps: { - setIsModalVisible: setIsVisibleForErrorModal, - refreshModal: tryAgainForErrorModal, - pendingDeployments: ['.elser-test-3'], - errorsInTrainedModelDeployment: ['.elser-test-3'], + mappingsContextMocked.useMappingsState.mockReturnValue({ + ...defaultState, + fields: { + ...defaultState.fields, + byId: { + new_field: { + id: 'new_field', + isMultiField: false, + path: ['new_field'], + source: { + name: 'new_field', + type: 'semantic_text', + reference_field: 'title', + inference_id: 'elser_model_2', + }, + } as NormalizedField, + }, + rootLevelFields: ['new_field'], }, - memoryRouter: { wrapComponent: false }, + } as any); + const { find } = setup({ + fetchData, + errorsInTrainedModelDeployment: { '.elser_model_2': 'Error' }, + setErrorsInTrainedModelDeployment, }); - const { exists, find } = setup(); - it('should display the modal', () => { - expect(exists('trainedModelsErroredDeploymentModal')).toBe(true); + it('should display text related to errored deployments', () => { + expect(find('trainedModelsDeploymentModalText').text()).toContain('There was an error'); }); - it('should contain content related to semantic_text', () => { - expect(find('trainedModelsErrorDeploymentModalText').text()).toContain( - 'There was an error when trying to deploy' - ); + it('should display only the errored deployment', () => { + expect(find('trainedModelsDeploymentModal').text()).toContain('.elser_model_2'); + expect(find('trainedModelsDeploymentModal').text()).not.toContain('valid-model'); }); it("should call refresh method if 'Try again' button is pressed", async () => { await act(async () => { find('confirmModalConfirmButton').simulate('click'); }); - expect(tryAgainForErrorModal.mock.calls).toHaveLength(1); + expect(fetchData.mock.calls).toHaveLength(1); }); it('should call setIsVisibleForErrorModal method if cancel button is pressed', async () => { await act(async () => { find('confirmModalCancelButton').simulate('click'); }); - expect(setIsVisibleForErrorModal).toHaveBeenLastCalledWith(false); }); }); }); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx index eb9e6c793aa5ad..dac7dadfa25578 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx @@ -12,7 +12,13 @@ import * as fixtures from '../../../test/fixtures'; import { API_BASE_PATH } from '../../../common/constants'; import { setupEnvironment, kibanaVersion } from '../helpers'; -import { TEMPLATE_NAME, SETTINGS, ALIASES, MAPPINGS as DEFAULT_MAPPING } from './constants'; +import { + TEMPLATE_NAME, + SETTINGS, + ALIASES, + MAPPINGS as DEFAULT_MAPPING, + INDEX_PATTERNS, +} from './constants'; import { setup } from './template_edit.helpers'; import { TemplateFormTestBed } from './template_form.helpers'; @@ -26,6 +32,22 @@ const MAPPING = { }, }, }; +const NONEXISTENT_COMPONENT_TEMPLATE = { + name: 'component_template@custom', + hasMappings: false, + hasAliases: false, + hasSettings: false, + usedBy: [], +}; + +const EXISTING_COMPONENT_TEMPLATE = { + name: 'test_component_template', + hasMappings: true, + hasAliases: false, + hasSettings: false, + usedBy: [], + isManaged: false, +}; jest.mock('@kbn/code-editor', () => { const original = jest.requireActual('@kbn/code-editor'); @@ -70,6 +92,7 @@ describe('', () => { beforeAll(() => { jest.useFakeTimers({ legacyFakeTimers: true }); httpRequestsMockHelpers.setLoadComponentTemplatesResponse([]); + httpRequestsMockHelpers.setLoadComponentTemplatesResponse([EXISTING_COMPONENT_TEMPLATE]); }); afterAll(() => { @@ -296,6 +319,84 @@ describe('', () => { }); }); + describe('when composed of a nonexistent component template', () => { + const templateToEdit = fixtures.getTemplate({ + name: TEMPLATE_NAME, + indexPatterns: INDEX_PATTERNS, + composedOf: [NONEXISTENT_COMPONENT_TEMPLATE.name], + ignoreMissingComponentTemplates: [NONEXISTENT_COMPONENT_TEMPLATE.name], + }); + + beforeAll(() => { + httpRequestsMockHelpers.setLoadTemplateResponse('my_template', templateToEdit); + }); + + beforeEach(async () => { + await act(async () => { + testBed = await setup(httpSetup); + }); + testBed.component.update(); + }); + + it('the nonexistent component template should be selected in the Component templates selector', async () => { + const { actions, exists } = testBed; + + // Complete step 1: Logistics + await actions.completeStepOne(); + jest.advanceTimersByTime(0); // advance timers to allow the form to validate + + // Should be at the Component templates step + expect(exists('stepComponents')).toBe(true); + + const { + actions: { + componentTemplates: { getComponentTemplatesSelected }, + }, + } = testBed; + + expect(exists('componentTemplatesSelection.emptyPrompt')).toBe(false); + expect(getComponentTemplatesSelected()).toEqual([NONEXISTENT_COMPONENT_TEMPLATE.name]); + }); + + it('the composedOf and ignoreMissingComponentTemplates fields should be included in the final payload', async () => { + const { component, actions, find } = testBed; + + // Complete step 1: Logistics + await actions.completeStepOne(); + // Complete step 2: Component templates + await actions.completeStepTwo(); + // Complete step 3: Index settings + await actions.completeStepThree(); + // Complete step 4: Mappings + await actions.completeStepFour(); + // Complete step 5: Aliases + await actions.completeStepFive(); + + expect(find('stepTitle').text()).toEqual(`Review details for '${TEMPLATE_NAME}'`); + + await act(async () => { + actions.clickNextButton(); + }); + component.update(); + + expect(httpSetup.put).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/index_templates/${TEMPLATE_NAME}`, + expect.objectContaining({ + body: JSON.stringify({ + name: TEMPLATE_NAME, + indexPatterns: INDEX_PATTERNS, + version: templateToEdit.version, + allowAutoCreate: templateToEdit.allowAutoCreate, + _kbnMeta: templateToEdit._kbnMeta, + composedOf: [NONEXISTENT_COMPONENT_TEMPLATE.name], + template: {}, + ignoreMissingComponentTemplates: [NONEXISTENT_COMPONENT_TEMPLATE.name], + }), + }) + ); + }); + }); + if (kibanaVersion.major < 8) { describe('legacy index templates', () => { const legacyTemplateToEdit = fixtures.getTemplate({ diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx index 71c2f09072dacb..1c727265fd1f1c 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx @@ -87,8 +87,20 @@ export const ComponentTemplatesSelector = ({ .map((name) => components.find((comp) => comp.name === name)) .filter(Boolean) as ComponentTemplateListItem[]; - setComponentsSelected(nextComponentsSelected); - onChange(nextComponentsSelected.map(({ name }) => name)); + // Add the non-existing templates from the "defaultValue" prop + const missingDefaultComponents: ComponentTemplateListItem[] = defaultValue + .filter((name) => !components.find((comp) => comp.name === name)) + .map((name) => ({ + name, + usedBy: [], + hasMappings: false, + hasAliases: false, + hasSettings: false, + isManaged: false, + })); + + setComponentsSelected([...nextComponentsSelected, ...missingDefaultComponents]); + onChange([...nextComponentsSelected, ...missingDefaultComponents].map(({ name }) => name)); isInitialized.current = true; } else { onChange(componentsSelected.map(({ name }) => name)); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx index e1c3ea7dc61795..094fd40ab1e32a 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx @@ -380,8 +380,11 @@ export const setup = ( props: any = { onUpdate() {} }, appDependencies?: any ): MappingsEditorTestBed => { + const defaultAppDependencies = { + plugins: {}, + }; const setupTestBed = registerTestBed( - WithAppDependencies(MappingsEditor, appDependencies), + WithAppDependencies(MappingsEditor, appDependencies ?? defaultAppDependencies), { memoryRouter: { wrapComponent: false, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx index 1347aaeade4f87..685aa4963edc48 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx @@ -28,6 +28,7 @@ describe('Mappings editor: core', () => { let onChangeHandler: jest.Mock = jest.fn(); let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); let testBed: MappingsEditorTestBed; + const appDependencies = { plugins: { ml: { mlApi: {} } } }; beforeAll(() => { jest.useFakeTimers({ legacyFakeTimers: true }); @@ -55,7 +56,7 @@ describe('Mappings editor: core', () => { }; await act(async () => { - testBed = setup({ value: defaultMappings, onChange: onChangeHandler }); + testBed = setup({ value: defaultMappings, onChange: onChangeHandler }, appDependencies); }); const { component } = testBed; @@ -95,7 +96,7 @@ describe('Mappings editor: core', () => { }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component, exists } = testBed; @@ -115,7 +116,7 @@ describe('Mappings editor: core', () => { }, }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component, exists } = testBed; @@ -137,6 +138,7 @@ describe('Mappings editor: core', () => { config: { enableMappingsSourceFieldSection: true, }, + ...appDependencies, }; beforeEach(async () => { @@ -295,6 +297,7 @@ describe('Mappings editor: core', () => { config: { enableMappingsSourceFieldSection: true, }, + ...appDependencies, }; beforeEach(async () => { @@ -472,7 +475,7 @@ describe('Mappings editor: core', () => { }, }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component, exists } = testBed; @@ -494,7 +497,7 @@ describe('Mappings editor: core', () => { }, }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component } = testBed; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx index e895a00b9f6d8a..6fe58e7ba26dac 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx @@ -7,6 +7,7 @@ import React, { useCallback, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; import { TextField, UseField, FieldConfig } from '../../../shared_imports'; import { validateUniqueName } from '../../../lib'; import { PARAMETERS_DEFINITION } from '../../../constants'; @@ -14,7 +15,11 @@ import { useMappingsState } from '../../../mappings_state_context'; const { validations, ...rest } = PARAMETERS_DEFINITION.name.fieldConfig as FieldConfig; -export const NameParameter = () => { +interface NameParameterProps { + isSemanticText?: boolean; +} + +export const NameParameter: React.FC = ({ isSemanticText }) => { const { fields: { rootLevelFields, byId }, documentFields: { fieldToAddFieldTo, fieldToEdit }, @@ -32,6 +37,11 @@ export const NameParameter = () => { const nameConfig: FieldConfig = useMemo( () => ({ ...rest, + label: isSemanticText + ? i18n.translate('xpack.idxMgmt.mappingsEditor.semanticTextNameFieldLabel', { + defaultMessage: 'New field name', + }) + : rest.label, validations: [ ...validations!, { @@ -39,7 +49,7 @@ export const NameParameter = () => { }, ], }), - [uniqueNameValidator] + [isSemanticText, uniqueNameValidator] ); return ( diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx index b8f5e866b68a9d..9d923f529931b5 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx @@ -5,65 +5,45 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React from 'react'; -import { useLoadIndexMappings } from '../../../../../services'; import { getFieldConfig } from '../../../lib'; -import { Form, SuperSelectField, UseField, useForm } from '../../../shared_imports'; +import { useMappingsState } from '../../../mappings_state_context'; +import { SuperSelectField, UseField } from '../../../shared_imports'; import { SuperSelectOption } from '../../../types'; -interface Props { - onChange(value: string): void; - 'data-test-subj'?: string; - indexName?: string; -} +export const ReferenceFieldSelects = () => { + const { fields, mappingViewFields } = useMappingsState(); -export const ReferenceFieldSelects = ({ - onChange, - 'data-test-subj': dataTestSubj, - indexName, -}: Props) => { - const { form } = useForm(); - const { subscribe } = form; + const allFields = { + byId: { + ...mappingViewFields.byId, + ...fields.byId, + }, + rootLevelFields: [], + aliases: {}, + maxNestedDepth: 0, + }; - const { data } = useLoadIndexMappings(indexName ?? ''); - const referenceFieldOptions: SuperSelectOption[] = []; - if (data && data.mappings && data.mappings.properties) { - Object.keys(data.mappings.properties).forEach((key) => { - const field = data.mappings.properties[key]; - if (field.type === 'text') { - referenceFieldOptions.push({ - value: key, - inputDisplay: key, - 'data-test-subj': `select-reference-field-${key}`, - }); - } - }); - } + const referenceFieldOptions: SuperSelectOption[] = Object.values(allFields.byId) + .filter((field) => field.source.type === 'text') + .map((field) => ({ + value: field.path.join('.'), + inputDisplay: field.path.join('.'), + 'data-test-subj': `select-reference-field-${field.path.join('.')}}`, + })); const fieldConfigReferenceField = getFieldConfig('reference_field'); - - useEffect(() => { - const subscription = subscribe((updateData) => { - const formData = updateData.data.internal; - const value = formData.main; - onChange(value); - }); - - return subscription.unsubscribe; - }, [subscribe, onChange]); return ( -
- - {(field) => ( - - )} - -
+ + {(field) => ( + + )} + ); }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx index e9a4387f912066..c4da2d30ac4fd1 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx @@ -24,63 +24,74 @@ import { import { i18n } from '@kbn/i18n'; import React, { useEffect, useState, useCallback, useMemo } from 'react'; -import { - InferenceAPIConfigResponse, - SUPPORTED_PYTORCH_TASKS, - TRAINED_MODEL_TYPE, -} from '@kbn/ml-trained-models-utils'; +import { SUPPORTED_PYTORCH_TASKS, TRAINED_MODEL_TYPE } from '@kbn/ml-trained-models-utils'; import { InferenceTaskType } from '@elastic/elasticsearch/lib/api/types'; -import { - ElasticsearchModelDefaultOptions, - ModelConfig, - Service, -} from '@kbn/inference_integration_flyout/types'; +import { ModelConfig } from '@kbn/inference_integration_flyout/types'; import { InferenceFlyoutWrapper } from '@kbn/inference_integration_flyout/components/inference_flyout_wrapper'; import { TrainedModelConfigResponse } from '@kbn/ml-plugin/common/types/trained_models'; import { getFieldConfig } from '../../../lib'; import { useAppContext } from '../../../../../app_context'; -import { Form, UseField, useForm } from '../../../shared_imports'; import { useLoadInferenceEndpoints } from '../../../../../services/api'; -import { getTrainedModelStats } from '../../../../../../hooks/use_details_page_mappings_model_management'; -import { InferenceToModelIdMap } from '../fields'; import { useMLModelNotificationToasts } from '../../../../../../hooks/use_ml_model_status_toasts'; -import { - CustomInferenceEndpointConfig, - DefaultInferenceModels, - DeploymentState, -} from '../../../types'; +import { CustomInferenceEndpointConfig } from '../../../types'; +import { UseField } from '../../../shared_imports'; -const inferenceServiceTypeElasticsearchModelMap: Record = - { - elser: ElasticsearchModelDefaultOptions.elser, - elasticsearch: ElasticsearchModelDefaultOptions.e5, - }; -const uncheckSelectedModelOption = (options: EuiSelectableOption[]) => { - const checkedOption = options.find(({ checked }) => checked === 'on'); - if (checkedOption) { - checkedOption.checked = undefined; - } -}; -interface Props { - onChange(value: string): void; +export interface SelectInferenceIdProps { + createInferenceEndpoint: ( + trainedModelId: string, + inferenceId: string, + modelConfig: CustomInferenceEndpointConfig + ) => Promise; 'data-test-subj'?: string; - setValue: (value: string) => void; - setNewInferenceEndpoint: ( - newInferenceEndpoint: InferenceToModelIdMap, - customInferenceEndpointConfig: CustomInferenceEndpointConfig - ) => void; } -export const SelectInferenceId = ({ - onChange, + +type SelectInferenceIdContentProps = SelectInferenceIdProps & { + setValue: (value: string) => void; + value: string; +}; + +const defaultEndpoints = [ + { + model_id: 'elser_model_2', + }, + { + model_id: 'e5', + }, +]; + +export const SelectInferenceId: React.FC = ({ + createInferenceEndpoint, + 'data-test-subj': dataTestSubj, +}: SelectInferenceIdProps) => { + const config = getFieldConfig('inference_id'); + return ( + + {(field) => { + return ( + + ); + }} + + ); +}; + +const SelectInferenceIdContent: React.FC = ({ + createInferenceEndpoint, 'data-test-subj': dataTestSubj, setValue, - setNewInferenceEndpoint, -}: Props) => { + value, +}) => { const { core: { application }, docLinks, plugins: { ml }, } = useAppContext(); + const config = getFieldConfig('inference_id'); const getMlTrainedModelPageUrl = useCallback(async () => { return await ml?.locator?.getUrl({ @@ -88,9 +99,6 @@ export const SelectInferenceId = ({ }); }, [ml]); - const { form } = useForm({ defaultValue: { main: DefaultInferenceModels.elser_model_2 } }); - const { subscribe } = form; - const [isInferenceFlyoutVisible, setIsInferenceFlyoutVisible] = useState(false); const [availableTrainedModels, setAvailableTrainedModels] = useState< TrainedModelConfigResponse[] @@ -118,101 +126,57 @@ export const SelectInferenceId = ({ return availableTrainedModelsList; }, [availableTrainedModels]); + const [isSaveInferenceLoading, setIsSaveInferenceLoading] = useState(false); - const fieldConfigModelId = getFieldConfig('inference_id'); - const defaultInferenceIds: EuiSelectableOption[] = useMemo(() => { - return [ - { - checked: 'on', - label: 'elser_model_2', - 'data-test-subj': 'default-inference_elser_model_2', - }, - { - label: 'e5', - 'data-test-subj': 'default-inference_e5', - }, - ]; - }, []); - - const { isLoading, data: models } = useLoadInferenceEndpoints(); - - const [options, setOptions] = useState([...defaultInferenceIds]); - const inferenceIdOptionsFromModels = useMemo(() => { - const inferenceIdOptions = - models?.map((model: InferenceAPIConfigResponse) => ({ - label: model.model_id, - 'data-test-subj': `custom-inference_${model.model_id}`, - })) || []; + const { isLoading, data: endpoints, resendRequest } = useLoadInferenceEndpoints(); - return inferenceIdOptions; - }, [models]); - - useEffect(() => { - const mergedOptions = { - ...inferenceIdOptionsFromModels.reduce( - (acc, option) => ({ ...acc, [option.label]: option }), - {} - ), - ...defaultInferenceIds.reduce((acc, option) => ({ ...acc, [option.label]: option }), {}), - }; - setOptions(Object.values(mergedOptions)); - }, [inferenceIdOptionsFromModels, defaultInferenceIds]); + const options: EuiSelectableOption[] = useMemo(() => { + const missingDefaultEndpoints = defaultEndpoints.filter( + (endpoint) => !(endpoints || []).find((e) => e.model_id === endpoint.model_id) + ); + const newOptions: EuiSelectableOption[] = [ + ...(endpoints || []), + ...missingDefaultEndpoints, + ].map((endpoint) => ({ + label: endpoint.model_id, + 'data-test-subj': `custom-inference_${endpoint.model_id}`, + checked: value === endpoint.model_id ? 'on' : undefined, + })); + if (value && !newOptions.find((option) => option.label === value)) { + // Sometimes we create a new endpoint but the backend is slow in updating so we need to optimistically update + const newOption: EuiSelectableOption = { + label: value, + checked: 'on', + 'data-test-subj': `custom-inference_${value}`, + }; + return [...newOptions, newOption]; + } + return newOptions; + }, [endpoints, value]); const { showErrorToasts } = useMLModelNotificationToasts(); const onSaveInferenceCallback = useCallback( async (inferenceId: string, taskType: InferenceTaskType, modelConfig: ModelConfig) => { - setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); try { - const isDeployable = - modelConfig.service === Service.elser || modelConfig.service === Service.elasticsearch; - - const newOption: EuiSelectableOption[] = [ - { - label: inferenceId, - checked: 'on', - 'data-test-subj': `custom-inference_${inferenceId}`, - }, - ]; - // uncheck selected endpoint id - uncheckSelectedModelOption(options); - - setOptions([...options, ...newOption]); - - const trainedModelStats = await ml?.mlApi?.trainedModels.getTrainedModelStats(); - const defaultEndpointId = - inferenceServiceTypeElasticsearchModelMap[modelConfig.service] || ''; - const newModelId: InferenceToModelIdMap = {}; - newModelId[inferenceId] = { - trainedModelId: defaultEndpointId, - isDeployable, - isDeployed: - getTrainedModelStats(trainedModelStats)[defaultEndpointId] === DeploymentState.DEPLOYED, - }; - const customInferenceEndpointConfig: CustomInferenceEndpointConfig = { + const trainedModelId = modelConfig.service_settings.model_id || ''; + const customModelConfig = { taskType, modelConfig, }; - setNewInferenceEndpoint(newModelId, customInferenceEndpointConfig); + setIsSaveInferenceLoading(true); + await createInferenceEndpoint(trainedModelId, inferenceId, customModelConfig); + resendRequest(); + setValue(inferenceId); + setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); + setIsSaveInferenceLoading(false); } catch (error) { showErrorToasts(error); + setIsSaveInferenceLoading(false); } }, - [isInferenceFlyoutVisible, ml, setNewInferenceEndpoint, options, showErrorToasts] + [createInferenceEndpoint, setValue, isInferenceFlyoutVisible, showErrorToasts, resendRequest] ); - useEffect(() => { - const subscription = subscribe((updateData) => { - const formData = updateData.data.internal; - const value = formData.main; - onChange(value); - }); - - return subscription.unsubscribe; - }, [subscribe, onChange]); - const selectedOptionLabel = options.find((option) => option.checked)?.label; - useEffect(() => { - setValue(selectedOptionLabel ?? DefaultInferenceModels.elser_model_2); - }, [selectedOptionLabel, setValue]); const [isInferencePopoverVisible, setIsInferencePopoverVisible] = useState(false); const [inferenceEndpointError, setInferenceEndpointError] = useState( undefined @@ -221,7 +185,15 @@ export const SelectInferenceId = ({ async (inferenceId: string) => { const modelsExist = options.some((i) => i.label === inferenceId); if (modelsExist) { - setInferenceEndpointError('Inference Endpoint id already exists'); + setInferenceEndpointError( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.defaultLabel', + { + defaultMessage: 'Inference endpoint {inferenceId} already exists', + values: { inferenceId }, + } + ) + ); } else { setInferenceEndpointError(undefined); } @@ -229,139 +201,133 @@ export const SelectInferenceId = ({ [options] ); - const inferencePopover = () => { - return ( - - - {(field) => ( - <> - -

- {field.label} -

-
- - { - setIsInferencePopoverVisible(!isInferencePopoverVisible); - }} - > - {selectedOptionLabel || - i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.defaultLabel', - { - defaultMessage: 'No model selected', - } - )} - - - )} -
- - } - isOpen={isInferencePopoverVisible} - panelPaddingSize="m" - closePopover={() => setIsInferencePopoverVisible(!isInferencePopoverVisible)} - > - - option.checked)?.label; + + const inferencePopover = () => ( + + +

+ {config.label} +

+
+ + { - setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); - setInferenceEndpointError(undefined); setIsInferencePopoverVisible(!isInferencePopoverVisible); }} > + {selectedOptionLabel || + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.alreadyExistsLabel', + { + defaultMessage: 'No inference endpoint selected', + } + )} + + + } + isOpen={isInferencePopoverVisible} + panelPaddingSize="m" + closePopover={() => setIsInferencePopoverVisible(!isInferencePopoverVisible)} + > + + { + setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); + setInferenceEndpointError(undefined); + setIsInferencePopoverVisible(!isInferencePopoverVisible); + }} + > + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.addInferenceEndpointButton', + { + defaultMessage: 'Add Inference Endpoint', + } + )} + + + { + const mlTrainedPageUrl = await getMlTrainedModelPageUrl(); + if (typeof mlTrainedPageUrl === 'string') { + application.navigateToUrl(mlTrainedPageUrl); + } + }} + > + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.manageInferenceEndpointButton', + { + defaultMessage: 'Manage Inference Endpoints', + } + )} + + + + + +

{i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.addInferenceEndpointButton', - { - defaultMessage: 'Add inference Endpoint', - } - )} - - - { - const mlTrainedPageUrl = await getMlTrainedModelPageUrl(); - if (typeof mlTrainedPageUrl === 'string') { - application.navigateToUrl(mlTrainedPageUrl); - } - }} - > - {i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.manageInferenceEndpointButton', + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.selectable.Label', { - defaultMessage: 'Manage Inference Endpoint', + defaultMessage: 'Existing endpoints', } )} - - - - - -

- {i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.selectable.Label', - { - defaultMessage: 'Existing endpoints', - } - )} -

-
- +

+
+ - { - setOptions(newOptions); - setIsInferencePopoverVisible(!isInferencePopoverVisible); - }} - > - {(list, search) => ( - <> - {search} - {list} - - )} - -
-
- ); - }; + ), + }} + options={options} + onChange={(newOptions) => { + setValue(newOptions.find((option) => option.checked)?.label || ''); + }} + > + {(list, search) => ( + <> + {search} + {list} + + )} + + +
+ ); return ( -
+ <> + {inferencePopover()} @@ -378,6 +344,7 @@ export const SelectInferenceId = ({ supportedNlpModels={docLinks.links.enterpriseSearch.supportedNlpModels} nlpImportModel={docLinks.links.ml.nlpImportModel} setInferenceEndpointError={setInferenceEndpointError} + isCreateInferenceApiLoading={isSaveInferenceLoading} /> )} @@ -395,6 +362,6 @@ export const SelectInferenceId = ({ /> - + ); }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx index 4a3f600753dd42..4f8e6557e334fb 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx @@ -14,20 +14,16 @@ import { EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ElasticsearchModelDefaultOptions } from '@kbn/inference_integration_flyout/types'; +import { TrainedModelStat } from '@kbn/ml-plugin/common/types/trained_models'; import { MlPluginStart } from '@kbn/ml-plugin/public'; import classNames from 'classnames'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import { EUI_SIZE, TYPE_DEFINITION } from '../../../../constants'; import { fieldSerializer } from '../../../../lib'; -import { useDispatch, useMappingsState } from '../../../../mappings_state_context'; -import { Form, FormDataProvider, UseField, useForm, useFormData } from '../../../../shared_imports'; -import { - CustomInferenceEndpointConfig, - Field, - MainType, - NormalizedFields, -} from '../../../../types'; +import { isSemanticTextField } from '../../../../lib/utils'; +import { useDispatch } from '../../../../mappings_state_context'; +import { Form, FormDataProvider, useForm, useFormData } from '../../../../shared_imports'; +import { Field, MainType, NormalizedFields } from '../../../../types'; import { NameParameter, SubTypeParameter, TypeParameter } from '../../field_parameters'; import { ReferenceFieldSelects } from '../../field_parameters/reference_field_selects'; import { SelectInferenceId } from '../../field_parameters/select_inference_id'; @@ -38,9 +34,11 @@ import { useSemanticText } from './semantic_text/use_semantic_text'; const formWrapper = (props: any) =>
; export interface InferenceToModelIdMap { [key: string]: { - trainedModelId: ElasticsearchModelDefaultOptions | string; + trainedModelId: string; isDeployed: boolean; isDeployable: boolean; + isDownloading: boolean; + modelStats?: TrainedModelStat; // third-party models don't have model stats }; } @@ -48,7 +46,9 @@ export interface SemanticTextInfo { isSemanticTextEnabled?: boolean; indexName?: string; ml?: MlPluginStart; - setErrorsInTrainedModelDeployment: React.Dispatch>; + setErrorsInTrainedModelDeployment: React.Dispatch< + React.SetStateAction> + >; } interface Props { allFields: NormalizedFields['byId']; @@ -73,13 +73,13 @@ export const CreateField = React.memo(function CreateFieldComponent({ isAddingFields, semanticTextInfo, }: Props) { - const { isSemanticTextEnabled, indexName, ml, setErrorsInTrainedModelDeployment } = - semanticTextInfo ?? {}; + const { isSemanticTextEnabled, ml, setErrorsInTrainedModelDeployment } = semanticTextInfo ?? {}; const dispatch = useDispatch(); const { form } = useForm({ serializer: fieldSerializer, options: { stripEmptyFields: false }, + id: 'create-field', }); useFormData({ form }); @@ -93,9 +93,6 @@ export const CreateField = React.memo(function CreateFieldComponent({ return subscription.unsubscribe; }, [dispatch, subscribe]); - const [customInferenceEndpointConfig, setCustomInferenceEndpointConfig] = useState< - CustomInferenceEndpointConfig | undefined - >(undefined); const cancel = () => { if (isAddingFields && onCancelAddingNewFields) { onCancelAddingNewFields(); @@ -104,19 +101,14 @@ export const CreateField = React.memo(function CreateFieldComponent({ } }; - const { - referenceFieldComboValue, - nameValue, - inferenceIdComboValue, - setInferenceValue, - semanticFieldType, - handleSemanticText, - } = useSemanticText({ + const { createInferenceEndpoint, handleSemanticText } = useSemanticText({ form, setErrorsInTrainedModelDeployment, ml, }); + const isSemanticText = form.getFormData().type === 'semantic_text'; + const submitForm = async ( e?: React.FormEvent, exitAfter: boolean = false, @@ -128,11 +120,9 @@ export const CreateField = React.memo(function CreateFieldComponent({ const { isValid, data } = await form.submit(); - if (isValid) { - form.reset(); - - if (data.type === 'semantic_text' && !clickOutside) { - handleSemanticText(data, customInferenceEndpointConfig); + if (isValid && !clickOutside) { + if (isSemanticTextField(data)) { + handleSemanticText(data); } else { dispatch({ type: 'field.add', value: data }); } @@ -140,6 +130,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ if (exitAfter) { cancel(); } + form.reset(); } }; @@ -187,23 +178,19 @@ export const CreateField = React.memo(function CreateFieldComponent({ {/* Field reference_field for semantic_text field type */} - + {isSemanticText && ( + + + + )} {/* Field name */} - + ); - const isAddFieldButtonDisabled = (): boolean => { - if (semanticFieldType) { - return !referenceFieldComboValue || !nameValue || !inferenceIdComboValue; - } - - return false; - }; - const renderFormActions = () => ( {(isCancelable !== false || isAddingFields) && ( @@ -222,7 +209,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ onClick={submitForm} type="submit" data-test-subj="addButton" - isDisabled={isAddFieldButtonDisabled()} + isDisabled={form.getErrors().length > 0} > {isMultiField ? i18n.translate('xpack.idxMgmt.mappingsEditor.createField.addMultiFieldButtonLabel', { @@ -289,11 +276,10 @@ export const CreateField = React.memo(function CreateFieldComponent({ ); }} - {/* Field inference_id for semantic_text field type */} - + + {isSemanticText && ( + + )} {renderFormActions()}
@@ -302,69 +288,3 @@ export const CreateField = React.memo(function CreateFieldComponent({ ); }); - -function ReferenceFieldCombo({ indexName }: { indexName?: string }) { - const [{ type }] = useFormData({ watch: 'type' }); - - if (type === undefined || type[0]?.value !== 'semantic_text') { - return null; - } - - return ( - - - {(field) => } - - - ); -} - -interface InferenceProps { - setValue: (value: string) => void; - setCustomInferenceEndpointConfig: (config: CustomInferenceEndpointConfig) => void; -} - -function InferenceIdCombo({ setValue, setCustomInferenceEndpointConfig }: InferenceProps) { - const { inferenceToModelIdMap } = useMappingsState(); - const dispatch = useDispatch(); - const [{ type }] = useFormData({ watch: 'type' }); - - // update new inferenceEndpoint - const setNewInferenceEndpoint = useCallback( - ( - newInferenceEndpoint: InferenceToModelIdMap, - customInferenceEndpointConfig: CustomInferenceEndpointConfig - ) => { - dispatch({ - type: 'inferenceToModelIdMap.update', - value: { - inferenceToModelIdMap: { - ...inferenceToModelIdMap, - ...newInferenceEndpoint, - }, - }, - }); - setCustomInferenceEndpointConfig(customInferenceEndpointConfig); - }, - [dispatch, inferenceToModelIdMap, setCustomInferenceEndpointConfig] - ); - - if (type === undefined || type[0]?.value !== 'semantic_text') { - return null; - } - - return ( - <> - - - {(field) => ( - - )} - - - ); -} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts index f9bc12a9022fd9..72e007b86f7868 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts @@ -6,10 +6,37 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { CustomInferenceEndpointConfig, Field } from '../../../../../types'; +import { CustomInferenceEndpointConfig, SemanticTextField } from '../../../../../types'; import { useSemanticText } from './use_semantic_text'; import { act } from 'react-dom/test-utils'; +jest.mock('../../../../../../../../hooks/use_details_page_mappings_model_management', () => ({ + useDetailsPageMappingsModelManagement: () => ({ + fetchInferenceToModelIdMap: () => ({ + e5: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.multilingual-e5-small', + }, + elser_model_2: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + openai: { + isDeployed: false, + isDeployable: false, + trainedModelId: '', + }, + my_elser_endpoint: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + }), + }), +})); + const mlMock: any = { mlApi: { inferenceModels: { @@ -18,26 +45,30 @@ const mlMock: any = { }, }; -const mockField: Record = { +const mockField: Record = { elser_model_2: { name: 'name', type: 'semantic_text', - inferenceId: 'elser_model_2', + inference_id: 'elser_model_2', + reference_field: 'title', }, e5: { name: 'name', type: 'semantic_text', - inferenceId: 'e5', + inference_id: 'e5', + reference_field: 'title', }, openai: { name: 'name', type: 'semantic_text', - inferenceId: 'openai', + inference_id: 'openai', + reference_field: 'title', }, my_elser_endpoint: { name: 'name', type: 'semantic_text', - inferenceId: 'my_elser_endpoint', + inference_id: 'my_elser_endpoint', + reference_field: 'title', }, }; @@ -90,6 +121,10 @@ jest.mock('../../../../../mappings_state_context', () => ({ trainedModelId: '.elser_model_2', }, }, + fields: { + byId: {}, + }, + mappingViewFields: { byId: {} }, }), useDispatch: () => mockDispatch, })); @@ -128,28 +163,31 @@ describe('useSemanticText', () => { jest.clearAllMocks(); mockForm = { form: { - getFields: jest.fn().mockReturnValue({ - referenceField: { value: 'title' }, - name: { value: 'sem' }, - type: { value: [{ value: 'semantic_text' }] }, - inferenceId: { value: 'e5' }, + getFormData: jest.fn().mockReturnValue({ + referenceField: 'title', + name: 'sem', + type: 'semantic_text', + inferenceId: 'e5', }), + setFieldValue: jest.fn(), }, thirdPartyModel: { - getFields: jest.fn().mockReturnValue({ - referenceField: { value: 'title' }, - name: { value: 'semantic_text_openai_endpoint' }, - type: { value: [{ value: 'semantic_text' }] }, - inferenceId: { value: 'openai' }, + getFormData: jest.fn().mockReturnValue({ + referenceField: 'title', + name: 'semantic_text_openai_endpoint', + type: 'semantic_text', + inferenceId: 'openai', }), + setFieldValue: jest.fn(), }, elasticModelEndpointCreatedfromFlyout: { - getFields: jest.fn().mockReturnValue({ - referenceField: { value: 'title' }, - name: { value: 'semantic_text_elserServiceType_endpoint' }, - type: { value: [{ value: 'semantic_text' }] }, - inferenceId: { value: 'my_elser_endpoint' }, + getFormData: jest.fn().mockReturnValue({ + referenceField: 'title', + name: 'semantic_text_elserServiceType_endpoint', + type: 'semantic_text', + inferenceId: 'my_elser_endpoint', }), + setFieldValue: jest.fn(), }, }; }); @@ -162,11 +200,10 @@ describe('useSemanticText', () => { }) ); await act(async () => { - result.current.setInferenceValue('openai'); result.current.handleSemanticText(mockField.openai, mockConfig.openai); }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.openai, }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( @@ -184,12 +221,11 @@ describe('useSemanticText', () => { }) ); await act(async () => { - result.current.setInferenceValue('my_elser_endpoint'); result.current.handleSemanticText(mockField.my_elser_endpoint, mockConfig.elser); }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.my_elser_endpoint, }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( @@ -198,20 +234,6 @@ describe('useSemanticText', () => { mockConfig.elser.modelConfig ); }); - it('should populate the values from the form', () => { - const { result } = renderHook(() => - useSemanticText({ - form: mockForm.form, - setErrorsInTrainedModelDeployment: jest.fn(), - ml: mlMock, - }) - ); - - expect(result.current.referenceFieldComboValue).toBe('title'); - expect(result.current.nameValue).toBe('sem'); - expect(result.current.inferenceIdComboValue).toBe('e5'); - expect(result.current.semanticFieldType).toBe('semantic_text'); - }); it('should handle semantic text correctly', async () => { const { result } = renderHook(() => @@ -227,7 +249,7 @@ describe('useSemanticText', () => { }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.elser_model_2, }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( @@ -253,12 +275,11 @@ describe('useSemanticText', () => { ); await act(async () => { - result.current.setInferenceValue('e5'); result.current.handleSemanticText(mockField.e5); }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.e5, }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts index 72be2636329a2a..2eb4343d0c7a40 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts @@ -5,23 +5,26 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import { useCallback } from 'react'; import { MlPluginStart } from '@kbn/ml-plugin/public'; -import React, { useEffect, useState } from 'react'; -import { ElasticsearchModelDefaultOptions } from '@kbn/inference_integration_flyout/types'; +import React, { useEffect } from 'react'; import { InferenceTaskType } from '@elastic/elasticsearch/lib/api/types'; -import { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import { ElserModels } from '@kbn/ml-trained-models-utils'; +import { i18n } from '@kbn/i18n'; +import { useDetailsPageMappingsModelManagement } from '../../../../../../../../hooks/use_details_page_mappings_model_management'; import { useDispatch, useMappingsState } from '../../../../../mappings_state_context'; import { FormHook } from '../../../../../shared_imports'; -import { CustomInferenceEndpointConfig, DefaultInferenceModels, Field } from '../../../../../types'; +import { CustomInferenceEndpointConfig, Field, SemanticTextField } from '../../../../../types'; import { useMLModelNotificationToasts } from '../../../../../../../../hooks/use_ml_model_status_toasts'; import { getInferenceEndpoints } from '../../../../../../../services/api'; +import { getFieldByPathName } from '../../../../../lib/utils'; interface UseSemanticTextProps { form: FormHook; ml?: MlPluginStart; - setErrorsInTrainedModelDeployment: React.Dispatch> | undefined; + setErrorsInTrainedModelDeployment?: React.Dispatch< + React.SetStateAction> + >; } interface DefaultInferenceEndpointConfig { taskType: InferenceTaskType; @@ -30,70 +33,52 @@ interface DefaultInferenceEndpointConfig { export function useSemanticText(props: UseSemanticTextProps) { const { form, setErrorsInTrainedModelDeployment, ml } = props; - const { inferenceToModelIdMap } = useMappingsState(); + const { fields, mappingViewFields } = useMappingsState(); + const { fetchInferenceToModelIdMap } = useDetailsPageMappingsModelManagement(); const dispatch = useDispatch(); - const [referenceFieldComboValue, setReferenceFieldComboValue] = useState(); - const [nameValue, setNameValue] = useState(); - const [inferenceIdComboValue, setInferenceIdComboValue] = useState(); - const [semanticFieldType, setSemanticTextFieldType] = useState(); - const [inferenceValue, setInferenceValue] = useState( - DefaultInferenceModels.elser_model_2 - ); - const { showSuccessToasts, showErrorToasts } = useMLModelNotificationToasts(); + const { showSuccessToasts, showErrorToasts, showSuccessfullyDeployedToast } = + useMLModelNotificationToasts(); - const useFieldEffect = ( - semanticTextform: FormHook, - fieldName: string, - setState: React.Dispatch> - ) => { - const fieldValue = semanticTextform.getFields()?.[fieldName]?.value; - useEffect(() => { - if (typeof fieldValue === 'string') { - setState(fieldValue); - } - }, [semanticTextform, fieldValue, setState]); - }; - - useFieldEffect(form, 'referenceField', setReferenceFieldComboValue); - useFieldEffect(form, 'name', setNameValue); - - const fieldTypeValue = form.getFields()?.type?.value; + const fieldTypeValue = form.getFormData()?.type; useEffect(() => { - if (!Array.isArray(fieldTypeValue) || fieldTypeValue.length === 0) { - return; - } - setSemanticTextFieldType( - fieldTypeValue[0]?.value === 'semantic_text' ? fieldTypeValue[0].value : undefined - ); - }, [form, fieldTypeValue]); - - const inferenceId = form.getFields()?.inferenceId?.value; - useEffect(() => { - if (typeof inferenceId === 'string') { - setInferenceIdComboValue(inferenceId); + if (fieldTypeValue === 'semantic_text') { + const allFields = { + byId: { + ...fields.byId, + ...mappingViewFields.byId, + }, + rootLevelFields: [], + aliases: {}, + maxNestedDepth: 0, + }; + const defaultName = getFieldByPathName(allFields, 'semantic_text') ? '' : 'semantic_text'; + const referenceField = + Object.values(allFields.byId) + .find((field) => field.source.type === 'text') + ?.path.join('.') || ''; + if (!form.getFormData().name) { + form.setFieldValue('name', defaultName); + } + if (!form.getFormData().reference_field) { + form.setFieldValue('reference_field', referenceField); + } + if (!form.getFormData().inference_id) { + form.setFieldValue('inference_id', 'elser_model_2'); + } } - }, [form, inferenceId, inferenceToModelIdMap]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [fieldTypeValue]); const createInferenceEndpoint = useCallback( async ( - trainedModelId: ElasticsearchModelDefaultOptions | string, - data: Field, + trainedModelId: string, + inferenceId: string, customInferenceEndpointConfig?: CustomInferenceEndpointConfig ) => { - if (data.inferenceId === undefined) { - throw new Error( - i18n.translate('xpack.idxMgmt.mappingsEditor.createField.undefinedInferenceIdError', { - defaultMessage: 'Inference ID is undefined', - }) - ); - } + const isElser = ElserModels.includes(trainedModelId); const defaultInferenceEndpointConfig: DefaultInferenceEndpointConfig = { - service: - trainedModelId === ElasticsearchModelDefaultOptions.elser ? 'elser' : 'elasticsearch', - taskType: - trainedModelId === ElasticsearchModelDefaultOptions.elser - ? 'sparse_embedding' - : 'text_embedding', + service: isElser ? 'elser' : 'elasticsearch', + taskType: isElser ? 'sparse_embedding' : 'text_embedding', }; const modelConfig = customInferenceEndpointConfig @@ -108,65 +93,69 @@ export function useSemanticText(props: UseSemanticTextProps) { }; const taskType: InferenceTaskType = customInferenceEndpointConfig?.taskType ?? defaultInferenceEndpointConfig.taskType; - try { - await ml?.mlApi?.inferenceModels?.createInferenceEndpoint( - data.inferenceId, - taskType, - modelConfig - ); - } catch (error) { - throw error; - } + + await ml?.mlApi?.inferenceModels?.createInferenceEndpoint(inferenceId, taskType, modelConfig); }, [ml?.mlApi?.inferenceModels] ); const handleSemanticText = async ( - data: Field, + data: SemanticTextField, customInferenceEndpointConfig?: CustomInferenceEndpointConfig ) => { - data.inferenceId = inferenceValue; - if (data.inferenceId === undefined) { - return; - } - const inferenceData = inferenceToModelIdMap?.[data.inferenceId]; + const modelIdMap = await fetchInferenceToModelIdMap(); + const inferenceId = data.inference_id; + const inferenceData = modelIdMap?.[inferenceId]; if (!inferenceData) { - return; + throw new Error( + i18n.translate('xpack.idxMgmt.mappingsEditor.semanticText.inferenceError', { + defaultMessage: 'No inference model found for inference ID {inferenceId}', + }) + ); } const { trainedModelId } = inferenceData; - dispatch({ type: 'field.addSemanticText', value: data }); - + dispatch({ type: 'field.add', value: data }); + const inferenceEndpoints = await getInferenceEndpoints(); + const hasInferenceEndpoint = inferenceEndpoints.data?.some( + (inference) => inference.model_id === inferenceId + ); + // if inference endpoint exists already, do not create new inference endpoint + if (hasInferenceEndpoint) { + return; + } try { - // if inference endpoint exists already, do not create inference endpoint - const inferenceModels = await getInferenceEndpoints(); - const inferenceModel: InferenceAPIConfigResponse[] = inferenceModels.data.some( - (e: InferenceAPIConfigResponse) => e.model_id === inferenceValue - ); - if (inferenceModel) { - return; - } // Only show toast if it's an internal Elastic model that hasn't been deployed yet if (trainedModelId && inferenceData.isDeployable && !inferenceData.isDeployed) { showSuccessToasts(trainedModelId); } - - await createInferenceEndpoint(trainedModelId, data, customInferenceEndpointConfig); + await createInferenceEndpoint( + trainedModelId, + data.inference_id, + customInferenceEndpointConfig + ); + if (trainedModelId) { + // clear error because we've succeeded here + setErrorsInTrainedModelDeployment?.((prevItems) => ({ + ...prevItems, + [trainedModelId]: undefined, + })); + } + showSuccessfullyDeployedToast(trainedModelId); } catch (error) { // trainedModelId is empty string when it's a third party model if (trainedModelId) { - setErrorsInTrainedModelDeployment?.((prevItems) => [...prevItems, trainedModelId]); + setErrorsInTrainedModelDeployment?.((prevItems) => ({ + ...prevItems, + [trainedModelId]: error, + })); } showErrorToasts(error); } }; return { - referenceFieldComboValue, - nameValue, - inferenceIdComboValue, - semanticFieldType, + createInferenceEndpoint, handleSemanticText, - setInferenceValue, }; } diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx index 790b4560000f72..0be09876b63f20 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx @@ -1041,7 +1041,6 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, schema: t.number, }, - dims: { fieldConfig: { defaultValue: '', @@ -1070,20 +1069,46 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, reference_field: { fieldConfig: { + defaultValue: '', label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.referenceFieldLabel', { defaultMessage: 'Reference field', }), helpText: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.referenceFieldHelpText', { defaultMessage: 'Reference field for model inference.', }), + validations: [ + { + validator: emptyField( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.validations.referenceFieldIsRequiredErrorMessage', + { + defaultMessage: 'Reference field is required.', + } + ) + ), + }, + ], }, schema: t.string, }, inference_id: { fieldConfig: { + defaultValue: 'elser_model_2', label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.inferenceIdLabel', { defaultMessage: 'Select an inference endpoint:', }), + validations: [ + { + validator: emptyField( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.validations.inferenceIdIsRequiredErrorMessage', + { + defaultMessage: 'Inference ID is required.', + } + ) + ), + }, + ], }, schema: t.string, }, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts index be00b71b58ea12..3a4f71a8d533be 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts @@ -18,6 +18,7 @@ import { getFieldsFromState, getAllFieldTypesFromState, getFieldsMatchingFilterFromState, + getStateWithCopyToFields, } from './utils'; const fieldsWithnestedFields: NormalizedFields = { @@ -420,6 +421,7 @@ describe('utils', () => { selectedDataTypes: ['Boolean'], }, inferenceToModelIdMap: {}, + mappingViewFields: { byId: {}, rootLevelFields: [], aliases: {}, maxNestedDepth: 0 }, }; test('returns list of matching fields with search term', () => { expect(getFieldsMatchingFilterFromState(sampleState, ['Boolean'])).toEqual({ @@ -442,5 +444,203 @@ describe('utils', () => { }, }); }); + describe('getStateWithCopyToFields', () => { + test('returns state if there is no semantic text field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + source: { + name: 'title', + type: 'text', + }, + }, + }, + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(state); + }); + test('returns state if semantic text field has no reference field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + }, + }, + }, + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(state); + }); + test('adds text field with copy to to state if semantic text field has reference field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + reference_field: 'new', + }, + }, + 'new-field': { + id: 'new-field', + isMultiField: false, + path: ['new'], + source: { + name: 'new', + type: 'text', + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d'], + }, + } as any; + const expectedState = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + }, + }, + 'new-field': { + id: 'new-field', + isMultiField: false, + path: ['new'], + source: { + name: 'new', + type: 'text', + copy_to: ['title'], + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d', 'new-field'], + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(expectedState); + }); + test('adds nested text field with copy to to state if semantic text field has reference field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + reference_field: 'existing.new', + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d'], + }, + mappingViewFields: { + byId: { + existing: { + id: 'existing', + isMultiField: false, + path: ['existing'], + source: { + name: 'existing', + type: 'object', + }, + }, + 'new-field': { + id: 'new-field', + parentId: 'existing', + isMultiField: false, + path: ['existing', 'new'], + source: { + name: 'new', + type: 'text', + }, + }, + }, + }, + } as any; + const expectedState = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + }, + }, + existing: { + id: 'existing', + isMultiField: false, + path: ['existing'], + source: { + name: 'existing', + type: 'object', + }, + }, + 'new-field': { + id: 'new-field', + isMultiField: false, + parentId: 'existing', + path: ['existing', 'new'], + source: { + name: 'new', + type: 'text', + copy_to: ['title'], + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d', 'existing'], + }, + mappingViewFields: { + byId: { + existing: { + id: 'existing', + isMultiField: false, + path: ['existing'], + source: { + name: 'existing', + type: 'object', + }, + }, + 'new-field': { + id: 'new-field', + parentId: 'existing', + isMultiField: false, + path: ['existing', 'new'], + source: { + name: 'new', + type: 'text', + }, + }, + }, + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(expectedState); + }); + }); }); }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts index cb95da745a30d2..ed966805c0f2e0 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts @@ -7,6 +7,7 @@ import { v4 as uuidv4 } from 'uuid'; +import { cloneDeep } from 'lodash'; import { ChildFieldName, ComboBoxOption, @@ -23,6 +24,7 @@ import { ParameterName, RuntimeFields, SubType, + SemanticTextField, } from '../types'; import { @@ -685,3 +687,88 @@ export const getAllFieldTypesFromState = (allFields: Fields): DataType[] => { const fields: DataType[] = []; return getallFieldsIncludingNestedFields(allFields, fields).filter(filterUnique); }; + +export function isSemanticTextField(field: Partial): field is SemanticTextField { + return Boolean(field.inference_id && field.type === 'semantic_text'); +} + +/** + * Returns deep copy of state with `copy_to` added to text fields that are referenced by new semantic text fields + * @param state + * @returns state + */ + +export function getStateWithCopyToFields(state: State): State { + // Make sure we don't accidentally modify existing state + let updatedState = cloneDeep(state); + for (const field of Object.values(updatedState.fields.byId)) { + if (field.source.type === 'semantic_text' && field.source.reference_field) { + // Check fields already added to the list of to-update fields first + // API will not accept reference_field so removing it now + const { reference_field: referenceField, ...source } = field.source; + if (typeof referenceField !== 'string') { + // should never happen + throw new Error('Reference field is not a string'); + } + field.source = source; + const existingTextField = + getFieldByPathName(updatedState.fields, referenceField) || + getFieldByPathName(updatedState.mappingViewFields || { byId: {} }, referenceField); + if (existingTextField) { + // Add copy_to to existing text field's copy_to array + const updatedTextField: NormalizedField = { + ...existingTextField, + source: { + ...existingTextField.source, + copy_to: existingTextField.source.copy_to + ? [ + ...(Array.isArray(existingTextField.source.copy_to) + ? existingTextField.source.copy_to + : [existingTextField.source.copy_to]), + field.path.join('.'), + ] + : [field.path.join('.')], + }, + }; + updatedState = { + ...updatedState, + fields: { + ...updatedState.fields, + byId: { + ...updatedState.fields.byId, + [existingTextField.id]: updatedTextField, + }, + }, + }; + if (existingTextField.parentId) { + let currentField = existingTextField; + let hasParent = true; + while (hasParent) { + if (!currentField.parentId) { + // reached the top of the tree, push current field to root level fields + updatedState.fields.rootLevelFields.push(currentField.id); + hasParent = false; + } else if (updatedState.fields.byId[currentField.parentId]) { + // parent is already in state, don't need to do anything + hasParent = false; + } else { + // parent is not in state yet + updatedState.fields.byId[currentField.parentId] = + updatedState.mappingViewFields.byId[currentField.parentId]; + currentField = updatedState.fields.byId[currentField.parentId]; + } + } + } else { + updatedState.fields.rootLevelFields.push(existingTextField.id); + } + } else { + throw new Error(`Semantic text field ${field.path.join('.')} has invalid reference field`); + } + } + } + return updatedState; +} + +export const getFieldByPathName = (fields: NormalizedFields, name: string) => { + return Object.values(fields.byId).find((field) => field.path.join('.') === name); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx index 2b132d377918d5..ac19c5395f974a 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx @@ -60,6 +60,7 @@ export const StateProvider: React.FC<{ children?: React.ReactNode }> = ({ childr selectedDataTypes: [], }, inferenceToModelIdMap: {}, + mappingViewFields: { byId: {}, rootLevelFields: [], aliases: {}, maxNestedDepth: 0 }, }; const [state, dispatch] = useReducer(reducer, initialState); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts index 0e972e9900b9cb..626ee0e839a8a4 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts @@ -214,6 +214,9 @@ export const reducer = (state: State, action: Action): State => { }, }; } + case 'editor.replaceViewMappings': { + return { ...state, mappingViewFields: action.value.fields }; + } case 'configuration.update': { const nextState = { ...state, @@ -323,28 +326,6 @@ export const reducer = (state: State, action: Action): State => { case 'field.add': { return addFieldToState(action.value, state); } - case 'field.addSemanticText': { - const addTexFieldWithCopyToActionValue: Field = { - name: action.value.referenceField as string, - type: 'text', - copy_to: [action.value.name], - }; - - // Add text field to state with copy_to of semantic_text field - let updatedState = addFieldToState(addTexFieldWithCopyToActionValue, state); - - const addSemanticTextFieldActionValue: Field = { - name: action.value.name, - inference_id: action.value.inferenceId, - type: 'semantic_text', - }; - - // Add semantic_text field to state and reset fieldToAddFieldTo - updatedState = addFieldToState(addSemanticTextFieldActionValue, updatedState); - updatedState.documentFields.fieldToAddFieldTo = undefined; - - return updatedState; - } case 'field.remove': { const field = state.fields.byId[action.value]; const { id, hasChildFields, hasMultiFields } = field; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts index 767d29aaaeda82..7ff156f6817f11 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts @@ -186,9 +186,6 @@ interface FieldBasic { subType?: SubType; properties?: { [key: string]: Omit }; fields?: { [key: string]: Omit }; - referenceField?: string; - inferenceId?: string; - inference_id?: string; // other* exist together as a holder of types that the mappings editor does not yet know about but // enables the user to create mappings with them. @@ -201,6 +198,8 @@ type FieldParams = { export type Field = FieldBasic & Partial; +export type SemanticTextField = Field & { inference_id: string; reference_field: string }; + export interface FieldMeta { childFieldsName: ChildFieldName | undefined; canHaveChildFields: boolean; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts index a0e7247c39bc1f..f40fe420eb3be1 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts @@ -108,10 +108,12 @@ export interface State { }; templates: TemplatesFormState; inferenceToModelIdMap?: InferenceToModelIdMap; + mappingViewFields: NormalizedFields; // state of the incoming index mappings, separate from the editor state above } export type Action = | { type: 'editor.replaceMappings'; value: { [key: string]: any } } + | { type: 'editor.replaceViewMappings'; value: { fields: NormalizedFields } } | { type: 'inferenceToModelIdMap.update'; value: { inferenceToModelIdMap?: InferenceToModelIdMap }; @@ -122,7 +124,6 @@ export type Action = | { type: 'templates.save'; value: MappingsTemplates } | { type: 'fieldForm.update'; value: OnFormUpdateArg } | { type: 'field.add'; value: Field } - | { type: 'field.addSemanticText'; value: Field } | { type: 'field.remove'; value: string } | { type: 'field.edit'; value: Field } | { type: 'field.toggleExpand'; value: { fieldId: string; isExpanded?: boolean } } diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx index 1bd58bcc8e5f09..5c5e1c6a289fa8 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx @@ -8,6 +8,7 @@ import { useEffect, useMemo } from 'react'; import { EuiSelectableOption } from '@elastic/eui'; +import { cloneDeep } from 'lodash'; import { DocumentFieldsStatus, Field, @@ -182,6 +183,12 @@ export const useMappingsStateListener = ({ onChange, value, status }: Args) => { }, }, }); + dispatch({ + type: 'editor.replaceViewMappings', + value: { + fields: cloneDeep(parsedFieldsDefaultValue), + }, + }); }, [ value, parsedFieldsDefaultValue, diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx index be1fdbaa473150..ac247500e32481 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx @@ -218,6 +218,7 @@ export const TemplateForm = ({ ? serializeAsESLifecycle(wizardData.logistics.lifecycle) : undefined, }, + ignoreMissingComponentTemplates: initialTemplate.ignoreMissingComponentTemplates, }; return cleanupTemplateObject(outputTemplate as TemplateDeserialized); diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx index 88902ff517c35c..f1a625dafbbdab 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx @@ -29,6 +29,10 @@ import { FormattedMessage } from '@kbn/i18n-react'; import React, { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react'; import { ILicense } from '@kbn/licensing-plugin/public'; import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt'; +import { + getStateWithCopyToFields, + isSemanticTextField, +} from '../../../../components/mappings_editor/lib/utils'; import { Index } from '../../../../../../common'; import { useDetailsPageMappingsModelManagement } from '../../../../../hooks/use_details_page_mappings_model_management'; import { useAppContext } from '../../../../app_context'; @@ -73,7 +77,6 @@ export const DetailsPageMappingsContent: FunctionComponent<{ http, }, plugins: { ml, licensing }, - url, config, overlays, history, @@ -89,9 +92,9 @@ export const DetailsPageMappingsContent: FunctionComponent<{ }, [licensing]); const { enableSemanticText: isSemanticTextEnabled } = config; - const [errorsInTrainedModelDeployment, setErrorsInTrainedModelDeployment] = useState( - [] - ); + const [errorsInTrainedModelDeployment, setErrorsInTrainedModelDeployment] = useState< + Record + >({}); const hasMLPermissions = capabilities?.ml?.canGetTrainedModels ? true : false; @@ -151,11 +154,10 @@ export const DetailsPageMappingsContent: FunctionComponent<{ [jsonData] ); + const [hasSavedFields, setHasSavedFields] = useState(false); + useMappingsStateListener({ value: parsedDefaultValue, status: 'disabled' }); - const { fetchInferenceToModelIdMap, pendingDeployments } = useDetailsPageMappingsModelManagement( - state.fields, - state.inferenceToModelIdMap - ); + const { fetchInferenceToModelIdMap } = useDetailsPageMappingsModelManagement(); const onCancelAddingNewFields = useCallback(() => { setAddingFields(!isAddingFields); @@ -198,8 +200,6 @@ export const DetailsPageMappingsContent: FunctionComponent<{ }); }, [dispatch, isAddingFields, state]); - const [isModalVisible, setIsModalVisible] = useState(false); - useEffect(() => { if (!isSemanticTextEnabled || !hasMLPermissions) { return; @@ -213,7 +213,7 @@ export const DetailsPageMappingsContent: FunctionComponent<{ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const refreshModal = useCallback(async () => { + const fetchInferenceData = useCallback(async () => { try { if (!isSemanticTextEnabled) { return; @@ -230,35 +230,45 @@ export const DetailsPageMappingsContent: FunctionComponent<{ }, [fetchInferenceToModelIdMap, isSemanticTextEnabled, hasMLPermissions]); const updateMappings = useCallback(async () => { + const hasSemanticText = hasSemanticTextField(state.fields); try { - if (isSemanticTextEnabled && hasMLPermissions) { + if (isSemanticTextEnabled && hasMLPermissions && hasSemanticText) { await fetchInferenceToModelIdMap(); - - if (pendingDeployments.length > 0) { - setIsModalVisible(true); - return; - } } - const denormalizedFields = deNormalize(state.fields); + const fields = hasSemanticText ? getStateWithCopyToFields(state).fields : state.fields; - const { error } = await updateIndexMappings(indexName, denormalizedFields); + const denormalizedFields = deNormalize(fields); - if (!error) { - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.indexDetails.mappings.successfullyUpdatedIndexMappings', { - defaultMessage: 'Updated index mapping', - }) + const inferenceIdsInPendingList = Object.values(deNormalize(fields)) + .filter(isSemanticTextField) + .map((field) => field.inference_id) + .filter( + (inferenceId: string) => + state.inferenceToModelIdMap?.[inferenceId] && + !state.inferenceToModelIdMap?.[inferenceId].isDeployed ); - refetchMapping(); - } else { - setSaveMappingError(error.message); + setHasSavedFields(true); + if (inferenceIdsInPendingList.length === 0) { + const { error } = await updateIndexMappings(indexName, denormalizedFields); + + if (!error) { + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.indexDetails.mappings.successfullyUpdatedIndexMappings', { + defaultMessage: 'Updated index mapping', + }) + ); + refetchMapping(); + setHasSavedFields(false); + } else { + setSaveMappingError(error.message); + } } } catch (exception) { setSaveMappingError(exception.message); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.fields, pendingDeployments]); + }, [state.fields]); const onSearchChange = useCallback( (value: string) => { @@ -494,7 +504,7 @@ export const DetailsPageMappingsContent: FunctionComponent<{ > )} @@ -601,15 +611,17 @@ export const DetailsPageMappingsContent: FunctionComponent<{ - {isModalVisible && isSemanticTextEnabled && ( + {isSemanticTextEnabled && isAddingFields && hasSavedFields && ( )} ); }; + +function hasSemanticTextField(fields: NormalizedFields): boolean { + return Object.values(fields.byId).some((field) => field.source.type === 'semantic_text'); +} diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx index 8c2bfbbbef96d0..4bba4081976616 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx @@ -8,179 +8,175 @@ import { EuiConfirmModal, useGeneratedHtmlId, EuiHealth } from '@elastic/eui'; import React from 'react'; import { EuiLink } from '@elastic/eui'; -import { useEffect, useState } from 'react'; -import type { SharePluginStart } from '@kbn/share-plugin/public'; +import { useEffect, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; +import { isSemanticTextField } from '../../../../components/mappings_editor/lib/utils'; +import { deNormalize } from '../../../../components/mappings_editor/lib'; +import { useMLModelNotificationToasts } from '../../../../../hooks/use_ml_model_status_toasts'; +import { useMappingsState } from '../../../../components/mappings_editor/mappings_state_context'; +import { useAppContext } from '../../../../app_context'; -interface SemanticTextProps { - setIsModalVisible: (isVisible: boolean) => void; - refreshModal: () => void; - pendingDeployments: Array; - errorsInTrainedModelDeployment: string[]; - url?: SharePluginStart['url']; +export interface TrainedModelsDeploymentModalProps { + fetchData: () => void; + errorsInTrainedModelDeployment: Record; + setErrorsInTrainedModelDeployment: React.Dispatch< + React.SetStateAction> + >; } const ML_APP_LOCATOR = 'ML_APP_LOCATOR'; const TRAINED_MODELS_MANAGE = 'trained_models'; export function TrainedModelsDeploymentModal({ - setIsModalVisible, - refreshModal, - pendingDeployments = [], - errorsInTrainedModelDeployment = [], - url, -}: SemanticTextProps) { + errorsInTrainedModelDeployment = {}, + fetchData, + setErrorsInTrainedModelDeployment, +}: TrainedModelsDeploymentModalProps) { + const { fields, inferenceToModelIdMap } = useMappingsState(); + const { + plugins: { ml }, + url, + } = useAppContext(); const modalTitleId = useGeneratedHtmlId(); + const [isModalVisible, setIsModalVisible] = useState(false); const closeModal = () => setIsModalVisible(false); const [mlManagementPageUrl, setMlManagementPageUrl] = useState(''); + const { showErrorToasts } = useMLModelNotificationToasts(); useEffect(() => { - setIsModalVisible(pendingDeployments.length > 0); - }, [pendingDeployments, setIsModalVisible]); - - useEffect(() => { - let isCancelled = false; const mlLocator = url?.locators.get(ML_APP_LOCATOR); const generateUrl = async () => { if (mlLocator) { const mlURL = await mlLocator.getUrl({ page: TRAINED_MODELS_MANAGE, }); - if (!isCancelled) { - setMlManagementPageUrl(mlURL); - } + setMlManagementPageUrl(mlURL); } }; generateUrl(); - return () => { - isCancelled = true; - }; }, [url]); - const ErroredDeployments = pendingDeployments.filter( - (deployment) => deployment !== undefined && errorsInTrainedModelDeployment.includes(deployment) - ); + const inferenceIdsInPendingList = useMemo(() => { + return Object.values(deNormalize(fields)) + .filter(isSemanticTextField) + .map((field) => field.inference_id); + }, [fields]); - const PendingModelsDeploymentModal = () => { - const pendingDeploymentsList = pendingDeployments.map((deployment, index) => ( -
  • - - {deployment} - -
  • - )); + const [pendingDeployments, setPendingDeployments] = useState([]); - return ( - -

    - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textAboutDeploymentsNotCompleted', - { - defaultMessage: - 'Some fields are referencing models that have not yet completed deployment. Deployment may take a few minutes to complete.', - } - )} -

    -
      {pendingDeploymentsList}
    - - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textTrainedModelManagementLink', - { - defaultMessage: 'Go to Trained Model Management', - } - )} - -
    - ); + const startModelAllocation = async (trainedModelId: string) => { + try { + await ml?.mlApi?.trainedModels.startModelAllocation(trainedModelId); + } catch (error) { + setErrorsInTrainedModelDeployment((previousState) => ({ + ...previousState, + [trainedModelId]: error.message, + })); + showErrorToasts(error); + setIsModalVisible(true); + } }; - const ErroredModelsDeploymentModal = () => { - const pendingDeploymentsList = pendingDeployments.map((deployment, index) => ( -
  • - - {deployment} - -
  • - )); + useEffect(() => { + const models = inferenceIdsInPendingList.map( + (inferenceId) => inferenceToModelIdMap?.[inferenceId] + ); + for (const model of models) { + if (model && !model.isDownloading && !model.isDeployed) { + // Sometimes the model gets stuck in a ready to deploy state, so we need to trigger deployment manually + startModelAllocation(model.trainedModelId); + } + } + const pendingModels = models + .map((model) => { + return model?.trainedModelId && !model?.isDeployed ? model?.trainedModelId : ''; + }) + .filter((trainedModelId) => !!trainedModelId); + const uniqueDeployments = pendingModels.filter( + (deployment, index) => pendingModels.indexOf(deployment) === index + ); + setPendingDeployments(uniqueDeployments); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inferenceIdsInPendingList, inferenceToModelIdMap]); + + const erroredDeployments = pendingDeployments.filter( + (deployment) => errorsInTrainedModelDeployment[deployment] + ); - return ( - { + if (erroredDeployments.length > 0 || pendingDeployments.length > 0) { + setIsModalVisible(true); + } + }, [erroredDeployments.length, pendingDeployments.length]); + return isModalVisible ? ( + 0 + ? i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorTitle', + { + defaultMessage: 'Models could not be deployed', + } + ) + : i18n.translate('xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.titleLabel', { + defaultMessage: 'Models still deploying', + }) + } + titleProps={{ id: modalTitleId }} + onCancel={closeModal} + onConfirm={fetchData} + cancelButtonText={i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.closeButtonLabel', + { + defaultMessage: 'Close', + } + )} + confirmButtonText={i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.refreshButtonLabel', + { + defaultMessage: 'Refresh', + } + )} + defaultFocusedButton="confirm" + data-test-subj="trainedModelsDeploymentModal" + > +

    + {erroredDeployments.length > 0 + ? i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorText', + { + defaultMessage: 'There was an error when trying to deploy the following models.', + } + ) + : i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textAboutDeploymentsNotCompleted', + { + defaultMessage: + 'Some fields are referencing models that have not yet completed deployment. Deployment may take a few minutes to complete.', + } + )} +

    +
      + {(erroredDeployments.length > 0 ? erroredDeployments : pendingDeployments).map( + (deployment) => ( +
    • + + {deployment} + +
    • + ) )} - confirmButtonText={i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorTryAgainButtonLabel', +
    + + {i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textTrainedModelManagementLink', { - defaultMessage: 'Try again', + defaultMessage: 'Go to Trained Model Management', } )} - defaultFocusedButton="confirm" - data-test-subj="trainedModelsErroredDeploymentModal" - > -

    - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorText', - { - defaultMessage: 'There was an error when trying to deploy the following models.', - } - )} -

    -
      {pendingDeploymentsList}
    - - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorTrainedModelManagementLink', - { - defaultMessage: 'Go to Trained Model Management', - } - )} - -
    - ); - }; - - return ErroredDeployments.length > 0 ? ( - - ) : ( - - ); + +
    + ) : null; } diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index e071e0bf3c68c3..e68335b8e0ba56 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -434,6 +434,7 @@ export function createIndex(indexName: string) { }), }); } + export function updateIndexMappings(indexName: string, newFields: Fields) { return sendRequest({ path: `${API_BASE_PATH}/mapping/${encodeURIComponent(indexName)}`, @@ -443,7 +444,7 @@ export function updateIndexMappings(indexName: string, newFields: Fields) { } export function getInferenceEndpoints() { - return sendRequest({ + return sendRequest({ path: `${API_BASE_PATH}/inference/all`, method: 'get', }); diff --git a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts index c3d74c21ec5281..6e80bcea5c349c 100644 --- a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts +++ b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts @@ -6,7 +6,6 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { InferenceToModelIdMap } from '../application/components/mappings_editor/components/document_fields/fields'; import { NormalizedFields } from '../application/components/mappings_editor/types'; import { useDetailsPageMappingsModelManagement } from './use_details_page_mappings_model_management'; @@ -16,13 +15,24 @@ jest.mock('../application/app_context', () => ({ ml: { mlApi: { trainedModels: { + getModelsDownloadStatus: jest.fn().mockResolvedValue({ + '.elser_model_2_linux-x86_64': {}, + }), getTrainedModelStats: jest.fn().mockResolvedValue({ trained_model_stats: [ { - model_id: '.elser_model_2', + model_id: '.elser_model_2-x86_64', deployment_stats: { deployment_id: 'elser_model_2', - model_id: '.elser_model_2', + model_id: '.elser_model_2-x86_64', + state: 'not started', + }, + }, + { + model_id: '.multilingual-e5-small', + deployment_stats: { + deployment_id: 'e5', + model_id: '.multilingual-e5-small', state: 'started', }, }, @@ -55,68 +65,73 @@ jest.mock('../application/services/api', () => ({ jest.mock('../application/components/mappings_editor/mappings_state_context', () => ({ useDispatch: () => mockDispatch, -})); -const mockDispatch = jest.fn(); -const fields = { - byId: { - '88ebcfdb-19b7-4458-9ea2-9488df54453d': { - id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', - isMultiField: false, - source: { - name: 'title', - type: 'text', - copy_to: ['semantic'], + useMappingsState: () => ({ + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + source: { + name: 'title', + type: 'text', + copy_to: ['semantic'], + }, + path: ['title'], + nestedDepth: 0, + childFieldsName: 'fields', + canHaveChildFields: false, + hasChildFields: false, + canHaveMultiFields: true, + hasMultiFields: false, + isExpanded: false, + }, + 'c5d86c82-ea07-4457-b469-3ffd4b96db81': { + id: 'c5d86c82-ea07-4457-b469-3ffd4b96db81', + isMultiField: false, + source: { + name: 'semantic', + inference_id: 'elser_model_2', + type: 'semantic_text', + }, + path: ['semantic'], + nestedDepth: 0, + childFieldsName: 'fields', + canHaveChildFields: false, + hasChildFields: false, + canHaveMultiFields: true, + hasMultiFields: false, + isExpanded: false, + }, }, - path: ['title'], - nestedDepth: 0, - childFieldsName: 'fields', - canHaveChildFields: false, - hasChildFields: false, - canHaveMultiFields: true, - hasMultiFields: false, - isExpanded: false, - }, - 'c5d86c82-ea07-4457-b469-3ffd4b96db81': { - id: 'c5d86c82-ea07-4457-b469-3ffd4b96db81', - isMultiField: false, - source: { - name: 'semantic', - inference_id: 'elser_model_2', - type: 'semantic_text', + aliases: {}, + rootLevelFields: [ + '88ebcfdb-19b7-4458-9ea2-9488df54453d', + 'c5d86c82-ea07-4457-b469-3ffd4b96db81', + ], + maxNestedDepth: 2, + } as NormalizedFields, + inferenceToModelIdMap: { + elser_model_2: { + trainedModelId: '.elser_model_2', + isDeployed: false, + isDeployable: true, + isDownloading: false, + }, + e5: { + trainedModelId: '.multilingual-e5-small', + isDeployed: true, + isDeployable: true, + isDownloading: false, }, - path: ['semantic'], - nestedDepth: 0, - childFieldsName: 'fields', - canHaveChildFields: false, - hasChildFields: false, - canHaveMultiFields: true, - hasMultiFields: false, - isExpanded: false, }, - }, - aliases: {}, - rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d', 'c5d86c82-ea07-4457-b469-3ffd4b96db81'], - maxNestedDepth: 2, -} as NormalizedFields; + }), +})); -const inferenceToModelIdMap = { - elser_model_2: { - trainedModelId: '.elser_model_2', - isDeployed: true, - isDeployable: true, - }, - e5: { - trainedModelId: '.multilingual-e5-small', - isDeployed: true, - isDeployable: true, - }, -} as InferenceToModelIdMap; +const mockDispatch = jest.fn(); describe('useDetailsPageMappingsModelManagement', () => { it('should call the dispatch with correct parameters', async () => { - const { result } = renderHook(() => - useDetailsPageMappingsModelManagement(fields, inferenceToModelIdMap) - ); + const { result } = renderHook(() => useDetailsPageMappingsModelManagement()); await result.current.fetchInferenceToModelIdMap(); @@ -125,14 +140,22 @@ describe('useDetailsPageMappingsModelManagement', () => { value: { inferenceToModelIdMap: { e5: { - isDeployed: false, + isDeployed: true, isDeployable: true, trainedModelId: '.multilingual-e5-small', + isDownloading: false, + modelStats: { + deployment_id: 'e5', + model_id: '.multilingual-e5-small', + state: 'started', + }, }, elser_model_2: { - isDeployed: true, + isDeployed: false, isDeployable: true, - trainedModelId: '.elser_model_2', + trainedModelId: '.elser_model_2_linux-x86_64', + isDownloading: true, + modelStats: undefined, }, }, }, diff --git a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts index 125892bdf69794..2d920a2d18ee00 100644 --- a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts +++ b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts @@ -5,134 +5,130 @@ * 2.0. */ -import { ElasticsearchModelDefaultOptions, Service } from '@kbn/inference_integration_flyout/types'; -import { InferenceStatsResponse } from '@kbn/ml-plugin/public/application/services/ml_api_service/trained_models'; -import type { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; -import { useCallback, useMemo } from 'react'; -import { useAppContext } from '../application/app_context'; +import { Service } from '@kbn/inference_integration_flyout/types'; +import { ModelDownloadState, TrainedModelStat } from '@kbn/ml-plugin/common/types/trained_models'; +import { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import { + LATEST_ELSER_VERSION, + InferenceServiceSettings, + LocalInferenceServiceSettings, + LATEST_ELSER_MODEL_ID, + LATEST_E5_MODEL_ID, + ElserVersion, +} from '@kbn/ml-trained-models-utils/src/constants/trained_models'; +import { useCallback } from 'react'; +import { AppDependencies, useAppContext } from '../application/app_context'; import { InferenceToModelIdMap } from '../application/components/mappings_editor/components/document_fields/fields'; -import { deNormalize } from '../application/components/mappings_editor/lib'; import { useDispatch } from '../application/components/mappings_editor/mappings_state_context'; -import { - DefaultInferenceModels, - DeploymentState, - NormalizedFields, -} from '../application/components/mappings_editor/types'; +import { DefaultInferenceModels } from '../application/components/mappings_editor/types'; import { getInferenceEndpoints } from '../application/services/api'; -interface InferenceModel { - data: InferenceAPIConfigResponse[]; +function isLocalModel(model: InferenceServiceSettings): model is LocalInferenceServiceSettings { + return Boolean((model as LocalInferenceServiceSettings).service_settings.model_id); } -type DeploymentStatusType = Record; - const getCustomInferenceIdMap = ( - deploymentStatsByModelId: DeploymentStatusType, - models?: InferenceModel -) => { - return models?.data.reduce((inferenceMap, model) => { - const inferenceId = model.model_id; - - const trainedModelId = - 'model_id' in model.service_settings && - (model.service_settings.model_id === ElasticsearchModelDefaultOptions.elser || - model.service_settings.model_id === ElasticsearchModelDefaultOptions.e5) - ? model.service_settings.model_id - : ''; - inferenceMap[inferenceId] = { - trainedModelId, - isDeployable: model.service === Service.elser || model.service === Service.elasticsearch, - isDeployed: deploymentStatsByModelId[trainedModelId] === 'deployed', - }; + models: InferenceAPIConfigResponse[], + modelStatsById: Record, + downloadStates: Record, + elser: string, + e5: string +): InferenceToModelIdMap => { + const inferenceIdMap = models.reduce((inferenceMap, model) => { + const inferenceEntry = isLocalModel(model) + ? { + trainedModelId: model.service_settings.model_id, // third-party models don't have trained model ids + isDeployable: model.service === Service.elser || model.service === Service.elasticsearch, + isDeployed: modelStatsById[model.service_settings.model_id]?.state === 'started', + isDownloading: Boolean(downloadStates[model.service_settings.model_id]), + modelStats: modelStatsById[model.service_settings.model_id], + } + : { + trainedModelId: '', + isDeployable: false, + isDeployed: false, + isDownloading: false, + modelStats: undefined, + }; + inferenceMap[model.model_id] = inferenceEntry; return inferenceMap; }, {}); -}; - -export const getTrainedModelStats = (modelStats?: InferenceStatsResponse): DeploymentStatusType => { - return ( - modelStats?.trained_model_stats.reduce((acc, modelStat) => { - if (modelStat.model_id) { - acc[modelStat.model_id] = - modelStat?.deployment_stats?.state === 'started' - ? DeploymentState.DEPLOYED - : DeploymentState.NOT_DEPLOYED; - } - return acc; - }, {}) || {} - ); -}; - -const getDefaultInferenceIds = (deploymentStatsByModelId: DeploymentStatusType) => { - return { + const defaultInferenceIds = { [DefaultInferenceModels.elser_model_2]: { - trainedModelId: ElasticsearchModelDefaultOptions.elser, + trainedModelId: elser, isDeployable: true, - isDeployed: - deploymentStatsByModelId[ElasticsearchModelDefaultOptions.elser] === - DeploymentState.DEPLOYED, + isDeployed: modelStatsById[elser]?.state === 'started', + isDownloading: Boolean(downloadStates[elser]), + modelStats: modelStatsById[elser], }, [DefaultInferenceModels.e5]: { - trainedModelId: ElasticsearchModelDefaultOptions.e5, + trainedModelId: e5, isDeployable: true, - isDeployed: - deploymentStatsByModelId[ElasticsearchModelDefaultOptions.e5] === DeploymentState.DEPLOYED, + isDeployed: modelStatsById[e5]?.state === 'started', + isDownloading: Boolean(downloadStates[e5]), + modelStats: modelStatsById[e5], }, }; + return { ...defaultInferenceIds, ...inferenceIdMap }; }; -export const useDetailsPageMappingsModelManagement = ( - fields: NormalizedFields, - inferenceToModelIdMap?: InferenceToModelIdMap -) => { +async function getCuratedModelConfig( + ml: AppDependencies['plugins']['ml'] | undefined, + model: string, + version?: ElserVersion +) { + if (ml?.mlApi) { + try { + const result = await ml.mlApi.trainedModels.getCuratedModelConfig( + model, + version ? { version } : undefined + ); + return result.model_id; + } catch (e) { + // pass through and return default models below + } + } + return model === 'elser' ? LATEST_ELSER_MODEL_ID : LATEST_E5_MODEL_ID; +} + +export const useDetailsPageMappingsModelManagement = () => { const { plugins: { ml }, } = useAppContext(); const dispatch = useDispatch(); - const fetchInferenceModelsAndTrainedModelStats = useCallback(async () => { + const fetchInferenceToModelIdMap = useCallback<() => Promise>(async () => { const inferenceModels = await getInferenceEndpoints(); - const trainedModelStats = await ml?.mlApi?.trainedModels.getTrainedModelStats(); - - return { inferenceModels, trainedModelStats }; - }, [ml]); - - const fetchInferenceToModelIdMap = useCallback(async () => { - const { inferenceModels, trainedModelStats } = await fetchInferenceModelsAndTrainedModelStats(); - const deploymentStatsByModelId = getTrainedModelStats(trainedModelStats); - const defaultInferenceIds = getDefaultInferenceIds(deploymentStatsByModelId); - const modelIdMap = getCustomInferenceIdMap(deploymentStatsByModelId, inferenceModels); + const downloadStates = await ml?.mlApi?.trainedModels.getModelsDownloadStatus(); + const elser = await getCuratedModelConfig(ml, 'elser', LATEST_ELSER_VERSION); + const e5 = await getCuratedModelConfig(ml, 'e5'); + const modelStatsById = + trainedModelStats?.trained_model_stats.reduce< + Record + >((acc, { model_id: modelId, deployment_stats: stats }) => { + if (modelId && stats) { + acc[modelId] = stats; + } + return acc; + }, {}) || {}; + const modelIdMap = getCustomInferenceIdMap( + inferenceModels.data || [], + modelStatsById, + downloadStates || {}, + elser, + e5 + ); dispatch({ type: 'inferenceToModelIdMap.update', - value: { inferenceToModelIdMap: { ...defaultInferenceIds, ...modelIdMap } }, + value: { inferenceToModelIdMap: modelIdMap }, }); - }, [dispatch, fetchInferenceModelsAndTrainedModelStats]); - - const inferenceIdsInPendingList = useMemo(() => { - return Object.values(deNormalize(fields)) - .filter((field) => field.type === 'semantic_text' && field.inference_id) - .map((field) => field.inference_id); - }, [fields]); - - const pendingDeployments = useMemo(() => { - return inferenceIdsInPendingList - .map((inferenceId) => { - if (inferenceId === undefined) { - return undefined; - } - const trainedModelId = inferenceToModelIdMap?.[inferenceId]?.trainedModelId ?? ''; - return trainedModelId && !inferenceToModelIdMap?.[inferenceId]?.isDeployed - ? trainedModelId - : undefined; - }) - .filter((trainedModelId) => !!trainedModelId); - }, [inferenceIdsInPendingList, inferenceToModelIdMap]); + return modelIdMap; + }, [dispatch, ml]); return { - pendingDeployments, fetchInferenceToModelIdMap, - fetchInferenceModelsAndTrainedModelStats, }; }; diff --git a/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts b/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts index cba440186a1d0d..7b553f37498d5e 100644 --- a/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts +++ b/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts @@ -27,6 +27,22 @@ export function useMLModelNotificationToasts() { }), }); }; + const showSuccessfullyDeployedToast = (modelName: string) => { + return toasts.addSuccess({ + title: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.createField.modelDeploymentStartedNotification', + { + defaultMessage: 'Model deployment started', + } + ), + text: i18n.translate('xpack.idxMgmt.mappingsEditor.createField.modelDeployedNotification', { + defaultMessage: 'Model {modelName} has been deployed on your machine learning node.', + values: { + modelName, + }, + }), + }); + }; const showErrorToasts = (error: ErrorType) => { const errorObj = extractErrorProperties(error); return toasts.addError(new MLRequestFailure(errorObj, error), { @@ -35,5 +51,5 @@ export function useMLModelNotificationToasts() { }), }); }; - return { showSuccessToasts, showErrorToasts }; + return { showSuccessToasts, showErrorToasts, showSuccessfullyDeployedToast }; } diff --git a/x-pack/plugins/index_management/test/fixtures/template.ts b/x-pack/plugins/index_management/test/fixtures/template.ts index ca7f625d61bb9f..54df4410352b67 100644 --- a/x-pack/plugins/index_management/test/fixtures/template.ts +++ b/x-pack/plugins/index_management/test/fixtures/template.ts @@ -67,6 +67,8 @@ export const getTemplate = ({ indexPatterns = [], template: { settings, aliases, mappings } = {}, dataStream, + composedOf, + ignoreMissingComponentTemplates, hasDatastream = false, isLegacy = false, type = 'default', @@ -98,6 +100,8 @@ export const getTemplate = ({ hasDatastream: dataStream !== undefined ? true : hasDatastream, isLegacy, }, + composedOf, + ignoreMissingComponentTemplates, }; return indexTemplate; diff --git a/x-pack/plugins/integration_assistant/public/common/components/authorization/authorization_wrapper.tsx b/x-pack/plugins/integration_assistant/public/common/components/authorization/authorization_wrapper.tsx index 3890cd3b797cd6..36e2fc727d6745 100644 --- a/x-pack/plugins/integration_assistant/public/common/components/authorization/authorization_wrapper.tsx +++ b/x-pack/plugins/integration_assistant/public/common/components/authorization/authorization_wrapper.tsx @@ -25,7 +25,11 @@ export const AuthorizationWrapper = React.memo( if (!isAuthorized) { return ( - + ); diff --git a/x-pack/plugins/integration_assistant/public/common/components/buttons_footer.tsx b/x-pack/plugins/integration_assistant/public/common/components/buttons_footer.tsx index d70e2bcb288cb6..d27d1381b6e255 100644 --- a/x-pack/plugins/integration_assistant/public/common/components/buttons_footer.tsx +++ b/x-pack/plugins/integration_assistant/public/common/components/buttons_footer.tsx @@ -44,7 +44,12 @@ export const ButtonsFooter = React.memo( const integrationsUrl = useKibana().services.application.getUrlForApp('integrations'); return ( - + ( > {!hideCancel && ( - + {cancelButtonText || ( ( > {onBack && ( - + {backButtonText || ( ( {onNext && ( - + {nextButtonText || ( ({ + canCreateIntegrations: true, + canExecuteConnectors: true, + canCreateConnectors: true, + }) +); + +export const useRoutesAuthorization = jest.fn( + (): RoutesAuthorization => ({ + canUseIntegrationAssistant: true, + canUseIntegrationUpload: true, + }) +); diff --git a/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/headers.ts b/x-pack/plugins/integration_assistant/public/common/hooks/__mocks__/use_availability.ts similarity index 51% rename from x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/headers.ts rename to x-pack/plugins/integration_assistant/public/common/hooks/__mocks__/use_availability.ts index e4ca6acfbbc654..4f820b1ae1f52d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint_api_int/headers.ts +++ b/x-pack/plugins/integration_assistant/public/common/hooks/__mocks__/use_availability.ts @@ -5,7 +5,10 @@ * 2.0. */ -export const HEADERS = Object.freeze({ - 'kbn-xsrf': 'security_solution', - 'x-elastic-internal-origin': 'security_solution', +import type { Availability } from '../use_availability'; + +export const useAvailability = jest.fn((): Availability => { + return { hasLicense: true, renderUpselling: undefined }; }); + +export const useIsAvailable = jest.fn((): boolean => true); diff --git a/x-pack/plugins/integration_assistant/public/common/hooks/use_availability.ts b/x-pack/plugins/integration_assistant/public/common/hooks/use_availability.ts index 9681ea70006239..02f523fcde2264 100644 --- a/x-pack/plugins/integration_assistant/public/common/hooks/use_availability.ts +++ b/x-pack/plugins/integration_assistant/public/common/hooks/use_availability.ts @@ -11,10 +11,12 @@ import { MINIMUM_LICENSE_TYPE } from '../../../common/constants'; import { useKibana } from './use_kibana'; import type { RenderUpselling } from '../../services'; -export const useAvailability = (): { +export interface Availability { hasLicense: boolean; renderUpselling: RenderUpselling | undefined; -} => { +} + +export const useAvailability = (): Availability => { const { licensing, renderUpselling$ } = useKibana().services; const licenseService = useObservable(licensing.license$); const renderUpselling = useObservable(renderUpselling$); diff --git a/x-pack/plugins/integration_assistant/public/common/lib/api_parsers.test.ts b/x-pack/plugins/integration_assistant/public/common/lib/api_parsers.test.ts new file mode 100644 index 00000000000000..c7d427cb5b01a7 --- /dev/null +++ b/x-pack/plugins/integration_assistant/public/common/lib/api_parsers.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EpmPackageResponse } from './api'; +import { getIntegrationNameFromResponse } from './api_parsers'; + +describe('getIntegrationNameFromResponse', () => { + it.each([ + ['audit-security.data-stream-1.0.0', 'security-1.0.0'], + ['audit-endpoint_security.data_stream-1.0.0', 'endpoint_security-1.0.0'], + ['audit-endpoint_security_2.data_stream-1.0.0', 'endpoint_security_2-1.0.0'], + ])( + 'should return the integration name from the ingest pipeline name %s', + (ingestPipelineName, expected) => { + const response = { response: [{ id: ingestPipelineName }] } as EpmPackageResponse; + expect(getIntegrationNameFromResponse(response)).toEqual(expected); + } + ); + it('should return an empty string if the response is empty', () => { + const response = { response: [] } as unknown as EpmPackageResponse; + expect(getIntegrationNameFromResponse(response)).toEqual(''); + }); + it('should return an empty string if the response is undefined', () => { + const response = {} as EpmPackageResponse; + expect(getIntegrationNameFromResponse(response)).toEqual(''); + }); + it('should return an empty string if the response is null', () => { + const response = { response: null } as unknown as EpmPackageResponse; + expect(getIntegrationNameFromResponse(response)).toEqual(''); + }); +}); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration.test.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration.test.tsx new file mode 100644 index 00000000000000..dca18a90f3a652 --- /dev/null +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration.test.tsx @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PropsWithChildren } from 'react'; +import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { render } from '@testing-library/react'; +import { TestProvider } from '../../mocks/test_provider'; +import { CreateIntegration } from './create_integration'; +import { mockServices } from '../../services/mocks/services'; +import { useRoutesAuthorization } from '../../common/hooks/use_authorization'; +import { useIsAvailable } from '../../common/hooks/use_availability'; + +jest.mock('../../common/hooks/use_authorization'); +jest.mock('../../common/hooks/use_availability'); +const mockUseRoutesAuthorization = useRoutesAuthorization as jest.Mock; +const mockUseIsAvailable = useIsAvailable as jest.Mock; + +jest.mock('./create_integration_landing', () => ({ + CreateIntegrationLanding: jest.fn(() =>
    ), +})); +jest.mock('./create_integration_upload', () => ({ + CreateIntegrationUpload: jest.fn(() =>
    ), +})); +jest.mock('./create_integration_assistant', () => ({ + CreateIntegrationAssistant: jest.fn(() =>
    ), +})); + +const getWrapper = (pathname: string): React.FC> => + function wrapper({ children }) { + return ( + + {children} + + ); + }; + +const getElement = () => ; + +describe('CreateIntegration', () => { + describe('when url is /create', () => { + let wrapper: React.ComponentType; + beforeEach(() => { + wrapper = getWrapper('/create'); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + + describe('and user is not authorized', () => { + beforeEach(() => { + mockUseRoutesAuthorization.mockReturnValueOnce({ + canUseIntegrationAssistant: false, + canUseIntegrationUpload: false, + }); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); + + describe('and the product is not available', () => { + beforeEach(() => { + mockUseIsAvailable.mockReturnValueOnce(false); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); + }); + + describe('when url is /create/assistant', () => { + let wrapper: React.ComponentType; + + beforeEach(() => { + wrapper = getWrapper('/create/assistant'); + }); + + it('should render the assistant page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('assistantMock')).toBeInTheDocument(); + }); + + describe('and user is not authorized', () => { + beforeEach(() => { + mockUseRoutesAuthorization.mockReturnValueOnce({ + canUseIntegrationAssistant: false, + canUseIntegrationUpload: true, + }); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('assistantMock')).not.toBeInTheDocument(); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); + + describe('and the product is not available', () => { + beforeEach(() => { + mockUseIsAvailable.mockReturnValueOnce(false); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('assistantMock')).not.toBeInTheDocument(); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); + }); + + describe('when url is /create/upload', () => { + let wrapper: React.ComponentType; + + beforeEach(() => { + wrapper = getWrapper('/create/upload'); + }); + + it('should render the upload page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('uploadMock')).toBeInTheDocument(); + }); + + describe('and user is not authorized', () => { + beforeEach(() => { + mockUseRoutesAuthorization.mockReturnValueOnce({ + canUseIntegrationAssistant: true, + canUseIntegrationUpload: false, + }); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('uploadMock')).not.toBeInTheDocument(); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); + + describe('and the product is not available', () => { + beforeEach(() => { + mockUseIsAvailable.mockReturnValueOnce(false); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('uploadMock')).not.toBeInTheDocument(); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); + }); + + describe('when url is not exact', () => { + let wrapper: React.ComponentType; + + beforeEach(() => { + wrapper = getWrapper('/create/something_else'); + }); + + it('should render the landing page', () => { + const result = render(getElement(), { wrapper }); + expect(result.queryByTestId('landingMock')).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx new file mode 100644 index 00000000000000..496f34a943bed7 --- /dev/null +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { render } from '@testing-library/react'; +import { TestProvider } from '../../../mocks/test_provider'; +import { CreateIntegrationAssistant } from './create_integration_assistant'; +import type { State } from './state'; + +export const defaultInitialState: State = { + step: 1, + connector: undefined, + integrationSettings: undefined, + isGenerating: false, + result: undefined, +}; +const mockInitialState = jest.fn((): State => defaultInitialState); +jest.mock('./state', () => ({ + ...jest.requireActual('./state'), + get initialState() { + return mockInitialState(); + }, +})); + +const mockConnectorStep = jest.fn(() =>
    ); +const mockIntegrationStep = jest.fn(() =>
    ); +const mockDataStreamStep = jest.fn(() =>
    ); +const mockReviewStep = jest.fn(() =>
    ); +const mockDeployStep = jest.fn(() =>
    ); + +const mockIsConnectorStepReady = jest.fn(); +const mockIsIntegrationStepReady = jest.fn(); +const mockIsDataStreamStepReady = jest.fn(); +const mockIsReviewStepReady = jest.fn(); + +jest.mock('./steps/connector_step', () => ({ + ConnectorStep: () => mockConnectorStep(), + isConnectorStepReady: () => mockIsConnectorStepReady(), +})); +jest.mock('./steps/integration_step', () => ({ + IntegrationStep: () => mockIntegrationStep(), + isIntegrationStepReady: () => mockIsIntegrationStepReady(), +})); +jest.mock('./steps/data_stream_step', () => ({ + DataStreamStep: () => mockDataStreamStep(), + isDataStreamStepReady: () => mockIsDataStreamStepReady(), +})); +jest.mock('./steps/review_step', () => ({ + ReviewStep: () => mockReviewStep(), + isReviewStepReady: () => mockIsReviewStepReady(), +})); +jest.mock('./steps/deploy_step', () => ({ DeployStep: () => mockDeployStep() })); + +const renderIntegrationAssistant = () => + render(, { wrapper: TestProvider }); + +describe('CreateIntegration', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('when step is 1', () => { + beforeEach(() => { + mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 1 }); + }); + + it('should render connector', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('connectorStepMock')).toBeInTheDocument(); + }); + + it('should call isConnectorStepReady', () => { + renderIntegrationAssistant(); + expect(mockIsConnectorStepReady).toHaveBeenCalled(); + }); + }); + + describe('when step is 2', () => { + beforeEach(() => { + mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 2 }); + }); + + it('should render integration', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('integrationStepMock')).toBeInTheDocument(); + }); + + it('should call isIntegrationStepReady', () => { + renderIntegrationAssistant(); + expect(mockIsIntegrationStepReady).toHaveBeenCalled(); + }); + }); + + describe('when step is 3', () => { + beforeEach(() => { + mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 3 }); + }); + + it('should render data stream', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('dataStreamStepMock')).toBeInTheDocument(); + }); + + it('should call isDataStreamStepReady', () => { + renderIntegrationAssistant(); + expect(mockIsDataStreamStepReady).toHaveBeenCalled(); + }); + }); + + describe('when step is 4', () => { + beforeEach(() => { + mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 4 }); + }); + + it('should render review', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('reviewStepMock')).toBeInTheDocument(); + }); + + it('should call isReviewStepReady', () => { + renderIntegrationAssistant(); + expect(mockIsReviewStepReady).toHaveBeenCalled(); + }); + }); + + describe('when step is 5', () => { + beforeEach(() => { + mockInitialState.mockReturnValueOnce({ ...defaultInitialState, step: 5 }); + }); + + it('should render deploy', () => { + const result = renderIntegrationAssistant(); + expect(result.queryByTestId('deployStepMock')).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx index d2aec8dd2a6610..adc8a05654551d 100644 --- a/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx +++ b/x-pack/plugins/integration_assistant/public/components/create_integration/create_integration_assistant/create_integration_assistant.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useReducer, useMemo, useCallback, useEffect } from 'react'; +import React, { useReducer, useMemo, useEffect } from 'react'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { Header } from './header'; import { Footer } from './footer'; @@ -59,8 +59,6 @@ export const CreateIntegrationAssistant = React.memo(() => { return false; }, [state]); - const onGenerate = useCallback(() => actions.setIsGenerating(true), [actions]); - return ( @@ -92,7 +90,6 @@ export const CreateIntegrationAssistant = React.memo(() => {