diff --git a/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml b/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml index 841b06dde4a39..3c28f5de81662 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml @@ -20,6 +20,7 @@ spec: spec: env: ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: true branch_configuration: main 8.14 7.17 default_branch: main diff --git a/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml b/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml index 2429aac93accc..def68475815a7 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml @@ -21,6 +21,7 @@ spec: env: RELEASE_BUILD: 'true' ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: true branch_configuration: 7.17 8.14 repository: elastic/kibana diff --git a/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml b/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml index b9f71d514c240..c51728226f9b4 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml @@ -21,6 +21,7 @@ spec: env: RELEASE_BUILD: 'true' ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: true branch_configuration: '8.14' default_branch: main diff --git a/.buildkite/pipeline-resource-definitions/kibana-serverless-security-solution-quality-gate-api-integration.yml b/.buildkite/pipeline-resource-definitions/kibana-pr.yml similarity index 62% rename from .buildkite/pipeline-resource-definitions/kibana-serverless-security-solution-quality-gate-api-integration.yml rename to .buildkite/pipeline-resource-definitions/kibana-pr.yml index 3e8f53b101626..8d2a6c8bf9e99 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-serverless-security-solution-quality-gate-api-integration.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-pr.yml @@ -2,10 +2,10 @@ apiVersion: backstage.io/v1alpha1 kind: Resource metadata: - name: bk-kibana-serverless-secsol-qg-api-integration - description: Runs the serverless security solution api integration tests for the Quality Gate + name: bk-kibana-pull-request + description: Runs manually for pull requests links: - - url: 'https://buildkite.com/elastic/kibana-serverless-security-solution-quality-gate-api-integration' + - url: 'https://buildkite.com/elastic/kibana-pull-request' title: Pipeline link spec: type: buildkite-pipeline @@ -15,19 +15,24 @@ spec: apiVersion: buildkite.elastic.dev/v1 kind: Pipeline metadata: - name: kibana / serverless / security-solution-quality-gate / api-integration - description: Runs the serverless security solution api integration tests for the Quality Gate + name: kibana / pull request + description: Runs manually for pull requests spec: - env: {} + env: + PR_COMMENTS_ENABLED: 'true' + GITHUB_BUILD_COMMIT_STATUS_ENABLED: 'true' + GITHUB_BUILD_COMMIT_STATUS_CONTEXT: kibana-ci + GITHUB_STEP_COMMIT_STATUS_ENABLED: 'true' allow_rebuilds: true branch_configuration: '' + cancel_intermediate_builds: true default_branch: main repository: elastic/kibana - pipeline_file: .buildkite/pipelines/security_solution/api_integration.yml + pipeline_file: .buildkite/scripts/pipelines/pull_request/pipeline.sh skip_intermediate_builds: false provider_settings: build_branches: false - build_pull_requests: false + build_pull_requests: true publish_commit_status: false trigger_mode: none build_tags: false @@ -36,8 +41,6 @@ spec: teams: everyone: access_level: BUILD_AND_READ - security-engineering-productivity: - access_level: MANAGE_BUILD_AND_READ kibana-operations: access_level: MANAGE_BUILD_AND_READ appex-qa: diff --git a/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml b/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml index 575f895d77980..3b5d3fd84fad5 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml @@ -20,6 +20,7 @@ spec: spec: env: ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'false' + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: false branch_configuration: main default_branch: main diff --git a/.buildkite/pipeline-resource-definitions/locations.yml b/.buildkite/pipeline-resource-definitions/locations.yml index bd28f45d799ac..bd7e2c3bb86bd 100644 --- a/.buildkite/pipeline-resource-definitions/locations.yml +++ b/.buildkite/pipeline-resource-definitions/locations.yml @@ -24,9 +24,9 @@ spec: - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-on-merge-unsupported-ftrs.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-performance-daily.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-performance-data-set-extraction-daily.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-pr.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-serverless-security-solution-quality-gate-api-integration.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/scalability_testing-daily.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-ess/security-solution-ess.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml index b6898c0b87c17..d5e32ca55172c 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Defend Workflows" - description: "[MKI] Executes Cypress tests for the Defend Workflows team" + description: "[MKI] Executes Cypress and API tests for the Defend Workflows team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_defend_workflows.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml index c6ec39a9b69a0..8dc4265b3e6f4 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Detection Engine" - description: "[MKI] Executes Cypress tests for the Detection Engine team" + description: "[MKI] Executes Cypress and API tests for the Detection Engine team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml index 294bda432e6ef..9d5bba5f40d1d 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Entity Analytics" - description: "[MKI] Executes Cypress tests for the Entity Analytics team" + description: "[MKI] Executes Cypress and API tests for the Entity Analytics team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml index 87c33534347ed..cd2739fe4a6fb 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Explore" - description: "[MKI] Executes Cypress tests for the Explore team" + description: "[MKI] Executes Cypress and API tests for the Explore team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_explore.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml index d80c4bfe3acc1..1aeeefe2a0ad8 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Gen Ai" - description: "[MKI] Executes Cypress tests for the Gen AI team" + description: "[MKI] Executes Cypress and API tests for the Gen AI team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml index 0ba63a9762f95..955bcf24b1e63 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Investigations" - description: "[MKI] Executes Cypress tests for the Investigations team" + description: "[MKI] Executes Cypress and API tests for the Investigations team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_investigations.yml diff --git a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml index 4579e8961fffb..af0386076dd4d 100644 --- a/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml +++ b/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml @@ -13,7 +13,7 @@ spec: kind: Pipeline metadata: name: "Kibana / Serverless / Security Solution Quality Gate / Rule Management" - description: "[MKI] Executes Cypress tests for the Rule Management team" + description: "[MKI] Executes Cypress and API tests for the Rule Management team" spec: repository: elastic/kibana pipeline_file: .buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml 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 f515305b3d50b..aa6e33f1116b4 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 @@ -27,7 +27,7 @@ const getAgentRule = (queueName: string = 'n2-4-spot') => { return { provider: 'gcp', image: 'family/kibana-ubuntu-2004', - imageProject: 'elastic-images-qa', + imageProject: 'elastic-images-prod', machineType: `${kind}-standard-${cores}`, preemptible: spot === 'spot', }; diff --git a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml index b45c277b4d36b..81f04f933208c 100644 --- a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml +++ b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml @@ -48,6 +48,7 @@ steps: provider: gcp machineType: n2-standard-16 key: build + if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''" depends_on: pre-build timeout_in_minutes: 60 retry: diff --git a/.buildkite/pipelines/pull_request/apm_cypress.yml b/.buildkite/pipelines/pull_request/apm_cypress.yml index 38027371559db..e0d8b5f4db021 100644 --- a/.buildkite/pipelines/pull_request/apm_cypress.yml +++ b/.buildkite/pipelines/pull_request/apm_cypress.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/apm_cypress.sh label: 'APM Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index b3e1d3259efec..0af21702aedd0 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -3,14 +3,21 @@ steps: label: Pre-Build timeout_in_minutes: 10 agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 - wait - command: .buildkite/scripts/steps/build_kibana.sh label: Build Kibana Distribution and Plugins agents: - queue: n2-16-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-16 + preemptible: true key: build if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''" timeout_in_minutes: 60 @@ -22,7 +29,11 @@ steps: - command: .buildkite/scripts/steps/quick_checks.sh label: 'Quick Checks' agents: - queue: n2-2-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 + preemptible: true key: quick_checks timeout_in_minutes: 60 retry: @@ -35,7 +46,10 @@ steps: - command: .buildkite/scripts/steps/ci_stats_ready.sh label: Mark CI Stats as ready agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 timeout_in_minutes: 10 depends_on: - build @@ -48,7 +62,10 @@ steps: - command: .buildkite/scripts/steps/test/pick_test_group_run_order.sh label: 'Pick Test Group Run Order' agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 timeout_in_minutes: 10 env: JEST_UNIT_SCRIPT: '.buildkite/scripts/steps/test/jest.sh' @@ -62,7 +79,11 @@ steps: - command: .buildkite/scripts/steps/lint.sh label: 'Linting' agents: - queue: n2-8-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-8 + preemptible: true key: linting timeout_in_minutes: 60 retry: @@ -73,7 +94,11 @@ steps: - command: .buildkite/scripts/steps/check_types.sh label: 'Check Types' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true key: check_types timeout_in_minutes: 70 retry: @@ -84,7 +109,11 @@ steps: - command: .buildkite/scripts/steps/lint_with_types.sh label: 'Linting (with types)' agents: - queue: n2-16-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-16 + preemptible: true key: linting_with_types timeout_in_minutes: 90 retry: @@ -96,7 +125,11 @@ steps: label: 'Checks' key: checks agents: - queue: n2-2-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 + preemptible: true timeout_in_minutes: 60 retry: automatic: @@ -106,7 +139,11 @@ steps: - command: .buildkite/scripts/steps/api_docs/build_api_docs.sh label: 'Build API Docs' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true key: build_api_docs timeout_in_minutes: 90 retry: diff --git a/.buildkite/pipelines/pull_request/build_project.yml b/.buildkite/pipelines/pull_request/build_project.yml index ba1f73c3b7a23..c6ae6479effd5 100644 --- a/.buildkite/pipelines/pull_request/build_project.yml +++ b/.buildkite/pipelines/pull_request/build_project.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/artifacts/docker_image.sh label: 'Build Project Image' agents: - queue: n2-16-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-16 + preemptible: true timeout_in_minutes: 60 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/check_next_docs.yml b/.buildkite/pipelines/pull_request/check_next_docs.yml index 16b9145661a32..eafd8ca872392 100644 --- a/.buildkite/pipelines/pull_request/check_next_docs.yml +++ b/.buildkite/pipelines/pull_request/check_next_docs.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/next_docs/build_and_validate_docs.sh label: 'Build and Validate Next Docs' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 30 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/deploy_cloud.yml b/.buildkite/pipelines/pull_request/deploy_cloud.yml index 722c6a2785c04..ed174aa41facd 100644 --- a/.buildkite/pipelines/pull_request/deploy_cloud.yml +++ b/.buildkite/pipelines/pull_request/deploy_cloud.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/cloud/build_and_deploy.sh label: 'Build and Deploy to Cloud' agents: - queue: n2-2-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/deploy_project.yml b/.buildkite/pipelines/pull_request/deploy_project.yml index 0aacf9b46c48d..4891e287723fd 100644 --- a/.buildkite/pipelines/pull_request/deploy_project.yml +++ b/.buildkite/pipelines/pull_request/deploy_project.yml @@ -3,7 +3,11 @@ steps: label: 'Build Project Image' key: build_project_image agents: - queue: n2-16-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-16 + preemptible: true timeout_in_minutes: 60 soft_fail: true retry: @@ -13,7 +17,11 @@ steps: - command: .buildkite/scripts/steps/serverless/deploy.sh label: 'Deploy Project' agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true timeout_in_minutes: 10 depends_on: - build_project_image diff --git a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml index 719884a003c89..511e98321ecb7 100644 --- a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml +++ b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/exploratory_view_plugin.sh label: 'Exploratory View @elastic/synthetics Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/fips.yml b/.buildkite/pipelines/pull_request/fips.yml index dac30490b3733..5118fae835718 100644 --- a/.buildkite/pipelines/pull_request/fips.yml +++ b/.buildkite/pipelines/pull_request/fips.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/fips/build.sh label: 'Build FIPS Image' agents: - queue: n2-2-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/fleet_cypress.yml b/.buildkite/pipelines/pull_request/fleet_cypress.yml index 2f8e629478657..b2bf1bc3d9412 100644 --- a/.buildkite/pipelines/pull_request/fleet_cypress.yml +++ b/.buildkite/pipelines/pull_request/fleet_cypress.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/fleet_cypress.sh label: 'Fleet Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/kbn_handlebars.yml b/.buildkite/pipelines/pull_request/kbn_handlebars.yml index ba12674abaf32..9bee1bc29f372 100644 --- a/.buildkite/pipelines/pull_request/kbn_handlebars.yml +++ b/.buildkite/pipelines/pull_request/kbn_handlebars.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/test/kbn_handlebars.sh label: 'Check @kbn/handlebars for upstream differences' agents: - queue: n2-2-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml index 8a8d7e68e3f32..06c61b703b1e2 100644 --- a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml +++ b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/observability_onboarding_cypress.sh label: 'Observability onboarding Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/post_build.yml b/.buildkite/pipelines/pull_request/post_build.yml index 63f7169334584..95764b537e5eb 100644 --- a/.buildkite/pipelines/pull_request/post_build.yml +++ b/.buildkite/pipelines/pull_request/post_build.yml @@ -5,4 +5,7 @@ steps: - command: .buildkite/scripts/lifecycle/post_build.sh label: Post-Build agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 diff --git a/.buildkite/pipelines/pull_request/profiling_cypress.yml b/.buildkite/pipelines/pull_request/profiling_cypress.yml index f9fef28fa5fea..7293db65cb704 100644 --- a/.buildkite/pipelines/pull_request/profiling_cypress.yml +++ b/.buildkite/pipelines/pull_request/profiling_cypress.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/profiling_cypress.sh label: 'Profiling Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/response_ops.yml b/.buildkite/pipelines/pull_request/response_ops.yml index f9ada8c70c8fd..bc9f22fc8194c 100644 --- a/.buildkite/pipelines/pull_request/response_ops.yml +++ b/.buildkite/pipelines/pull_request/response_ops.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/response_ops.sh label: 'Rules, Alerts and Exceptions ResponseOps Cypress Tests on Security Solution' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/response_ops_cases.yml b/.buildkite/pipelines/pull_request/response_ops_cases.yml index 42ae473616e3d..421e71285af4d 100644 --- a/.buildkite/pipelines/pull_request/response_ops_cases.yml +++ b/.buildkite/pipelines/pull_request/response_ops_cases.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/response_ops_cases.sh label: 'Cases Cypress Tests on Security Solution' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml index 828f94f5db417..a0dbfdb62e98d 100644 --- a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml +++ b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_ai_assistant.sh label: 'Serverless AI Assistant - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_ai_assistant.sh label: 'AI Assistant - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml index f5f7f62e0d90f..d3ee6fe63f641 100644 --- a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml +++ b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml @@ -2,7 +2,13 @@ steps: - command: .buildkite/scripts/steps/functional/defend_workflows_burn.sh label: '[Soft fail] Defend Workflows Cypress Tests, burning changed specs' agents: - queue: n2-4-virt + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 depends_on: - build - quick_checks @@ -15,7 +21,13 @@ steps: - command: .buildkite/scripts/steps/functional/defend_workflows_serverless_burn.sh label: '[Soft fail] Defend Workflows Cypress Tests on Serverless, burning changed specs' agents: - queue: n2-4-virt + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 depends_on: - build - quick_checks @@ -28,7 +40,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_burn.sh label: '[Soft fail] Security Solution Cypress tests, burning changed specs' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -41,11 +57,15 @@ steps: - command: .buildkite/scripts/steps/functional/osquery_cypress_burn.sh label: '[Soft fail] Osquery Cypress Tests, burning changed specs' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks timeout_in_minutes: 50 soft_fail: true retry: - automatic: false \ No newline at end of file + automatic: false diff --git a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml index 31fe261a1b5b5..2fab86d72afa2 100644 --- a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml +++ b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml @@ -2,7 +2,13 @@ steps: - command: .buildkite/scripts/steps/functional/defend_workflows.sh label: 'Defend Workflows Cypress Tests' agents: - queue: n2-4-virt + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 depends_on: - build - quick_checks @@ -16,7 +22,13 @@ steps: - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh label: 'Defend Workflows Cypress Tests on Serverless' agents: - queue: n2-4-virt + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + enableNestedVirtualization: true + localSsds: 1 + localSsdInterface: nvme + machineType: n2-standard-4 depends_on: - build - quick_checks @@ -27,14 +39,18 @@ steps: - exit_status: '-1' limit: 1 - # status_exception: Native role management is not enabled in this Elasticsearch instance - # - command: .buildkite/scripts/steps/functional/security_serverless_defend_workflows.sh - # label: 'Serverless Security Defend Workflows Cypress Tests' - # agents: - # queue: n2-4-spot - # depends_on: build - # timeout_in_minutes: 60 - # retry: - # automatic: - # - exit_status: '-1' - # limit: 1 +# status_exception: Native role management is not enabled in this Elasticsearch instance +# - command: .buildkite/scripts/steps/functional/security_serverless_defend_workflows.sh +# label: 'Serverless Security Defend Workflows Cypress Tests' +# agents: +# image: family/kibana-ubuntu-2004 +# imageProject: elastic-images-prod +# provider: gcp +# machineType: n2-standard-4 +# preemptible: true +# depends_on: build +# timeout_in_minutes: 60 +# retry: +# automatic: +# - exit_status: '-1' +# limit: 1 diff --git a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml index 04c08a92a7ac1..b2294b33f82fe 100644 --- a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml +++ b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_detection_engine.sh label: 'Serverless Detection Engine - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_detection_engine_exceptions.sh label: 'Serverless Detection Engine - Exceptions - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -30,7 +38,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_detection_engine.sh label: 'Detection Engine - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -44,7 +56,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_detection_engine_exceptions.sh label: 'Detection Engine - Exceptions - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml index 8ed45e2bd409a..bd670b4fa9324 100644 --- a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml +++ b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_entity_analytics.sh label: 'Serverless Entity Analytics - Security Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_entity_analytics.sh label: 'Entity Analytics - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/explore.yml b/.buildkite/pipelines/pull_request/security_solution/explore.yml index 3ee855334a28a..4f4609aca42f1 100644 --- a/.buildkite/pipelines/pull_request/security_solution/explore.yml +++ b/.buildkite/pipelines/pull_request/security_solution/explore.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_explore.sh label: 'Explore - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_explore.sh label: 'Serverless Explore - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/investigations.yml b/.buildkite/pipelines/pull_request/security_solution/investigations.yml index 38b7481e603e1..713b1b0bc45ab 100644 --- a/.buildkite/pipelines/pull_request/security_solution/investigations.yml +++ b/.buildkite/pipelines/pull_request/security_solution/investigations.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_investigations.sh label: 'Investigations - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_investigations.sh label: 'Serverless Investigations - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml index 784176ec19561..6e47721a6d671 100644 --- a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml +++ b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/osquery_cypress.sh label: 'Osquery Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_osquery.sh label: 'Serverless Osquery Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml index 2680124d1575b..8c84a6566eca9 100644 --- a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml +++ b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_rule_management.sh label: 'Serverless Rule Management - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -16,7 +20,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_serverless_rule_management_prebuilt_rules.sh label: 'Serverless Rule Management - Prebuilt Rules - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -30,7 +38,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_rule_management.sh label: 'Rule Management - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks @@ -44,7 +56,11 @@ steps: - command: .buildkite/scripts/steps/functional/security_solution_rule_management_prebuilt_rules.sh label: 'Rule Management - Prebuilt Rules - Security Solution Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml b/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml index 519d36ba3c285..5f79c21bd4938 100644 --- a/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml +++ b/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/threat_intelligence.sh label: 'Threat Intelligence Cypress Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml b/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml index 83332811bcc20..8dc048801c7c1 100644 --- a/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml +++ b/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/slo_plugin_e2e.sh label: 'SLO Plugin @elastic/synthetics Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/storybooks.yml b/.buildkite/pipelines/pull_request/storybooks.yml index 8f76879231de2..fe8b333f2d46f 100644 --- a/.buildkite/pipelines/pull_request/storybooks.yml +++ b/.buildkite/pipelines/pull_request/storybooks.yml @@ -2,6 +2,10 @@ steps: - command: .buildkite/scripts/steps/storybooks/build_and_upload.sh label: 'Build Storybooks' agents: - queue: n2-8-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-8 + preemptible: true key: storybooks timeout_in_minutes: 80 diff --git a/.buildkite/pipelines/pull_request/synthetics_plugin.yml b/.buildkite/pipelines/pull_request/synthetics_plugin.yml index fe6fb1bb0b947..39467f473c08e 100644 --- a/.buildkite/pipelines/pull_request/synthetics_plugin.yml +++ b/.buildkite/pipelines/pull_request/synthetics_plugin.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/synthetics_plugin.sh label: 'Synthetics @elastic/synthetics Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/uptime_plugin.yml b/.buildkite/pipelines/pull_request/uptime_plugin.yml index 9371fb6c3deb4..2350767b92edf 100644 --- a/.buildkite/pipelines/pull_request/uptime_plugin.yml +++ b/.buildkite/pipelines/pull_request/uptime_plugin.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/uptime_plugin.sh label: 'Uptime @elastic/synthetics Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml index 2cb69eb1eadd9..747b7e813f752 100644 --- a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml +++ b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml @@ -2,7 +2,11 @@ steps: - command: .buildkite/scripts/steps/functional/ux_synthetics_e2e.sh label: 'UX Plugin @elastic/synthetics Tests' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - build - quick_checks diff --git a/.buildkite/pipelines/pull_request/webpack_bundle_analyzer.yml b/.buildkite/pipelines/pull_request/webpack_bundle_analyzer.yml index f1e61875fa254..03ff2bd0da693 100644 --- a/.buildkite/pipelines/pull_request/webpack_bundle_analyzer.yml +++ b/.buildkite/pipelines/pull_request/webpack_bundle_analyzer.yml @@ -2,6 +2,10 @@ steps: - command: .buildkite/scripts/steps/webpack_bundle_analyzer/build_and_upload.sh label: 'Build Webpack Bundle Analyzer reports' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true key: webpack_bundle_analyzer timeout_in_minutes: 60 diff --git a/.buildkite/pipelines/security_solution/api_integration.yml b/.buildkite/pipelines/security_solution/api_integration.yml deleted file mode 100644 index abf8d4f3f9e59..0000000000000 --- a/.buildkite/pipelines/security_solution/api_integration.yml +++ /dev/null @@ -1,23 +0,0 @@ -steps: - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh - label: "Upload runtime info" - key: upload_runtime_info - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 300 - retry: - automatic: - - exit_status: "-1" - limit: 2 - - - command: "cat .buildkite/pipelines/security_solution/api_integration_serverless_release.yml | buildkite-agent pipeline upload" - label: 'Upload Release pipeline' - if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" - - - command: "cat .buildkite/pipelines/security_solution/api_integration_serverless_periodic.yml | buildkite-agent pipeline upload" - label: 'Upload Periodic Serverless Pipeline' - if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" diff --git a/.buildkite/pipelines/security_solution/api_integration_serverless_periodic.yml b/.buildkite/pipelines/security_solution/api_integration_serverless_periodic.yml deleted file mode 100644 index 56edb10fb64a5..0000000000000 --- a/.buildkite/pipelines/security_solution/api_integration_serverless_periodic.yml +++ /dev/null @@ -1,528 +0,0 @@ -steps: - - group: "API Integration Serverless Periodic Tests" - key: test_execution - steps: - - label: Running exception_workflows:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_workflows:essentials:qa:serverless - key: exception_workflows:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_date_numeric_types:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_date_numeric_types:essentials:qa:serverless - key: exception_operators_date_numeric_types:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_keyword:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_keyword:essentials:qa:serverless - key: exception_operators_keyword:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_ips:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_ips:essentials:qa:serverless - key: exception_operators_ips:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_long:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_long:essentials:qa:serverless - key: exception_operators_long:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running exception_operators_text:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_text:essentials:qa:serverless - key: exception_operators_text:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running alerts:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:qa:serverless - key: alerts:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running alerts:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:essentials:qa:serverless - key: alerts:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running actions:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh actions:qa:serverless - key: actions:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running genai:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh genai:qa:serverless - key: genai:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_execution_logic:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_execution_logic:qa:serverless - key: rule_execution_logic:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_patch:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:qa:serverless - key: rule_patch:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_patch:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:essentials:qa:serverless - key: rule_patch:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_update:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:qa:serverless - key: rule_update:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_update:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:essentials:qa:serverless - key: rule_update:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rules_management:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rules_management:essentials:qa:serverless - key: rules_management:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_management:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_management:qa:serverless - key: prebuilt_rules_management:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless - key: prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_large_prebuilt_rules_package:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_large_prebuilt_rules_package:qa:serverless - key: prebuilt_rules_large_prebuilt_rules_package:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_update_prebuilt_rules_package:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_update_prebuilt_rules_package:qa:serverless - key: prebuilt_rules_update_prebuilt_rules_package:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_bulk_actions:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_bulk_actions:qa:serverless - key: rule_bulk_actions:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_read:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:qa:serverless - key: rule_read:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_import_export:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:essentials:qa:serverless - key: rule_import_export:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_import_export:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:qa:serverless - key: rule_import_export:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_management:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_management:qa:serverless - key: rule_management:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_read:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:essentials:qa:serverless - key: rule_read:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_creation:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:qa:serverless - key: rule_creation:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_creation:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:essentials:qa:serverless - key: rule_creation:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_delete:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:qa:serverless - key: rule_delete:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_delete:essentials:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:essentials:qa:serverless - key: rule_delete:essentials:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running exception_lists_items:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_lists_items:qa:serverless - key: exception_lists_items:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running lists_items:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh lists_items:qa:serverless - key: lists_items:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running user_roles:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh user_roles:qa:serverless - key: user_roles:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running telemetry:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh telemetry:qa:serverless - key: telemetry:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running entity_analytics:qa:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:qa:serverless - key: entity_analytics:qa:serverless - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 diff --git a/.buildkite/pipelines/security_solution/api_integration_serverless_release.yml b/.buildkite/pipelines/security_solution/api_integration_serverless_release.yml deleted file mode 100644 index 6d2a8c1716892..0000000000000 --- a/.buildkite/pipelines/security_solution/api_integration_serverless_release.yml +++ /dev/null @@ -1,528 +0,0 @@ -steps: - - group: "API Integration Serverless Release Tests" - key: test_execution - steps: - - label: Running exception_workflows:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_workflows:essentials:qa:serverless:release - key: exception_workflows:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_date_numeric_types:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_date_numeric_types:essentials:qa:serverless:release - key: exception_operators_date_numeric_types:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_keyword:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_keyword:essentials:qa:serverless:release - key: exception_operators_keyword:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_ips:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_ips:essentials:qa:serverless:release - key: exception_operators_ips:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "*" - limit: 2 - - - label: Running exception_operators_long:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_long:qa:serverless:release - key: exception_operators_long:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running exception_operators_text:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_text:essentials:qa:serverless:release - key: exception_operators_text:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running alerts:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:qa:serverless:release - key: alerts:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running alerts:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:essentials:qa:serverless:release - key: alerts:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running actions:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh actions:qa:serverless:release - key: actions:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running genai:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh genai:qa:serverless:release - key: genai:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_execution_logic:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_execution_logic:qa:serverless:release - key: rule_execution_logic:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_patch:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:qa:serverless:release - key: rule_patch:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_patch:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:essentials:qa:serverless:release - key: rule_patch:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_update:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:qa:serverless:release - key: rule_update:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_update:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:essentials:qa:serverless:release - key: rule_update:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rules_management:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rules_management:essentials:qa:serverless:release - key: rules_management:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_management:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_management:qa:serverless:release - key: prebuilt_rules_management:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release - key: prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release - key: prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release - key: prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_bulk_actions:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_bulk_actions:qa:serverless:release - key: rule_bulk_actions:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_read:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:qa:serverless:release - key: rule_read:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_import_export:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:essentials:qa:serverless:release - key: rule_import_export:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_import_export:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:qa:serverless:release - key: rule_import_export:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_management:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_management:qa:serverless:release - key: rule_management:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_read:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:essentials:qa:serverless:release - key: rule_read:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_creation:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:qa:serverless:release - key: rule_creation:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_creation:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:essentials:qa:serverless:release - key: rule_creation:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_delete:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:qa:serverless:release - key: rule_delete:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running rule_delete:essentials:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:essentials:qa:serverless:release - key: rule_delete:essentials:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running exception_lists_items:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_lists_items:qa:serverless:release - key: exception_lists_items:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running lists_items:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh lists_items:qa:serverless:release - key: lists_items:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running user_roles:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh user_roles:qa:serverless:release - key: user_roles:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running telemetry:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh telemetry:qa:serverless:release - key: telemetry:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 - - - label: Running entity_analytics:qa:serverless:release - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:qa:serverless:release - key: entity_analytics:qa:serverless:release - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 120 - retry: - automatic: - - exit_status: "1" - limit: 2 diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml index f9ad0d5817783..9e34569d6a808 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_detection_engine.yml @@ -14,40 +14,494 @@ steps: - exit_status: "*" limit: 1 - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine - label: 'Serverless MKI QA Detection Engine - Security Solution Cypress Tests' - key: test_detection_engine - env: - BK_TEST_SUITE_KEY: "serverless-cypress-detection-engine" - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 8 - retry: - automatic: - - exit_status: '-1' - limit: 1 + - group: "Serverless MKI QA Detection Engine - Cypress Tests" + key: cypress_test_detections_engine + steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine + label: "Serverless MKI QA Detection Engine - Security Solution Cypress Tests" + key: test_detection_engine + env: + BK_TEST_SUITE_KEY: "serverless-cypress-detection-engine" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 8 + retry: + automatic: + - exit_status: "-1" + limit: 1 - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine:exceptions - label: 'Serverless MKI QA Detection Engine - Exceptions - Security Solution Cypress Tests' - key: test_detection_engine_exceptions - env: - BK_TEST_SUITE_KEY: "serverless-cypress-detection-engine" - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 6 - retry: - automatic: - - exit_status: '-1' - limit: 1 + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:detection_engine:exceptions + label: "Serverless MKI QA Detection Engine - Exceptions - Security Solution Cypress Tests" + key: test_detection_engine_exceptions + env: + BK_TEST_SUITE_KEY: "serverless-cypress-detection-engine" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 6 + retry: + automatic: + - exit_status: "-1" + limit: 1 + + - group: "Serverless MKI QA Detection Engine - API Integration" + key: api_test_detections_engine + steps: + - label: Running exception_lists_items:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_lists_items:qa:serverless + key: exception_lists_items:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_lists_items:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_lists_items:qa:serverless:release + key: exception_lists_items:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running lists_items:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh lists_items:qa:serverless + key: lists_items:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running lists_items:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:essentials:qa:serverless:release + key: lists_items:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running user_roles:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh user_roles:qa:serverless + key: user_roles:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running user_roles:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh user_roles:qa:serverless:release + key: user_roles:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running telemetry:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh telemetry:qa:serverless + key: telemetry:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running telemetry:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh telemetry:qa:serverless:release + key: telemetry:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_workflows:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_workflows:essentials:qa:serverless + key: exception_workflows:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_workflows:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_workflows:essentials:qa:serverless:release + key: exception_workflows:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_date_numeric_types:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_date_numeric_types:essentials:qa:serverless + key: exception_operators_date_numeric_types:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_date_numeric_types:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_date_numeric_types:essentials:qa:serverless:release + key: exception_operators_date_numeric_types:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_keyword:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_keyword:essentials:qa:serverless + key: exception_operators_keyword:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_keyword:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_keyword:essentials:qa:serverless:release + key: exception_operators_keyword:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_ips:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_ips:essentials:qa:serverless + key: exception_operators_ips:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_ips:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_ips:essentials:qa:serverless:release + key: exception_operators_ips:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_long:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_long:essentials:qa:serverless + key: exception_operators_long:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_long:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_long:essentials:qa:serverless:release + key: exception_operators_long:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_text:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_text:essentials:qa:serverless + key: exception_operators_text:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running exception_operators_text:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh exception_operators_text:essentials:qa:serverless:release + key: exception_operators_text:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running actions:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh actions:qa:serverless + key: actions:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running actions:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh actions:qa:serverless:release + key: actions:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running alerts:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:qa:serverless + key: alerts:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running alerts:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:qa:serverless:release + key: alerts:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running alerts:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:essentials:qa:serverless + key: alerts:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running alerts:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh alerts:essentials:qa:serverless:release + key: alerts:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_execution_logic:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_execution_logic:qa:serverless + key: rule_execution_logic:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_execution_logic:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_execution_logic:qa:serverless:release + key: rule_execution_logic:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml index 9c553176429d0..1b36316ad2307 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_entity_analytics.yml @@ -32,3 +32,70 @@ steps: automatic: - exit_status: '-1' limit: 1 + + - group: "Serverless MKI QA Entity Analytics - API Integration" + key: api_test_entity_analytics + steps: + - label: Running entity_analytics:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:qa:serverless + key: entity_analytics:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running entity_analytics:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:qa:serverless:release + key: entity_analytics:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running entity_analytics:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:essentials:qa:serverless + key: entity_analytics:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running entity_analytics:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh entity_analytics:essentials:qa:serverless:release + key: entity_analytics:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml index d6ac5cd764a6f..f392c099560c6 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_gen_ai.yml @@ -32,3 +32,102 @@ steps: automatic: - exit_status: "-1" limit: 1 + + - group: "Serverless MKI QA AI Assistant - API Integration" + key: api_test_ai_assistant + steps: + - label: Running genai:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh genai:qa:serverless + key: genai:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running genai:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh genai:qa:serverless:release + key: genai:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running nlp_cleanup_task:complete:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh nlp_cleanup_task:complete:qa:serverless + key: nlp_cleanup_task:complete:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running nlp_cleanup_task:complete:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh nlp_cleanup_task:complete:qa:serverless:release + key: nlp_cleanup_task:complete:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running nlp_cleanup_task:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh nlp_cleanup_task:essentials:qa:serverless + key: nlp_cleanup_task:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running nlp_cleanup_task:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh nlp_cleanup_task:essentials:qa:serverless:release + key: nlp_cleanup_task:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 diff --git a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml index bc46cdffb3627..485a1391b57d9 100644 --- a/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml +++ b/.buildkite/pipelines/security_solution_quality_gate/mki_security_solution_rule_management.yml @@ -14,40 +14,654 @@ steps: - exit_status: "*" limit: 1 - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management - label: 'Serverless MKI QA Rule Management - Security Solution Cypress Tests' - key: test_rule_management - env: - BK_TEST_SUITE_KEY: "serverless-cypress-rule-management" - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 8 - retry: - automatic: - - exit_status: '-1' - limit: 1 + - group: "Serverless MKI QA Rule Management - Cypress Test" + key: cypress_test_rule_management + steps: + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management + label: "Serverless MKI QA Rule Management - Security Solution Cypress Tests" + key: test_rule_management + env: + BK_TEST_SUITE_KEY: "serverless-cypress-rule-management" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 8 + retry: + automatic: + - exit_status: "-1" + limit: 1 - - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management:prebuilt_rules - label: 'Serverless MKI QA Rule Management - Prebuilt Rules - Security Solution Cypress Tests' - key: test_rule_management_prebuilt_rules - env: - BK_TEST_SUITE_KEY: "serverless-cypress-rule-management" - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-4 - preemptible: true - # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. - timeout_in_minutes: 300 - parallelism: 4 - retry: - automatic: - - exit_status: '-1' - limit: 1 + - command: .buildkite/scripts/pipelines/security_solution_quality_gate/security_solution_cypress/mki_security_solution_cypress.sh cypress:run:qa:serverless:rule_management:prebuilt_rules + label: "Serverless MKI QA Rule Management - Prebuilt Rules - Security Solution Cypress Tests" + key: test_rule_management_prebuilt_rules + env: + BK_TEST_SUITE_KEY: "serverless-cypress-rule-management" + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + # TODO : Revise the timeout when the pipeline will be officially integrated with the quality gate. + timeout_in_minutes: 300 + parallelism: 4 + retry: + automatic: + - exit_status: "-1" + limit: 1 + + - group: "Serverless MKI QA Rule Management - API Integration" + key: api_test_rule_management + steps: + - label: Running rule_creation:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:qa:serverless + key: rule_creation:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_creation:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:qa:serverless:release + key: rule_creation:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_creation:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:essentials:qa:serverless + key: rule_creation:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_creation:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_creation:essentials:qa:serverless:release + key: rule_creation:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_update:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:qa:serverless + key: rule_update:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_update:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:qa:serverless:release + key: rule_update:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_update:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:essentials:qa:serverless + key: rule_update:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_update:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_update:essentials:qa:serverless:release + key: rule_update:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_patch:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:qa:serverless + key: rule_patch:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_patch:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:qa:serverless:release + key: rule_patch:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_patch:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:essentials:qa:serverless + key: rule_patch:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_patch:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_patch:essentials:qa:serverless:release + key: rule_patch:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_management:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_management:qa:serverless + key: prebuilt_rules_management:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_management:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_management:qa:serverless:release + key: prebuilt_rules_management:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless + key: prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release + key: prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_large_prebuilt_rules_package:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_large_prebuilt_rules_package:qa:serverless + key: prebuilt_rules_large_prebuilt_rules_package:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release + key: prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_update_prebuilt_rules_package:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_update_prebuilt_rules_package:qa:serverless + key: prebuilt_rules_update_prebuilt_rules_package:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release + key: prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_delete:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:qa:serverless + key: rule_delete:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_delete:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:qa:serverless:release + key: rule_delete:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_delete:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:essentials:qa:serverless + key: rule_delete:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_delete:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_delete:essentials:qa:serverless:release + key: rule_delete:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_import_export:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:qa:serverless + key: rule_import_export:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_import_export:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:qa:serverless:release + key: rule_import_export:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_import_export:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:essentials:qa:serverless + key: rule_import_export:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_import_export:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_import_export:essentials:qa:serverless:release + key: rule_import_export:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_management:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_management:qa:serverless + key: rule_management:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_management:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_management:qa:serverless:release + key: rule_management:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_bulk_actions:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_bulk_actions:qa:serverless + key: rule_bulk_actions:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_bulk_actions:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_bulk_actions:qa:serverless:release + key: rule_bulk_actions:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_read:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:qa:serverless + key: rule_read:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_read:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:qa:serverless:release + key: rule_read:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_read:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:essentials:qa:serverless + key: rule_read:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rule_read:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rule_read:essentials:qa:serverless:release + key: rule_read:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rules_management:essentials:qa:serverless + if: "build.env('KIBANA_MKI_QUALITY_GATE') != '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rules_management:essentials:qa:serverless + key: rules_management:essentials:qa:serverless + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 + + - label: Running rules_management:essentials:qa:serverless:release + if: "build.env('KIBANA_MKI_QUALITY_GATE') == '1'" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api_integration/api-integration-tests.sh rules_management:essentials:qa:serverless:release + key: rules_management:essentials:qa:serverless:release + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: "1" + limit: 2 diff --git a/.buildkite/pipelines/upload_pipeline.yml b/.buildkite/pipelines/upload_pipeline.yml index f20dd1f60f7f7..1f53ac97a7b47 100644 --- a/.buildkite/pipelines/upload_pipeline.yml +++ b/.buildkite/pipelines/upload_pipeline.yml @@ -7,5 +7,7 @@ steps: echo "Uploading pipeline $TESTED_PIPELINE_PATH" buildkite-agent pipeline upload $TESTED_PIPELINE_PATH else - $TESTED_PIPELINE_PATH | buildkite-agent pipeline upload + $TESTED_PIPELINE_PATH > /tmp/pipeline_steps.yml + buildkite-agent artifact upload '/tmp/pipeline_steps.yml' + buildkite-agent pipeline upload '/tmp/pipeline_steps.yml' fi diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index db0e8239d9701..02011690a13c3 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -27,16 +27,6 @@ const getPipeline = (filename: string, removeSteps = true) => { return removeSteps ? str.replace(/^steps:/, '') : str; }; -const uploadPipeline = (pipelineContent: string | object) => { - const str = - typeof pipelineContent === 'string' ? pipelineContent : JSON.stringify(pipelineContent); - - execSync('buildkite-agent pipeline upload', { - input: str, - stdio: ['pipe', 'inherit', 'inherit'], - }); -}; - (async () => { try { const skippable = await areChangesSkippable(SKIPPABLE_PR_MATCHERS, REQUIRED_PATHS); @@ -329,9 +319,9 @@ const uploadPipeline = (pipelineContent: string | object) => { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/post_build.yml')); // remove duplicated steps - uploadPipeline([...new Set(pipeline)].join('\n')); + console.log([...new Set(pipeline)].join('\n')); } catch (ex) { - console.error('PR pipeline generation error', ex.message); + console.error('Error while generating the pipeline steps: ' + ex.message, ex); process.exit(1); } })(); diff --git a/.buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh b/.buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh index f47f5d4a41bdf..3f83ffe74bdb8 100644 --- a/.buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh +++ b/.buildkite/scripts/pipelines/security_solution_quality_gate/upload_image_metadata.sh @@ -1,5 +1,13 @@ #!/bin/bash +if [ "$KIBANA_MKI_QUALITY_GATE" == "1" ]; then + echo "Triggered by quality gate!" + triggered_by="Serverless Quality Gate." +else + echo "Triggered by Serverless Kibana Periodic Pipeline." + triggered_by="Serverless Kibana Periodic Pipeline." +fi + KIBANA_BASE_IMAGE="docker.elastic.co/kibana-ci/kibana-serverless" KIBANA_LATEST=${KIBANA_BASE_IMAGE}:latest @@ -16,10 +24,17 @@ vcs_url=$(docker inspect ${KBN_IMAGE} | jq -r '.[0].Config.Labels."org.label-sch version=$(docker inspect ${KBN_IMAGE} | jq -r '.[0].Config.Labels."org.label-schema.version"') markdown_text=""" - # Kibana Container Metadata - - Build Date : $build_date - - Github Commit Hash : $vcs_ref - - Github Repo : $vcs_url - - Version : $version +#### $triggered_by + +- Triggered from buildkite pipeline : $BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG +- Triggered from build : $BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER + +--- + +#### Kibana Container Metadata +- Build Date : $build_date +- Github Commit Hash : $vcs_ref +- Github Repo : $vcs_url +- Version : $version """ echo "${markdown_text//[*\\_]/\\&}" | buildkite-agent annotate --style "info" \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index ee3d32c5c1171..52807d4b45e62 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1058,6 +1058,7 @@ module.exports = { 'x-pack/plugins/elastic_assistant/**/*.{ts,tsx}', 'x-pack/packages/kbn-elastic-assistant/**/*.{ts,tsx}', 'x-pack/packages/kbn-elastic-assistant-common/**/*.{ts,tsx}', + 'x-pack/packages/kbn-langchain/**/*.{ts,tsx}', 'x-pack/packages/security-solution/**/*.{ts,tsx}', 'x-pack/plugins/security_solution/**/*.{ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{ts,tsx}', @@ -1071,6 +1072,7 @@ module.exports = { 'x-pack/plugins/elastic_assistant/**/*.{test,mock,test_helper}.{ts,tsx}', 'x-pack/packages/kbn-elastic-assistant/**/*.{test,mock,test_helper}.{ts,tsx}', 'x-pack/packages/kbn-elastic-assistant-common/**/*.{test,mock,test_helper}.{ts,tsx}', + 'x-pack/packages/kbn-langchain/**/*.{test,mock,test_helper}.{ts,tsx}', 'x-pack/packages/security-solution/**/*.{test,mock,test_helper}.{ts,tsx}', 'x-pack/plugins/security_solution/**/*.{test,mock,test_helper}.{ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{test,mock,test_helper}.{ts,tsx}', @@ -1090,6 +1092,7 @@ module.exports = { 'x-pack/plugins/elastic_assistant/**/*.{ts,tsx}', 'x-pack/packages/kbn-elastic-assistant/**/*.{ts,tsx}', 'x-pack/packages/kbn-elastic-assistant-common/**/*.{ts,tsx}', + 'x-pack/packages/kbn-langchain/**/*.{ts,tsx}', 'x-pack/packages/security-solution/**/*.{ts,tsx}', 'x-pack/plugins/security_solution/**/*.{ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{ts,tsx}', @@ -1128,6 +1131,7 @@ module.exports = { 'x-pack/plugins/elastic_assistant/**/*.{js,mjs,ts,tsx}', 'x-pack/packages/kbn-elastic-assistant/**/*.{js,mjs,ts,tsx}', 'x-pack/packages/kbn-elastic-assistant-common/**/*.{js,mjs,ts,tsx}', + 'x-pack/packages/kbn-langchain/**/*.{js,mjs,ts,tsx}', 'x-pack/packages/security-solution/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution/**/*.{js,mjs,ts,tsx}', 'x-pack/plugins/security_solution_ess/**/*.{js,mjs,ts,tsx}', diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d160dda238f8d..e88634c4220d1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -81,7 +81,7 @@ packages/kbn-ci-stats-shipper-cli @elastic/kibana-operations packages/kbn-cli-dev-mode @elastic/kibana-operations packages/cloud @elastic/kibana-core x-pack/plugins/cloud_integrations/cloud_chat @elastic/kibana-core -x-pack/plugins/cloud_integrations/cloud_data_migration @elastic/platform-onboarding +x-pack/plugins/cloud_integrations/cloud_data_migration @elastic/kibana-management x-pack/plugins/cloud_defend @elastic/kibana-cloud-security-posture x-pack/plugins/cloud_integrations/cloud_experiments @elastic/kibana-core x-pack/plugins/cloud_integrations/cloud_full_story @elastic/kibana-core @@ -470,9 +470,9 @@ x-pack/plugins/global_search_providers @elastic/appex-sharedux x-pack/test/plugin_functional/plugins/global_search_test @elastic/kibana-core x-pack/plugins/graph @elastic/kibana-visualizations x-pack/plugins/grokdebugger @elastic/kibana-management -packages/kbn-guided-onboarding @elastic/platform-onboarding -examples/guided_onboarding_example @elastic/platform-onboarding -src/plugins/guided_onboarding @elastic/platform-onboarding +packages/kbn-guided-onboarding @elastic/appex-sharedux +examples/guided_onboarding_example @elastic/appex-sharedux +src/plugins/guided_onboarding @elastic/appex-sharedux packages/kbn-handlebars @elastic/kibana-security packages/kbn-hapi-mocks @elastic/kibana-core packages/kbn-health-gateway-server @elastic/kibana-core @@ -517,6 +517,7 @@ src/plugins/kibana_react @elastic/appex-sharedux src/plugins/kibana_usage_collection @elastic/kibana-core src/plugins/kibana_utils @elastic/appex-sharedux x-pack/plugins/kubernetes_security @elastic/kibana-cloud-security-posture +x-pack/packages/kbn-langchain @elastic/security-generative-ai packages/kbn-language-documentation-popover @elastic/kibana-esql x-pack/examples/lens_config_builder_example @elastic/kibana-visualizations packages/kbn-lens-embeddable-utils @elastic/obs-ux-infra_services-team @elastic/kibana-visualizations @@ -817,7 +818,6 @@ packages/kbn-shared-ux-utility @elastic/appex-sharedux x-pack/plugins/observability_solution/slo @elastic/obs-ux-management-team x-pack/packages/kbn-slo-schema @elastic/obs-ux-management-team x-pack/plugins/snapshot_restore @elastic/kibana-management -packages/solution-nav/es @elastic/appex-sharedux @elastic/enterprise-search-frontend packages/solution-nav/oblt @elastic/appex-sharedux @elastic/obs-ux-management-team packages/kbn-some-dev-log @elastic/kibana-operations packages/kbn-sort-package-json @elastic/kibana-operations @@ -1149,8 +1149,8 @@ x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant /src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview @elastic/obs-ux-logs-team # Observability onboarding tour -/x-pack/plugins/observability_solution/observability_shared/public/components/tour @elastic/platform-onboarding -/x-pack/test/functional/apps/infra/tour.ts @elastic/platform-onboarding +/x-pack/plugins/observability_solution/observability_shared/public/components/tour @elastic/appex-sharedux +/x-pack/test/functional/apps/infra/tour.ts @elastic/appex-sharedux # Observability settings /x-pack/plugins/observability_solution/observability/server/ui_settings.ts @elastic/obs-docs @@ -1345,6 +1345,8 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/test_serverless/functional/test_suites/common/management/landing_page.ts @elastic/kibana-management /x-pack/test_serverless/functional/test_suites/common/dev_tools/ @elastic/kibana-management /x-pack/test_serverless/**/test_suites/common/grok_debugger/ @elastic/kibana-management +/x-pack/test/api_integration/apis/management/ @elastic/kibana-management +/x-pack/test/functional/apps/rollup_job/ @elastic/kibana-management #CC# /x-pack/plugins/cross_cluster_replication/ @elastic/kibana-management @@ -1662,7 +1664,7 @@ x-pack/plugins/security_solution/server/lib/security_integrations @elastic/secur /src/plugins/kibana_react/public/page_template/ @elastic/eui-team @elastic/appex-sharedux # Landing page for guided onboarding in Home plugin -/src/plugins/home/public/application/components/guided_onboarding @elastic/platform-onboarding +/src/plugins/home/public/application/components/guided_onboarding @elastic/appex-sharedux # Changes to translation files should not ping code reviewers x-pack/plugins/translations/translations diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 3ba234b98bbcb..a8ff588b79080 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-05-22 +date: 2024-05-24 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 8336441b9f9af..abd046bcf69ae 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 6685b071320f1..1723ebd4ec7d8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.devdocs.json b/api_docs/aiops.devdocs.json index d9bcfc2a0c8ca..b0444a67e7314 100644 --- a/api_docs/aiops.devdocs.json +++ b/api_docs/aiops.devdocs.json @@ -1428,7 +1428,127 @@ ], "enums": [], "misc": [], - "objects": [] + "objects": [], + "start": { + "parentPluginId": "aiops", + "id": "def-public.AiopsPluginStart", + "type": "Interface", + "tags": [], + "label": "AiopsPluginStart", + "description": [], + "path": "x-pack/plugins/aiops/public/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "aiops", + "id": "def-public.AiopsPluginStart.getPatternAnalysisAvailable", + "type": "Function", + "tags": [], + "label": "getPatternAnalysisAvailable", + "description": [], + "signature": [ + "() => Promise<(dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + ") => Promise>" + ], + "path": "x-pack/plugins/aiops/public/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "aiops", + "id": "def-public.AiopsPluginStart.PatternAnalysisComponent", + "type": "CompoundType", + "tags": [], + "label": "PatternAnalysisComponent", + "description": [], + "signature": [ + "React.ComponentClass<", + "LogCategorizationEmbeddableWrapperProps", + ", any> | React.FunctionComponent<", + "LogCategorizationEmbeddableWrapperProps", + ">" + ], + "path": "x-pack/plugins/aiops/public/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "aiops", + "id": "def-public.AiopsPluginStart.ChangePointDetectionComponent", + "type": "Function", + "tags": [], + "label": "ChangePointDetectionComponent", + "description": [], + "signature": [ + "React.FunctionComponent<", + "ChangePointDetectionProps", + ">" + ], + "path": "x-pack/plugins/aiops/public/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "aiops", + "id": "def-public.AiopsPluginStart.ChangePointDetectionComponent.$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": "aiops", + "id": "def-public.AiopsPluginStart.ChangePointDetectionComponent.$2", + "type": "Any", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "lifecycle": "start", + "initialIsOpen": true + }, + "setup": { + "parentPluginId": "aiops", + "id": "def-public.AiopsPluginSetup", + "type": "Type", + "tags": [], + "label": "AiopsPluginSetup", + "description": [], + "signature": [ + "void" + ], + "path": "x-pack/plugins/aiops/public/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "lifecycle": "setup", + "initialIsOpen": true + } }, "server": { "classes": [], diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 1a335060d4c1b..8d6fc993bda14 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; @@ -21,10 +21,16 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 67 | 0 | 4 | 1 | +| 74 | 0 | 9 | 2 | ## Client +### Setup + + +### Start + + ### Functions diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 6754e19612e34..2781eb3b4957e 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -4156,9 +4156,21 @@ "text": "DataView" }, ">; createSavedObject: (dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise; updateSavedObject: (indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise; defaultDataViewExists: () => Promise; getDefaultDataViewLazy: () => Promise<", { "pluginId": "dataViews", diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index fe1caf5bed1bb..eeca7cd5e0d62 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 765707f572888..9114300725d2b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 2a57372e37479..11cc1236055e8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index c85c92d8cc279..2a4ba627e7192 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 986740b48784d..23fc89452b55b 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-05-22 +date: 2024-05-24 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 931af986b5143..685975a75bbcd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 3a1fcdb56c0d4..be34ee0630279 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 6cee45110a267..8f3e8a7e491f5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 83ea6810a8a8e..b80a9cc36395d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 0374ab0494cc8..22733b389aada 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 6b9217bd04591..89e65a5b24c25 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 6745793c454e4..c2daae947a252 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud -Contact [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) for questions regarding this plugin. +Contact [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 5a2b7696074f7..c730ea8fa0114 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index f46a01bc6c79b..ff5b4d464bb5d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 0dbe0774fb1b5..6c8127935cfe2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 8c0c47f1336d3..0eb5d6efff707 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 59b293bd5ec6a..e9a1cfee92e8b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 609d39dd79547..f3c433f0df8a2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 1abe7d23506b4..cb48517c41f97 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-05-22 +date: 2024-05-24 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 d081fe81ca480..c7cdd22a8702d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 9d269b4688230..d0dc7afb1e6c0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index c5c55378bddd5..35b158fdbb268 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -12089,7 +12089,13 @@ "text": "DataView" }, " extends ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, " implements ", { "pluginId": "@kbn/es-query", @@ -14586,7 +14592,13 @@ ], "signature": [ "(dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -14603,7 +14615,13 @@ "data view instance" ], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -14639,7 +14657,13 @@ ], "signature": [ "(indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -14654,7 +14678,13 @@ "label": "indexPattern", "description": [], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -18475,7 +18505,13 @@ "text": "DataView" }, " extends ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, " implements ", { "pluginId": "@kbn/es-query", @@ -21902,7 +21938,13 @@ ], "signature": [ "(dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -21919,7 +21961,13 @@ "data view instance" ], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -21955,7 +22003,13 @@ ], "signature": [ "(indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -21970,7 +22024,13 @@ "label": "indexPattern", "description": [], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -24988,9 +25048,21 @@ "text": "DataView" }, ">; createSavedObject: (dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise; updateSavedObject: (indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise; defaultDataViewExists: () => Promise; getDefaultDataViewLazy: () => Promise<", { "pluginId": "dataViews", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 4b2df0a95ff64..16c9a91990ed0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index eb502463b92f8..967f035932699 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index e442ef8638e71..50f5ea6137513 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index c5ea0b034a429..9b99e4b24bcd5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 259ff61fdab8d..d20d90251a8e0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index ade400cbafe2c..3ea3deb355dce 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-05-22 +date: 2024-05-24 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 c936050fd6caa..bd233d83f29d4 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -20,7 +20,13 @@ "text": "DataView" }, " extends ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, " implements ", { "pluginId": "@kbn/es-query", @@ -3853,7 +3859,13 @@ ], "signature": [ "(dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -3870,7 +3882,13 @@ "data view instance" ], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -3906,7 +3924,13 @@ ], "signature": [ "(indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -3921,7 +3945,13 @@ "label": "indexPattern", "description": [], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -6948,7 +6978,13 @@ "text": "DataView" }, " extends ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, " implements ", { "pluginId": "@kbn/es-query", @@ -9711,7 +9747,13 @@ ], "signature": [ "(dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -9728,7 +9770,13 @@ "data view instance" ], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -9764,7 +9812,13 @@ ], "signature": [ "(indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -9779,7 +9833,13 @@ "label": "indexPattern", "description": [], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -12841,235 +12901,2745 @@ "classes": [ { "parentPluginId": "dataViews", - "id": "def-common.DataView", + "id": "def-common.AbstractDataView", "type": "Class", "tags": [], - "label": "DataView", - "description": [ - "\nData view class. Central kibana abstraction around multiple indices." - ], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " extends ", - "AbstractDataView", - " implements ", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.DataViewBase", - "text": "DataViewBase" - } - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", + "label": "AbstractDataView", + "description": [], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "dataViews", - "id": "def-common.DataView.fields", - "type": "CompoundType", + "id": "def-common.AbstractDataView.id", + "type": "string", "tags": [], - "label": "fields", + "label": "id", "description": [ - "\nField list, in extended array format" + "\nSaved object id" ], "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.IIndexPatternFieldList", - "text": "IIndexPatternFieldList" - }, - " & { toSpec: () => ", - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataViewFieldMap", - "text": "DataViewFieldMap" - }, - "; }" + "string | undefined" ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "dataViews", - "id": "def-common.DataView.flattenHit", - "type": "Function", + "id": "def-common.AbstractDataView.title", + "type": "string", "tags": [ "deprecated" ], - "label": "flattenHit", - "description": [], - "signature": [ - "(hit: Record, deep?: boolean | undefined) => Record" + "label": "title", + "description": [ + "\nTitle of data view" ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", "deprecated": true, "trackAdoption": false, "references": [ { - "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx" + "plugin": "data", + "path": "src/plugins/data/public/query/filter_manager/lib/get_display_value.ts" }, { - "plugin": "maps", - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx" - } - ], - "returnComment": [], - "children": [ + "plugin": "data", + "path": "src/plugins/data/common/search/search_source/inspect/inspector_stats.ts" + }, { - "parentPluginId": "dataViews", - "id": "def-common.DataView.flattenHit.$1", - "type": "Object", - "tags": [], - "label": "hit", - "description": [], - "signature": [ - "{ [x: string]: unknown[]; }" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false + "plugin": "data", + "path": "src/plugins/data/common/search/tabify/response_writer.ts" }, { - "parentPluginId": "dataViews", - "id": "def-common.DataView.flattenHit.$2", - "type": "CompoundType", - "tags": [], - "label": "deep", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "dataViews", - "id": "def-common.DataView.Unnamed", - "type": "Function", - "tags": [], - "label": "Constructor", - "description": [ - "\nconstructor" - ], - "signature": [ - "any" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + "plugin": "@kbn/search-errors", + "path": "packages/kbn-search-errors/src/painless_error.tsx" + }, { - "parentPluginId": "dataViews", - "id": "def-common.DataView.Unnamed.$1", - "type": "Object", - "tags": [], - "label": "config", - "description": [ - "- config data and dependencies" - ], - "signature": [ - "DataViewDeps" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "dataViews", - "id": "def-common.DataView.getScriptedFieldsForQuery", - "type": "Function", - "tags": [], - "label": "getScriptedFieldsForQuery", - "description": [], - "signature": [ - "() => Record" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "dataViews", - "id": "def-common.DataView.getEtag", - "type": "Function", - "tags": [], - "label": "getEtag", - "description": [], - "signature": [ - "() => string | undefined" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "dataViews", - "id": "def-common.DataView.setEtag", - "type": "Function", - "tags": [], - "label": "setEtag", - "description": [], - "signature": [ - "(etag: string | undefined) => string | undefined" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/param_types/field.ts" + }, { - "parentPluginId": "dataViews", - "id": "def-common.DataView.setEtag.$1", - "type": "string", - "tags": [], - "label": "etag", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data_views/common/data_views/data_view.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] - }, - { - "parentPluginId": "dataViews", - "id": "def-common.DataView.getComputedFields", - "type": "Function", - "tags": [], - "label": "getComputedFields", - "description": [ - "\nReturns scripted fields" - ], + "plugin": "savedObjectsManagement", + "path": "src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx" + }, + { + "plugin": "savedObjectsManagement", + "path": "src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx" + }, + { + "plugin": "unifiedSearch", + "path": "src/plugins/unified_search/public/autocomplete/providers/value_suggestion_provider.ts" + }, + { + "plugin": "unifiedSearch", + "path": "src/plugins/unified_search/public/query_string_input/fetch_index_patterns.ts" + }, + { + "plugin": "unifiedSearch", + "path": "src/plugins/unified_search/public/dataview_picker/change_dataview.tsx" + }, + { + "plugin": "@kbn/unified-field-list", + "path": "packages/kbn-unified-field-list/src/hooks/use_existing_fields.ts" + }, + { + "plugin": "@kbn/unified-field-list", + "path": "packages/kbn-unified-field-list/src/hooks/use_existing_fields.ts" + }, + { + "plugin": "@kbn/unified-field-list", + "path": "packages/kbn-unified-field-list/src/services/field_stats/load_field_stats.ts" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" + }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx" + }, + { + "plugin": "controls", + "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" + }, + { + "plugin": "controls", + "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/data_apis.ts" + }, + { + "plugin": "dataVisualizer", + "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.tsx" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/services/kibana/data_views.ts" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/services/kibana/data_views.ts" + }, + { + "plugin": "canvas", + "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" + }, + { + "plugin": "presentationUtil", + "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" + }, + { + "plugin": "logsShared", + "path": "x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/categorization_examples_loader.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_details.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/datavisualizer/index_based/data_loader/data_loader.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/clone_action_name.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx" + }, + { + "plugin": "@kbn/ml-data-view-utils", + "path": "x-pack/packages/ml/data_view_utils/actions/data_view_handler.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/server/models/job_service/new_job_caps/rollup.ts" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explore_table_formulas.ts" + }, + { + "plugin": "graph", + "path": "x-pack/plugins/graph/public/state_management/datasource.sagas.ts" + }, + { + "plugin": "graph", + "path": "x-pack/plugins/graph/public/state_management/persistence.ts" + }, + { + "plugin": "graph", + "path": "x-pack/plugins/graph/public/state_management/persistence.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts" + }, + { + "plugin": "@kbn/lens-embeddable-utils", + "path": "packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/utils/observability_data_views/observability_data_views.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/report_definition_field.tsx" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/series_editor/use_filter_values.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/filter_value_btn.tsx" + }, + { + "plugin": "stackAlerts", + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx" + }, + { + "plugin": "stackAlerts", + "path": "x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx" + }, + { + "plugin": "stackAlerts", + "path": "x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts" + }, + { + "plugin": "timelines", + "path": "x-pack/plugins/timelines/server/search_strategy/index_fields/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.ts" + }, + { + "plugin": "transform", + "path": "x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_term_form.tsx" + }, + { + "plugin": "transform", + "path": "x-pack/plugins/transform/public/app/hooks/use_data_view_exists.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/external_links.tsx" + }, + { + "plugin": "graph", + "path": "x-pack/plugins/graph/public/state_management/datasource.test.ts" + }, + { + "plugin": "uptime", + "path": "x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/filter_group/filter_group.tsx" + }, + { + "plugin": "uptime", + "path": "x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx" + }, + { + "plugin": "ux", + "path": "x-pack/plugins/observability_solution/ux/public/components/app/rum_dashboard/local_uifilters/use_data_view.ts" + }, + { + "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" + }, + { + "plugin": "ml", + "path": "x-pack/plugins/ml/public/application/services/new_job_capabilities/remove_nested_field_children.test.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_kpi.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_with_reference_lines.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/test_formula_metric_attribute.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.test.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.test.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/mobile_test_attribute.ts" + }, + { + "plugin": "exploratoryView", + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_cwv.ts" + }, + { + "plugin": "transform", + "path": "x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts" + }, + { + "plugin": "controls", + "path": "src/plugins/controls/public/services/data_views/data_views.story.ts" + }, + { + "plugin": "dataViewManagement", + "path": "src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx" + }, + { + "plugin": "dataViewManagement", + "path": "src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx" + }, + { + "plugin": "dataViewManagement", + "path": "src/plugins/data_view_management/public/components/field_editor/components/scripting_help/test_script.tsx" + }, + { + "plugin": "dataViewManagement", + "path": "src/plugins/data_view_management/public/components/field_editor/field_editor.tsx" + }, + { + "plugin": "dataViewManagement", + "path": "src/plugins/data_view_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx" + }, + { + "plugin": "eventAnnotationListing", + "path": "src/plugins/event_annotation_listing/public/components/group_editor_flyout/group_editor_controls/group_editor_controls.tsx" + }, + { + "plugin": "eventAnnotationListing", + "path": "src/plugins/event_annotation_listing/public/components/table_list.tsx" + }, + { + "plugin": "inputControlVis", + "path": "src/plugins/input_control_vis/public/control/list_control_factory.ts" + }, + { + "plugin": "inputControlVis", + "path": "src/plugins/input_control_vis/public/control/range_control_factory.ts" + }, + { + "plugin": "visDefaultEditor", + "path": "src/plugins/vis_default_editor/public/components/controls/field.tsx" + }, + { + "plugin": "visDefaultEditor", + "path": "src/plugins/vis_default_editor/public/components/controls/field.tsx" + }, + { + "plugin": "visDefaultEditor", + "path": "src/plugins/vis_default_editor/public/components/agg_select.tsx" + }, + { + "plugin": "inputControlVis", + "path": "src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts" + }, + { + "plugin": "visTypeTimelion", + "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" + }, + { + "plugin": "visTypeTimelion", + "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts" + }, + { + "plugin": "visTypeVega", + "path": "src/plugins/vis_types/vega/public/data_model/search_api.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/agg_config.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/buckets/rare_terms.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/buckets/terms.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/common/search/aggs/buckets/terms.test.ts" + }, + { + "plugin": "data", + "path": "src/plugins/data/public/query/filter_manager/lib/get_display_value.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/public/convert_to_lens/lib/datasource/datasource_info.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/public/convert_to_lens/lib/datasource/datasource_info.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/public/convert_to_lens/lib/datasource/datasource_info.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts" + }, + { + "plugin": "visTypeTimeseries", + "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts" + }, + { + "plugin": "infra", + "path": "x-pack/plugins/observability_solution/infra/public/hooks/use_data_view.test.ts" + } + ] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.fieldFormatMap", + "type": "Object", + "tags": [], + "label": "fieldFormatMap", + "description": [ + "\nMap of field formats by field name" + ], + "signature": [ + "{ [x: string]: ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.SerializedFieldFormat", + "text": "SerializedFieldFormat" + }, + "<{}, ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.typeMeta", + "type": "Object", + "tags": [], + "label": "typeMeta", + "description": [ + "\nOnly used by rollup indices, used by rollup specific endpoint to load field list." + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.TypeMeta", + "text": "TypeMeta" + }, + " | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.timeFieldName", + "type": "string", + "tags": [], + "label": "timeFieldName", + "description": [ + "\nTimestamp field name" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.type", + "type": "string", + "tags": [], + "label": "type", + "description": [ + "\nType is used to identify rollup index patterns or ES|QL data views." + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.metaFields", + "type": "Array", + "tags": [], + "label": "metaFields", + "description": [ + "\nList of meta fields by name" + ], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.version", + "type": "string", + "tags": [], + "label": "version", + "description": [ + "\nSavedObject version" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.sourceFilters", + "type": "Array", + "tags": [], + "label": "sourceFilters", + "description": [ + "\nArray of filters - hides fields in discover" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.SourceFilter", + "text": "SourceFilter" + }, + "[] | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [ + "\nArray of namespace ids" + ], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.originalSavedObjectBody", + "type": "Object", + "tags": [], + "label": "originalSavedObjectBody", + "description": [ + "\nOriginal saved object body. Used to check for saved object changes." + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.shortDotsEnable", + "type": "boolean", + "tags": [], + "label": "shortDotsEnable", + "description": [ + "\nReturns true if short dot notation is enabled" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.fieldFormats", + "type": "Object", + "tags": [], + "label": "fieldFormats", + "description": [ + "\nFieldFormats service interface" + ], + "signature": [ + "{ deserialize: ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FormatFactory", + "text": "FormatFactory" + }, + "; getDefaultConfig: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ", esTypes?: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined) => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormatConfig", + "text": "FieldFormatConfig" + }, + "; getType: (formatId: string) => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormatInstanceType", + "text": "FieldFormatInstanceType" + }, + " | undefined; getTypeWithoutMetaParams: (formatId: string) => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormatInstanceType", + "text": "FieldFormatInstanceType" + }, + " | undefined; getDefaultType: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ", esTypes?: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined) => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormatInstanceType", + "text": "FieldFormatInstanceType" + }, + " | undefined; getTypeNameByEsTypes: (esTypes: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined) => ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + " | undefined; getDefaultTypeName: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ", esTypes?: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined) => ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + " | ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + "; getInstance: (formatId: string, params?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ") => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormat", + "text": "FieldFormat" + }, + "; getDefaultInstancePlain: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ", esTypes?: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined, params?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ") => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormat", + "text": "FieldFormat" + }, + "; getDefaultInstanceCacheResolver: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ", esTypes?: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined) => string; getByFieldType: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ") => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormatInstanceType", + "text": "FieldFormatInstanceType" + }, + "[]; getDefaultInstance: (fieldType: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ", esTypes?: ", + { + "pluginId": "@kbn/field-types", + "scope": "common", + "docId": "kibKbnFieldTypesPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + "[] | undefined, params?: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ") => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormat", + "text": "FieldFormat" + }, + "; parseDefaultTypeMap: (value: Record) => void; has: (id: string) => boolean; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.fieldAttrs", + "type": "Object", + "tags": [], + "label": "fieldAttrs", + "description": [ + "\nMap of field attributes by field name. Currently count and customLabel." + ], + "signature": [ + "{ [key: string]: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldAttrSet", + "text": "FieldAttrSet" + }, + "; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.runtimeFieldMap", + "type": "Object", + "tags": [], + "label": "runtimeFieldMap", + "description": [ + "\nMap of runtime field definitions by field name" + ], + "signature": [ + "{ [x: string]: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeFieldSpec", + "text": "RuntimeFieldSpec" + }, + "; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.allowNoIndex", + "type": "boolean", + "tags": [], + "label": "allowNoIndex", + "description": [ + "\nPrevents errors when index pattern exists before indices" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nName of the data view. Human readable name used to differentiate data view." + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.matchedIndices", + "type": "Array", + "tags": [], + "label": "matchedIndices", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.scriptedFieldsMap", + "type": "Object", + "tags": [], + "label": "scriptedFieldsMap", + "description": [], + "signature": [ + "{ [x: string]: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewFieldBase", + "text": "DataViewFieldBase" + }, + "; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "signature": [ + "AbstractDataViewDeps" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getAllowHidden", + "type": "Function", + "tags": [], + "label": "getAllowHidden", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setAllowHidden", + "type": "Function", + "tags": [], + "label": "setAllowHidden", + "description": [], + "signature": [ + "(allowHidden: boolean) => boolean" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setAllowHidden.$1", + "type": "boolean", + "tags": [], + "label": "allowHidden", + "description": [], + "signature": [ + "boolean" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getName", + "type": "Function", + "tags": [], + "label": "getName", + "description": [ + "\nGet name of Data View" + ], + "signature": [ + "() => string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getIndexPattern", + "type": "Function", + "tags": [], + "label": "getIndexPattern", + "description": [ + "\nGet index pattern" + ], + "signature": [ + "() => string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [ + "index pattern string" + ] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setIndexPattern", + "type": "Function", + "tags": [], + "label": "setIndexPattern", + "description": [ + "\nSet index pattern" + ], + "signature": [ + "(indexPattern: string) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setIndexPattern.$1", + "type": "string", + "tags": [], + "label": "indexPattern", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getOriginalSavedObjectBody", + "type": "Function", + "tags": [], + "label": "getOriginalSavedObjectBody", + "description": [ + "\nGet last saved saved object fields" + ], + "signature": [ + "() => { fieldAttrs?: string | undefined; title?: string | undefined; timeFieldName?: string | undefined; fields?: string | undefined; sourceFilters?: string | undefined; fieldFormatMap?: string | undefined; typeMeta?: string | undefined; type?: string | undefined; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.resetOriginalSavedObjectBody", + "type": "Function", + "tags": [], + "label": "resetOriginalSavedObjectBody", + "description": [ + "\nReset last saved saved object fields. Used after saving." + ], + "signature": [ + "() => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.isPersisted", + "type": "Function", + "tags": [], + "label": "isPersisted", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getSourceFiltering", + "type": "Function", + "tags": [], + "label": "getSourceFiltering", + "description": [ + "\nGet the source filtering configuration for that index." + ], + "signature": [ + "() => { excludes: string[]; }" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getAggregationRestrictions", + "type": "Function", + "tags": [], + "label": "getAggregationRestrictions", + "description": [ + "\nGet aggregation restrictions. Rollup fields can only perform a subset of aggregations." + ], + "signature": [ + "() => Record | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getFormatterForField", + "type": "Function", + "tags": [], + "label": "getFormatterForField", + "description": [ + "\nProvide a field, get its formatter" + ], + "signature": [ + "(field: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + }, + " | ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + }, + ") => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormat", + "text": "FieldFormat" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getFormatterForField.$1", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [ + "field to get formatter for" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + }, + " | ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getFormatterForFieldNoDefault", + "type": "Function", + "tags": [], + "label": "getFormatterForFieldNoDefault", + "description": [ + "\nGet formatter for a given field name. Return undefined if none exists." + ], + "signature": [ + "(fieldname: string) => ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormat", + "text": "FieldFormat" + }, + " | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getFormatterForFieldNoDefault.$1", + "type": "string", + "tags": [], + "label": "fieldname", + "description": [ + "name of field to get formatter for" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldAttrs", + "type": "Function", + "tags": [], + "label": "setFieldAttrs", + "description": [ + "\nSet field attribute" + ], + "signature": [ + "(fieldName: string, attrName: K, value: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldAttrSet", + "text": "FieldAttrSet" + }, + "[K]) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldAttrs.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [ + "name of field to set attribute on" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldAttrs.$2", + "type": "Uncategorized", + "tags": [], + "label": "attrName", + "description": [ + "name of attribute to set" + ], + "signature": [ + "K" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldAttrs.$3", + "type": "Uncategorized", + "tags": [], + "label": "value", + "description": [ + "value of attribute" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldAttrSet", + "text": "FieldAttrSet" + }, + "[K]" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCustomLabelInternal", + "type": "Function", + "tags": [], + "label": "setFieldCustomLabelInternal", + "description": [ + "\nSet field custom label" + ], + "signature": [ + "(fieldName: string, customLabel: string | null | undefined) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCustomLabelInternal.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [ + "name of field to set custom label on" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCustomLabelInternal.$2", + "type": "CompoundType", + "tags": [], + "label": "customLabel", + "description": [ + "custom label value. If undefined, custom label is removed" + ], + "signature": [ + "string | null | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCountInternal", + "type": "Function", + "tags": [], + "label": "setFieldCountInternal", + "description": [ + "\nSet field count" + ], + "signature": [ + "(fieldName: string, count: number | null | undefined) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCountInternal.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [ + "name of field to set count on" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCountInternal.$2", + "type": "CompoundType", + "tags": [], + "label": "count", + "description": [ + "count value. If undefined, count is removed" + ], + "signature": [ + "number | null | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCustomDescriptionInternal", + "type": "Function", + "tags": [], + "label": "setFieldCustomDescriptionInternal", + "description": [ + "\nSet field custom description" + ], + "signature": [ + "(fieldName: string, customDescription: string | null | undefined) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCustomDescriptionInternal.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [ + "name of field to set custom description on" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldCustomDescriptionInternal.$2", + "type": "CompoundType", + "tags": [], + "label": "customDescription", + "description": [ + "custom description value. If undefined, custom description is removed" + ], + "signature": [ + "string | null | undefined" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldFormat", + "type": "Function", + "tags": [], + "label": "setFieldFormat", + "description": [ + "\nSet field formatter" + ], + "signature": [ + "(fieldName: string, format: ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.SerializedFieldFormat", + "text": "SerializedFieldFormat" + }, + "<{}, ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldFormat.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [ + "name of field to set format on" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.setFieldFormat.$2", + "type": "Object", + "tags": [], + "label": "format", + "description": [ + "field format in serialized form" + ], + "signature": [ + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.SerializedFieldFormat", + "text": "SerializedFieldFormat" + }, + "<{}, ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + ">" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.deleteFieldFormat", + "type": "Function", + "tags": [], + "label": "deleteFieldFormat", + "description": [ + "\nRemove field format from the field format map." + ], + "signature": [ + "(fieldName: string) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.deleteFieldFormat.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [ + "field name associated with the format for removal" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getAsSavedObjectBody", + "type": "Function", + "tags": [], + "label": "getAsSavedObjectBody", + "description": [ + "\nReturns index pattern as saved object body for saving" + ], + "signature": [ + "() => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewAttributes", + "text": "DataViewAttributes" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.toSpecShared", + "type": "Function", + "tags": [], + "label": "toSpecShared", + "description": [], + "signature": [ + "(includeFields?: boolean) => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewSpec", + "text": "DataViewSpec" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.toSpecShared.$1", + "type": "boolean", + "tags": [], + "label": "includeFields", + "description": [], + "signature": [ + "boolean" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.upsertScriptedFieldInternal", + "type": "Function", + "tags": [], + "label": "upsertScriptedFieldInternal", + "description": [], + "signature": [ + "(field: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + }, + ") => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.upsertScriptedFieldInternal.$1", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.deleteScriptedFieldInternal", + "type": "Function", + "tags": [], + "label": "deleteScriptedFieldInternal", + "description": [], + "signature": [ + "(fieldName: string) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.deleteScriptedFieldInternal.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.replaceAllScriptedFields", + "type": "Function", + "tags": [], + "label": "replaceAllScriptedFields", + "description": [], + "signature": [ + "(newFields: Record) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.replaceAllScriptedFields.$1", + "type": "Object", + "tags": [], + "label": "newFields", + "description": [], + "signature": [ + "Record" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.removeScriptedField", + "type": "Function", + "tags": [], + "label": "removeScriptedField", + "description": [], + "signature": [ + "(name: string) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.removeScriptedField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.upsertScriptedField", + "type": "Function", + "tags": [], + "label": "upsertScriptedField", + "description": [], + "signature": [ + "(field: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + }, + ") => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.upsertScriptedField.$1", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.hasRuntimeField", + "type": "Function", + "tags": [], + "label": "hasRuntimeField", + "description": [ + "\nChecks if runtime field exists" + ], + "signature": [ + "(name: string) => boolean" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.hasRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "field name" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getRuntimeField", + "type": "Function", + "tags": [], + "label": "getRuntimeField", + "description": [ + "\nReturns runtime field if exists" + ], + "signature": [ + "(name: string) => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + " | null" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "Runtime field name" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "getAllRuntimeFields", + "description": [ + "\nGet all runtime field definitions.\nNOTE: this does not strip out runtime fields that match mapped field names" + ], + "signature": [ + "() => Record" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [ + "map of runtime field definitions by field name" + ] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.replaceAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "replaceAllRuntimeFields", + "description": [ + "\nReplaces all existing runtime fields with new fields." + ], + "signature": [ + "(newFields: Record) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.replaceAllRuntimeFields.$1", + "type": "Object", + "tags": [], + "label": "newFields", + "description": [ + "Map of runtime field definitions by field name" + ], + "signature": [ + "Record" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.removeRuntimeField", + "type": "Function", + "tags": [], + "label": "removeRuntimeField", + "description": [], + "signature": [ + "(name: string) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.removeRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.addRuntimeField", + "type": "Function", + "tags": [], + "label": "addRuntimeField", + "description": [], + "signature": [ + "(name: string, runtimeField: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ") => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.addRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.addRuntimeField.$2", + "type": "Object", + "tags": [], + "label": "runtimeField", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.removeRuntimeFieldInteral", + "type": "Function", + "tags": [], + "label": "removeRuntimeFieldInteral", + "description": [], + "signature": [ + "(name: string) => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.removeRuntimeFieldInteral.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.addRuntimeFieldInteral", + "type": "Function", + "tags": [], + "label": "addRuntimeFieldInteral", + "description": [], + "signature": [ + "(name: string, runtimeField: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ") => void" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.addRuntimeFieldInteral.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.addRuntimeFieldInteral.$2", + "type": "Object", + "tags": [], + "label": "runtimeField", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.AbstractDataView.getFieldAttrs", + "type": "Function", + "tags": [], + "label": "getFieldAttrs", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldAttrs", + "text": "FieldAttrs" + } + ], + "path": "src/plugins/data_views/common/data_views/abstract_data_views.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView", + "type": "Class", + "tags": [], + "label": "DataView", + "description": [ + "\nData view class. Central kibana abstraction around multiple indices." + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + " extends ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, + " implements ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + } + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.fields", + "type": "CompoundType", + "tags": [], + "label": "fields", + "description": [ + "\nField list, in extended array format" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.IIndexPatternFieldList", + "text": "IIndexPatternFieldList" + }, + " & { toSpec: () => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewFieldMap", + "text": "DataViewFieldMap" + }, + "; }" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.flattenHit", + "type": "Function", + "tags": [ + "deprecated" + ], + "label": "flattenHit", + "description": [], + "signature": [ + "(hit: Record, deep?: boolean | undefined) => Record" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx" + } + ], + "returnComment": [], + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.flattenHit.$1", + "type": "Object", + "tags": [], + "label": "hit", + "description": [], + "signature": [ + "{ [x: string]: unknown[]; }" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.flattenHit.$2", + "type": "CompoundType", + "tags": [], + "label": "deep", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [ + "\nconstructor" + ], + "signature": [ + "any" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "config", + "description": [ + "- config data and dependencies" + ], + "signature": [ + "DataViewDeps" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getScriptedFieldsForQuery", + "type": "Function", + "tags": [], + "label": "getScriptedFieldsForQuery", + "description": [], + "signature": [ + "() => Record" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getEtag", + "type": "Function", + "tags": [], + "label": "getEtag", + "description": [], + "signature": [ + "() => string | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.setEtag", + "type": "Function", + "tags": [], + "label": "setEtag", + "description": [], + "signature": [ + "(etag: string | undefined) => string | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.setEtag.$1", + "type": "string", + "tags": [], + "label": "etag", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/data_views/common/data_views/data_view.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViews", + "id": "def-common.DataView.getComputedFields", + "type": "Function", + "tags": [], + "label": "getComputedFields", + "description": [ + "\nReturns scripted fields" + ], "signature": [ "() => { scriptFields: Record Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -17198,7 +19780,13 @@ "data view instance" ], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -17234,7 +19822,13 @@ ], "signature": [ "(indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -17249,7 +19843,13 @@ "label": "indexPattern", "description": [], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -19091,7 +21691,13 @@ ], "signature": [ "(indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean | undefined) => Promise" ], "path": "src/plugins/data_views/common/data_views/data_views.ts", @@ -19106,7 +21712,13 @@ "label": "indexPattern", "description": [], "signature": [ - "AbstractDataView" + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + } ], "path": "src/plugins/data_views/common/data_views/data_views.ts", "deprecated": false, @@ -23184,9 +25796,21 @@ "text": "DataView" }, ">; createSavedObject: (dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise; updateSavedObject: (indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise; defaultDataViewExists: () => Promise; getDefaultDataViewLazy: () => Promise<", { "pluginId": "dataViews", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 89f51b914ebaf..a15efa25849f9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.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 | |-------------------|-----------|------------------------|-----------------| -| 1069 | 0 | 369 | 4 | +| 1156 | 0 | 402 | 3 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index ee20462caa503..4472313f06924 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index f9b500c0537a8..ccdd467fda0f9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index f9d6ff0d62153..4abe92cc80da2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,6 +17,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | +| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, lens, controls, triggersActionsUi, dataVisualizer, canvas, presentationUtil, logsShared, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, @kbn/lens-embeddable-utils, exploratoryView, stackAlerts, infra, timelines, securitySolution, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | visualizations, lens, controls, dashboard, maps, discover, ml, infra, profiling, slo, links | - | | | lens, controls, dashboard, observabilityShared, ml | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | @@ -118,12 +119,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | savedSearch, visualizations, lens, maps | - | | | dataViewManagement | - | | | dataViewManagement | - | +| | spaces, savedObjectsManagement | - | | | unifiedSearch | - | | | unifiedSearch | - | -| | embeddableEnhanced | - | -| | embeddableEnhanced | - | -| | uiActionsEnhanced | - | -| | observabilityShared | - | | | canvas | - | | | canvas | - | | | canvas | - | @@ -134,14 +132,17 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | canvas | - | | | canvas | - | +| | enterpriseSearch | - | +| | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | +| | embeddableEnhanced | - | +| | embeddableEnhanced | - | +| | uiActionsEnhanced | - | +| | observabilityShared | - | | | visTypeGauge | - | | | visTypePie | - | | | visTypePie | - | | | @kbn/core-logging-server-internal, security | - | -| | spaces, savedObjectsManagement | - | | | @kbn/react-kibana-context-styled, kibanaReact | - | -| | enterpriseSearch | - | -| | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | | | encryptedSavedObjects | - | | | @kbn/content-management-table-list-view, filesManagement | - | | | @kbn/core | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index c9a6228b657e6..94a7166973c1d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -324,6 +324,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/lens-embeddable-utils + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [breakdown.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts#:~:text=title) | - | + + + ## @kbn/management-settings-field-definition | Deprecated API | Reference location(s) | Remove By | @@ -332,6 +340,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/ml-data-view-utils + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [data_view_handler.ts](https://github.com/elastic/kibana/tree/main/x-pack/packages/ml/data_view_utils/actions/data_view_handler.ts#:~:text=title) | - | + + + ## @kbn/monaco | Deprecated API | Reference location(s) | Remove By | @@ -381,6 +397,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/search-errors + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [painless_error.tsx](https://github.com/elastic/kibana/tree/main/packages/kbn-search-errors/src/painless_error.tsx#:~:text=title) | - | + + + ## @kbn/securitysolution-data-table | Deprecated API | Reference location(s) | Remove By | @@ -402,6 +426,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/unified-field-list + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [use_existing_fields.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-unified-field-list/src/hooks/use_existing_fields.ts#:~:text=title), [use_existing_fields.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-unified-field-list/src/hooks/use_existing_fields.ts#:~:text=title), [load_field_stats.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-unified-field-list/src/services/field_stats/load_field_stats.ts#:~:text=title) | - | + + + ## actions | Deprecated API | Reference location(s) | Remove By | @@ -469,6 +501,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.component.tsx#:~:text=title), [es_data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.tsx#:~:text=title), [es_data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/es_data_view_select/es_data_view_select.tsx#:~:text=title), [data_views.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/kibana/data_views.ts#:~:text=title), [data_views.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/kibana/data_views.ts#:~:text=title), [datasource_component.js](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/components/datasource/datasource_component.js#:~:text=title) | - | | | [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx#:~:text=getEmbeddableFactories), [embeddables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/services/kibana/embeddables.ts#:~:text=getEmbeddableFactories) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context) | - | | | [setup_expressions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | @@ -531,6 +564,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [options_list_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/options_list/options_list_service.ts#:~:text=title), [options_list_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/options_list/options_list_service.ts#:~:text=title), [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/data_views/data_views.story.ts#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/embeddable/types.ts#:~:text=getEmbeddableFactory), [embeddable_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/embeddable/embeddable_service.ts#:~:text=getEmbeddableFactory), [embeddable.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/public/services/embeddable/embeddable.story.ts#:~:text=getEmbeddableFactory) | - | | | [options_list_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/options_list/options_list_persistable_state.ts#:~:text=SavedObjectReference), [options_list_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/options_list/options_list_persistable_state.ts#:~:text=SavedObjectReference), [options_list_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/options_list/options_list_persistable_state.ts#:~:text=SavedObjectReference), [range_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/range_slider/range_slider_persistable_state.ts#:~:text=SavedObjectReference), [range_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/range_slider/range_slider_persistable_state.ts#:~:text=SavedObjectReference), [range_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/range_slider/range_slider_persistable_state.ts#:~:text=SavedObjectReference), [time_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/time_slider/time_slider_persistable_state.ts#:~:text=SavedObjectReference), [time_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/time_slider/time_slider_persistable_state.ts#:~:text=SavedObjectReference), [time_slider_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/time_slider/time_slider_persistable_state.ts#:~:text=SavedObjectReference), [control_group_persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/controls/common/control_group/control_group_persistable_state.ts#:~:text=SavedObjectReference)+ 2 more | - | @@ -583,6 +617,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [get_display_value.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/get_display_value.ts#:~:text=title), [inspector_stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts#:~:text=title), [response_writer.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/response_writer.ts#:~:text=title), [field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/param_types/field.ts#:~:text=title), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=title), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [rare_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/rare_terms.test.ts#:~:text=title), [terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/terms.test.ts#:~:text=title)+ 2 more | - | | | [session_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/search/session/session_service.ts#:~:text=authc) | - | | | [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions), [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions) | - | | | [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/filters/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/filters/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/filters/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/persistable_state.ts#:~:text=SavedObjectReference) | - | @@ -605,6 +640,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | - | | | [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | - | | | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | - | +| | [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=title), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=title), [test_script.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=title), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/field_editor/field_editor.tsx#:~:text=title), [create_edit_field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data_view_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx#:~:text=title) | - | @@ -630,6 +666,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [document_stats.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/document_stats.tsx#:~:text=fieldFormats), [distinct_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/distinct_values.tsx#:~:text=fieldFormats), [top_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx#:~:text=fieldFormats), [choropleth_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx#:~:text=fieldFormats), [default_value_formatter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts#:~:text=fieldFormats) | - | +| | [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title) | - | | | [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=savedObjects) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject) | - | @@ -685,6 +722,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [find_or_create_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts#:~:text=title), [analytics_collection_explore_table_formulas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explore_table_formulas.ts#:~:text=title), [find_or_create_data_view.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.test.ts#:~:text=title) | - | | | [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi) | - | | | [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/plugin.ts#:~:text=legacy) | - | @@ -702,10 +740,19 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## eventAnnotationListing + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [group_editor_controls.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/event_annotation_listing/public/components/group_editor_flyout/group_editor_controls/group_editor_controls.tsx#:~:text=title), [table_list.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/event_annotation_listing/public/components/table_list.tsx#:~:text=title) | - | + + + ## exploratoryView | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [observability_data_views.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/utils/observability_data_views/observability_data_views.ts#:~:text=title), [report_definition_field.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/report_definition_field.tsx#:~:text=title), [use_filter_values.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/series_editor/use_filter_values.ts#:~:text=title), [filter_value_btn.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/series_editor/columns/filter_value_btn.tsx#:~:text=title), [sample_attribute.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute.ts#:~:text=title), [sample_attribute_kpi.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_kpi.ts#:~:text=title), [sample_attribute_with_reference_lines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_with_reference_lines.ts#:~:text=title), [test_formula_metric_attribute.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/test_data/test_formula_metric_attribute.ts#:~:text=title), [single_metric_attributes.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.test.ts#:~:text=title), [single_metric_attributes.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/configurations/lens_attributes/single_metric_attributes.test.ts#:~:text=title)+ 2 more | - | | | [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/hooks/use_discover_link.tsx#:~:text=indexPatternId) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/application/types.ts#:~:text=SavedObjectsStart), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/exploratory_view/public/application/types.ts#:~:text=SavedObjectsStart) | - | @@ -749,6 +796,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [install.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.test.ts#:~:text=migrationVersion) | - | | | [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [install.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.test.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion)+ 22 more | - | +| | [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=title) | - | | | [use_get_logs_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/hooks/use_get_logs_discover_link.tsx#:~:text=indexPatternId) | - | | | [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode) | 8.8.0 | | | [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode) | 8.8.0 | @@ -775,6 +823,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | +| | [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [source_picker.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/source_picker.tsx#:~:text=includeFields) | - | | | [save_modal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/save_modal.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | @@ -819,6 +868,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_data_view.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/hooks/use_data_view.test.ts#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [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) | - | @@ -831,6 +881,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=fetch), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=fetch) | - | | | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=indexPatterns), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=indexPatterns), [controls_tab.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx#:~:text=indexPatterns) | - | | | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=fetch), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=fetch) | - | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=title), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=title), [get_index_pattern_mock.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts#:~:text=title) | - | @@ -870,6 +921,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/data_views_service/loader.ts#:~:text=title), [lens_top_nav.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=registerSavedObjectToPanelMethod) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [embeddable_component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_component.tsx#:~:text=getEmbeddableFactory) | - | @@ -922,6 +974,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [resolved_log_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts#:~:text=title) | - | | | [log_view_saved_object.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts#:~:text=migrations) | - | @@ -950,6 +1003,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | | | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | | | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | +| | [es_tooltip_property.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/plugin.ts#:~:text=registerSavedObjectToPanelMethod) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [map_attribute_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/map_attribute_service.ts#:~:text=ResolvedSimpleSavedObject), [map_attribute_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/map_attribute_service.ts#:~:text=ResolvedSimpleSavedObject), [map_attribute_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/map_attribute_service.ts#:~:text=ResolvedSimpleSavedObject), [map_attribute_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/map_attribute_service.ts#:~:text=ResolvedSimpleSavedObject) | - | @@ -973,6 +1027,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [register_ml_alerts.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts#:~:text=registerNavigation) | - | +| | [job_creator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts#:~:text=title), [categorization_examples_loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/categorization_examples_loader.ts#:~:text=title), [configuration_step_details.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_details.tsx#:~:text=title), [data_loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/datavisualizer/index_based/data_loader/data_loader.ts#:~:text=title), [use_index_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts#:~:text=title), [use_index_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts#:~:text=title), [use_index_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts#:~:text=title), [use_index_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts#:~:text=title), [configuration_step_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx#:~:text=title), [configuration_step_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx#:~:text=title)+ 10 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/embeddables/index.ts#:~:text=registerEmbeddableFactory) | - | | | [get_embeddable_component.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/embeddables/get_embeddable_component.tsx#:~:text=getEmbeddableFactory) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/plugin.ts#:~:text=license%24) | 8.8.0 | @@ -1035,6 +1090,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/data_views/data_views.story.ts#:~:text=title) | - | | | [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | @@ -1111,6 +1167,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=title), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=title) | - | | | [find_relationships.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts#:~:text=SavedObject), [find_relationships.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts#:~:text=SavedObject), [find_relationships.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts#:~:text=SavedObject), [find_relationships.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/server/lib/find_relationships.test.ts#:~:text=SavedObject) | - | | | [record.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/services/types/record.ts#:~:text=SavedObjectReference), [record.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/services/types/record.ts#:~:text=SavedObjectReference) | - | | | [resolve_import_errors.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts#:~:text=createNewCopy) | - | @@ -1197,6 +1254,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [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) | - | | | [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts#:~:text=options) | - | +| | [create_sourcerer_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts#:~:text=title), [create_sourcerer_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts#:~:text=title), [create_sourcerer_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts#:~:text=title), [validators.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.ts#:~:text=title) | - | | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [get_is_alert_suppression_active.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.ts#:~:text=license%24), [create_threat_signals.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts#:~:text=license%24), [query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts#:~:text=license%24), [threshold.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24) | 8.8.0 | @@ -1278,6 +1336,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [data_view_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/data_view_select.tsx#:~:text=indexPatterns), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=indexPatterns), [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=indexPatterns), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=indexPatterns), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=indexPatterns) | - | | | [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/threshold/expression.tsx#:~:text=fieldFormats) | - | | | [fetch_search_source_query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/lib/fetch_search_source_query.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch), [rule_type.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/server/rule_types/es_query/rule_type.test.ts#:~:text=fetch) | - | +| | [boundary_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/boundary_form.tsx#:~:text=title), [entity_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/geo_containment/rule_form/entity_form.tsx#:~:text=title), [data_view_select_popover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx#:~:text=title) | - | @@ -1308,10 +1367,19 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## timelines + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/server/search_strategy/index_fields/index.ts#:~:text=title) | - | + + + ## transform | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [filter_term_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_term_form.tsx#:~:text=title), [use_data_view_exists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_data_view_exists.ts#:~:text=title), [common.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts#:~:text=title) | - | | | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/services/license.ts#:~:text=license%24) | 8.8.0 | | | [mount_management_section.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/mount_management_section.ts#:~:text=savedObjects) | - | | | [app_dependencies.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/app_dependencies.tsx#:~:text=SavedObjectsStart), [app_dependencies.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/app_dependencies.tsx#:~:text=SavedObjectsStart) | - | @@ -1323,6 +1391,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [use_bulk_get_maintenance_windows.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_get_maintenance_windows.tsx#:~:text=MaintenanceWindow), [use_bulk_get_maintenance_windows.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_get_maintenance_windows.tsx#:~:text=MaintenanceWindow), [tooltip_content.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/tooltip_content.tsx#:~:text=MaintenanceWindow), [tooltip_content.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/tooltip_content.tsx#:~:text=MaintenanceWindow), [cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx#:~:text=MaintenanceWindow)+ 11 more | - | +| | [data_apis.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/common/lib/data_apis.ts#:~:text=title) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/plugin.ts#:~:text=theme%24) | - | | | [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute), [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute), [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute), [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute) | - | @@ -1341,6 +1410,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [value_suggestion_provider.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/public/autocomplete/providers/value_suggestion_provider.ts#:~:text=title), [fetch_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/public/query_string_input/fetch_index_patterns.ts#:~:text=title), [change_dataview.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx#:~:text=title) | - | | | [terms_enum.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_enum.ts#:~:text=getFieldByName), [terms_enum.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_enum.ts#:~:text=getFieldByName), [terms_agg.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_agg.ts#:~:text=getFieldByName), [terms_agg.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_agg.ts#:~:text=getFieldByName) | - | | | [terms_enum.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_enum.ts#:~:text=findIndexPatternById), [terms_enum.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_enum.ts#:~:text=findIndexPatternById), [terms_agg.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_agg.ts#:~:text=findIndexPatternById), [terms_agg.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/server/autocomplete/terms_agg.ts#:~:text=findIndexPatternById) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/public/types.ts#:~:text=savedObjects), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/unified_search/public/types.ts#:~:text=savedObjects) | - | @@ -1351,6 +1421,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [external_links.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/external_links.tsx#:~:text=title) | - | | | [reindex_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24) | 8.8.0 | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/common/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/common/types.ts#:~:text=SavedObject) | - | @@ -1360,10 +1431,27 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [filter_group.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/filter_group/filter_group.tsx#:~:text=title), [filters_expression_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx#:~:text=title) | - | | | [uptime_settings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/lib/saved_objects/uptime_settings.ts#:~:text=migrations) | - | +## ux + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [use_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/ux/public/components/app/rum_dashboard/local_uifilters/use_data_view.ts#:~:text=title) | - | + + + +## visDefaultEditor + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=title), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=title), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=title) | - | + + + ## visTypeGauge | Deprecated API | Reference location(s) | Remove By | @@ -1381,6 +1469,14 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## visTypeTimelion + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [arg_value_suggestions.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts#:~:text=title), [arg_value_suggestions.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts#:~:text=title) | - | + + + ## visTypeTimeseries | Deprecated API | Reference location(s) | Remove By | @@ -1388,10 +1484,19 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | - | | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | - | | | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | - | +| | [index_patterns_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.ts#:~:text=title), [index_patterns_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.ts#:~:text=title), [get_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/get_fields.ts#:~:text=title), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=title), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=title), [convert_series_to_datatable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts#:~:text=title), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=title), [datasource_info.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/datasource/datasource_info.test.ts#:~:text=title), [datasource_info.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/datasource/datasource_info.test.ts#:~:text=title), [datasource_info.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/datasource/datasource_info.test.ts#:~:text=title)+ 2 more | - | | | [query_input_bar_context.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/contexts/query_input_bar_context.ts#:~:text=SavedObjectsClientContract), [query_input_bar_context.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/contexts/query_input_bar_context.ts#:~:text=SavedObjectsClientContract) | - | +## visTypeVega + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [search_api.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/data_model/search_api.ts#:~:text=title) | - | + + + ## visualizations | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 499661402ab00..7763384170ba7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -61,8 +61,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Plugin | Deprecated API | Reference location(s) | Remove By | | --------|-------|-----------|-----------| +| upgradeAssistant | | [reindex_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/server/services/license.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/remote_clusters/server/plugin.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/index_lifecycle_management/server/services/license.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rollup/server/services/license.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/snapshot_restore/server/services/license.ts#:~:text=license%24) | 8.8.0 | | licenseManagement | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/license_management/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cross_cluster_replication/public/plugin.ts#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | 8.8.0 | -| painlessLab | | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/server/services/license.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/remote_clusters/server/plugin.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/index_lifecycle_management/server/services/license.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rollup/server/services/license.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/snapshot_restore/server/services/license.ts#:~:text=license%24), [reindex_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24) | 8.8.0 | | management | | [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/management/public/application.tsx#:~:text=appBasePath) | 8.8.0 | @@ -71,7 +71,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Plugin | Deprecated API | Reference location(s) | Remove By | | --------|-------|-----------|-----------| -| dashboard | | [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [add_to_library_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx#:~:text=SavedObjectSaveModal), [add_to_library_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx#:~:text=SavedObjectSaveModal), [save_to_library.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/links/public/content_management/save_to_library.tsx#:~:text=SavedObjectSaveModal), [save_to_library.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/links/public/content_management/save_to_library.tsx#:~:text=SavedObjectSaveModal), [attribute_service.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal), [attribute_service.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | +| dashboard | | [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [add_to_library_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx#:~:text=SavedObjectSaveModal), [add_to_library_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [save_to_library.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/links/public/content_management/save_to_library.tsx#:~:text=SavedObjectSaveModal), [save_to_library.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/links/public/content_management/save_to_library.tsx#:~:text=SavedObjectSaveModal), [attribute_service.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal), [attribute_service.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | @@ -119,7 +119,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Plugin | Deprecated API | Reference location(s) | Remove By | | --------|-------|-----------|-----------| | ml | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/plugin.ts#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/aiops/public/plugin.tsx#:~:text=license%24) | 8.8.0 | -| ml | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/aiops/server/plugin.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/services/license.ts#:~:text=license%24) | 8.8.0 | +| ml | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/plugin.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/services/license.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/aiops/server/plugin.ts#:~:text=license%24) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 796e4ba0bad3b..8700ada6e3d09 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-05-22 +date: 2024-05-24 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 05fdd00439054..9470b077bc0c1 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-05-22 +date: 2024-05-24 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 239c249d26bf0..5f6ede2706f29 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-05-22 +date: 2024-05-24 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 0418f3237d1fc..daa23f3e03003 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-05-22 +date: 2024-05-24 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 369a51bfc9721..f5f1b9b6abe70 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.devdocs.json b/api_docs/elastic_assistant.devdocs.json index 305f009d109af..73d9cc8d736fc 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -1494,6 +1494,8 @@ "ActionsClientLlm", " | ", "ActionsClientChatOpenAI", + " | ", + "ActionsClientSimpleChatModel", " | undefined" ], "path": "x-pack/plugins/elastic_assistant/server/types.ts", diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 4bc8321f96848..7df6e9bf552a7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 6faa7cbf91145..0f03975d8dc82 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 578ddf257efc6..307ba79aabcc9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 29b84b185a7ec..9ce88bb1ab916 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index e26c0e8daac2c..ebb4f006ace86 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 685df68a7084c..8c07efa929150 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 0a0a98a397192..6542fb00edc6c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index c4a04834c4210..182a708e2cba8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index a10096a00b365..c6a31ce67126a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index f0a58586fb684..ee2d96da709cd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index bc4a4049116ef..a470059efb14c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 16c409c397b5c..e94808f2707a0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index bd7e759ee7977..54c6029b18238 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index d9763544ace12..20087eed7766c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index b5c58cac01ebc..6c06943fc0174 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 40930bdb6bdcc..d1c70f7c0a86f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index b2afbfba5b08b..870de6489d9c9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 4bf83b04e318e..b6f87bd3764b1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 6d5605db8f2b5..66aceaff9ae53 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 6a9be51495b6f..8dc8d7853da44 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 14315213f38d3..c1f1448bad18f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index c59644b57e751..8021fa3872b04 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 09cb25eb565bd..cd9e2a2e5d231 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 5cd0457727083..50acf5f61871d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 9a72517bfd94e..7fb9aa8a7a3d3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.devdocs.json b/api_docs/field_formats.devdocs.json index fd5a4c08e4283..c0d04c8516b70 100644 --- a/api_docs/field_formats.devdocs.json +++ b/api_docs/field_formats.devdocs.json @@ -5538,16 +5538,16 @@ "pluginId": "fieldFormats", "scope": "common", "docId": "kibFieldFormatsPluginApi", - "section": "def-common.TextContextTypeConvert", - "text": "TextContextTypeConvert" + "section": "def-common.HtmlContextTypeConvert", + "text": "HtmlContextTypeConvert" }, " | ", { "pluginId": "fieldFormats", "scope": "common", "docId": "kibFieldFormatsPluginApi", - "section": "def-common.HtmlContextTypeConvert", - "text": "HtmlContextTypeConvert" + "section": "def-common.TextContextTypeConvert", + "text": "TextContextTypeConvert" } ], "path": "src/plugins/field_formats/common/types.ts", diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index e83fd08dc5e18..9148c75a00144 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index e7b15ff47b220..ea6ee9e25f18a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.devdocs.json b/api_docs/files.devdocs.json index 19d7534b84931..834e9950abb4b 100644 --- a/api_docs/files.devdocs.json +++ b/api_docs/files.devdocs.json @@ -5277,7 +5277,7 @@ "\nAttributes to update." ], "signature": [ - "{ name: string; meta: unknown; alt: string | undefined; }" + "{ meta: unknown; name: string; alt: string | undefined; }" ], "path": "src/plugins/files/server/file_service/file_action_types.ts", "deprecated": false, @@ -6869,7 +6869,7 @@ "\nThe set of file metadata that can be updated." ], "signature": [ - "{ name: string; meta: Meta | undefined; alt: string | undefined; }" + "{ meta: Meta | undefined; name: string; alt: string | undefined; }" ], "path": "src/plugins/files/common/types.ts", "deprecated": false, diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 3daa1cc982643..fb8d0d61c4353 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 8a53899d5912a..1f53d43ae4137 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 44c8d14f84aa4..79dedb3ee428d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index b14b2ba12281b..027d172fdc785 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 22d1c0e924ad2..79dcb830cb11e 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; Guided onboarding framework -Contact [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) for questions regarding this plugin. +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 04afe38b36489..8ba7fd344cd22 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 095da1f16aada..b78258826330d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index ff21047f396c6..41c8309475ce7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 2411ced1b1181..9802f2a41ef1d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 216b2a587eeb3..8153bc2cae01c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 91652ff4211c6..42f3e51e3ae35 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 114b16ddc66cd..5d4227bb0de27 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index dbdc29d6d8486..efc7a494887ef 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 449a411703985..668f038f6e8cb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 74a53f9f09dcb..fafd6da65d8a3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 59576b117dea1..ca98b2af38a19 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 7118fb705a619..c06f5fbfddbfe 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index b45e05a6e13f5..a1f912bb205e3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 1b16ac6112522..9efbfcdb895e1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 17ea0b1338bca..a2130b301d857 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 4a0d84229bbb0..86ea6492e3147 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 1dfcaa8277a27..62c6a8839ccaa 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.devdocs.json b/api_docs/kbn_alerts_ui_shared.devdocs.json index 41bc892287396..98be16075c7ae 100644 --- a/api_docs/kbn_alerts_ui_shared.devdocs.json +++ b/api_docs/kbn_alerts_ui_shared.devdocs.json @@ -1497,9 +1497,21 @@ "text": "DataView" }, ">; createSavedObject: (dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise; updateSavedObject: (indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise; defaultDataViewExists: () => Promise; getDefaultDataViewLazy: () => Promise<", { "pluginId": "dataViews", @@ -2289,9 +2301,21 @@ "text": "DataView" }, ">; createSavedObject: (dataView: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", overwrite?: boolean) => Promise; updateSavedObject: (indexPattern: ", - "AbstractDataView", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" + }, ", saveAttempts?: number, ignoreErrors?: boolean, displayErrors?: boolean) => Promise; defaultDataViewExists: () => Promise; getDefaultDataViewLazy: () => Promise<", { "pluginId": "dataViews", diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index b748c4b4a5d0c..aa94ecee7227e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index ec231f48be5cb..99b6fabf0450c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index b5d375021b5ed..dc90fa2f92e5c 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index ff0fdb33bf11e..04f24df27c3bd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 5390561128359..9286d5486fcaf 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index fe996f9579153..1ee7e47d88dd2 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 238f2a516b9f2..14816f0aad9e3 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index b7dbe09f82851..fb20061c3457d 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 4872a7962cb45..11d510821d550 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 8d78c95f6efab..babf1f0f51f7f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 75d7830e8bdd2..b475cdcabd2fd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index ce2d14ba979d9..8ecc7ab54b1b6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 4932cf23656db..621e99ccc1ff3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 70ed8086627b5..a189e52483f24 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index a69cd515f4353..f93ca4aa972e1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 77aaa7de43eed..554cedb736e31 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index d17d13f655a0a..2704629372fbc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 7d98b8019a376..ce0e13e859e5b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index be970c4ac4e3c..cb5980b048704 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index c49c0ea96e3c9..2f344658ac3c6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index e0ed57e28baa8..034fd4f8b1f2c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 112b19bdd81fd..68fd997506364 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 2c5320f2c71f2..000f8704c768a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index e3988ab7bc941..81b8f5bced327 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 8e49be1785c33..3c0f9d26e267d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 17656aad08d96..351e211e77c3b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 1098de619a422..5dc9de9c8a32c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index ebba771c06d92..deeca11fbacf1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index b8d96a7dbf987..c17d47e83490d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 83758deb07e35..6f9b9d080ce38 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 0cf2f7f5f2b25..f330c0aea3b2c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.devdocs.json b/api_docs/kbn_config_schema.devdocs.json index 2c82087ed0c2e..6b5e7c68c2f26 100644 --- a/api_docs/kbn_config_schema.devdocs.json +++ b/api_docs/kbn_config_schema.devdocs.json @@ -1796,7 +1796,9 @@ "section": "def-common.Type", "text": "Type" }, - "; literal: (value: T) => ", + "; lazy: (id: string) => ", + "Lazy", + "; literal: (value: T) => ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -2646,7 +2648,7 @@ "label": "metaFields", "description": [], "signature": [ - "{ readonly META_FIELD_X_OAS_ANY: \"x-oas-any-type\"; readonly META_FIELD_X_OAS_REF_ID: \"x-oas-ref-id\"; readonly META_FIELD_X_OAS_OPTIONAL: \"x-oas-optional\"; readonly META_FIELD_X_OAS_DEPRECATED: \"x-oas-deprecated\"; readonly META_FIELD_X_OAS_MAX_LENGTH: \"x-oas-max-length\"; readonly META_FIELD_X_OAS_MIN_LENGTH: \"x-oas-min-length\"; readonly META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES: \"x-oas-get-additional-properties\"; }" + "{ readonly META_FIELD_X_OAS_ANY: \"x-oas-any-type\"; readonly META_FIELD_X_OAS_OPTIONAL: \"x-oas-optional\"; readonly META_FIELD_X_OAS_DEPRECATED: \"x-oas-deprecated\"; readonly META_FIELD_X_OAS_MAX_LENGTH: \"x-oas-max-length\"; readonly META_FIELD_X_OAS_MIN_LENGTH: \"x-oas-min-length\"; readonly META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES: \"x-oas-get-additional-properties\"; }" ], "path": "packages/kbn-config-schema/index.ts", "deprecated": false, @@ -3177,6 +3179,36 @@ } ] }, + { + "parentPluginId": "@kbn/config-schema", + "id": "def-common.schema.lazy", + "type": "Function", + "tags": [], + "label": "lazy", + "description": [], + "signature": [ + "(id: string) => ", + "Lazy", + "" + ], + "path": "packages/kbn-config-schema/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/config-schema", + "id": "def-common.schema.lazy.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-config-schema/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, { "parentPluginId": "@kbn/config-schema", "id": "def-common.schema.literal", diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 670776670de62..4da893732c1ac 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.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 | |-------------------|-----------|------------------------|-----------------| -| 142 | 3 | 139 | 19 | +| 144 | 3 | 141 | 20 | ## Common diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index f2cb6d3b4185e..5780993f9b6d4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index ff30706fec14a..bba48c92f6e4e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 21578661ccfd6..a16bd6c42222d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 0fb82dc841e6d..fe538f6d9cef8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index ed69e10c53701..46aacf54d6be3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index ac4cc0cd2430f..6647818ed3641 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index e4b0df5e07b41..580e25611feb9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 7d185a3c3a05a..2319e64003105 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 50c2d63ce68ac..d91f16a400267 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index bbd6f7f697cf2..f4ccff13933dc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 26491d6623726..4b70b54cdf6ee 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 075c12742bf4d..3f8f143f9f20f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 4c2dfb86763c7..b8207bcc3b201 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 4db1b6902ebf1..61e49c0c5dc94 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index d940fa2813755..c59e682b07f0f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 33b4f71b1c8ee..072535098bd6f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.devdocs.json b/api_docs/kbn_core_apps_browser_internal.devdocs.json index 6d8e18656bdf4..4f9ba443d8311 100644 --- a/api_docs/kbn_core_apps_browser_internal.devdocs.json +++ b/api_docs/kbn_core_apps_browser_internal.devdocs.json @@ -115,7 +115,7 @@ "label": "start", "description": [], "signature": [ - "({ application, docLinks, http, notifications, uiSettings, }: ", + "({ application, docLinks, http, notifications, uiSettings, analytics, i18n, theme, }: ", { "pluginId": "@kbn/core-apps-browser-internal", "scope": "common", @@ -134,7 +134,7 @@ "id": "def-common.CoreAppsService.start.$1", "type": "Object", "tags": [], - "label": "{\n application,\n docLinks,\n http,\n notifications,\n uiSettings,\n }", + "label": "{\n application,\n docLinks,\n http,\n notifications,\n uiSettings,\n analytics,\n i18n,\n theme,\n }", "description": [], "signature": [ { @@ -369,6 +369,78 @@ "path": "packages/core/apps/core-apps-browser-internal/src/core_app.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-apps-browser-internal", + "id": "def-common.CoreAppsServiceStartDeps.analytics", + "type": "Object", + "tags": [], + "label": "analytics", + "description": [], + "signature": [ + "{ optIn: (optInConfig: ", + { + "pluginId": "@kbn/analytics-client", + "scope": "common", + "docId": "kibKbnAnalyticsClientPluginApi", + "section": "def-common.OptInConfig", + "text": "OptInConfig" + }, + ") => void; reportEvent: (eventType: string, eventData: EventTypeData) => void; readonly telemetryCounter$: ", + "Observable", + "<", + { + "pluginId": "@kbn/analytics-client", + "scope": "common", + "docId": "kibKbnAnalyticsClientPluginApi", + "section": "def-common.TelemetryCounter", + "text": "TelemetryCounter" + }, + ">; }" + ], + "path": "packages/core/apps/core-apps-browser-internal/src/core_app.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-apps-browser-internal", + "id": "def-common.CoreAppsServiceStartDeps.i18n", + "type": "Object", + "tags": [], + "label": "i18n", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-i18n-browser", + "scope": "common", + "docId": "kibKbnCoreI18nBrowserPluginApi", + "section": "def-common.I18nStart", + "text": "I18nStart" + } + ], + "path": "packages/core/apps/core-apps-browser-internal/src/core_app.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-apps-browser-internal", + "id": "def-common.CoreAppsServiceStartDeps.theme", + "type": "Object", + "tags": [], + "label": "theme", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-theme-browser", + "scope": "common", + "docId": "kibKbnCoreThemeBrowserPluginApi", + "section": "def-common.ThemeServiceSetup", + "text": "ThemeServiceSetup" + } + ], + "path": "packages/core/apps/core-apps-browser-internal/src/core_app.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index da8335205412c..f66265afc6b43 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.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 | |-------------------|-----------|------------------------|-----------------| -| 20 | 0 | 19 | 0 | +| 23 | 0 | 22 | 0 | ## Common diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 4dd9805dd11c7..909676bed50da 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index cb7dca2816c95..700a9d15ad2ff 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index e74f353c4bd63..9abc4850a5606 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 0bdf905e87ea1..1626885b30fd5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index d57d692fa661c..a26682ad0cd7b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index a7ac4fc9b4193..7517e2f8a7103 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 1be5f19ead44e..aef3b62400f77 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 1ba74d6d7a0f6..05e14961ed459 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 295a5790328e4..c615cd0ca2eb4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index d8932d1a32f61..ebb4a7419971a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index 708e63bdc0164..eb8ba6a1f7234 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3938,6 +3938,33 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-chrome-browser", + "id": "def-common.EuiSideNavItemTypeEnhanced", + "type": "Type", + "tags": [], + "label": "EuiSideNavItemTypeEnhanced", + "description": [ + "\nTemporary helper interface while we have to maintain both the legacy side navigation\nand the new \"solution view\" one. The legacy uses EuiSideNavItemType and its properties are not fully compatible\nwith the NodeDefinition. Solution teams declare their \"classic\" navigation using the EuiSideNavItemType.\nConverting those to the `NodeDefinition` require some additional props." + ], + "signature": [ + "Omit<", + "EuiSideNavItemType", + ", \"items\"> & { items?: ", + { + "pluginId": "@kbn/core-chrome-browser", + "scope": "common", + "docId": "kibKbnCoreChromeBrowserPluginApi", + "section": "def-common.EuiSideNavItemTypeEnhanced", + "text": "EuiSideNavItemTypeEnhanced" + }, + "[] | undefined; iconToString?: string | undefined; nameToString?: string | undefined; }" + ], + "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-chrome-browser", "id": "def-common.EuiThemeSize", diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 695a90d35402f..6db6f1c107d7b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 205 | 0 | 99 | 0 | +| 206 | 0 | 99 | 0 | ## Common diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 3281ff7ac5e81..8e6df37ac19dc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index a90d4dbdb5059..4ecc6dbae3096 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index b103dfb710a0c..0f115a7445ba7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 96a9765231ec4..9dc7879b039b6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index aabab67696446..5fedd7d2e3e57 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index ffad4225e2df8..634b80ac14785 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 7ae36fd146f6b..e5857583c8e0e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 89889d04017e8..506260dc916f4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index a7a0069ea43c6..73a4d43652894 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 222e6b46d21db..9870a636432e0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 43ae174f5aceb..e07c71e9fc17e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index ebe19faca5a1a..dc57562f00e24 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 7f678ee4d5740..f905a64f99f5a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 6dd7a8b13eca9..33a7e122ad9bf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index f947914094212..d1affa7bad6b7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 62faf54e92850..f1c9fe28bae6a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 49b6c827c78cb..7d875dcbd9a91 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index c0351a865ba3e..7e2990bb8af2d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 989b3db4243b8..27ffa9ef4f07b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index a250e1717f83b..15f5473fdd3fd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 1d3bf4c12a3eb..aeee55b47bb4c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 6fcde157ec8d8..f08fd4db352e1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 35fe09b50d539..e6b28c433b143 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index ce71cab8b91cf..96b4e15963e3c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 914c29bd3d24c..903caff878113 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 8d4a428b8bbf2..8eaa477b38269 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 279c2c7070f5a..67943d3220a3b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 17f26c6b483e8..93994d6ba4a48 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 0cf6ebf4dbe48..70a4cbc2bb5c5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 9f143a5ce82cb..246ff76ea2081 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 2d6f317a2038f..9dd4c242b682b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 0ca0075218ab8..658f5c2012b50 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index f5214fc353125..3b2a4e84d9a23 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 07a40adfcbe13..45dea9af5ef19 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 10f31c334ac70..f2ab0d311c1e7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 0b76211bf96fb..38a44632bd699 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 7ce43ecdb8132..9387238ee777b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index c8454c29160b0..29c0c7b25bbe4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 8125de2db5e9a..058f48d70b65d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 48ad610e75fad..cde449b27df85 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index f307305a83a92..9d14aaaef2f6d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 51460510b7708..89cff734a61c7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index c0987b380d709..c690cc8d0066f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 5434ef8c98492..d988350d76af2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index f9f4970b26f2e..dbb6c83e22af6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 6ff7a45fe0979..b2280925e61c8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index e35e1e8c7fe9e..0f2b5014ebfbf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index a8bbf53184c4c..87e762b8d2bf2 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3574,10 +3574,6 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/enabled.ts" }, - { - "plugin": "security", - "path": "x-pack/plugins/security/server/routes/api_keys/get.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/has_active.ts" @@ -5814,10 +5810,6 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/enabled.test.ts" }, - { - "plugin": "security", - "path": "x-pack/plugins/security/server/routes/api_keys/get.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/has_active.test.ts" @@ -6236,6 +6228,10 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/invalidate.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/api_keys/query.ts" + }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/analytics/authentication_type.ts" @@ -8164,6 +8160,10 @@ "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/invalidate.test.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/routes/api_keys/query.test.ts" + }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/authentication/index.test.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 06e4ab9725460..66873d96ba67d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 5ed22ef541a1c..919690a73c905 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 6b15ce5be210c..b91a8d0b2e51c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index a4936f9dd8453..db7f47c50fecc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 6c616a5a6ee4d..e2f19cc0e1695 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index e92ad9a20bac2..e71a493e54c21 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 7e612e8a8a70b..b93b9bd01aab6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 06d5d8fbeadcf..b4f3cbe416c20 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 80d81d5fd8829..809b786f3b099 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index d67231068d5ff..c95d628631b4e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 8ed75f086afa9..99fe7f480f469 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 84ab23b8f2a26..0acb5fa66878b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 741bcd4da75ac..5205f5723eded 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 36e4af670d536..cafd27968b47c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 4a1358e544a3d..ee3a3ef922889 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index f2360595df173..47afedb514a44 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 6dba2fdcd7f29..39e02eaec4e28 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 37e8058a02f42..d09b2c9607e90 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index ff8f96913c74d..f20ae899ae115 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 99961b17c4639..bf42fdb880e92 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index dfdbcb6096dc2..033840ccaf223 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 4fec85e010f5b..1fa374ab67fa6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index f74274709cbca..c708dff320ee0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index a1a804e08cbf3..cab71dee4f10a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index a00c37f30f747..b6391fda8d90b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index cb84ee91e2366..215cf72b17249 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 7590422e4d75f..2dd46e8075f3e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index bc228713d9de7..c4f554dc70e36 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 69396520b28ff..8858d1dcaaae9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 1b0e65e39e5da..cee49ecc81b18 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 952b7cdb7add6..615e68ba54f44 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 931cfb297b0d4..040f88ba20e87 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 41f5db00535ea..237abe52549bc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 2bfcd6c29ba2c..113645d1d5adb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 3d0eaf3fb4b63..840c3a551a3d6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 2db0a0798af60..cbab3add667fb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index ed64397ef4bfe..99fb0a7c82fd1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 6a00ea71d4872..d44f7fdb8e0ed 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index ae799c4517f81..15203507883b8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 7d288ad42ac4a..881809caceabd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index f90572814eae8..8279126418348 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index ad97dd2480bf5..ebfd1fed3cab6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 1c27656bed7a2..334685d46009e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 5814973751948..af6cf50f80583 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index c3edf1774352d..7ba99832890a6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 2dc58b1b68056..2337263f039af 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index d73a012fd5b97..eb4d4e5e30b8a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index fc41d41ccb1b6..582a1f1bbb324 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index f91f693cf8c4c..8cb8cc1083154 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index a773df5ea1827..7fa566a6bc5c2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 74f46271bd385..bdfeff8968db8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index d9de66f1a4493..4e9ed55bf5dde 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 79043941dd82a..bdb3cde6e95ca 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 0d215a506b4e6..0a8106649b7f4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 34f7219b8f15e..c75d1534d77a7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 8f54dd0c43571..c6a4bac606d53 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 5d8936c419cce..43a64a3b8edbf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 824ccbe654fe1..58d157ca34e2a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index fec1c07bad8e6..ae1b24ce3185d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 51b0595e7a0a9..5004dc1630242 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 2e3fc37500e8f..3adbcde8689df 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index e60df97041c50..41ce61850472c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index ccd932ffc0573..59e828b84221a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index f349c92022450..d27fba8941cd1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 902115f215d4b..484f1cc9044fd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 294754d71cfd9..afab3cec5b44d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index a5d9e94547d81..24f255c1b8fb6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 75bb2881fa0e2..9caf0af1fa815 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index df8622c4147a4..ed80acfc298a2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 0d4f03acdb229..76f43f1bbec15 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 211705a2dd5e2..152e83d41617c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 9d0b9505b84bd..b35f833d7cb1d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index f6c1bf7e6b531..ecadb62630b4c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 2c0b7c9d67b42..40dbe315eb605 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 79f9f65bce8c6..f318280858453 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 5c69a44300b73..01f361fc3f45e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index cc0081277f7bd..eed6e28929e8a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index f5c380905a7d8..a0554906da7b3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 000408fbb079f..8842ee450ac86 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index dca947eaa0fef..df902033b253d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index e0db805fb5417..ea360da7fea07 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 47d4f54b8a73a..d4ebaa5055459 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index f238c05280e76..5f1705cfb81ec 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 9b5c376bfa2dc..71e27678c1b6b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index fd6c8b199d0e1..f85d0acd908ab 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index adf9dfebd21ff..6736e77002911 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index cc74331a1e79b..396c012dd7bb6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 259ed5b77f12b..3ed1e3f60ca3b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 21b05fdda695f..8313566bd60c1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index b90796e1e7382..c8727822cac46 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 7757c73d90eb5..ad6d7947fa44f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 7886497fd8b0a..39e96506eff7f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 11766a8688972..dcdcfcbac3a45 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 089f30b5c58eb..0ee933bf08e9e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 9a85725f23002..1ebbc45a16cd9 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-05-22 +date: 2024-05-24 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 4951f9feaaa78..6bdce20ec4569 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-05-22 +date: 2024-05-24 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 007d2917137e4..9a8c2469367b2 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-05-22 +date: 2024-05-24 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 4f099f96ee167..672b82605c7f3 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-05-22 +date: 2024-05-24 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 9b3a822a80ca2..3b47905618f9a 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-05-22 +date: 2024-05-24 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 fdc1766b27506..685087c866ac0 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-05-22 +date: 2024-05-24 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 3335b519a2e53..2f5d5d868e78e 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-05-22 +date: 2024-05-24 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 850221c6ec508..9feb4db9089a2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 1f2aba8655d85..6cd36c4a4e590 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 97f8fb023bb4c..5c102083835e8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index eaf1c29f054bf..3f972ca464511 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index d44adb4d074f1..5bc3ae6210cc6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index dc0a2a8ec1559..cee0f7c998215 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index e822731059f6e..fd5777f4625b4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 9706690bfea76..ac67687e05717 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 2fbc334b5fa1f..e8a59e0630244 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 7088ddabd5f87..c4af9074bcd95 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 369c9737021b1..2f65f4412f9cd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index d05539481e49f..e8ca952c1c61d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 84c15b0eea6a8..36144d2ae2374 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 713d9396d9244..eb56875bf539c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index ac3249594a809..151f7616afa67 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index c9fabd69dd120..73b414f99d802 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index dfe745b859aa3..cc0d5c6e96b7e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 4ca813358870b..c4c27bece7bff 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 7113d7d12f47f..dfae276b32bdb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 31244e03f14bf..995b83f949ee1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 1ba3f20176cb0..79cc3b9e3a5c5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 1cb1e2889de4f..b769d08ec8917 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 9813c78f4bd61..fa2f1667f9ab7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 267788ee3b493..7e6b0c6aceef5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 4436378a70d3c..37de496d34fea 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 7af256ba2a10b..8c8ca98afc88e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index af7052701de8c..ed327603aa451 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 35465e1f7bd14..1f51a030e621f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index b2d979ce60530..6893f75315f30 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 7e480d2ab5d94..ba2e201835e4a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index db61b6fa68e9e..56152abc3712d 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -840,7 +840,7 @@ "label": "fleet", "description": [], "signature": [ - "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; readonly scalingKubernetesResourcesAndLimits: string; }" + "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; readonly scalingKubernetesResourcesAndLimits: string; readonly roleAndPrivileges: 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 fa4dbca4fe9fd..1280623574e70 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 76c638e59df70..a2f7e2d7114f6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index dff3e48cc5047..e0a8b790a75cb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index bdc83ff069966..e390f2fa93898 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 053e056ce5f1a..2875edb89ebb9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 6e15aac431766..09a97fc321257 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index b27829e88ef60..4398c2800491b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.devdocs.json b/api_docs/kbn_elastic_assistant_common.devdocs.json index 387ca39c3bb1b..99c152889d5a3 100644 --- a/api_docs/kbn_elastic_assistant_common.devdocs.json +++ b/api_docs/kbn_elastic_assistant_common.devdocs.json @@ -400,6 +400,74 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.parseBedrockBuffer", + "type": "Function", + "tags": [], + "label": "parseBedrockBuffer", + "description": [ + "\nParses a Bedrock buffer from an array of chunks.\n" + ], + "signature": [ + "(chunks: Uint8Array[], logger: ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + }, + ") => string" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/utils/bedrock.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.parseBedrockBuffer.$1", + "type": "Array", + "tags": [], + "label": "chunks", + "description": [ + "- Array of Uint8Array chunks to be parsed." + ], + "signature": [ + "Uint8Array[]" + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/utils/bedrock.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/elastic-assistant-common", + "id": "def-common.parseBedrockBuffer.$2", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.Logger", + "text": "Logger" + } + ], + "path": "x-pack/packages/kbn-elastic-assistant-common/impl/utils/bedrock.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [ + "- Parsed string from the Bedrock buffer." + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/elastic-assistant-common", "id": "def-common.replaceAnonymizedValuesWithOriginalValues", diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 2ff982ad906c3..74a9d332fdcfc 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-05-22 +date: 2024-05-24 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 | |-------------------|-----------|------------------------|-----------------| -| 292 | 0 | 275 | 2 | +| 295 | 0 | 276 | 0 | ## Common diff --git a/api_docs/kbn_entities_schema.devdocs.json b/api_docs/kbn_entities_schema.devdocs.json index e393324139b95..85f8114b5cd5e 100644 --- a/api_docs/kbn_entities_schema.devdocs.json +++ b/api_docs/kbn_entities_schema.devdocs.json @@ -63,7 +63,7 @@ "section": "def-common.EntityType", "text": "EntityType" }, - "; name: string; indexPatterns: string[]; timestampField: string; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: { toJSON: () => string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; name: string; managed: boolean; indexPatterns: string[]; timestampField: string; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: { toJSON: () => string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -289,7 +289,7 @@ "section": "def-common.BasicAggregations", "text": "BasicAggregations" }, - "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }>, \"many\">>; staticFields: Zod.ZodOptional>; lookback: Zod.ZodEffects string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }, string>; timestampField: Zod.ZodString; settings: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { id: string; type: ", + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }>, \"many\">>; staticFields: Zod.ZodOptional>; lookback: Zod.ZodEffects string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }, string>; timestampField: Zod.ZodString; managed: Zod.ZodDefault>; settings: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { id: string; type: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -297,7 +297,7 @@ "section": "def-common.EntityType", "text": "EntityType" }, - "; name: string; indexPatterns: string[]; timestampField: string; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: { toJSON: () => string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; name: string; managed: boolean; indexPatterns: string[]; timestampField: string; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: { toJSON: () => string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -321,7 +321,7 @@ "section": "def-common.BasicAggregations", "text": "BasicAggregations" }, - "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>" + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; managed?: boolean | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>" ], "path": "x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts", "deprecated": false, diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 1ea4de5a6ce5f..c574bf1c4c09a 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-05-22 +date: 2024-05-24 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 d3e1152bc2c5c..6a10d6e71589b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index cb14577d76cfc..b765f55d12d20 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 820e58bc86dea..7300d6d64697e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 133e844769caf..0ee8c1a7f7cfa 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index eacfe9a801771..7d21cddb833e3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 4ee9a1be28ef1..6c0d4507e809b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 82946fa232886..a509c6a9c3b4c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json index db7a44d058d30..fc0f2cc69906f 100644 --- a/api_docs/kbn_esql_utils.devdocs.json +++ b/api_docs/kbn_esql_utils.devdocs.json @@ -578,6 +578,216 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults", + "type": "Function", + "tags": [], + "label": "getESQLResults", + "description": [], + "signature": [ + "({\n esqlQuery,\n search,\n signal,\n filter,\n dropNullColumns,\n}: { esqlQuery: string; search: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchGeneric", + "text": "ISearchGeneric" + }, + "; signal?: AbortSignal | undefined; filter?: unknown; dropNullColumns?: boolean | undefined; }) => Promise<{ response: ", + { + "pluginId": "@kbn/es-types", + "scope": "common", + "docId": "kibKbnEsTypesPluginApi", + "section": "def-common.ESQLSearchReponse", + "text": "ESQLSearchReponse" + }, + "; params: ", + { + "pluginId": "@kbn/es-types", + "scope": "common", + "docId": "kibKbnEsTypesPluginApi", + "section": "def-common.ESQLSearchParams", + "text": "ESQLSearchParams" + }, + "; }>" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1", + "type": "Object", + "tags": [], + "label": "{\n esqlQuery,\n search,\n signal,\n filter,\n dropNullColumns,\n}", + "description": [], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.esqlQuery", + "type": "string", + "tags": [], + "label": "esqlQuery", + "description": [], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.search", + "type": "Function", + "tags": [], + "label": "search", + "description": [], + "signature": [ + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + }, + "<", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchRequestParams", + "text": "ISearchRequestParams" + }, + ">, SearchStrategyResponse extends ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + ">(request: SearchStrategyRequest, options?: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined) => ", + "Observable", + "" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.search.$1", + "type": "Uncategorized", + "tags": [], + "label": "request", + "description": [], + "signature": [ + "SearchStrategyRequest" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.search.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.signal", + "type": "Object", + "tags": [], + "label": "signal", + "description": [], + "signature": [ + "AbortSignal | undefined" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.filter", + "type": "Unknown", + "tags": [], + "label": "filter", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLResults.$1.dropNullColumns", + "type": "CompoundType", + "tags": [], + "label": "dropNullColumns", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/esql-utils", "id": "def-common.getESQLWithSafeLimit", diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 9721a5657f643..2f972d0221272 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 43 | 0 | 41 | 0 | +| 52 | 0 | 50 | 0 | ## Common diff --git a/api_docs/kbn_esql_validation_autocomplete.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index 84d035dfd8766..40625e66ca85d 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -2947,20 +2947,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "@kbn/esql-validation-autocomplete", - "id": "def-common.ESQLCallbacks.getMetaFields", - "type": "Function", - "tags": [], - "label": "getMetaFields", - "description": [], - "signature": [ - "CallbackFn<{}, string> | undefined" - ], - "path": "packages/kbn-esql-validation-autocomplete/src/shared/types.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "@kbn/esql-validation-autocomplete", "id": "def-common.ESQLCallbacks.getPolicies", diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 05f6871fbb1a3..c97ed9f64cb63 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-05-22 +date: 2024-05-24 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 | |-------------------|-----------|------------------------|-----------------| -| 194 | 0 | 184 | 10 | +| 193 | 0 | 183 | 10 | ## Common diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 620d41bc0d95f..53a3c58c6bd0f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index f1b88bfc62ccc..69b2a23d70f53 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 6a755483dc4b5..f0c091e0cc7d8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 0030027ade603..e53515dc66375 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 8268d8f70c427..bd5f88ec95de3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index fae961dc600bb..7282b9b37e829 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index cb49111aca642..5dd8c2c76fa09 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 645fdaa11e35a..a5859e459f219 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 3f05134d500cc..779c8c4da71d8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index d429d5bac10ef..3987841762111 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 03c74b9eb2d2a..c7fa5d6528f98 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index c72b6f26850fc..15c0695889139 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 251a692f74fe3..3f0375b37859a 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,14 +8,14 @@ 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; -Contact [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) for questions regarding this plugin. +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index ed9b89784ea5c..21c81a81c8787 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 77bb962e31c85..3759c8b702e09 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 3aff8fd27f040..4dd24a8154425 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 5f77fc5697304..18e0ede1b58a6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 621f74d3c4390..a37376d6bf80d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 8c63d47e674a5..63101a6c97d06 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 60c37c8910017..f35bf61546e58 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 4c17fcae6cbe2..ed6f26bca7d75 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index e3dc75c2243e7..d3eeddca58b6c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index b99efadd70af8..cd4332ba3991e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index b1420b085e4c7..1aa7b429a690e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index eb421ccec74d2..f43cd69b05459 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index a3fae46dd0c69..6e0f088f1ce3d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index ba661d4575e26..70f8b401985ed 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 01c48101575fc..e9dcf100c3983 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 7a0d8a0ddb2ee..82758f975d7b6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 5862b5be6ded4..f7869ab4f77e7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 6b96367f4a976..5295d7a8f15a8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 1359e928b7457..4a329327ef98f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 33be0e8c3dec1..b3eff5d6863ff 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index b094c74fd3977..bd89d7e082fce 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 1914ebf983161..7b672d039f3da 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 2f49bbad47da1..9b386e9285e00 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 6ac248c71ad50..cb3510007411f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 3194073a20c74..e3376c226ba73 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 0114ffe5d2628..8eae7c73cb947 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 8d45ceb1dd6b0..36eddd166218f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index f2b5d25b9dd03..d0fff926be690 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 4e6e2412811e5..6ef66604120dd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index fdb2f87c364e3..5fdf1c8c8387c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 20bd72b4eeade..8b750ccf023e4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 49eea2d9808a0..7f82f349df177 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 220035e0198b0..8e698f93fea85 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 7e1675b4f00c7..db0d52392d324 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index f0f6ad186f826..dd737d1ba4e2b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index ae2ae081a2949..f143006787e7b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 2cc5a9e92de17..aceb187e7c749 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index cb7587bbb61e8..f2ee9c2206f64 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index c2eb1fc95cae4..3868e2b15e84f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 10fd5d64ea0ef..f93a99a72b11a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 653cde2b22f74..3936d3bc3f8eb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 89915d991603b..2d600b386a2c7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 47b8091114e18..557f83248daeb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 7b79cd55d73ac..013e5a4609c1a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 5815c8dc635d8..dc61ea93474a6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index f4cbf4d102ea2..58a6d67dd6814 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.devdocs.json b/api_docs/kbn_ml_date_picker.devdocs.json index c8a41eb5045fa..c07148653d9d9 100644 --- a/api_docs/kbn_ml_date_picker.devdocs.json +++ b/api_docs/kbn_ml_date_picker.devdocs.json @@ -174,6 +174,53 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/ml-date-picker", + "id": "def-common.getTimeFieldRange", + "type": "Function", + "tags": [], + "label": "getTimeFieldRange", + "description": [ + "\n" + ], + "signature": [ + "(options: GetTimeFieldRangeOptions) => Promise<", + { + "pluginId": "@kbn/ml-date-picker", + "scope": "common", + "docId": "kibKbnMlDatePickerPluginApi", + "section": "def-common.GetTimeFieldRangeResponse", + "text": "GetTimeFieldRangeResponse" + }, + ">" + ], + "path": "x-pack/packages/ml/date_picker/src/services/time_field_range.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/ml-date-picker", + "id": "def-common.getTimeFieldRange.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "- GetTimeFieldRangeOptions" + ], + "signature": [ + "GetTimeFieldRangeOptions" + ], + "path": "x-pack/packages/ml/date_picker/src/services/time_field_range.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [ + "GetTimeFieldRangeResponse" + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/ml-date-picker", "id": "def-common.getTimeFilterRange", diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index d20bfb24d7051..436ab3d3e4d86 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.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 | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 0 | 0 | +| 50 | 0 | 0 | 0 | ## Common diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 7d25bddb5eac6..b2c686428fff0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index b753be6209f08..0862edca82983 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 013b026e9816a..04ab38b1aa87a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 547b48ec30733..5d6393aa3d057 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index b7b19e18769d5..a55ac3dceb139 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index fa93c5aba6bf0..74a5b6db28d19 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index a34edb95b2c21..e8ff7e9b17207 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 33cc7aef1c4c3..7d9ddb0c9dc28 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index b6d9abe4cbfef..a93deac7f4480 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index dd39d846a1e47..0c60d620c0f39 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index e0204e98cddaf..c89a54e896a61 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index c34d8688c0861..7002a9674ccd1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index f5e7c2b0f9158..f0caf7de0317e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 88481446d9d0e..021e1fed1372b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 3aed1580ec11c..3ca76c27a90f7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 8ec610561d054..0d9b585620ae1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 372d4642c4dfd..07c47c6e1189b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 3b985c2306781..a7fe767d8bce3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index a39ca03823886..3c0aeaae4800e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.devdocs.json b/api_docs/kbn_monaco.devdocs.json index 11e9fbad5dcb9..e8cc403b3ee30 100644 --- a/api_docs/kbn_monaco.devdocs.json +++ b/api_docs/kbn_monaco.devdocs.json @@ -502,20 +502,6 @@ "deprecated": false, "trackAdoption": false }, - { - "parentPluginId": "@kbn/monaco", - "id": "def-common.ESQLCallbacks.getMetaFields", - "type": "Function", - "tags": [], - "label": "getMetaFields", - "description": [], - "signature": [ - "CallbackFn<{}, string> | undefined" - ], - "path": "packages/kbn-esql-validation-autocomplete/src/shared/types.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "@kbn/monaco", "id": "def-common.ESQLCallbacks.getPolicies", diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 82534f85ce419..bba132cdad00c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 123 | 0 | 123 | 3 | +| 122 | 0 | 122 | 3 | ## Common diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 710d7be91a037..d519d1f1c4a7c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index afe07f2cc4f2f..fa9fdc6f53147 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 50e154e63922a..06d0e9451f3ff 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 34df926fc930b..9f80b2c109cae 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 021a1eaf17a26..bf22b60086162 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index cf1d7598d61e4..43ebba64d53b1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 61d2413e518db..9daaeb6ce8263 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 4206f567d2a69..be1887dce41ba 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index add7eadbb2c6b..c3fe7661261d1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 42e6ce739427b..d63b39598801e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index d9c3419d60da9..808672ea8f429 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 794ec3b23277d..7b74faf36e701 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 6b3dc7e12b759..017503c5efd9c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 0369499767209..c3faae2d8845a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index e5e184c342b0f..3baf7f185582d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index 1dbcbd813226a..fdfac45fbefb3 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -2088,6 +2088,180 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.useSearchApi", + "type": "Function", + "tags": [], + "label": "useSearchApi", + "description": [ + "\nReact hook that converts search props into search observable API" + ], + "signature": [ + "({\n filters,\n query,\n timeRange,\n}: { filters?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined; query?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined; timeRange?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined; }) => { filters$: ", + "BehaviorSubject", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; query$: ", + "BehaviorSubject", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined>; timeRange$: ", + "BehaviorSubject", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined>; }" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.useSearchApi.$1", + "type": "Object", + "tags": [], + "label": "{\n filters,\n query,\n timeRange,\n}", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.useSearchApi.$1.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.useSearchApi.$1.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.useSearchApi.$1.timeRange", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.useStateFromPublishingSubject", diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index fa977d8912e89..aebc887cccabd 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 197 | 0 | 163 | 5 | +| 202 | 0 | 167 | 5 | ## Common diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 4b341ba8b4736..8a2e3a0b5f8cf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index a54729f92d11e..359e98f0d3f0a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index f57ea865bff25..e3d7756cf1855 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-05-22 +date: 2024-05-24 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 5f7cbd083e572..9b43a4b4f5d39 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-05-22 +date: 2024-05-24 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 91544eadaead1..492e042bdfb94 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index b7e7c84ff93ef..6c5a6241435bf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index ed0ba7522c843..00f3e97c7c3b2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 9942f9fd825bc..3c0dcc88052f3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index e92405f5f8211..8324881a57ffc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index ff818606dc1e5..85857b57c5957 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index a3894f12f652a..0ef923c25b393 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 3e0d4ddd0d643..e2feb0ccbf73c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 73eaf7fccb5be..a5d401a48dfaf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index de051f0bea216..9c3551591fc3f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 5008dc5e37f35..c6dec769f0afb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 61ec0e84db957..02bac16fcf7c4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index c8ec072eaee73..e0c4acedcbab4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index c93fd45baae74..5b90ea32e3811 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 0b7dffd2fb40c..7dde00ad16766 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index fc06f64cc7818..27d583248839b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 5850cf773a9f9..8324f251c3a20 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 35c75478d6747..fb39628d4a067 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index a15e5455c8619..d1e92a71ec254 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 20e66c10e96de..93b0619d12d22 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index b15d152a90463..88c885e867e31 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 5786dceaf0065..0b8d242f5fc1c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 86642d624350d..95737aa864f53 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index ddeedd063f557..cc250e27033a9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 945f2b3ce6d56..5220c45eb4ebb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index f48b325a82a51..b551ad2a20c3d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 1de6405d826a2..b34232c13b5f8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index e86496dcc6ff2..c49f111942187 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 16d519a794d8b..e69df56d20bab 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 20ef7763f735e..30d0ea8326cac 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.devdocs.json b/api_docs/kbn_search_errors.devdocs.json index abb6c8f63c181..9721675c6333b 100644 --- a/api_docs/kbn_search_errors.devdocs.json +++ b/api_docs/kbn_search_errors.devdocs.json @@ -188,8 +188,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" }, " | undefined) => ", { @@ -267,8 +267,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" }, " | undefined" ], diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 69069b567be19..33f103ea761ee 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index a8e1b2a04020f..f2be01e7bb6e6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index a02ba097a6963..ed242946d7fed 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.devdocs.json b/api_docs/kbn_search_types.devdocs.json index 2278e0ff9e98d..c36995b3791c6 100644 --- a/api_docs/kbn_search_types.devdocs.json +++ b/api_docs/kbn_search_types.devdocs.json @@ -799,8 +799,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" + "section": "def-common.AbstractDataView", + "text": "AbstractDataView" }, " | undefined" ], diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index f11844252c135..376859461862b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index f28f2bebe653b..1d527daf9fe7b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index dd9d27b6978ac..f46079d6881e3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 4ecafc1a5ce87..b3b2827009dba 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index f01c8ccff6b47..834476b9400b5 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -3832,7 +3832,7 @@ "label": "CreateAPIKeyParams", "description": [], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{} & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" + "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, @@ -3864,7 +3864,7 @@ "label": "CreateCrossClusterAPIKeyParams", "description": [], "signature": [ - "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly type: \"cross_cluster\"; readonly name: string; readonly access: Readonly<{ search?: Readonly<{} & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" + "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly type: \"cross_cluster\"; readonly name: string; readonly access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, @@ -4050,7 +4050,7 @@ "section": "def-common.Type", "text": "Type" }, - "[] | undefined>; replication: ", + "[] | undefined>; replication: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 793ffe421c2ff..787add3df955f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 8d2b2d6db02cb..bc769ab13d5fc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index fcbec55716205..271458277efa8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 013ed93e8038d..c5abfa2f6d863 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 5bc24bdf43ef3..ec5ec473e51f5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 6e21c96ae9071..220a067aef038 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 78561ef5d2d5d..42aa6396bddf2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 1b9f7e09c5ca2..b90428765c016 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 92cc76e5b49a3..93013ece93211 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index f3d0ca01edd11..b0f690f365aac 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -851,7 +851,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -865,7 +865,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -1004,7 +1004,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1018,7 +1018,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1144,7 +1144,7 @@ "label": "showValueListModal", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 9142cc1c4bdac..0551505eccd7e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 60248fc46e002..33c14a78fffa6 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 55849128e2a89..83894d1b8a33f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 93477daea464c..39c2ee8740c63 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json index 756afc289dda0..0ebe5a949c24b 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_list_types.devdocs.json @@ -3020,7 +3020,7 @@ "label": "CreateListSchemaDecoded", "description": [], "signature": [ - "{ id: string | undefined; 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\"; name: string; serializer: string | undefined; meta: object | undefined; description: string; deserializer: string | undefined; } & { version: number; }" + "{ id: string | undefined; meta: object | undefined; 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\"; name: string; serializer: string | undefined; description: string; deserializer: string | undefined; } & { version: number; }" ], "path": "packages/kbn-securitysolution-io-ts-list-types/src/request/create_list_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 6513acb5dfc32..3f190d880c181 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index dba0917fc5c83..162587bf80440 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index a34cf58a1d604..43ce6a7a89d44 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 10ca93221725f..f7caa43f7b1b2 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 45925d057976d..0250434a5220e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index f24807a94fa32..935813883ef49 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.devdocs.json b/api_docs/kbn_securitysolution_list_utils.devdocs.json index b47a7562eeffd..6cd192ee0916e 100644 --- a/api_docs/kbn_securitysolution_list_utils.devdocs.json +++ b/api_docs/kbn_securitysolution_list_utils.devdocs.json @@ -3095,7 +3095,7 @@ "label": "CreateExceptionListItemBuilderSchema", "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; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; expire_time?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }, \"entries\" | \"meta\" | \"list_id\" | \"namespace_type\"> & { meta: { temporaryUuid: string; }; entries: ", + "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; })[]; list_id: string; name: string; type: \"simple\"; } & { comments?: { comment: string; }[] | undefined; expire_time?: string | undefined; item_id?: string | undefined; meta?: object | undefined; namespace_type?: \"single\" | \"agnostic\" | undefined; os_types?: (\"windows\" | \"linux\" | \"macos\")[] | undefined; tags?: string[] | undefined; }, \"meta\" | \"entries\" | \"list_id\" | \"namespace_type\"> & { meta: { temporaryUuid: string; }; entries: ", { "pluginId": "@kbn/securitysolution-list-utils", "scope": "common", diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index a6b89977bff3c..c0f6b5ce45d1b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index a2124afcb7df0..34eb14385efdf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 51ce7f9d0ad33..4e5ee154f510a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 214597d14a982..5f690fa5c43f5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index d2d2e5156b2a4..d8b6f33e26e09 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index b75bf0f1d41f4..fb8de339bcb5f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 88cd9766e17d6..d25b86b434745 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 2122f3854bd33..087abc9d3477e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 25f3c10d0ecd5..a832946fb50db 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index b110748eba5fa..2f56e88a60610 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index ffb66e5c8be45..7c1c4c3d7cc4e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 2cdcee037a715..0df04baeebac9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 2775fddea4b63..a057e6d8f3eea 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 6d69f2220fb3c..d088dfde31988 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 22612b1d5b3de..cead63de20888 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 6f734f82e09c1..b45b143509af5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 4e328356abfbd..42fd1949c0e26 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index a7c6787d03594..2505328c43588 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 396fd54ca0907..ce10d06efc1fc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 5a2187073c3ac..609e77459f219 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 9b7b3ddcca766..7d58080ca2a12 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 84a2720571146..da1a3778f7783 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 3b7f0d235b768..0bde06967dda6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index ec91c83d5664d..efe59adaaf705 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 0672d93f9b877..360a835c0b813 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 603eb39f3892b..b3c93d877cb52 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 6368b645dc145..f949341ad23fc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index c71283f3890ec..8dfbed0c2e374 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index e0c44b3febfd0..e805d1ccfbe44 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index f8f8ae4e25f9c..191dd9b251b31 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 021098eff045c..98035d41c5afb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index c1ed21b0f7755..d617301a58b37 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index c50a54c2d9850..b40a969effdd4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 2ac30b19d8fde..9c8c7943ce4c9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 22084d11698fb..8b11a0d005670 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index ddf51ea55b7a0..a6a201e51575d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 8cd30abf85715..f8e99283c1dc1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index d8d6fbf51f631..79a6765d56864 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index eeb43be79150f..2dbebdd9ab634 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 5a069bd153519..aa5b4ccb778da 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index e1d3045c59968..36b633bf8080b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 15535683dd489..c6d84494e6729 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index f83baa9c03928..57e577dc535d4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 3513b67805dc1..302d9ed27d69e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 2fa702f5bb771..ded4ac6ec786d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 13b149a91734b..85f7d1e8d33b5 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index ba2c134552113..a870c501d0b99 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 966668b68b0a5..9cb5f05c9c9d4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 2bf4e2f4f9102..bed979963c456 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 44ba05c0db21d..1d5b8f048c51c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 8a6db037b33d2..de139b756e65e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index a6ef553090607..866f0472e4607 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 28a786f7f0b2a..3d5b513953f04 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx index 59ad9c13dc615..5c431930553e9 100644 --- a/api_docs/kbn_solution_nav_oblt.mdx +++ b/api_docs/kbn_solution_nav_oblt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt title: "@kbn/solution-nav-oblt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-oblt plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt'] --- import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 3832906f28938..836de80fbfed1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 4fe868837419e..338d932a75536 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index f8c48a59fac37..0f7ab59b8021e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 3610972932c17..39aec9016c710 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 3d0712613ee12..a9ac9b840a32a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index d01dda11b5422..9a5534d65f9eb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 074150110667e..e09190f34ff45 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 9ef0ade665ae1..4349eb5baf3cc 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index a9c3f03d949d3..887505e269a3e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 8fc82df383096..52221555fb1e3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 2cd89728edd09..daf123b33595e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index b108f350e3e10..e427cb805626c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 3468a4ae5bbb2..8339cad27f4e6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index f4a2fe75a5ffc..01cf31aa5c1e1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 8231f97fe090c..5b1f63ef8e683 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-05-22 +date: 2024-05-24 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 53652f7ef141e..fcf2a97f8004f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index a91f736bd6f62..a6b842b84cd87 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index c7f3b73348f36..ca61db3b994a4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 03c536fc404f2..1ee06fbefe3b4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index dccb7b38d01aa..1a2cc34462d6e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index de8f135ee6abf..df69eb97a4610 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 121c8a8f91a7e..e88913138a121 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.devdocs.json b/api_docs/kbn_unified_field_list.devdocs.json index 7efe0795b8e9a..0b81540944ce4 100644 --- a/api_docs/kbn_unified_field_list.devdocs.json +++ b/api_docs/kbn_unified_field_list.devdocs.json @@ -312,8 +312,8 @@ "pluginId": "@kbn/unified-field-list", "scope": "common", "docId": "kibKbnUnifiedFieldListPluginApi", - "section": "def-common.FieldPopoverFooterProps", - "text": "FieldPopoverFooterProps" + "section": "def-common.FieldVisualizeButtonProps", + "text": "FieldVisualizeButtonProps" }, ">) => JSX.Element" ], @@ -334,8 +334,8 @@ "pluginId": "@kbn/unified-field-list", "scope": "common", "docId": "kibKbnUnifiedFieldListPluginApi", - "section": "def-common.FieldPopoverFooterProps", - "text": "FieldPopoverFooterProps" + "section": "def-common.FieldVisualizeButtonProps", + "text": "FieldVisualizeButtonProps" }, ">" ], @@ -5486,9 +5486,7 @@ "docId": "kibKbnUnifiedFieldListPluginApi", "section": "def-common.FieldVisualizeButtonProps", "text": "FieldVisualizeButtonProps" - }, - " | ", - "FieldCategorizeButtonProps" + } ], "path": "packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx", "deprecated": false, diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index bccb1f5edadfb..f2ad354d131ef 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.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 | |-------------------|-----------|------------------------|-----------------| -| 293 | 0 | 269 | 10 | +| 293 | 0 | 269 | 9 | ## Common diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index db1e5c9be4826..fa1a01746b82e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 9ed2ad476e9fd..4f415ea754ca6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.devdocs.json b/api_docs/kbn_user_profile_components.devdocs.json index 541125e5db436..c7c080c2e335a 100644 --- a/api_docs/kbn_user_profile_components.devdocs.json +++ b/api_docs/kbn_user_profile_components.devdocs.json @@ -1399,9 +1399,7 @@ "EuiSelectableLIOption", "<{}>> & ", "CommonProps", - " & { label: string; searchableLabel?: string | undefined; key?: string | undefined; checked?: ", - "EuiSelectableOptionCheckedType", - "; disabled?: boolean | undefined; isGroupLabel?: false | undefined; prepend?: React.ReactNode; append?: React.ReactNode; ref?: ((optionIndex: number) => void) | undefined; id?: undefined; data?: { [key: string]: any; } | undefined; textWrap?: \"wrap\" | \"truncate\" | undefined; truncationProps?: Partial void) | undefined; id?: undefined; data?: { [key: string]: any; } | undefined; textWrap?: \"wrap\" | \"truncate\" | undefined; truncationProps?: Partial> | undefined; toolTipContent?: React.ReactNode; toolTipProps?: Partial & { dataTestSubj?: string | undefined; panelContentProvider?: ", + { + "pluginId": "@kbn/shared-ux-chrome-navigation", + "scope": "public", + "docId": "kibKbnSharedUxChromeNavigationPluginApi", + "section": "def-public.ContentProvider", + "text": "ContentProvider" + }, + " | undefined; }" + ], + "path": "src/plugins/navigation/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "navigation", "id": "def-public.SolutionType", @@ -1074,7 +1099,13 @@ ], "signature": [ "(solutionNavigationAgg: ", - "AddSolutionNavigationArg", + { + "pluginId": "navigation", + "scope": "public", + "docId": "kibNavigationPluginApi", + "section": "def-public.AddSolutionNavigationArg", + "text": "AddSolutionNavigationArg" + }, ") => void" ], "path": "src/plugins/navigation/public/types.ts", @@ -1089,7 +1120,13 @@ "label": "solutionNavigationAgg", "description": [], "signature": [ - "AddSolutionNavigationArg" + { + "pluginId": "navigation", + "scope": "public", + "docId": "kibNavigationPluginApi", + "section": "def-public.AddSolutionNavigationArg", + "text": "AddSolutionNavigationArg" + } ], "path": "src/plugins/navigation/public/types.ts", "deprecated": false, diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 46d353b5e521e..aac1480b13c94 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 49 | 0 | 47 | 5 | +| 50 | 0 | 48 | 5 | ## Client diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index a7eabdb0c70c9..a93cf40853939 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 0ef307824063c..16be9735cd09c 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 9937a98aec1b1..a530caba89476 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 4ac7b1cc38395..2f6bf11d914de 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -3572,7 +3572,13 @@ "label": "aiops", "description": [], "signature": [ - "AiopsPluginStart" + { + "pluginId": "aiops", + "scope": "public", + "docId": "kibAiopsPluginApi", + "section": "def-public.AiopsPluginStart", + "text": "AiopsPluginStart" + } ], "path": "x-pack/plugins/observability_solution/observability/public/plugin.ts", "deprecated": false, @@ -10332,7 +10338,7 @@ "label": "value", "description": [], "signature": [ - "true" + "false" ], "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index ff0313be67deb..29edb72641aca 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index c02bb4cb86da2..6952ef5f0ce24 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -3530,6 +3530,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.aiAssistantSearchConnectorIndexPattern", + "type": "string", + "tags": [], + "label": "aiAssistantSearchConnectorIndexPattern", + "description": [], + "signature": [ + "\"observability:aiAssistantSearchConnectorIndexPattern\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-public.aiAssistantSimulatedFunctionCalling", @@ -5668,6 +5683,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-server.aiAssistantSearchConnectorIndexPattern", + "type": "string", + "tags": [], + "label": "aiAssistantSearchConnectorIndexPattern", + "description": [], + "signature": [ + "\"observability:aiAssistantSearchConnectorIndexPattern\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-server.aiAssistantSimulatedFunctionCalling", @@ -7370,6 +7400,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-common.aiAssistantSearchConnectorIndexPattern", + "type": "string", + "tags": [], + "label": "aiAssistantSearchConnectorIndexPattern", + "description": [], + "signature": [ + "\"observability:aiAssistantSearchConnectorIndexPattern\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/ui_settings/settings_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-common.aiAssistantSimulatedFunctionCalling", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index f6a5a354e5bdf..eafefdae2bd06 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 253 | 1 | 251 | 26 | +| 256 | 1 | 254 | 26 | ## Client diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 440df9aa2fc15..6b302b9fdaaa7 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 70eed8cd0ae9a..11c98224c454d 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index e48bcc4d9e7c4..74c27896ce0cf 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 850ae2f125673..a792a6380b547 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 98aae3c9d1626..39f19d98f12ae 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index b209755b6de11..d091ccf300fa3 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 8558fb0e7560c..bf4d00c4d8667 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index a48c74d7d3cc8..c7b4c8909f99d 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 797 | 685 | 43 | +| 797 | 684 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48329 | 241 | 36889 | 1862 | +| 48444 | 241 | 36942 | 1864 | ## Plugin Directory @@ -30,7 +30,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 303 | 0 | 297 | 32 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 67 | 0 | 4 | 1 | +| | [@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) | - | 865 | 1 | 833 | 54 | | | [@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-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | @@ -43,7 +43,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 268 | 2 | 253 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 74 | 0 | 17 | 0 | | cloudChat | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Chat available on Elastic Cloud deployments for quicker assistance. | 0 | 0 | 0 | 0 | -| | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud | 8 | 0 | 8 | 1 | +| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud | 8 | 0 | 8 | 1 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | Defend for containers (D4C) | 52 | 0 | 43 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | 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. | 12 | 0 | 0 | 0 | | cloudFullStory | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | When Kibana runs on Elastic Cloud, this plugin registers FullStory as a shipper for telemetry. | 0 | 0 | 0 | 0 | @@ -61,7 +61,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 1069 | 0 | 369 | 4 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 1156 | 0 | 402 | 3 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 4 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 10 | 0 | 10 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 15 | 0 | 9 | 2 | @@ -105,7 +105,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | globalSearchProviders | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | | graph | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 0 | 0 | 0 | 0 | | grokdebugger | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | -| | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | Guided onboarding framework | 59 | 0 | 58 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Guided onboarding framework | 59 | 0 | 58 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 149 | 0 | 111 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 1 | 0 | 1 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | @@ -138,12 +138,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 2 | 0 | 2 | 0 | | | [@elastic/stack-monitoring](https://github.com/orgs/elastic/teams/stack-monitoring) | - | 15 | 3 | 13 | 1 | | | [@elastic/stack-monitoring](https://github.com/orgs/elastic/teams/stack-monitoring) | - | 9 | 0 | 9 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 47 | 5 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 50 | 0 | 48 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 695 | 2 | 686 | 15 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 253 | 1 | 251 | 26 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 256 | 1 | 254 | 26 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 21 | 0 | 21 | 1 | @@ -172,7 +172,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 6 | 0 | 6 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 18 | 0 | 10 | 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. | 413 | 0 | 205 | 2 | +| | [@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. | 413 | 0 | 205 | 3 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 190 | 0 | 120 | 36 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | @@ -269,7 +269,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 217 | 0 | 180 | 9 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 79 | 0 | 50 | 9 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 24 | 0 | 24 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 142 | 3 | 139 | 19 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 144 | 3 | 141 | 20 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 8 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | @@ -286,7 +286,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 17 | 3 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 1 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 19 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 23 | 0 | 22 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | @@ -297,7 +297,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 205 | 0 | 99 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 206 | 0 | 99 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | @@ -483,7 +483,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) | - | 165 | 0 | 138 | 9 | -| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 292 | 0 | 275 | 2 | +| | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 295 | 0 | 276 | 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 | @@ -492,8 +492,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 26 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 63 | 1 | 63 | 6 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 43 | 0 | 41 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 184 | 10 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 52 | 0 | 50 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 193 | 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) | - | 38 | 0 | 14 | 1 | @@ -506,7 +506,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 26 | 0 | 26 | 1 | -| | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | - | 49 | 0 | 47 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 47 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 33 | 3 | 24 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | @@ -553,7 +553,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 12 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 152 | 1 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 141 | 0 | 5 | 0 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 48 | 0 | 0 | 0 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 50 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 11 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 36 | 4 | 8 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 12 | 0 | 1 | 0 | @@ -573,7 +573,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 123 | 0 | 123 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 122 | 0 | 122 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 55 | 1 | 50 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 10 | 0 | 10 | 2 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 99 | 1 | 99 | 0 | @@ -589,7 +589,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 70 | 0 | 64 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 197 | 0 | 163 | 5 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 202 | 0 | 167 | 5 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | @@ -703,7 +703,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 6 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 182 | 0 | 182 | 0 | -| | [@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) | - | 6 | 0 | 6 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 4 | 0 | @@ -727,7 +726,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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 | 149 | 0 | 80 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 293 | 0 | 269 | 10 | +| | [@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 | 293 | 0 | 269 | 9 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 3 | 0 | 2 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 81 | 1 | 21 | 2 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 2152824b6fe2d..0f2edcde88fd0 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index f09e26928ec1e..c220246f99db1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 003bc60e2f530..359322b10b9c7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 7b7fdc38d6b11..427a3486dfa37 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 49259057f8293..5ac0c888eef18 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 7a4ed5d321e42..5de7bd244fb16 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index d3b00eed9b7e3..4b5ac71d070b3 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index efc596092f1d3..284720f78a1f1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index f6a0f50332b50..47a059050556c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 3a0ba8827ce1c..3be4ec99b5658 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index da1d86f02b29f..3f5a6e0986623 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-05-22 +date: 2024-05-24 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 757c5f49d6c2a..960c3f2389b2b 100644 --- a/api_docs/saved_objects_management.devdocs.json +++ b/api_docs/saved_objects_management.devdocs.json @@ -679,7 +679,7 @@ "label": "obj", "description": [], "signature": [ - "{ id: string; type: string; meta: { title?: string | undefined; icon?: string | undefined; }; managed?: boolean | undefined; overwrite?: boolean | undefined; }" + "{ id: string; meta: { title?: string | undefined; icon?: string | undefined; }; type: string; managed?: boolean | undefined; overwrite?: boolean | undefined; }" ], "path": "src/plugins/saved_objects_management/public/lib/process_import_response.ts", "deprecated": false, diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index a7ee1d13502ab..8a283fd58b907 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 6526e9567332b..10f1c54e86a4e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 3e1fc9755e622..095f74d720395 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 43733f7621c74..fe6d6a93f56eb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 63e7da2aa37a3..54aec683bc94e 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index d02560905295d..e4ac4bd9ab089 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 5cadc84edb0e7..000c11d8dbbc7 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 700847cdcfd2e..3e26e0fe9c2de 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index fbe8c13b5e5ca..60b5d8f545af8 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index c86bad58007a3..86960e5d096f8 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -5038,7 +5038,7 @@ "label": "CreateAPIKeyParams", "description": [], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{} & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" + "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"grant\" | \"except\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, @@ -5070,7 +5070,7 @@ "label": "CreateCrossClusterAPIKeyParams", "description": [], "signature": [ - "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly type: \"cross_cluster\"; readonly name: string; readonly access: Readonly<{ search?: Readonly<{} & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" + "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly type: \"cross_cluster\"; readonly name: string; readonly access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, @@ -6250,7 +6250,8 @@ "section": "def-common.RestApiKey", "text": "RestApiKey" }, - " extends BaseApiKey" + " extends ", + "BaseApiKey" ], "path": "x-pack/plugins/security/common/model/api_key.ts", "deprecated": false, diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 6c9f3dee69a05..dc3c19666d11f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 413 | 0 | 205 | 2 | +| 413 | 0 | 205 | 3 | ## Client diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index b4b30ca8b5011..f00dfec41734d 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -390,7 +390,7 @@ "label": "data", "description": [], "signature": [ - "({ id: string; type: \"eql\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"eql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; data_view_id?: string | undefined; filters?: unknown[] | undefined; event_category_override?: string | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"query\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"saved_query\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; query?: string | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"threshold\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threshold: { value: number; field: (string | string[]) & (string | string[] | undefined); cardinality?: { value: number; field: string; }[] | undefined; }; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"threat_match\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { value: string; type: \"mapping\"; field: string; }[]; }[]; threat_index: string[]; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"lucene\" | \"kuery\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { id: string; type: \"machine_learning\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: (string | string[]) & (string | string[] | undefined); namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; } | { id: string; type: \"new_terms\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"esql\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"esql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; })[]" + "({ id: string; type: \"eql\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"eql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; data_view_id?: string | undefined; filters?: unknown[] | undefined; event_category_override?: string | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"query\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"saved_query\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; saved_id: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; query?: string | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; response_actions?: ({ params: { query?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; queries?: { id: string; query: string; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { field?: string | undefined; value?: string | string[] | undefined; }, { field?: string | undefined; value?: string | string[] | undefined; }>, \"strip\"> | undefined; version?: string | undefined; platform?: string | undefined; removed?: boolean | undefined; snapshot?: boolean | undefined; }[] | undefined; pack_id?: string | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; } | { id: string; type: \"threshold\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threshold: { value: number; field: (string | string[]) & (string | string[] | undefined); cardinality?: { value: number; field: string; }[] | undefined; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"h\" | \"s\"; }; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"threat_match\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; threat_query: string; threat_mapping: { entries: { value: string; type: \"mapping\"; field: string; }[]; }[]; threat_index: string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"lucene\" | \"kuery\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { id: string; type: \"machine_learning\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; anomaly_threshold: number; machine_learning_job_id: (string | string[]) & (string | string[] | undefined); meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; } | { id: string; type: \"new_terms\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"kuery\" | \"lucene\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; new_terms_fields: string[]; history_window_start: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; index?: string[] | undefined; filters?: unknown[] | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"esql\"; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; group: string; action_type_id: string; uuid?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; }[]; tags: string[]; setup: string; enabled: boolean; revision: number; query: string; interval: string; description: string; version: number; risk_score: number; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; from: string; to: string; language: \"esql\"; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; field: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; rule_source?: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; } | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; total_enrichment_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"h\" | \"s\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; })[]" ], "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management/logic/types.ts", "deprecated": false, @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | 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\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3054,7 +3054,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3230,7 +3230,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3296,7 +3296,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; }" + "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: 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 1168fc4cdfd9a..5986bb936f2dc 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-05-22 +date: 2024-05-24 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 bcb7ec4659ee6..c3851a35558f4 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 131c3bfa2580c..e32f42d5cf492 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index c43f502585aa3..28946405d1c4a 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 35d03f10b1b53..7579dba45f9d9 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 03a2c1824ff6c..dbfcdf77d6cee 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 1f3db3a3f8c28..5987b54820048 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 7a078e666b995..72c565c6f7e87 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.devdocs.json b/api_docs/slo.devdocs.json index 02cfed22cb843..e4abe45387191 100644 --- a/api_docs/slo.devdocs.json +++ b/api_docs/slo.devdocs.json @@ -446,7 +446,13 @@ "label": "aiops", "description": [], "signature": [ - "AiopsPluginStart" + { + "pluginId": "aiops", + "scope": "public", + "docId": "kibAiopsPluginApi", + "section": "def-public.AiopsPluginStart", + "text": "AiopsPluginStart" + } ], "path": "x-pack/plugins/observability_solution/slo/public/types.ts", "deprecated": false, diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 474ed008d3f49..852ec8fda1a71 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 049775b351a2c..47417e4799866 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index b98f9fd1ed747..d02bce54d307d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 3ccbef096cc92..66b393185c3bb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 86565d96f37ef..1e60ae211a315 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 8ac56ef78a30a..6d835b73a9fab 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index adc5e0060895d..22866b6c8c728 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index ad35927629ddf..080cd42d8e793 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index ce1341fb11a74..f4e0ab3f3d72c 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 28e0329866ad8..2f0f5ea28b22d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 2ead16c34920e..caf66bd513b2a 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 137aa6018642f..f608b7b700ff1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 5a3759820b7fe..755868cb98640 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 195a2f423104e..b1990aef57cdb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 9eb7e40e9452b..eaa5e23d3c291 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 652a81ead3355..64a5cb9d40ceb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index ce1dbe266ff0b..31877ae7e09db 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 97d74caff335f..d315349b0d491 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index b4539e38a7527..0152f601b7c30 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 5ac4695b1924f..3941dac118646 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index bde18006da537..c3bbc3ce2e333 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 9ec2cb1cf4ad7..00788dee33478 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index b5f164b3d3566..956b46ce6a3b1 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 02d52f1bf0e75..362186a7c033b 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 5315cbe1aa157..eb7d4b2f31734 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 311b2dfb9dfd2..4b1379baf3e52 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 364245c49b5bb..f47bb32dad01d 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 9e9501f387030..a38b4ed0a5d16 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 39349140baea0..336b5362b2209 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 16eaa33b9b80f..301929b876ce6 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 45d2bc4d47801..f5bfe4363f07f 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 0624d3db19fe9..fe35fa07fcaaf 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index b118cdf5df5d5..f944581881feb 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index e3eb4411150bd..1148f54c22285 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index c2b71fc079024..cb43d04403c35 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index de0edc32295f7..873000edb0550 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-05-22 +date: 2024-05-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index c9d7f7c1f992f..7d15e2f5673e9 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -53,6 +53,7 @@ xpack.fleet.internal.registry.excludePackages: [ # Security integrations 'endpoint', 'beaconing', + 'security_detection_engine', # Removed in 8.11 integrations 'cisco', diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 09b083b7213b2..5cb979389a4d2 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -10,6 +10,7 @@ Review important information about the {kib} 8.x releases. +* <> * <> * <> * <> @@ -65,6 +66,316 @@ Review important information about the {kib} 8.x releases. * <> -- +[[release-notes-8.14.0]] +== {kib} 8.14.0 + +For information about the {kib} 8.14.0 release, review the following information. + +[float] +[[breaking-changes-8.14.0]] +=== Breaking changes + +Breaking changes can prevent your application from optimal operation and performance. +Before you upgrade to 8.14.0, review the breaking changes, then mitigate the impact to your application. + +[discrete] +[[breaking-182074]] +.Renamed an advanced setting to enable {esql}. +[%collapsible] +==== +*Details* + +The advanced setting which hides {esql} from the UI has been renamed from `discover:enableESQL` to `enableESQL`. It is enabled by default and must be switched off to disable {esql} features from your {kib} applications. For more information, refer to ({kibana-pull}182074[#182074]). +==== + +[discrete] +[[breaking-178879]] +.The unified search filter builder is Generally Available. +[%collapsible] +==== +*Details* + +The unified search filter builder (OR / AND) is out of technical preview. For more information, refer to ({kibana-pull}178879[#178879]). +==== + +[discrete] +[[breaking-178860]] +.{esql} is Generally Available. +[%collapsible] +==== +*Details* + +{esql} comes out of technical preview and is generally available. For more information, refer to ({kibana-pull}178860[#178860]). +==== + +[discrete] +[[breaking-177549]] +.The region map visualization type is Generally Available in Lens. +[%collapsible] +==== +*Details* + +The visualization type, region map, comes out of technical preview and is generally available. For more information, refer to ({kibana-pull}177549[#177549]). +==== + +[discrete] +[[breaking-177089]] +.UI enhancements to managed tags. +[%collapsible] +==== +*Details* + +UI improvements for managed tags. For more information, refer to ({kibana-pull}177089[#177089]). +==== + +[float] +[[features-8.14.0]] +=== Features +{kib} 8.14.0 adds the following new and notable features. + +Alerting:: +* Adds a warning when changing the index pattern while at least one rule relies on the current one ({kibana-pull}180310[#180310]). +* Enrich the alert flyout with a new overview tab ({kibana-pull}178863[#178863]). +* Adds history chart for multiple conditions ({kibana-pull}180578[#180578]). +* Implements a tabbed design for existing alert detail pages ({kibana-pull}179529[#179529]). +* Stops reporting no data alert for missing groups that are untracked ({kibana-pull}179512[#179512]). +* Adds a new modal window that lets users interact with value lists directly ({kibana-pull}179339[#179339]). +* Adds new rule type selection modal ({kibana-pull}179285[#179285]). +* Enables filters for the alert search bar on the Observability Alerts page ({kibana-pull}178886[#178886]). +APM:: +* Adds a new API to support linking APM from the Profiling UI ({kibana-pull}180677[#180677]). +* Enables fast filter on Service inventory ({kibana-pull}179096[#179096]). +Cases:: +* Adds automatically creating cases when an alert is triggered ({kibana-pull}168369[#168369]). +* Adds "Additional Fields" field to the Jira action form UI ({kibana-pull}179262[#179262]). +Dashboards:: +* Adds logic and UI improvements where invalid controls selections are no longer ignored, improving the overall loading speed of a dashboard ({kibana-pull}174201[#174201]). +Discover:: +* Allows storing a configured {esql} visualization ({kibana-pull}175227[#175227]). +* Adds document comparison mode ({kibana-pull}166577[#166577]). +Elastic Security:: +For the Elastic Security 8.14.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +ES|QL:: +* Adds a query history component which displays the 20 most recent queries ({kibana-pull}178302[#178302]). +Fleet:: +* Adds subfeatures privileges for Fleet, for Agents, Agent policies and Settings, this feature is in technical preview ({kibana-pull}179889[#179889]). +* Implements state machine behavior for package install ({kibana-pull}178657[#178657]). +* Lowers the default `total_fields` limit to 1000 from 10k ({kibana-pull}178398[#178398]). +* Avoids subobject and scalar mapping conflicts by setting `subobjects: false` on custom integrations ({kibana-pull}178397[#178397]). +* Adds functionality to `default_fields` field, so a query can run against all fields in the mapping ({kibana-pull}178020[#178020]). +* Relaxes delete restrictions for managed content installed by Fleet ({kibana-pull}179113[#179113]). +Infrastructure:: +* Adds a dashboard tab in the UI to the asset details view ({kibana-pull}178518[#178518]). +Lens & Visualizations:: +* Replaces `expression_gauge` from `Goal` to `Bullet` in *Lens* ({kibana-pull}177766[#177766]). +Machine Learning:: +* Removes the technical preview badge for pattern analysis ({kibana-pull}181020[#181020]). +* Adds query history for the {esql} Data visualizer ({kibana-pull}179098[#179098]). +Management:: +* {kib} now uses Elasticsearch's `_async_search/status/{id}` endpoint (instead of `_async_search/{id}`) when polling on search requests to improve performance.({kibana-pull}178921[#178921]). +Observability:: +* The timeslice SLOs calculation for the SLI value now includes the no data slices as good slices. For existing "Timeslice" SLOs you will need to use the `POST /api/observability/slos/{slo.id}/_reset` endpoint to reset the transforms to take advantage of the new calculation ({kibana-pull}181888[#181888]). +* Adds support for user instructions via Knowledge base or API request ({kibana-pull}180263[#180263]). +* Adds baseline alert detail pages ({kibana-pull}180256[#180256]). +* Adds a new connector that can call the AI assistant ({kibana-pull}179980[#179980]). +* Adds a link to Discover to view good/bad events in the event panel ({kibana-pull}178008[#178008]). +* Adds customization for Virtual Columns in Field List ({kibana-pull}177626[#177626]). +* Adds dependencies for Burn Rate rule suppression ({kibana-pull}177078[#177078]). +* Adds grouping by multiple values when creating SLOs, allowing for dynamic creation of multiple SLOs from a single SLI definition ({kibana-pull}175063[#175063]). +Uptime:: +* Adds Monitor public API ({kibana-pull}169928[#169928]). + +For more information about the features introduced in 8.14.0, refer to <>. + +[[enhancements-and-bug-fixes-v8.14.0]] +=== Enhancements and bug fixes + +For detailed information about the 8.14.0 release, review the enhancements and bug fixes. + +[float] +[[enhancement-v8.14.0]] +=== Enhancements +Alerting:: +* Adds history chart for multiple conditions ({kibana-pull}180578[#180578]). +* Show Alerting rule JSON for API requests ({kibana-pull}180085[#180085]). +* Implement tabbed design for existing alert detail pages ({kibana-pull}179529[#179529]). +* Adds new rule type selection modal ({kibana-pull}179285[#179285]). +* Moves alerts filter controls to `@kbn/alerts-ui-shared` package ({kibana-pull}179243[#179243]). +* Improves alerts table actions column performance ({kibana-pull}178632[#178632]). +* Adds Insights component to alerts details ({kibana-pull}178330[#178330]). +* Adds support to dhow the number of additional filters that are applied on the alerts table ({kibana-pull}177275[#177275]). +* Adds error boundary to AlertsTable ({kibana-pull}176412[#176412]). +* Improves the performance of `join_by_key` ({kibana-pull}175177[#175177]). +APM:: +* Show Universal Profiling data on transaction details page ({kibana-pull}176922[#176922]). +Connectors:: +* Adds support for the Jira connector API to support the `otherFields` property to pass additional fields to be used when updating or creating issues via the link:https://developer.atlassian.com/cloud/jira/platform/rest/v2/api-group-issues/#api-rest-api-2-issue-post[Jira API] ({kibana-pull}178627[#178627]). +Dashboard:: +* Reorganized panel actions in the actions menu ({kibana-pull}178596[#178596]). +* Adds panel styling improvements ({kibana-pull}178139[#178139]). +* Adds "Apply" button to stop controls selections being automatically applied ({kibana-pull}174714[#174714]). +Discover:: +* Support field stats for {esql} query ({kibana-pull}178433[#178433]). +Elastic Security:: +For the Elastic Security 8.14.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +ES|QL:: +* Implicit casting changes ({kibana-pull}182989[#182989]). +* Adds validation and auto-complete for `date_diff` ({kibana-pull}182513[#182513]). +* Adds more functions to the validator ({kibana-pull}180640[#180640]). +* Adds an enhanced chart switcher to the *Lens* inline editing flyout ({kibana-pull}177790[#177790]). +Fleet:: +* Adds support for dimension mappings in dynamic templates ({kibana-pull}180023[#180023]). +* Adds CPU metrics to request diagnostics ({kibana-pull}179819[#179819]). +* Adds Settings Framework API and UI ({kibana-pull}179795[#179795]). +* Adds an Elastic Defend advanced policy option for pruning capability arrays ({kibana-pull}179766[#179766]). +* Adds Agent activity flyout enhancements ({kibana-pull}179161[#179161]). +* Adds unhealthy reason (input/output/other) to agent metrics ({kibana-pull}178605[#178605]). +* Adds a warning which is displayed when trying to upgrade agent to version > max fleet server version ({kibana-pull}178079[#178079]). +Infrastructure:: +* Adds alerts count to hosts data ({kibana-pull}176034[#176034]). +Lens & Visualizations:: +* combines the chart type selection options into a single, layer-based chart switch ({kibana-pull}178971[#178971]). +Machine Learning:: +* Hides file upload document count chart until data is searchable ({kibana-pull}181460[#181460]). +* Removes technical preview badge for pattern analysis ({kibana-pull}181020[#181020]). +* Adds support for ad-hoc Data Views for testing models in Trained Models UI ({kibana-pull}180795[#180795]). +* Adds open and edit panel actions for the Single Metric Viewer ({kibana-pull}179364[#179364]). +* Improves {esql} data visualizer performance with early limit and remove option to Analyze all ({kibana-pull}179286[#179286]). +* Adds query history for the {esql} Data visualizer ({kibana-pull}179098[#179098]). +* Hides the Filebeat configuration card for Serverless Search file upload ({kibana-pull}178987[#178987]). +* Improves performance of Field stats / Index data visualizer by reducing requests for empty fields, making it convenient to add multi-field ({kibana-pull}178766[#178766]). +* AIOps: Identify spike/dips with change point detection for log rate analysis ({kibana-pull}178338[#178338]). +* Adds ML feature privileges tooltip ({kibana-pull}181595[#181595]). +Management:: +* Transforms: Use basic stats for transform list, call full stats only for expanded rows ({kibana-pull}180271[#180271]). +* Allows adding a custom description for data view fields ({kibana-pull}168577[#168577]). +Observability:: +* Adds an advanced setting to enable simulated function calling ({kibana-pull}180621[#180621]). +* Adds a public API for /chat/complete ({kibana-pull}179618[#179618]). +* Persists settings in {es} instead of local storage ({kibana-pull}179380[#179380]). +* Allows filtering data views by type ({kibana-pull}179069[#179069]). +* Implements contextual actions ({kibana-pull}178405[#178405]). +* Adds the ability to create an SLI based on the availability of your synthetics monitors ({kibana-pull}177842[#177842]). +* Adds setting for user's preferred language for the AI assistant ({kibana-pull}176444[#176444]). +* Adds improvements to the AI assistants handling where a generated {esql} query has syntax errors ({kibana-pull}179919[#179919]). +* Adds grouping by multiple values when creating SLOs, allowing for dynamic creation of multiple SLOs from a single SLI definition({kibana-pull}175063[#175063]). +Platform:: +* Adds a new option, `system`, to the `theme:darkMode` Kibana advanced setting, that can be used to have Kibana's theme follow the system's (light or dark) ({kibana-pull}173044[#173044]). +Reporting:: +* A feature has been deprecated which allowed users to download a CSV file from a saved search panel in a dashboard, without having a report generated. Now, when users need to access saved search data from a dashboard panel as CSV, a normal report will be generated. To access the deprecated functionality, you can add `xpack.reporting.csv.enablePanelActionDownload: true` to kibana.yml, but this ability will be removed in a future version of Kibana ({kibana-pull}178159[#178159]). +Security:: +* Adds `Content-Security-Policy-Report-Only` header support ({kibana-pull}179949[#179949]). +* Renders a user-friendly UI for unhandled login failures ({kibana-pull}173959[#173959]). +* Migrates the Security AI Assistant into a flyout ({kibana-pull}176657[#176657]). +* Adds support for LangChain streaming for the `openai-functions` agent ({kibana-pull}174126[#174126]). +Unified Search:: +* Adds auto-refresh pause when the page is not visible ({kibana-pull}177693[#177693]). +* Adds support for not clearing the value on the filter builder when the operator changes ({kibana-pull}176911[#176911]). + +[float] +[[fixes-v8.14.0]] +=== Bug Fixes +Alerting:: +* Fixes bug with aggregation building for {es} query rule when there are multi-terms and a group by field ({kibana-pull}182865[#182865]). +* Fixes using `recoveredCurrent` and `activeCurrent` to determine how to update old alerts ({kibana-pull}180934[#180934]). +* Fixes logging the errors reported by `addLastRunError` to the console ({kibana-pull}179962[#179962]). +* Preserves relative snooze when adding or removing snooze schedules ({kibana-pull}178344[#178344]). +* Reverts changes to notify when there is a change on connector configuration ({kibana-pull}177054[#177054]). +APM:: +* Fixes the cardinality count for SLOs generated from a single SLI definition was previously incorrect for APM latency and APM availability SLIs ({kibana-pull}183171[#183171]). +* Fixes the telemetry collection of Logstash with metricbeat monitoring ({kibana-pull}182304[#182304]). +* Fixes otel service detection ({kibana-pull}180574[#180574]). +Cases:: +* Displays the link to the Cases page under observability when Cases {kib} privileges are granted regardless of the other application privileges ({kibana-pull}182569[#182569]). +Canvas:: +* Fixes workpad templates using legacy filters function ({kibana-pull}176093[#176093]). +Connectors:: +* Removes secrets from the connectors before validating in `actionsClient` getAll ({kibana-pull}179837[#179837]). +Dashboard:: +* Fixes opening panel title edit flyout only when panel title is clicked ({kibana-pull}180137[#180137]). +* Disallows copy to dashboard from a maximized panel ({kibana-pull}179422[#179422]). +Discover:: +* Fixes issue where an ES query rule could be created with a data view, then the data view is changed but there's still a reference to the previous data view's timestamp field. ({kibana-pull}182883[#182883]). +* Fixes view all matches button for timestamps with numeric date formats ({kibana-pull}181769[#181769]). +* Fixes time range filters for CSV when a relative time filter is specified in UI ({kibana-pull}181067[#181067]). +* Fixes the status list to be static ({kibana-pull}177435[#177435]). +* Fixes a timeout for a "View all matches" request ({kibana-pull}181859[#181859]). +* Fixes tracking total hits for "View all matches" button ({kibana-pull}181811[#181811]). +* Fixes comments bugs in Discover and Data Visualizer ({kibana-pull}181283[#181283]). +* Fixes the problem with Discover and queries without the from command ({kibana-pull}180692[#180692]). +* Fixes displaying "Unsaved changes" badge on time filter changes in case time range is stored along with saved search ({kibana-pull}178659[#178659]). +Elastic Security:: +For the Elastic Security 8.14.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +ES|QL:: +* Fixes validation on string implicit casting for dates and other minor issues ({kibana-pull}181571[#181571]). +* Fixes validation for some specific {esql} types ({kibana-pull}181381[#181381]). +* Fixes retrieving the indices from AST parsing ({kibana-pull}181271[#181271]). +* Fixes max and min accepting date fields ({kibana-pull}180945[#180945]). +* Fixes autocomplete with incompatible arguments ({kibana-pull}180874[#180874]). +* Fixes providing the CCS indices on the autosuggestion ({kibana-pull}180610[#180610]). +* Fixes to `auto_bucket` and constant-only parameters ({kibana-pull}180509[#180509]). +* Fixes persisting columns sorting in saved search ({kibana-pull}180193[#180193]). +* Fixes client-side validation: make `and` and `or` accept `null` ({kibana-pull}179707[#179707]). +* Fixes to the @timestamp column ({kibana-pull}176834[#176834]). +* Fixes validation running on outdated queries when typing ({kibana-pull}180977[#180977]). +Fleet:: +* Adds validation to dataset field in input packages to disallow special characters ({kibana-pull}182925[#182925]). +* Fixes rollback input package install on failure ({kibana-pull}182665[#182665]). +* Fixes cloudflare template error ({kibana-pull}182645[#182645]). +* Fixes displaying `Config` and `API reference` tabs if they are not needed ({kibana-pull}182518[#182518]). +* Fixes allowing fleet-server agent upgrade to newer than fleet-server ({kibana-pull}181575[#181575]). +* Fixes flattened inputs in the configuration tab ({kibana-pull}181155[#181155]). +* Adds callout when editing an output about plain text secrets being re-saved to secret storage ({kibana-pull}180334[#180334]). +* Removes unnecessary field definitions for custom integrations ({kibana-pull}178293[#178293]). +* Fixes secrets UI inputs in forms when secrets storage is disabled server side ({kibana-pull}178045[#178045]). +* Fixes not being able to preview or download files with special characters ({kibana-pull}176822[#176822]). +* Fixes KQL validation being applied in search boxes ({kibana-pull}176806[#176806]). +Lens & Visualizations:: +* Fixes import to other spaces ({kibana-pull}183076[#183076]). +* Fixes clip path cutting mobile view in *Lens* ({kibana-pull}182376[#182376]). +* Fixes error message layer indexing in *Lens* ({kibana-pull}180898[#180898]). +* Fixes markdown table borders being visible in the text panels ({kibana-pull}180454[#180454]). +* Fixes default formatter for gauge charts in *Lens* ({kibana-pull}179473[#179473]). +* Fixes error for non-date histogram charts that contain `showCurrentTimeMarker:true` setting in *Lens* ({kibana-pull}179452[#179452]). +* Fixes overriding title when using the inline *Lens* editor ({kibana-pull}182897[#182897]). +Machine Learning:: +* Single Metric Viewer: Ensures edit to different job works as expected ({kibana-pull}183086[#183086]). +* Single Metric Viewer: Fixes hover functionality in the anomalies table ({kibana-pull}182297[#182297]). +* Single Metric Viewer: Ensures chart displays correctly when opening from a job annotation ({kibana-pull}182176[#182176]). +* Single Metric Viewer: Displays error message when insufficient permissions ({kibana-pull}180858[#180858]). +* Fixes retention of categorization example limits ({kibana-pull}182103[#182103]). +* Fixes responsive layout for Trained Models table ({kibana-pull}181541[#181541]). +* Removes datafeed preview frozen tier message in serverless ({kibana-pull}181440[#181440]). +* ML anomaly swim lane: Ensure dashboard reset works correctly ({kibana-pull}181346[#181346]). +* AIOps: Fixes query string for the change point detection metric charts ({kibana-pull}181314[#181314]). +* AIOps: Fixes missing field caps filters for log rate analysis ({kibana-pull}181109[#181109]). +* AIOps: Fixes not running log rate analysis twice when no spike/dip is detected ({kibana-pull}180980[#180980]). +* Removes all SCSS files in favor of CSS ({kibana-pull}178314[#178314]). +* Fixes polling for blocked anomaly detection jobs ({kibana-pull}178246[#178246]). +* Adds trained model list permission UI tests ({kibana-pull}174045[#174045]). +Management:: +* Fixes transform health rule failure with a long list of continuous transforms ({kibana-pull}183153[#183153]). +* The runtime field creation modal now shows indexed values instead of source values in the preview pane ({kibana-pull}181246[#181246]). +Monitoring:: +* Fixes broken KQL filter for Cluster Health rule ({kibana-pull}183259[#183259]). +Observability:: +* Fixes Triggered column timezone and format ({kibana-pull}182653[#182653]). +* Fixes refetching data views on save ({kibana-pull}181033[#181033]). +* Allows editing of charts when {es} query fails ({kibana-pull}180500[#180500]). +* Fixes Agent ID not being parsed correctly ({kibana-pull}180301[#180301]). +* Changes `Custom KQL` to `Custom Query` ({kibana-pull}179497[#179497]). +* Fixes filtering for a histogram legend value ({kibana-pull}178551[#178551]). +* Fixes an OpenAI Connector default model assignment bug ({kibana-pull}178369[#178369]). +Platform:: +* Update static asset headers to include `public` and `immutable` link:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control[cache control directives] to a large number of assets served by Kibana, which should reduce the number of requests for static assets in browsers that respect these directives. ({kibana-pull}180378[#180378]). +* Omits apiKey from RUM agent ({kibana-pull}178902[#178902]). +Presentation:: +* Fixes clicking "Explore in maps" button not taking users to maps ({kibana-pull}181903[#181903]). +Security:: +* Fixed escaped terminal codes logging in interactive plugin setup ({kibana-pull}180342[#180342]). +* Fixes an issue with Security Assistant send to timeline functionality ({kibana-pull}177771[#177771]). +SharedUX:: +* Fixes multiline query in expanded mode displaying undefined for line number ({kibana-pull}181544[#181544]). +* Removes unused legacy markdown component ({kibana-pull}179272[#179272]). +* Fixes typo in chromium driver factory page event ({kibana-pull}178708[#178708]). +* Fixes not being able to enter the {esql} editor when the column menu is open ({kibana-pull}178622[#178622]). +* Fixes an issue in Reporting with consistently showing the toast message for completed report jobs ({kibana-pull}177537[#177537]). +* Fixes time picker to show allowed formats properly in absolute tabs ({kibana-pull}182152[#182152]). [[release-notes-8.13.4]] == {kib} 8.13.4 diff --git a/docs/management/action-types.asciidoc b/docs/management/action-types.asciidoc index ae9a887481406..7729b85699eb6 100644 --- a/docs/management/action-types.asciidoc +++ b/docs/management/action-types.asciidoc @@ -2,7 +2,8 @@ [[action-types]] == Connectors -Connectors provide a central place to store connection information for services and integrations with third party systems. Actions are instantiations of a connector that are linked to rules and run as background tasks on the {kib} server when rule conditions are met. {kib} provides the following types of connectors: +Connectors provide a central place to store connection information for services and integrations with Elastic or third party systems. +Actions are instantiations of a connector that are linked to rules and run as background tasks on the {kib} server when rule conditions are met. {kib} provides the following types of connectors: [cols="2"] |=== @@ -11,6 +12,10 @@ a| <> | Send a request to {bedrock}. +a| <> + +| Add alerts to cases. + a| <> | Send a request to D3 Security. diff --git a/docs/management/cases/cases.asciidoc b/docs/management/cases/cases.asciidoc index 02d5b5f859a5f..1c0c53ee8aa9e 100644 --- a/docs/management/cases/cases.asciidoc +++ b/docs/management/cases/cases.asciidoc @@ -5,13 +5,12 @@ :frontmatter-tags-content-type: [overview] :frontmatter-tags-user-goals: [analyze] -Cases are used to open and track issues directly in {kib}. You can add -assignees and tags to your cases, set their severity and status, and add alerts, -comments, and visualizations. You can also send cases to external incident -management systems by configuring connectors. +Cases are used to open and track issues directly in {kib}. +You can add assignees and tags to your cases, set their severity and status, and add alerts, comments, and visualizations. +You can create cases automatically when alerts occur or send cases to external incident management systems by configuring connectors. [role="screenshot"] -image::images/cases.png[Cases page] +image::images/cases-list.png[Cases page] // NOTE: This is an autogenerated screenshot. Do not edit it directly. NOTE: If you create cases in the {observability} or {security-app}, they are not diff --git a/docs/management/cases/images/cases.png b/docs/management/cases/images/cases-list.png similarity index 100% rename from docs/management/cases/images/cases.png rename to docs/management/cases/images/cases-list.png diff --git a/docs/management/cases/manage-cases.asciidoc b/docs/management/cases/manage-cases.asciidoc index 79b0f09642cc7..ecf7c755a7a59 100644 --- a/docs/management/cases/manage-cases.asciidoc +++ b/docs/management/cases/manage-cases.asciidoc @@ -36,6 +36,11 @@ information, refer to <>. . After you've completed all of the required fields, click *Create case*. +preview:[] Alternatively, you can configure your rules to automatically create cases by using <>. +By default, the rule adds all of the alerts within a specified time window to a single case. +You can optionally choose a field to group the alerts and create separate cases for each group. +You can also choose whether you want the rule to reopen cases or open new ones when the time window elapses. + [[case-custom-fields]] === Add custom fields diff --git a/docs/management/cases/setup-cases.asciidoc b/docs/management/cases/setup-cases.asciidoc index fdc4dde72504e..b15d3c884bf79 100644 --- a/docs/management/cases/setup-cases.asciidoc +++ b/docs/management/cases/setup-cases.asciidoc @@ -30,9 +30,14 @@ and comments and edit case settings unless you customize the sub-feature privile | Give assignee access to cases a| `All` for the *Cases* feature under *Management*. -NOTE: Before a user can be assigned to a case, they must log into {kib} at +[NOTE] +==== +Before a user can be assigned to a case, they must log into {kib} at least once, which creates a user profile. +This privilege is also required to add <> to rules. +==== + | Give view-only access to cases a| `Read` for the *Cases* feature under *Management*. diff --git a/docs/management/connectors/action-types/cases-action-type.asciidoc b/docs/management/connectors/action-types/cases-action-type.asciidoc new file mode 100644 index 0000000000000..1e9a6e113ff83 --- /dev/null +++ b/docs/management/connectors/action-types/cases-action-type.asciidoc @@ -0,0 +1,55 @@ +[[cases-action-type]] +== Cases connector and action +++++ +Cases +++++ +:frontmatter-description: Add a rule action that creates and updates cases. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] + +preview::[] + +The Cases connector creates cases in {kib} when alerts occur. + +[float] +[[define-cases-ui]] +=== Create connectors in {kib} + +To use this connector you must have `All` {kib} privileges for the *Cases* feature. +Depending on the type of rule you want to create and its role visibility, you must have privileges for *Management* or *{observability}* case features. +For more details, refer to <>. + +You cannot manage this connector in *{stack-manage-app} > {connectors-ui}* or by using APIs. +You also cannot create a Cases <>. +It is available only when you're creating a rule in {kib}. +For example: + +[role="screenshot"] +image::management/connectors/images/cases-action.png[Add a cases action while creating a rule in {kib} {rules-ui}] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +NOTE: You can have only one Cases action in each rule. + +[float] +[[cases-connector-configuration]] +==== Connector configuration + +Cases connectors have the following configuration properties: + +Group by alert field:: +By default, all alerts are attached to the same case. +You can optionally choose a field to use for grouping the alerts; a unique case is created for each group. + +Reopen when the case is closed:: +If this option is enabled, closed cases are re-opened when an alert occurs. + +Time window:: +By default, alerts are added to an existing case only if they occur within a 7 day time window. + +[float] +[[cases-action-configuration]] +=== Test connectors + +You cannot test or edit these connectors in {kib} or by using APIs. + diff --git a/docs/management/connectors/images/cases-action.png b/docs/management/connectors/images/cases-action.png new file mode 100644 index 0000000000000..a838a49143cdc Binary files /dev/null and b/docs/management/connectors/images/cases-action.png differ diff --git a/docs/management/connectors/index.asciidoc b/docs/management/connectors/index.asciidoc index 1acba0863b07d..4354879579178 100644 --- a/docs/management/connectors/index.asciidoc +++ b/docs/management/connectors/index.asciidoc @@ -1,4 +1,5 @@ include::action-types/bedrock.asciidoc[leveloffset=+1] +include::action-types/cases-action-type.asciidoc[leveloffset=+1] include::action-types/d3security.asciidoc[leveloffset=+1] include::action-types/email.asciidoc[leveloffset=+1] include::action-types/resilient.asciidoc[leveloffset=+1] diff --git a/docs/playground/playground-context.asciidoc b/docs/playground/playground-context.asciidoc index c0c4533fcb1a0..25273eb8806ba 100644 --- a/docs/playground/playground-context.asciidoc +++ b/docs/playground/playground-context.asciidoc @@ -15,6 +15,11 @@ There are a few ways to optimize this context for better results. Some adjustments can be made directly in the {x} UI. Others require refining your indexing strategy, and potentially reindexing your data. +[NOTE] +===== +Currently you can only select *one field* to be provided as context to the LLM. +===== + [float] [[playground-context-ui]] == Edit context in UI diff --git a/docs/user/alerting/alerting-setup.asciidoc b/docs/user/alerting/alerting-setup.asciidoc index f26f3b630c49d..82e64557b55dd 100644 --- a/docs/user/alerting/alerting-setup.asciidoc +++ b/docs/user/alerting/alerting-setup.asciidoc @@ -54,6 +54,8 @@ To add rule actions and test connectors, you must also have `read` privileges fo To change rule settings, you must have `all` privileges for the *Rules Settings* privilege or `all` privileges for the appropriate sub-feature such as flapping detection. For more information on configuring roles that provide access to features, go to <>. +preview:[] To create a rule that uses the <>, you must also have `all` privileges for the *Cases* feature. + Each rule also has a rule visibility value (or `consumer` in the APIs), which affects the {kib} feature privileges that are required to access it. To view or edit a rule that has a `Stack Rules` rule visibility, for example, you must have the appropriate *Management > {stack-rules-feature}* feature privileges. diff --git a/docs/user/alerting/create-and-manage-rules.asciidoc b/docs/user/alerting/create-and-manage-rules.asciidoc index 35e554b0205fc..5e108b963b18a 100644 --- a/docs/user/alerting/create-and-manage-rules.asciidoc +++ b/docs/user/alerting/create-and-manage-rules.asciidoc @@ -69,7 +69,8 @@ For details on what types of rules are available and how to configure them, refe You can add one or more actions to your rule to generate notifications when its conditions are met and when they are no longer met. Each action uses a connector, which provides connection information for a {kib} service or third party integration, depending on where you want to send the notifications. -If no connectors exist, click **Add connector** to create one. + +preview:[] Some connectors that perform actions within {kib}, such as the <>, require less configuration. For example, you do not need to set the action frequency or variables. After you select a connector, set the action frequency. You can choose to create a summary of alerts on each check interval or on a custom interval. diff --git a/examples/bfetch_explorer/public/mount.tsx b/examples/bfetch_explorer/public/mount.tsx index 40d171f2d98a3..9a09d40748137 100644 --- a/examples/bfetch_explorer/public/mount.tsx +++ b/examples/bfetch_explorer/public/mount.tsx @@ -10,6 +10,7 @@ import * as React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { CoreSetup, CoreStart, AppMountParameters } from '@kbn/core/public'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { BfetchExplorerStartPlugins, ExplorerService } from './plugin'; import { App } from './containers/app'; @@ -26,9 +27,11 @@ export const mount = const [core, plugins] = await coreSetup.getStartServices(); const deps: BfetchDeps = { appBasePath, core, plugins, explorer }; const reactElement = ( - - - + + + + + ); render(reactElement, element); return () => unmountComponentAtNode(element); diff --git a/examples/bfetch_explorer/tsconfig.json b/examples/bfetch_explorer/tsconfig.json index e09ad294b4ae7..c8417c734f58d 100644 --- a/examples/bfetch_explorer/tsconfig.json +++ b/examples/bfetch_explorer/tsconfig.json @@ -19,5 +19,6 @@ "@kbn/bfetch-plugin", "@kbn/kibana-react-plugin", "@kbn/shared-ux-router", + "@kbn/react-kibana-context-render", ] } diff --git a/examples/content_management_examples/public/examples/index.tsx b/examples/content_management_examples/public/examples/index.tsx index 3b92da0ba025e..7b6296a80fb4d 100644 --- a/examples/content_management_examples/public/examples/index.tsx +++ b/examples/content_management_examples/public/examples/index.tsx @@ -9,6 +9,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Redirect } from 'react-router-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Router, Routes, Route } from '@kbn/shared-ux-router'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { EuiPageTemplate, EuiSideNav } from '@elastic/eui'; @@ -24,65 +25,67 @@ export const renderApp = ( { element, history }: AppMountParameters ) => { ReactDOM.render( - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - , + + + + + + + + + + + + + + + + + + , element ); diff --git a/examples/content_management_examples/tsconfig.json b/examples/content_management_examples/tsconfig.json index c94193dc151cc..44b5bf053aeb6 100644 --- a/examples/content_management_examples/tsconfig.json +++ b/examples/content_management_examples/tsconfig.json @@ -29,5 +29,6 @@ "@kbn/shared-ux-router", "@kbn/saved-objects-finder-plugin", "@kbn/content-management-table-list-view-common", + "@kbn/react-kibana-context-render", ] } diff --git a/examples/developer_examples/public/app.tsx b/examples/developer_examples/public/app.tsx index b95806edb28eb..279697d5a200f 100644 --- a/examples/developer_examples/public/app.tsx +++ b/examples/developer_examples/public/app.tsx @@ -22,16 +22,29 @@ import { EuiLink, EuiButtonIcon, } from '@elastic/eui'; -import { AppMountParameters } from '@kbn/core/public'; +import { + AnalyticsServiceStart, + AppMountParameters, + I18nStart, + ThemeServiceStart, +} from '@kbn/core/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { ExampleDefinition } from './types'; +interface StartServices { + analytics: Pick; + i18n: I18nStart; + theme: Pick; +} + interface Props { + startServices: StartServices; examples: ExampleDefinition[]; navigateToApp: (appId: string) => void; getUrlForApp: (appId: string) => string; } -function DeveloperExamples({ examples, navigateToApp, getUrlForApp }: Props) { +function DeveloperExamples({ startServices, examples, navigateToApp, getUrlForApp }: Props) { const [search, setSearch] = useState(''); const lcSearch = search.toLowerCase(); @@ -44,7 +57,7 @@ function DeveloperExamples({ examples, navigateToApp, getUrlForApp }: Props) { }); return ( - <> + @@ -103,7 +116,7 @@ function DeveloperExamples({ examples, navigateToApp, getUrlForApp }: Props) { ))} - + ); } diff --git a/examples/developer_examples/public/plugin.ts b/examples/developer_examples/public/plugin.ts index c87bd2f5cc890..75a304b895e8f 100644 --- a/examples/developer_examples/public/plugin.ts +++ b/examples/developer_examples/public/plugin.ts @@ -27,8 +27,10 @@ export class DeveloperExamplesPlugin implements Plugin coreStart.application.navigateToApp(appId), getUrlForApp: (appId: string) => coreStart.application.getUrlForApp(appId), diff --git a/examples/developer_examples/tsconfig.json b/examples/developer_examples/tsconfig.json index fdd37bde1e1eb..3863ff54e0b96 100644 --- a/examples/developer_examples/tsconfig.json +++ b/examples/developer_examples/tsconfig.json @@ -14,6 +14,7 @@ "target/**/*", ], "kbn_references": [ - "@kbn/core" + "@kbn/core", + "@kbn/react-kibana-context-render" ] } diff --git a/examples/discover_customization_examples/public/plugin.tsx b/examples/discover_customization_examples/public/plugin.tsx index 8afe18cbe9c92..d1215307fdb60 100644 --- a/examples/discover_customization_examples/public/plugin.tsx +++ b/examples/discover_customization_examples/public/plugin.tsx @@ -16,6 +16,7 @@ import { } from '@elastic/eui'; import { CoreSetup, CoreStart, Plugin, SimpleSavedObject } from '@kbn/core/public'; import type { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { CustomizationCallback, DiscoverSetup, @@ -140,41 +141,43 @@ export class DiscoverCustomizationExamplesPlugin implements Plugin { document.body.appendChild(optionsContainer); const element = ( - - alert('Create new clicked'), - }, - { - name: 'Make a copy', - icon: 'copy', - onClick: () => alert('Make a copy clicked'), - }, - { - name: 'Manage saved searches', - icon: 'gear', - onClick: () => alert('Manage saved searches clicked'), - }, - ], - }, - ]} - data-test-subj="customOptionsPopover" - /> - + + + alert('Create new clicked'), + }, + { + name: 'Make a copy', + icon: 'copy', + onClick: () => alert('Make a copy clicked'), + }, + { + name: 'Manage saved searches', + icon: 'gear', + onClick: () => alert('Manage saved searches clicked'), + }, + ], + }, + ]} + data-test-subj="customOptionsPopover" + /> + + ); ReactDOM.render(element, optionsContainer); diff --git a/examples/discover_customization_examples/tsconfig.json b/examples/discover_customization_examples/tsconfig.json index c71a72086dde1..49c83477e0c1f 100644 --- a/examples/discover_customization_examples/tsconfig.json +++ b/examples/discover_customization_examples/tsconfig.json @@ -14,6 +14,7 @@ "@kbn/i18n-react", "@kbn/react-kibana-context-theme", "@kbn/data-plugin", + "@kbn/react-kibana-context-render", ], "exclude": ["target/**/*"] } diff --git a/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx b/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx index 18bd40fe69dae..945e969187631 100644 --- a/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx +++ b/examples/embeddable_examples/public/react_embeddables/search/register_add_search_panel_action.tsx @@ -27,10 +27,16 @@ export const registerAddSearchPanelAction = (uiActions: UiActionsStart) => { embeddable.addNewPanel( { panelType: SEARCH_EMBEDDABLE_ID, + initialState: {}, }, true ); }, }); uiActions.attachAction('ADD_PANEL_TRIGGER', ADD_SEARCH_ACTION_ID); + if (uiActions.hasTrigger('ADD_CANVAS_ELEMENT_TRIGGER')) { + // Because Canvas is not enabled in Serverless, this trigger might not be registered - only attach + // the create action if the Canvas-specific trigger does indeed exist. + uiActions.attachAction('ADD_CANVAS_ELEMENT_TRIGGER', ADD_SEARCH_ACTION_ID); + } }; diff --git a/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx b/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx index 65cb55fb3e43d..fcd1210f05b8d 100644 --- a/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx +++ b/examples/embeddable_examples/public/react_embeddables/search/search_embeddable_renderer.tsx @@ -6,10 +6,10 @@ * Side Public License, v 1. */ -import React, { useEffect, useMemo } from 'react'; -import { BehaviorSubject } from 'rxjs'; +import React, { useMemo } from 'react'; import { TimeRange } from '@kbn/es-query'; import { ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; +import { useSearchApi } from '@kbn/presentation-publishing'; import type { SearchApi, SearchSerializedState } from './types'; import { SEARCH_EMBEDDABLE_ID } from './constants'; @@ -28,23 +28,15 @@ export function SearchEmbeddableRenderer(props: Props) { // only run onMount }, []); - const parentApi = useMemo(() => { - return { - timeRange$: new BehaviorSubject(props.timeRange), - getSerializedStateForChild: () => initialState, - }; - // only run onMount - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - parentApi.timeRange$.next(props.timeRange); - }, [props.timeRange, parentApi.timeRange$]); + const searchApi = useSearchApi({ timeRange: props.timeRange }); return ( type={SEARCH_EMBEDDABLE_ID} - getParentApi={() => parentApi} + getParentApi={() => ({ + ...searchApi, + getSerializedStateForChild: () => initialState, + })} hidePanelChrome={true} /> ); diff --git a/examples/error_boundary/public/plugin.tsx b/examples/error_boundary/public/plugin.tsx index 2c5d4e7487005..d09edbf714cc8 100755 --- a/examples/error_boundary/public/plugin.tsx +++ b/examples/error_boundary/public/plugin.tsx @@ -5,7 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { EuiButton } from '@elastic/eui'; +import { EuiButton, EuiProvider } from '@elastic/eui'; import React, { useState } from 'react'; import ReactDOM from 'react-dom'; @@ -74,23 +74,27 @@ export class ErrorBoundaryExamplePlugin implements Plugin id: 'errorBoundaryExample', title: 'Error Boundary Example', async mount({ element }: AppMountParameters) { + // Using the "EuiProvider" here rather than KibanaRenderContextProvider, because KibanaRenderContextProvider + // wraps KibanaErrorBoundaryProvider and KibanaErrorBoundary and we want to test it directly, not a wrapper. ReactDOM.render( - - - - - - - - - - - - - , + + + + + + + + + + + + + + + , element ); return () => ReactDOM.unmountComponentAtNode(element); diff --git a/examples/esql_validation_example/public/app.tsx b/examples/esql_validation_example/public/app.tsx index 918fbd6be79ab..f785b31de3ba2 100644 --- a/examples/esql_validation_example/public/app.tsx +++ b/examples/esql_validation_example/public/app.tsx @@ -57,9 +57,6 @@ export const App = (props: { core: CoreStart; plugins: StartDependencies }) => { { name: 'stringField', type: 'string' }, ] : undefined, - getMetaFields: callbacksEnabled.metaFields - ? async () => ['_version', '_id', '_index', '_source'] - : undefined, getPolicies: callbacksEnabled.policies ? async () => [ { @@ -103,10 +100,6 @@ export const App = (props: { core: CoreStart; plugins: StartDependencies }) => { id: 'policies', label: 'getPolicies callback => my-policy', }, - { - id: 'metaFields', - label: 'getMetaFields callback => _version, _id, _index, _source', - }, ]; return ( diff --git a/examples/esql_validation_example/public/code_snippet.tsx b/examples/esql_validation_example/public/code_snippet.tsx index e80b52b4dd378..d6e21f6b41c79 100644 --- a/examples/esql_validation_example/public/code_snippet.tsx +++ b/examples/esql_validation_example/public/code_snippet.tsx @@ -35,11 +35,6 @@ function getCallbacksCode(callbacks: CodeSnippetProps['callbacks']) { ],` : '' } - ${ - callbacks.metaFields - ? `getMetaFields: async () => ['_version', '_id', '_index', '_source'],` - : '' - } ${ callbacks.policies ? `getPolicies: async () => [ diff --git a/examples/expressions_explorer/public/app.tsx b/examples/expressions_explorer/public/app.tsx index 776d612fd395d..029690d52fa4a 100644 --- a/examples/expressions_explorer/public/app.tsx +++ b/examples/expressions_explorer/public/app.tsx @@ -18,11 +18,17 @@ import { EuiText, EuiLink, } from '@elastic/eui'; -import { AppMountParameters, IUiSettingsClient, ThemeServiceStart } from '@kbn/core/public'; +import { + AppMountParameters, + I18nStart, + IUiSettingsClient, + ThemeServiceStart, +} from '@kbn/core/public'; import { ExpressionsStart } from '@kbn/expressions-plugin/public'; import { Start as InspectorStart } from '@kbn/inspector-plugin/public'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { SettingsStart } from '@kbn/core-ui-settings-browser'; import { RunExpressionsExample } from './run_expressions'; import { RenderExpressionsExample } from './render_expressions'; @@ -36,6 +42,7 @@ interface Props { uiSettings: IUiSettingsClient; settings: SettingsStart; theme: ThemeServiceStart; + i18n: I18nStart; } const ExpressionsExplorer = ({ @@ -44,6 +51,7 @@ const ExpressionsExplorer = ({ actions, uiSettings, settings, + i18n, theme, }: Props) => { const { Provider: KibanaReactContextProvider } = createKibanaReactContext({ @@ -51,49 +59,52 @@ const ExpressionsExplorer = ({ settings, theme, }); + const startServices = { i18n, theme }; return ( - - - - - - - + + + + - -

- There are a couple of ways to run the expressions. Below some of the options are - demonstrated. You can read more about it{' '} - - here - -

-
+ +
+ + + +

+ There are a couple of ways to run the expressions. Below some of the options are + demonstrated. You can read more about it{' '} + + here + +

+
- + - + - + - + - + - + - + - -
-
-
-
-
+ + +
+
+
+
+ ); }; diff --git a/examples/expressions_explorer/public/plugin.tsx b/examples/expressions_explorer/public/plugin.tsx index ba95f55f0a19a..5fad13ec5e025 100644 --- a/examples/expressions_explorer/public/plugin.tsx +++ b/examples/expressions_explorer/public/plugin.tsx @@ -14,7 +14,7 @@ import { UiActionsStart, UiActionsSetup } from '@kbn/ui-actions-plugin/public'; import { getExpressionsInspectorViewDescription } from './inspector'; import { NAVIGATE_TRIGGER_ID, navigateTrigger } from './actions/navigate_trigger'; import { ACTION_NAVIGATE, createNavigateAction } from './actions/navigate_action'; -import { buttonRenderer } from './renderers/button'; +import { getButtonRenderer } from './renderers/button'; import { buttonFn } from './functions/button'; interface StartDeps { @@ -41,7 +41,7 @@ export class ExpressionsExplorerPlugin implements Plugin = { - name: 'button', - displayName: 'Button', - reuseDomNode: true, - render(domNode, config, handlers) { - const buttonClick = () => { - handlers.event({ - name: 'NAVIGATE', - data: { - href: config.href, - }, - }); - }; +export const getButtonRenderer = (core: CoreSetup) => { + const buttonRenderer: ExpressionRenderDefinition = { + name: 'button', + displayName: 'Button', + reuseDomNode: true, + async render(domNode, config, handlers) { + const [startServices] = await core.getStartServices(); + const buttonClick = () => { + handlers.event({ + name: 'NAVIGATE', + data: { + href: config.href, + }, + }); + }; - const renderDebug = () => ( -
- - {config.name} - -
- ); + const renderDebug = () => ( + +
+ + {config.name} + +
+
+ ); - ReactDOM.render(renderDebug(), domNode, () => handlers.done()); + ReactDOM.render(renderDebug(), domNode, () => handlers.done()); - handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); - }, + handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); + }, + }; + + return buttonRenderer; }; diff --git a/examples/expressions_explorer/tsconfig.json b/examples/expressions_explorer/tsconfig.json index b75817c68be7c..199dae0793f56 100644 --- a/examples/expressions_explorer/tsconfig.json +++ b/examples/expressions_explorer/tsconfig.json @@ -23,5 +23,7 @@ "@kbn/i18n-react", "@kbn/core-ui-settings-browser", "@kbn/code-editor", + "@kbn/react-kibana-context-render", + "@kbn/core-lifecycle-browser", ] } diff --git a/examples/guided_onboarding_example/kibana.jsonc b/examples/guided_onboarding_example/kibana.jsonc index 51a53dae720dd..72ee0bd46d74d 100644 --- a/examples/guided_onboarding_example/kibana.jsonc +++ b/examples/guided_onboarding_example/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/guided-onboarding-example-plugin", - "owner": "@elastic/platform-onboarding", + "owner": "@elastic/appex-sharedux", "description": "Example plugin to consume guidedOnboarding", "plugin": { "id": "guidedOnboardingExample", diff --git a/examples/response_stream/README.md b/examples/response_stream/README.md index 73c8a9161b2ce..ad3124bee805a 100644 --- a/examples/response_stream/README.md +++ b/examples/response_stream/README.md @@ -4,11 +4,15 @@ This plugin demonstrates how to stream chunks of data to the client with just a To run Kibana with the described examples, use `yarn start --run-examples`. -The `response_stream` plugin demonstrates API endpoints that can stream data chunks with a single request with gzip/compression support. gzip-streams get decompressed natively by browsers. The plugin demonstrates two use cases to get started: Streaming a raw string as well as a more complex example that streams Redux-like actions to the client which update React state via `useReducer()`. +The `response_stream` plugin demonstrates API endpoints that can stream data chunks with a single request with gzip/compression support. gzip-streams get decompressed natively by browsers. The plugin demonstrates some use cases to get you started: -Code in `@kbn/ml-response-stream` contains helpers to set up a stream on the server side (`streamFactory()`) and consume it on the client side via a custom hook (`useFetchStream()`). The utilities make use of TS generics in a way that allows to have type safety for both request related options as well as the returned data. +- Streaming just a raw string. +- Streaming NDJSON with "old-school" redux like actions and client side state managed with `useFetchStream()`. This uses React's own `useReducer()` under the hood. +- Streaming NDJSON with actions created via Redux Toolkit's `createSlice()` to a client with a full Redux Toolkit setup. -No additional third party libraries are used in the helpers to make it work. On the server, they integrate with `Hapi` and use node's own `gzip`. On the client, the custom hook abstracts away the necessary logic to consume the stream, internally it makes use of a generator function and `useReducer()` to update React state. +Code in `@kbn/ml-response-stream` contains helpers to set up a stream on the server side (`streamFactory()`) and consume it on the client side via a custom hook (`useFetchStream()`) or slice (`streamSlice()`). The utilities make use of TS generics in a way that allows to have type safety for both request related options as well as the returned data. + +Besides Redux Toolkit for its particular use case, no additional third party libraries are used in the helpers to make it work. On the server, they integrate with `Hapi` and use node's own `gzip`. On the client, the custom hook abstracts away the necessary logic to consume the stream, internally it makes use of a generator function and `useReducer()` to update React state. On the server, the simpler stream to send a string is set up like this: @@ -21,12 +25,7 @@ The request's headers get passed on to automatically identify if compression is On the client, the custom hook is used like this: ```ts -const { - errors, - start, - cancel, - data, - isRunning -} = useFetchStream('/internal/response_stream/simple_string_stream'); +const { errors, start, cancel, data, isRunning } = useFetchStream( + '/internal/response_stream/simple_string_stream' +); ``` - diff --git a/examples/response_stream/common/api/index.ts b/examples/response_stream/common/api/index.ts index 925ff844e3cfa..c5ff141e270eb 100644 --- a/examples/response_stream/common/api/index.ts +++ b/examples/response_stream/common/api/index.ts @@ -8,5 +8,6 @@ export const RESPONSE_STREAM_API_ENDPOINT = { REDUCER_STREAM: '/internal/response_stream/reducer_stream', + REDUX_STREAM: '/internal/response_stream/redux_stream', SIMPLE_STRING_STREAM: '/internal/response_stream/simple_string_stream', } as const; diff --git a/examples/response_stream/common/api/reducer_stream/index.ts b/examples/response_stream/common/api/reducer_stream/index.ts index 606834be2d0ba..cc5255761fbd6 100644 --- a/examples/response_stream/common/api/reducer_stream/index.ts +++ b/examples/response_stream/common/api/reducer_stream/index.ts @@ -9,71 +9,3 @@ export { reducerStreamReducer } from './reducer'; export { reducerStreamRequestBodySchema } from './request_body_schema'; export type { ReducerStreamRequestBodySchema } from './request_body_schema'; - -export const API_ACTION_NAME = { - UPDATE_PROGRESS: 'update_progress', - ADD_TO_ENTITY: 'add_to_entity', - DELETE_ENTITY: 'delete_entity', - ERROR: 'error', -} as const; -export type ApiActionName = typeof API_ACTION_NAME[keyof typeof API_ACTION_NAME]; - -interface ApiActionUpdateProgress { - type: typeof API_ACTION_NAME.UPDATE_PROGRESS; - payload: number; -} - -export function updateProgressAction(payload: number): ApiActionUpdateProgress { - return { - type: API_ACTION_NAME.UPDATE_PROGRESS, - payload, - }; -} - -interface ApiActionAddToEntity { - type: typeof API_ACTION_NAME.ADD_TO_ENTITY; - payload: { - entity: string; - value: number; - }; -} - -export function addToEntityAction(entity: string, value: number): ApiActionAddToEntity { - return { - type: API_ACTION_NAME.ADD_TO_ENTITY, - payload: { - entity, - value, - }, - }; -} - -interface ApiActionDeleteEntity { - type: typeof API_ACTION_NAME.DELETE_ENTITY; - payload: string; -} - -export function deleteEntityAction(payload: string): ApiActionDeleteEntity { - return { - type: API_ACTION_NAME.DELETE_ENTITY, - payload, - }; -} - -interface ApiActionError { - type: typeof API_ACTION_NAME.ERROR; - payload: string; -} - -export function errorAction(payload: string): ApiActionError { - return { - type: API_ACTION_NAME.ERROR, - payload, - }; -} - -export type ReducerStreamApiAction = - | ApiActionUpdateProgress - | ApiActionAddToEntity - | ApiActionDeleteEntity - | ApiActionError; diff --git a/examples/response_stream/common/api/reducer_stream/reducer.ts b/examples/response_stream/common/api/reducer_stream/reducer.ts index 9896e760cd75b..a793ccf55489a 100644 --- a/examples/response_stream/common/api/reducer_stream/reducer.ts +++ b/examples/response_stream/common/api/reducer_stream/reducer.ts @@ -6,24 +6,14 @@ * Side Public License, v 1. */ -import { ReducerStreamApiAction, API_ACTION_NAME } from '.'; +import { getInitialState, type StreamState } from '../stream_state'; +import { type ReducerStreamApiAction, API_ACTION_NAME } from './reducer_actions'; export const UI_ACTION_NAME = { RESET: 'reset', } as const; export type UiActionName = typeof UI_ACTION_NAME[keyof typeof UI_ACTION_NAME]; -export interface StreamState { - errors: string[]; - progress: number; - entities: Record; -} -export const initialState: StreamState = { - errors: [], - progress: 0, - entities: {}, -}; - interface UiActionResetStream { type: typeof UI_ACTION_NAME.RESET; } @@ -34,14 +24,7 @@ export function resetStream(): UiActionResetStream { type UiAction = UiActionResetStream; export type ReducerAction = ReducerStreamApiAction | UiAction; -export function reducerStreamReducer( - state: StreamState, - action: ReducerAction | ReducerAction[] -): StreamState { - if (Array.isArray(action)) { - return action.reduce(reducerStreamReducer, state); - } - +export function reducerStreamReducer(state: StreamState, action: ReducerAction): StreamState { switch (action.type) { case API_ACTION_NAME.UPDATE_PROGRESS: return { @@ -72,7 +55,7 @@ export function reducerStreamReducer( errors: [...state.errors, action.payload], }; case UI_ACTION_NAME.RESET: - return initialState; + return getInitialState(); default: return state; } diff --git a/examples/response_stream/common/api/reducer_stream/reducer_actions.ts b/examples/response_stream/common/api/reducer_stream/reducer_actions.ts new file mode 100644 index 0000000000000..7a6f077dfdfe6 --- /dev/null +++ b/examples/response_stream/common/api/reducer_stream/reducer_actions.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. + */ + +export const API_ACTION_NAME = { + UPDATE_PROGRESS: 'update_progress', + ADD_TO_ENTITY: 'add_to_entity', + DELETE_ENTITY: 'delete_entity', + ERROR: 'error', +} as const; +export type ApiActionName = typeof API_ACTION_NAME[keyof typeof API_ACTION_NAME]; + +interface ApiActionUpdateProgress { + type: typeof API_ACTION_NAME.UPDATE_PROGRESS; + payload: number; +} + +export function updateProgressAction(payload: number): ApiActionUpdateProgress { + return { + type: API_ACTION_NAME.UPDATE_PROGRESS, + payload, + }; +} + +interface ApiActionAddToEntity { + type: typeof API_ACTION_NAME.ADD_TO_ENTITY; + payload: { + entity: string; + value: number; + }; +} + +export function addToEntityAction(entity: string, value: number): ApiActionAddToEntity { + return { + type: API_ACTION_NAME.ADD_TO_ENTITY, + payload: { + entity, + value, + }, + }; +} + +interface ApiActionDeleteEntity { + type: typeof API_ACTION_NAME.DELETE_ENTITY; + payload: string; +} + +export function deleteEntityAction(payload: string): ApiActionDeleteEntity { + return { + type: API_ACTION_NAME.DELETE_ENTITY, + payload, + }; +} + +interface ApiActionError { + type: typeof API_ACTION_NAME.ERROR; + payload: string; +} + +export function errorAction(payload: string): ApiActionError { + return { + type: API_ACTION_NAME.ERROR, + payload, + }; +} + +export type ReducerStreamApiAction = + | ApiActionUpdateProgress + | ApiActionAddToEntity + | ApiActionDeleteEntity + | ApiActionError; diff --git a/examples/response_stream/common/api/redux_stream/data_slice.ts b/examples/response_stream/common/api/redux_stream/data_slice.ts new file mode 100644 index 0000000000000..7008c5a17ddcb --- /dev/null +++ b/examples/response_stream/common/api/redux_stream/data_slice.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. + */ + +import { createSlice } from '@reduxjs/toolkit'; +import type { PayloadAction } from '@reduxjs/toolkit'; + +import { getInitialState } from '../stream_state'; + +export const dataSlice = createSlice({ + name: 'development', + initialState: getInitialState(), + reducers: { + updateProgress: (state, action: PayloadAction) => { + state.progress = action.payload; + }, + addToEntity: ( + state, + action: PayloadAction<{ + entity: string; + value: number; + }> + ) => { + const { entity, value } = action.payload; + state.entities[entity] = (state.entities[entity] || 0) + value; + }, + deleteEntity: (state, action: PayloadAction) => { + delete state.entities[action.payload]; + }, + error: (state, action: PayloadAction) => { + state.errors.push(action.payload); + }, + reset: () => { + return getInitialState(); + }, + }, +}); + +export const { updateProgress, addToEntity, deleteEntity, error, reset } = dataSlice.actions; +export type ReduxStreamApiAction = ReturnType< + typeof dataSlice.actions[keyof typeof dataSlice.actions] +>; diff --git a/examples/response_stream/common/api/redux_stream/options_slice.ts b/examples/response_stream/common/api/redux_stream/options_slice.ts new file mode 100644 index 0000000000000..6791c74d81b33 --- /dev/null +++ b/examples/response_stream/common/api/redux_stream/options_slice.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 { createSlice } from '@reduxjs/toolkit'; +import type { PayloadAction } from '@reduxjs/toolkit'; + +const getInitialState = () => ({ + simulateErrors: false, + compressResponse: true, + flushFix: false, +}); + +export const optionsSlice = createSlice({ + name: 'options', + initialState: getInitialState(), + reducers: { + setSimulateErrors: (state, action: PayloadAction) => { + state.simulateErrors = action.payload; + }, + setCompressResponse: (state, action: PayloadAction) => { + state.compressResponse = action.payload; + }, + setFlushFix: (state, action: PayloadAction) => { + state.flushFix = action.payload; + }, + }, +}); + +export const { setSimulateErrors, setCompressResponse, setFlushFix } = optionsSlice.actions; +export type ReduxOptionsApiAction = ReturnType< + typeof optionsSlice.actions[keyof typeof optionsSlice.actions] +>; diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/index.tsx b/examples/response_stream/common/api/stream_state.ts old mode 100755 new mode 100644 similarity index 61% rename from packages/kbn-unified-field-list/src/components/field_categorize_button/index.tsx rename to examples/response_stream/common/api/stream_state.ts index 8a07a8290ca84..78a541515ce8e --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/index.tsx +++ b/examples/response_stream/common/api/stream_state.ts @@ -6,10 +6,14 @@ * Side Public License, v 1. */ -export { - type FieldCategorizeButtonProps, - FieldCategorizeButton, - getFieldCategorizeButton, -} from './field_categorize_button'; +export interface StreamState { + errors: string[]; + progress: number; + entities: Record; +} -export { triggerCategorizeActions, canCategorize } from './categorize_trigger_utils'; +export const getInitialState = (): StreamState => ({ + errors: [], + progress: 0, + entities: {}, +}); diff --git a/examples/response_stream/public/components/page.tsx b/examples/response_stream/public/components/page.tsx index e3138fafa71ab..2626eb317cf17 100644 --- a/examples/response_stream/public/components/page.tsx +++ b/examples/response_stream/public/components/page.tsx @@ -18,7 +18,7 @@ export const Page: FC> = ({ title = 'Untitled', chi <> -

{title}

+

{title}

{children} diff --git a/examples/response_stream/public/containers/app/components/bar_chart_race.tsx b/examples/response_stream/public/containers/app/components/bar_chart_race.tsx new file mode 100644 index 0000000000000..ef399f4cc050d --- /dev/null +++ b/examples/response_stream/public/containers/app/components/bar_chart_race.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { type FC } from 'react'; + +import { + Chart, + Settings, + Axis, + BarSeries, + Position, + ScaleType, + LEGACY_LIGHT_THEME, +} from '@elastic/charts'; + +interface BarChartRaceProps { + entities: Record; +} + +export const BarChartRace: FC = ({ entities }) => { + return ( +
+ + + + + + { + return { + x, + y, + }; + }) + .sort((a, b) => b.y - a.y)} + /> + +
+ ); +}; diff --git a/examples/response_stream/public/containers/app/pages/page_reducer_stream/get_status_message.tsx b/examples/response_stream/public/containers/app/components/get_status_message.tsx similarity index 100% rename from examples/response_stream/public/containers/app/pages/page_reducer_stream/get_status_message.tsx rename to examples/response_stream/public/containers/app/components/get_status_message.tsx diff --git a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx index 7da5f68e792f8..a471d6f589034 100644 --- a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx @@ -8,16 +8,6 @@ import React, { useEffect, useState, FC } from 'react'; -import { - Chart, - Settings, - Axis, - BarSeries, - Position, - ScaleType, - LEGACY_LIGHT_THEME, -} from '@elastic/charts'; - import { EuiBadge, EuiButton, @@ -31,8 +21,8 @@ import { import { useFetchStream } from '@kbn/ml-response-stream/client'; +import { getInitialState } from '../../../../../common/api/stream_state'; import { - initialState, resetStream, reducerStreamReducer, } from '../../../../../common/api/reducer_stream/reducer'; @@ -42,7 +32,10 @@ import { Page } from '../../../../components/page'; import { useDeps } from '../../../../hooks/use_deps'; -import { getStatusMessage } from './get_status_message'; +import { BarChartRace } from '../../components/bar_chart_race'; +import { getStatusMessage } from '../../components/get_status_message'; + +const initialState = getInitialState(); export const PageReducerStream: FC = () => { const { @@ -72,8 +65,12 @@ export const PageReducerStream: FC = () => { } }; - // TODO This approach needs to be adapted as it might miss when error messages arrive bulk. - // This is for low level errors on the stream/HTTP level. + // TODO This needs to be adapted as it might miss when error messages arrive + // in bulk, but it should be good enough for this demo. This is for low level + // errors on the HTTP level.Note this will only surface errors that happen for + // the original request. Once the stream returns data, it will not be able to + // return errors. This is why we need separate error handling for application + // level errors. useEffect(() => { if (errors.length > 0) { notifications.toasts.addDanger(errors[errors.length - 1]); @@ -91,27 +88,33 @@ export const PageReducerStream: FC = () => { const buttonLabel = isRunning ? 'Stop development' : 'Start development'; return ( - +

- This demonstrates a single endpoint with streaming support that sends Redux inspired - actions from server to client. The server and client share types of the data to be - received. The client uses a custom hook that receives stream chunks and passes them on to - `useReducer()` that acts on the Redux type actions it receives. The custom hook includes - code to buffer actions and is able to apply them in bulk so the DOM does not get hammered - with updates. Hit "Start development" to trigger the bar chart race! + This demonstrates a single endpoint with streaming support that sends old school Redux + inspired actions from server to client. The server and client share types of the data to + be received. The client uses a custom hook that receives stream chunks and passes them on + to `useReducer()` that acts on the actions it receives. The custom hook includes code to + buffer actions and is able to apply them in bulk so the DOM does not get hammered with + updates. Hit "Start development" to trigger the bar chart race!


- + {buttonLabel} - {progress}% + {progress}% @@ -119,35 +122,11 @@ export const PageReducerStream: FC = () => { -
- - - - - - { - return { - x, - y, - }; - }) - .sort((a, b) => b.y - a.y)} - /> - -
+ -

{getStatusMessage(isRunning, isCancelled, data.progress)}

+

+ {getStatusMessage(isRunning, isCancelled, progress)} +

AppDispatch = useDispatch; +export const useAppSelector: TypedUseSelectorHook = useSelector; +export const useAppStore: () => AppStore = useStore; diff --git a/examples/response_stream/public/containers/app/pages/page_redux_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_redux_stream/index.tsx new file mode 100644 index 0000000000000..aaf0a7b5dbbb7 --- /dev/null +++ b/examples/response_stream/public/containers/app/pages/page_redux_stream/index.tsx @@ -0,0 +1,158 @@ +/* + * Copyright 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, { useEffect, useRef, FC } from 'react'; + +import { + EuiBadge, + EuiButton, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiProgress, + EuiSpacer, + EuiText, +} from '@elastic/eui'; + +import { cancelStream, startStream } from '@kbn/ml-response-stream/client'; + +import { RESPONSE_STREAM_API_ENDPOINT } from '../../../../../common/api'; +import { + setSimulateErrors, + setCompressResponse, + setFlushFix, +} from '../../../../../common/api/redux_stream/options_slice'; +import { reset } from '../../../../../common/api/redux_stream/data_slice'; + +import { Page } from '../../../../components/page'; +import { useDeps } from '../../../../hooks/use_deps'; + +import { BarChartRace } from '../../components/bar_chart_race'; +import { getStatusMessage } from '../../components/get_status_message'; + +import { useAppDispatch, useAppSelector } from './hooks'; + +export const PageReduxStream: FC = () => { + const { + core: { http, notifications }, + } = useDeps(); + + const dispatch = useAppDispatch(); + const { isRunning, isCancelled, errors: streamErrors } = useAppSelector((s) => s.stream); + const { progress, entities, errors } = useAppSelector((s) => s.data); + const { simulateErrors, compressResponse, flushFix } = useAppSelector((s) => s.options); + + const abortCtrl = useRef(new AbortController()); + + const onClickHandler = async () => { + if (isRunning) { + abortCtrl.current.abort(); + dispatch(cancelStream()); + } else { + abortCtrl.current = new AbortController(); + dispatch(reset()); + dispatch( + startStream({ + http, + endpoint: RESPONSE_STREAM_API_ENDPOINT.REDUX_STREAM, + apiVersion: '1', + abortCtrl, + body: { compressResponse, flushFix, simulateErrors }, + }) + ); + } + }; + + // TODO This needs to be adapted as it might miss when error messages arrive + // in bulk, but it should be good enough for this demo. This is for low level + // errors on the HTTP level.Note this will only surface errors that happen for + // the original request. Once the stream returns data, it will not be able to + // return errors. This is why we need separate error handling for application + // level errors. + useEffect(() => { + if (streamErrors.length > 0) { + notifications.toasts.addDanger(streamErrors[streamErrors.length - 1]); + } + }, [streamErrors, notifications.toasts]); + + // TODO This approach needs to be adapted as it might miss when error messages arrive bulk. + // This is for errors on the application level + useEffect(() => { + if (errors.length > 0) { + notifications.toasts.addDanger(errors[errors.length - 1]); + } + }, [errors, notifications.toasts]); + + const buttonLabel = isRunning ? 'Stop development' : 'Start development'; + + return ( + + +

+ This demonstrates integration of a single endpoint with streaming support with Redux + Toolkit. The server and client share actions created via `createSlice`. The server sends a + stream of NDJSON data to the client where each line is a redux action. The client then + applies these actions to its state. The package `@kbn/ml-response-stream` exposes a slice + of the state that can be used to start and cancel the stream. The `startStream` action is + implemented as an async thunk that starts the stream and then dispatches received actions + to the store. Hit "Start development" to trigger the bar chart race! +

+
+
+ + + + {buttonLabel} + + + + + {progress}% + + + + + + + + + +

+ {getStatusMessage(isRunning, isCancelled, progress)} +

+ dispatch(setSimulateErrors(!simulateErrors))} + compressed + /> + dispatch(setCompressResponse(!compressResponse))} + compressed + /> + dispatch(setFlushFix(!flushFix))} + compressed + /> +
+
+ ); +}; diff --git a/examples/response_stream/public/containers/app/pages/page_redux_stream/store.tsx b/examples/response_stream/public/containers/app/pages/page_redux_stream/store.tsx new file mode 100644 index 0000000000000..ddeb265493298 --- /dev/null +++ b/examples/response_stream/public/containers/app/pages/page_redux_stream/store.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { type FC, type PropsWithChildren } from 'react'; +import { configureStore } from '@reduxjs/toolkit'; +import { Provider } from 'react-redux'; + +import { streamSlice } from '@kbn/ml-response-stream/client'; + +import { optionsSlice } from '../../../../../common/api/redux_stream/options_slice'; +import { dataSlice } from '../../../../../common/api/redux_stream/data_slice'; + +const reduxStore = configureStore({ + reducer: { + // State of the stream: is it running, has it errored, etc. + stream: streamSlice.reducer, + // The actual data returned by the stream. + data: dataSlice.reducer, + // Options for the stream: simulate errors, compress response, etc. + options: optionsSlice.reducer, + }, +}); + +export const ReduxStreamProvider: FC> = ({ children }) => ( + {children} +); + +// Infer the `RootState` and `AppDispatch` types from the store itself +export type AppStore = typeof reduxStore; +export type RootState = ReturnType; +export type AppDispatch = AppStore['dispatch']; diff --git a/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx index 7075656dc0167..3e33ade381489 100644 --- a/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx @@ -66,7 +66,13 @@ export const PageSimpleStringStream: FC = () => {
- + {buttonLabel} @@ -81,7 +87,7 @@ export const PageSimpleStringStream: FC = () => { /> -

{data}

+

{data}

{errors.length > 0 && ( diff --git a/examples/response_stream/public/routes.tsx b/examples/response_stream/public/routes.tsx index eafe96c320d8c..f2ec595f1f753 100644 --- a/examples/response_stream/public/routes.tsx +++ b/examples/response_stream/public/routes.tsx @@ -10,6 +10,8 @@ import React from 'react'; import { PLUGIN_ID, PLUGIN_NAME } from '../common/constants'; import { PageSimpleStringStream } from './containers/app/pages/page_simple_string_stream'; import { PageReducerStream } from './containers/app/pages/page_reducer_stream'; +import { PageReduxStream } from './containers/app/pages/page_redux_stream'; +import { ReduxStreamProvider } from './containers/app/pages/page_redux_stream/store'; interface RouteSectionDef { title: string; @@ -34,10 +36,19 @@ export const routes: RouteSectionDef[] = [ component: , }, { - title: 'Reducer stream', - id: 'reducer-stream', + title: 'NDJSON useReducer stream', + id: 'ndjson-usereducer-stream', component: , }, + { + title: 'NDJSON Redux Toolkit stream', + id: 'ndjson-redux-toolkit-stream', + component: ( + + + + ), + }, ], }, ]; diff --git a/examples/response_stream/server/plugin.ts b/examples/response_stream/server/plugin.ts index 6bb0c55003059..e21c3c3f59287 100644 --- a/examples/response_stream/server/plugin.ts +++ b/examples/response_stream/server/plugin.ts @@ -9,7 +9,11 @@ import { Plugin, PluginInitializerContext, CoreSetup, CoreStart, Logger } from '@kbn/core/server'; import type { DataRequestHandlerContext } from '@kbn/data-plugin/server'; -import { defineReducerStreamRoute, defineSimpleStringStreamRoute } from './routes'; +import { + defineReducerStreamRoute, + defineReduxStreamRoute, + defineSimpleStringStreamRoute, +} from './routes'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ResponseStreamSetupPlugins {} @@ -29,6 +33,7 @@ export class ResponseStreamPlugin implements Plugin { void core.getStartServices().then(([_, depsStart]) => { defineReducerStreamRoute(router, this.logger); + defineReduxStreamRoute(router, this.logger); defineSimpleStringStreamRoute(router, this.logger); }); } diff --git a/examples/response_stream/server/routes/index.ts b/examples/response_stream/server/routes/index.ts index f18a1283aa0ec..34d707ed81655 100644 --- a/examples/response_stream/server/routes/index.ts +++ b/examples/response_stream/server/routes/index.ts @@ -7,4 +7,5 @@ */ export { defineReducerStreamRoute } from './reducer_stream'; +export { defineReduxStreamRoute } from './redux_stream'; export { defineSimpleStringStreamRoute } from './single_string_stream'; diff --git a/examples/response_stream/server/routes/reducer_stream.ts b/examples/response_stream/server/routes/reducer_stream.ts index 02606b8c44756..abdc90f28a23c 100644 --- a/examples/response_stream/server/routes/reducer_stream.ts +++ b/examples/response_stream/server/routes/reducer_stream.ts @@ -11,14 +11,16 @@ import { streamFactory } from '@kbn/ml-response-stream/server'; import { errorAction, - reducerStreamRequestBodySchema, updateProgressAction, addToEntityAction, deleteEntityAction, ReducerStreamApiAction, -} from '../../common/api/reducer_stream'; +} from '../../common/api/reducer_stream/reducer_actions'; +import { reducerStreamRequestBodySchema } from '../../common/api/reducer_stream'; import { RESPONSE_STREAM_API_ENDPOINT } from '../../common/api'; +import { entities, getActions } from './shared'; + export const defineReducerStreamRoute = (router: IRouter, logger: Logger) => { router.versioned .post({ @@ -64,23 +66,7 @@ export const defineReducerStreamRoute = (router: IRouter, logger: Logger) => { request.body.flushFix ); - const entities = [ - 'kimchy', - 's1monw', - 'martijnvg', - 'jasontedor', - 'nik9000', - 'javanna', - 'rjernst', - 'jrodewig', - ]; - - const actions = [...Array(19).fill('add'), 'delete']; - - if (simulateError) { - actions.push('throw-error'); - actions.push('emit-error'); - } + const actions = getActions(simulateError); let progress = 0; @@ -101,19 +87,28 @@ export const defineReducerStreamRoute = (router: IRouter, logger: Logger) => { const randomEntity = entities[Math.floor(Math.random() * entities.length)]; const randomAction = actions[Math.floor(Math.random() * actions.length)]; - if (randomAction === 'add') { - const randomCommits = Math.floor(Math.random() * 100); - push(addToEntityAction(randomEntity, randomCommits)); - } else if (randomAction === 'delete') { - push(deleteEntityAction(randomEntity)); - } else if (randomAction === 'throw-error') { - // Throw an error. It should not crash Kibana! - // It should be caught and logged to the Kibana server console. - throw new Error('There was a (simulated) server side error!'); - } else if (randomAction === 'emit-error') { - // Emit an error as a stream action. - push(errorAction('(Simulated) error pushed to the stream')); - return; + switch (randomAction) { + case 'add': + const randomCommits = Math.floor(Math.random() * 100); + push(addToEntityAction(randomEntity, randomCommits)); + break; + + case 'delete': + push(deleteEntityAction(randomEntity)); + break; + + case 'throw-error': + // Throw an error. It should not crash Kibana! + // It should be caught and logged to the Kibana server console. + // The stream will just stop but the client will note receive an error! + // In practice this pattern should be avoided as it will just end + // the stream without an explanation. + throw new Error('There was a (simulated) server side error!'); + + case 'emit-error': + // Emit an error as a stream action. + push(errorAction('(Simulated) error pushed to the stream')); + return; } void pushStreamUpdate(); diff --git a/examples/response_stream/server/routes/redux_stream.ts b/examples/response_stream/server/routes/redux_stream.ts new file mode 100644 index 0000000000000..bd694c531907b --- /dev/null +++ b/examples/response_stream/server/routes/redux_stream.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 type { IRouter, Logger } from '@kbn/core/server'; +import { streamFactory } from '@kbn/ml-response-stream/server'; + +import { + updateProgress, + addToEntity, + deleteEntity, + error, + type ReduxStreamApiAction, +} from '../../common/api/redux_stream/data_slice'; +import { reducerStreamRequestBodySchema } from '../../common/api/reducer_stream'; +import { RESPONSE_STREAM_API_ENDPOINT } from '../../common/api'; + +import { entities, getActions } from './shared'; + +export const defineReduxStreamRoute = (router: IRouter, logger: Logger) => { + router.versioned + .post({ + path: RESPONSE_STREAM_API_ENDPOINT.REDUX_STREAM, + access: 'internal', + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: reducerStreamRequestBodySchema, + }, + }, + }, + async (context, request, response) => { + const maxTimeoutMs = request.body.timeout ?? 250; + const simulateError = request.body.simulateErrors ?? false; + + let logMessageCounter = 1; + + function logDebugMessage(msg: string) { + logger.debug(`Response Stream Example #${logMessageCounter}: ${msg}`); + logMessageCounter++; + } + + logDebugMessage('Starting stream.'); + + let shouldStop = false; + request.events.aborted$.subscribe(() => { + logDebugMessage('aborted$ subscription trigger.'); + shouldStop = true; + }); + request.events.completed$.subscribe(() => { + logDebugMessage('completed$ subscription trigger.'); + shouldStop = true; + }); + + const { end, push, responseWithHeaders } = streamFactory( + request.headers, + logger, + request.body.compressResponse, + request.body.flushFix + ); + + const actions = getActions(simulateError); + + let progress = 0; + + async function pushStreamUpdate() { + await new Promise((resolve) => + setTimeout(resolve, Math.floor(Math.random() * maxTimeoutMs)) + ); + try { + progress++; + + if (progress > 100 || shouldStop) { + end(); + return; + } + + push(updateProgress(progress)); + + const randomEntity = entities[Math.floor(Math.random() * entities.length)]; + const randomAction = actions[Math.floor(Math.random() * actions.length)]; + + switch (randomAction) { + case 'add': + const randomCommits = Math.floor(Math.random() * 100); + push(addToEntity({ entity: randomEntity, value: randomCommits })); + break; + + case 'delete': + push(deleteEntity(randomEntity)); + break; + + case 'throw-error': + // Throw an error. It should not crash Kibana! + // It should be caught and logged to the Kibana server console. + // The stream will just stop but the client will note receive an error! + // In practice this pattern should be avoided as it will just end + // the stream without an explanation. + throw new Error('There was a (simulated) server side error!'); + + case 'emit-error': + // Emit an error as a stream action. + push(error('(Simulated) error pushed to the stream')); + return; + } + + void pushStreamUpdate(); + } catch (e) { + logger.error(e); + } + } + + // do not call this using `await` so it will run asynchronously while we return the stream already. + void pushStreamUpdate(); + + return response.ok(responseWithHeaders); + } + ); +}; diff --git a/examples/response_stream/server/routes/shared.ts b/examples/response_stream/server/routes/shared.ts new file mode 100644 index 0000000000000..72223d21e09ff --- /dev/null +++ b/examples/response_stream/server/routes/shared.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const entities = [ + 'kimchy', + 's1monw', + 'martijnvg', + 'jasontedor', + 'nik9000', + 'javanna', + 'rjernst', + 'jrodewig', +]; + +export const getActions = (simulateError: boolean) => { + const actions = [...Array(19).fill('add'), 'delete']; + + if (simulateError) { + actions.push('throw-error'); + actions.push('emit-error'); + } + + return actions; +}; diff --git a/examples/routing_example/public/app.tsx b/examples/routing_example/public/app.tsx index eb9589919d2ab..4a2200742c53d 100644 --- a/examples/routing_example/public/app.tsx +++ b/examples/routing_example/public/app.tsx @@ -16,6 +16,7 @@ import { EuiHorizontalRule, EuiListGroup, } from '@elastic/eui'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { RandomNumberRouteExample } from './random_number_example'; import { RandomNumberBetweenRouteExample } from './random_number_between_example'; import { Services } from './services'; @@ -30,56 +31,59 @@ function RoutingExplorer({ addSuccessToast, postMessage, getMessageById, + startServices, }: Props) { return ( - - - -

Routing examples

-
-
- - + + + - +

Routing examples

- - - - +
+ + + + + + + + + - - + + - - - - -
+ + +
+
+
+ ); } diff --git a/examples/routing_example/public/services.ts b/examples/routing_example/public/services.ts index d98791ff5c240..75308f5279ddf 100644 --- a/examples/routing_example/public/services.ts +++ b/examples/routing_example/public/services.ts @@ -6,7 +6,12 @@ * Side Public License, v 1. */ -import type { CoreStart } from '@kbn/core/public'; +import type { + AnalyticsServiceStart, + CoreStart, + I18nStart, + ThemeServiceStart, +} from '@kbn/core/public'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { RANDOM_NUMBER_ROUTE_PATH, @@ -15,7 +20,14 @@ import { INTERNAL_GET_MESSAGE_BY_ID_ROUTE, } from '../common'; +interface StartServices { + analytics: Pick; + i18n: I18nStart; + theme: Pick; +} + export interface Services { + startServices: StartServices; fetchRandomNumber: () => Promise; fetchRandomNumberBetween: (max: number) => Promise; postMessage: (message: string, id: string) => Promise; @@ -24,7 +36,11 @@ export interface Services { } export function getServices(core: CoreStart): Services { + const { analytics, i18n, theme } = core; + const startServices = { analytics, i18n, theme }; + return { + startServices, addSuccessToast: (message: string) => core.notifications.toasts.addSuccess(message), fetchRandomNumber: async () => { try { diff --git a/examples/routing_example/tsconfig.json b/examples/routing_example/tsconfig.json index bf0c7af2e33c2..b35e8dbd34f4a 100644 --- a/examples/routing_example/tsconfig.json +++ b/examples/routing_example/tsconfig.json @@ -19,5 +19,6 @@ "@kbn/developer-examples-plugin", "@kbn/core-http-browser", "@kbn/config-schema", + "@kbn/react-kibana-context-render", ] } diff --git a/examples/search_examples/public/application.tsx b/examples/search_examples/public/application.tsx index 10985afc4984a..9124c01b4e802 100644 --- a/examples/search_examples/public/application.tsx +++ b/examples/search_examples/public/application.tsx @@ -10,6 +10,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Redirect } from 'react-router-dom'; import { Router, Routes, Route } from '@kbn/shared-ux-router'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { I18nProvider } from '@kbn/i18n-react'; import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; @@ -44,45 +45,48 @@ export const renderApp = ( { element, history }: AppMountParameters ) => { ReactDOM.render( - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - , + + + + + + + + + , element ); diff --git a/examples/search_examples/public/search_sessions/app.tsx b/examples/search_examples/public/search_sessions/app.tsx index 7c9f28cee1026..2585b39fae814 100644 --- a/examples/search_examples/public/search_sessions/app.tsx +++ b/examples/search_examples/public/search_sessions/app.tsx @@ -30,6 +30,7 @@ import { catchError, map, tap } from 'rxjs'; import { lastValueFrom, of } from 'rxjs'; import { CoreStart } from '@kbn/core/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; import type { TimeRange } from '@kbn/es-query'; import { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; @@ -51,6 +52,9 @@ import { getInitialStateFromUrl, SEARCH_SESSIONS_EXAMPLES_APP_LOCATOR } from './ interface SearchSessionsExampleAppDeps { notifications: CoreStart['notifications']; + analytics: CoreStart['analytics']; + i18n: CoreStart['i18n']; + theme: CoreStart['theme']; navigation: NavigationPublicPluginStart; data: DataPublicPluginStart; unifiedSearch: UnifiedSearchPublicPluginStart; @@ -80,10 +84,10 @@ interface State extends QueryState { } export const SearchSessionsExampleApp = ({ - notifications, navigation, data, unifiedSearch, + ...startServices }: SearchSessionsExampleAppDeps) => { const { IndexPatternSelect } = unifiedSearch.ui; @@ -196,7 +200,7 @@ export const SearchSessionsExampleApp = ({ if (!numericFieldName) return; setIsSearching(true); const requestId = ++nextRequestIdRef.current; - doSearch({ dataView, numericFieldName, restoreSearchSessionId }, { data, notifications }) + doSearch({ dataView, numericFieldName, restoreSearchSessionId }, { data, ...startServices }) .then(({ response: res, request: req, tookMs: _tookMs }) => { if (requestId !== nextRequestIdRef.current) return; // no longer interested in this result if (restoreSearchSessionId) { @@ -214,7 +218,7 @@ export const SearchSessionsExampleApp = ({ setIsSearching(false); }); }, - [data, notifications, dataView, numericFieldName] + [data, dataView, numericFieldName, startServices] ); useEffect(() => { @@ -662,7 +666,14 @@ function doSearch( { data, notifications, - }: { data: DataPublicPluginStart; notifications: CoreStart['notifications'] } + ...startServices + }: { + data: DataPublicPluginStart; + notifications: CoreStart['notifications']; + analytics: CoreStart['analytics']; + i18n: CoreStart['i18n']; + theme: CoreStart['theme']; + } ): Promise<{ request: IEsSearchRequest; response: IEsSearchResponse; tookMs?: number }> { if (!dataView) return Promise.reject('Select a data view'); if (!numericFieldName) return Promise.reject('Select a field to aggregate on'); @@ -712,12 +723,14 @@ function doSearch( res.rawResponse.aggregations[1]?.value ?? res.rawResponse.aggregations[2]?.value : undefined; const message = ( - - Searched {res.rawResponse.hits.total} documents.
- The average of {numericFieldName} is {avgResult ? Math.floor(avgResult) : 0} - . -
-
+ + + Searched {res.rawResponse.hits.total} documents.
+ The average of {numericFieldName} is {avgResult ? Math.floor(avgResult) : 0} + . +
+
+
); notifications.toasts.addSuccess({ title: 'Query result', diff --git a/examples/search_examples/tsconfig.json b/examples/search_examples/tsconfig.json index 18156d4bfa198..842a75b634918 100644 --- a/examples/search_examples/tsconfig.json +++ b/examples/search_examples/tsconfig.json @@ -35,5 +35,6 @@ "@kbn/shared-ux-link-redirect-app", "@kbn/react-kibana-mount", "@kbn/search-response-warnings", + "@kbn/react-kibana-context-render", ] } diff --git a/examples/state_containers_examples/public/plugin.ts b/examples/state_containers_examples/public/plugin.ts index daf5c3216ef38..44f702ae5c8fb 100644 --- a/examples/state_containers_examples/public/plugin.ts +++ b/examples/state_containers_examples/public/plugin.ts @@ -42,6 +42,7 @@ export class StateContainersExamplesPlugin implements Plugin { const { renderApp, History } = await import('./todo/app'); const [coreStart] = await core.getStartServices(); return renderApp( + coreStart, params, { appTitle: examples.stateContainersExampleBrowserHistory.title, @@ -59,6 +60,7 @@ export class StateContainersExamplesPlugin implements Plugin { const { renderApp, History } = await import('./todo/app'); const [coreStart] = await core.getStartServices(); return renderApp( + coreStart, params, { appTitle: examples.stateContainersExampleHashHistory.title, diff --git a/examples/state_containers_examples/public/todo/app.tsx b/examples/state_containers_examples/public/todo/app.tsx index 81c067cec7d60..8c9b1266ded4b 100644 --- a/examples/state_containers_examples/public/todo/app.tsx +++ b/examples/state_containers_examples/public/todo/app.tsx @@ -6,9 +6,11 @@ * Side Public License, v 1. */ -import { AppMountParameters, CoreStart } from '@kbn/core/public'; import ReactDOM from 'react-dom'; import React from 'react'; + +import { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { createHashHistory } from 'history'; import { TodoAppPage } from './todo'; import { StateContainersExamplesPage, ExampleLink } from '../common/example_page'; @@ -29,15 +31,18 @@ export interface Deps { } export const renderApp = ( + core: CoreStart, { appBasePath, element, history: platformHistory }: AppMountParameters, { appTitle, historyType }: AppOptions, { navigateToApp, exampleLinks }: Deps ) => { const history = historyType === History.Browser ? platformHistory : createHashHistory(); ReactDOM.render( - - - , + + + + + , element ); diff --git a/examples/state_containers_examples/tsconfig.json b/examples/state_containers_examples/tsconfig.json index 400b8613a4d8f..cfb4e8ab9c909 100644 --- a/examples/state_containers_examples/tsconfig.json +++ b/examples/state_containers_examples/tsconfig.json @@ -23,5 +23,6 @@ "@kbn/developer-examples-plugin", "@kbn/es-query", "@kbn/shared-ux-router", + "@kbn/react-kibana-context-render", ] } diff --git a/examples/ui_actions_explorer/public/app.tsx b/examples/ui_actions_explorer/public/app.tsx index 3b5d3a99274f7..db76721f9addb 100644 --- a/examples/ui_actions_explorer/public/app.tsx +++ b/examples/ui_actions_explorer/public/app.tsx @@ -18,6 +18,7 @@ import { EuiPageHeader, } from '@elastic/eui'; import { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { TriggerContextExample } from './trigger_context_example'; import { ContextMenuExamples } from './context_menu_examples'; @@ -31,30 +32,35 @@ interface Props { const ActionsExplorer = ({ uiActionsStartService, core }: Props) => { return ( - - - - - - + + + - + + + + + - + - + - + - + - + - - - - - + + + + + + ); }; diff --git a/examples/ui_actions_explorer/tsconfig.json b/examples/ui_actions_explorer/tsconfig.json index e3070598efca1..609a609b89a50 100644 --- a/examples/ui_actions_explorer/tsconfig.json +++ b/examples/ui_actions_explorer/tsconfig.json @@ -18,5 +18,6 @@ "@kbn/ui-actions-examples-plugin", "@kbn/developer-examples-plugin", "@kbn/react-kibana-mount", + "@kbn/react-kibana-context-render", ] } diff --git a/package.json b/package.json index e747cf96a7fea..f4f03cb30722e 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.13.0", "@elastic/ems-client": "8.5.1", - "@elastic/eui": "94.5.0-backport.1", + "@elastic/eui": "94.5.1", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", @@ -544,6 +544,7 @@ "@kbn/kibana-usage-collection-plugin": "link:src/plugins/kibana_usage_collection", "@kbn/kibana-utils-plugin": "link:src/plugins/kibana_utils", "@kbn/kubernetes-security-plugin": "link:x-pack/plugins/kubernetes_security", + "@kbn/langchain": "link:x-pack/packages/kbn-langchain", "@kbn/language-documentation-popover": "link:packages/kbn-language-documentation-popover", "@kbn/lens-config-builder-example-plugin": "link:x-pack/examples/lens_config_builder_example", "@kbn/lens-embeddable-utils": "link:packages/kbn-lens-embeddable-utils", @@ -820,7 +821,6 @@ "@kbn/slo-plugin": "link:x-pack/plugins/observability_solution/slo", "@kbn/slo-schema": "link:x-pack/packages/kbn-slo-schema", "@kbn/snapshot-restore-plugin": "link:x-pack/plugins/snapshot_restore", - "@kbn/solution-nav-es": "link:packages/solution-nav/es", "@kbn/solution-nav-oblt": "link:packages/solution-nav/oblt", "@kbn/sort-predicates": "link:packages/kbn-sort-predicates", "@kbn/spaces-plugin": "link:x-pack/plugins/spaces", diff --git a/packages/cloud/connection_details/kibana/global.ts b/packages/cloud/connection_details/kibana/global.ts index 0a2ede8e5157d..805cc324c9827 100644 --- a/packages/cloud/connection_details/kibana/global.ts +++ b/packages/cloud/connection_details/kibana/global.ts @@ -13,13 +13,13 @@ import type { SharePluginStart } from '@kbn/share-plugin/public'; export interface ConnectionDetailsGlobalDependencies { start: { core: { + analytics: CoreStart['analytics']; i18n: CoreStart['i18n']; docLinks: CoreStart['docLinks']; theme: CoreStart['theme']; http: CoreStart['http']; application: CoreStart['application']; overlays: CoreStart['overlays']; - analytics?: CoreStart['analytics']; }; plugins: { cloud?: CloudStart; diff --git a/packages/cloud/connection_details/kibana/open_connection_details.tsx b/packages/cloud/connection_details/kibana/open_connection_details.tsx index 52078662c337d..6e29f6bffec9e 100644 --- a/packages/cloud/connection_details/kibana/open_connection_details.tsx +++ b/packages/cloud/connection_details/kibana/open_connection_details.tsx @@ -8,6 +8,7 @@ import * as React from 'react'; import ReactDOM from 'react-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { CoreStart } from '@kbn/core-lifecycle-browser'; import * as conn from '..'; @@ -16,6 +17,9 @@ export interface OpenConnectionDetailsParams { start: { core: { overlays: CoreStart['overlays']; + i18n: CoreStart['i18n']; + analytics?: CoreStart['analytics']; + theme: CoreStart['theme']; }; }; } @@ -23,14 +27,16 @@ export interface OpenConnectionDetailsParams { export const openConnectionDetails = async ({ props, start }: OpenConnectionDetailsParams) => { const mount = (element: HTMLElement) => { const reactElement = ( - { - flyoutRef?.close(); - }} - > - - + + { + flyoutRef?.close(); + }} + > + + + ); ReactDOM.render(reactElement, element); diff --git a/packages/cloud/tsconfig.json b/packages/cloud/tsconfig.json index 1eb5dbd01b1e0..63d6c281f8199 100644 --- a/packages/cloud/tsconfig.json +++ b/packages/cloud/tsconfig.json @@ -22,5 +22,6 @@ "@kbn/cloud-plugin", "@kbn/share-plugin", "@kbn/security-plugin-types-server", + "@kbn/react-kibana-context-render", ] } diff --git a/packages/core/apps/core-apps-browser-internal/src/core_app.ts b/packages/core/apps/core-apps-browser-internal/src/core_app.ts index 6ea7eb8835849..85c61ff7f8641 100644 --- a/packages/core/apps/core-apps-browser-internal/src/core_app.ts +++ b/packages/core/apps/core-apps-browser-internal/src/core_app.ts @@ -18,12 +18,15 @@ import type { InternalApplicationSetup, InternalApplicationStart, } from '@kbn/core-application-browser-internal'; +import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; +import type { I18nStart } from '@kbn/core-i18n-browser'; +import type { ThemeServiceStart } from '@kbn/core-theme-browser'; +import { renderApp as renderStatusApp } from './status'; import { renderApp as renderErrorApp, setupPublicBaseUrlConfigWarning, setupUrlOverflowDetection, } from './errors'; -import { renderApp as renderStatusApp } from './status'; export interface CoreAppsServiceSetupDeps { application: InternalApplicationSetup; @@ -38,6 +41,9 @@ export interface CoreAppsServiceStartDeps { http: InternalHttpStart; notifications: NotificationsStart; uiSettings: IUiSettingsClient; + analytics: AnalyticsServiceStart; + i18n: I18nStart; + theme: ThemeServiceStart; } export class CoreAppsService { @@ -79,6 +85,9 @@ export class CoreAppsService { http, notifications, uiSettings, + analytics, + i18n, + theme, }: CoreAppsServiceStartDeps) { if (!application.history) { return; @@ -91,7 +100,7 @@ export class CoreAppsService { uiSettings, }); - setupPublicBaseUrlConfigWarning({ docLinks, http, notifications }); + setupPublicBaseUrlConfigWarning({ docLinks, http, notifications, analytics, i18n, theme }); } public stop() { diff --git a/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.test.tsx b/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.test.tsx index edcdc18740664..fc5c60555d7e4 100644 --- a/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.test.tsx +++ b/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.test.tsx @@ -6,15 +6,28 @@ * Side Public License, v 1. */ +import { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; import { docLinksServiceMock } from '@kbn/core-doc-links-browser-mocks'; import { httpServiceMock } from '@kbn/core-http-browser-mocks'; - +import { i18nServiceMock } from '@kbn/core-i18n-browser-mocks'; import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; +import { themeServiceMock } from '@kbn/core-theme-browser-mocks'; + import { setupPublicBaseUrlConfigWarning } from './public_base_url'; describe('publicBaseUrl warning', () => { const docLinks = docLinksServiceMock.createStartContract(); const notifications = notificationServiceMock.createStartContract(); + const i18nStart = i18nServiceMock.createStartContract(); + const analytics = analyticsServiceMock.createAnalyticsServiceStart(); + const theme = themeServiceMock.createStartContract(); + const startServices = { + notifications, + analytics, + i18n: i18nStart, + theme, + }; + const addWarningToastSpy = jest.spyOn(notifications.toasts, 'addWarning'); beforeEach(() => { jest.resetAllMocks(); @@ -24,38 +37,38 @@ describe('publicBaseUrl warning', () => { const http = httpServiceMock.createStartContract(); setupPublicBaseUrlConfigWarning({ + ...startServices, docLinks, - notifications, http, location: { hostname: 'localhost', } as Location, }); - expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + expect(addWarningToastSpy).not.toHaveBeenCalled(); }); it('does not show any toast on 127.0.0.1', () => { const http = httpServiceMock.createStartContract(); setupPublicBaseUrlConfigWarning({ + ...startServices, docLinks, - notifications, http, location: { hostname: '127.0.0.1', } as Location, }); - expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + expect(addWarningToastSpy).not.toHaveBeenCalled(); }); it('does not show toast if configured correctly', () => { const http = httpServiceMock.createStartContract({ publicBaseUrl: 'http://myhost.com' }); setupPublicBaseUrlConfigWarning({ + ...startServices, docLinks, - notifications, http, location: { hostname: 'myhost.com', @@ -65,7 +78,7 @@ describe('publicBaseUrl warning', () => { } as Location, }); - expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + expect(addWarningToastSpy).not.toHaveBeenCalled(); }); describe('config missing toast', () => { @@ -73,8 +86,8 @@ describe('publicBaseUrl warning', () => { const http = httpServiceMock.createStartContract({ publicBaseUrl: undefined }); setupPublicBaseUrlConfigWarning({ + ...startServices, docLinks, - notifications, http, location: { hostname: 'myhost.com', @@ -84,7 +97,7 @@ describe('publicBaseUrl warning', () => { } as Location, }); - expect(notifications.toasts.addWarning).toHaveBeenCalledWith({ + expect(addWarningToastSpy).toHaveBeenCalledWith({ title: 'Configuration recommended', text: expect.any(Function), }); @@ -94,8 +107,8 @@ describe('publicBaseUrl warning', () => { const http = httpServiceMock.createStartContract({ publicBaseUrl: undefined }); setupPublicBaseUrlConfigWarning({ + ...startServices, docLinks, - notifications, http, location: { hostname: 'myhost.com', @@ -104,11 +117,11 @@ describe('publicBaseUrl warning', () => { }, } as Location, storage: { - getItem: (id: string) => 'true', + getItem: (_id: string) => 'true', } as Storage, }); - expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + expect(addWarningToastSpy).not.toHaveBeenCalled(); }); }); }); diff --git a/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx b/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx index f125d03239802..33557bc86de91 100644 --- a/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx +++ b/packages/core/apps/core-apps-browser-internal/src/errors/public_base_url.tsx @@ -12,9 +12,13 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { DocLinksStart } from '@kbn/core-doc-links-browser'; +import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; +import type { I18nStart } from '@kbn/core-i18n-browser'; +import type { ThemeServiceStart } from '@kbn/core-theme-browser'; import type { InternalHttpStart } from '@kbn/core-http-browser-internal'; import type { NotificationsStart } from '@kbn/core-notifications-browser'; import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; /** Only exported for tests */ export const MISSING_CONFIG_STORAGE_KEY = `core.warnings.publicBaseUrlMissingDismissed`; @@ -26,6 +30,10 @@ interface Deps { // Exposed for easier testing storage?: Storage; location?: Location; + // For KibanaRenderContextProvider + analytics: AnalyticsServiceStart; + i18n: I18nStart; + theme: ThemeServiceStart; } export const setupPublicBaseUrlConfigWarning = ({ @@ -34,6 +42,7 @@ export const setupPublicBaseUrlConfigWarning = ({ notifications, storage = window.localStorage, location = window.location, + ...renderContextDeps }: Deps) => { if (location.hostname === 'localhost' || location.hostname === '127.0.0.1') { return; @@ -49,7 +58,7 @@ export const setupPublicBaseUrlConfigWarning = ({ defaultMessage: 'Configuration recommended', }), text: mountReactNode( - <> +

- + ), }); }; diff --git a/packages/core/apps/core-apps-browser-internal/tsconfig.json b/packages/core/apps/core-apps-browser-internal/tsconfig.json index 35e25675fe078..a18bb3421a1f4 100644 --- a/packages/core/apps/core-apps-browser-internal/tsconfig.json +++ b/packages/core/apps/core-apps-browser-internal/tsconfig.json @@ -10,7 +10,7 @@ }, "include": [ "**/*.ts", - "**/*.tsx", + "**/*.tsx" ], "kbn_references": [ "@kbn/i18n", @@ -35,8 +35,15 @@ "@kbn/core-doc-links-browser-mocks", "@kbn/test-jest-helpers", "@kbn/react-kibana-context-theme", + "@kbn/core-analytics-browser", + "@kbn/core-i18n-browser", + "@kbn/core-theme-browser", + "@kbn/react-kibana-context-render", + "@kbn/core-analytics-browser-mocks", + "@kbn/core-i18n-browser-mocks", + "@kbn/core-theme-browser-mocks" ], "exclude": [ - "target/**/*", + "target/**/*" ] } diff --git a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx index 08847884eeafe..de0ff6dd95c76 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.test.tsx @@ -21,7 +21,10 @@ import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; import { customBrandingServiceMock } from '@kbn/core-custom-branding-browser-mocks'; import { analyticsServiceMock } from '@kbn/core-analytics-browser-mocks'; +import { i18nServiceMock } from '@kbn/core-i18n-browser-mocks'; +import { themeServiceMock } from '@kbn/core-theme-browser-mocks'; import { getAppInfo } from '@kbn/core-application-browser-internal'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { findTestSubject } from '@kbn/test-jest-helpers'; import { ChromeService } from './chrome_service'; @@ -48,6 +51,9 @@ Object.defineProperty(window, 'localStorage', { function defaultStartDeps(availableApps?: App[], currentAppId?: string) { const deps = { + analytics: analyticsServiceMock.createAnalyticsServiceStart(), + i18n: i18nServiceMock.createStartContract(), + theme: themeServiceMock.createStartContract(), application: applicationServiceMock.createInternalStartContract(currentAppId), docLinks: docLinksServiceMock.createStartContract(), http: httpServiceMock.createStartContract(), @@ -94,7 +100,7 @@ async function start({ startDeps.injectedMetadata.getCspConfig.mockReturnValue(cspConfigMock); } - await service.setup({ analytics: analyticsServiceMock.createAnalyticsServiceSetup() }); + service.setup({ analytics: analyticsServiceMock.createAnalyticsServiceSetup() }); const chromeStart = await service.start(startDeps); return { @@ -118,7 +124,7 @@ describe('setup', () => { it('calls registerAnalyticsContextProvider with the correct parameters', async () => { const service = new ChromeService(defaultStartTestOptions({})); const analytics = analyticsServiceMock.createAnalyticsServiceSetup(); - await service.setup({ analytics }); + service.setup({ analytics }); expect(registerAnalyticsContextProviderMock).toHaveBeenCalledTimes(1); expect(registerAnalyticsContextProviderMock).toHaveBeenCalledWith( @@ -206,7 +212,7 @@ describe('start', () => { }); it('renders the custom project side navigation', async () => { - const { chrome } = await start({ + const { chrome, startDeps } = await start({ startDeps: defaultStartDeps([{ id: 'foo', title: 'Foo' } as App], 'foo'), }); @@ -216,7 +222,11 @@ describe('start', () => { chrome.setChromeStyle('project'); chrome.project.setSideNavComponent(MyNav); - const component = mount(chrome.getHeaderComponent()); + const component = mount( + + {chrome.getHeaderComponent()} + + ); const projectHeader = findTestSubject(component, 'kibanaProjectHeader'); expect(projectHeader.length).toBe(1); @@ -229,11 +239,15 @@ describe('start', () => { }); it('renders chromeless header', async () => { - const { chrome } = await start({ startDeps: defaultStartDeps() }); + const { chrome, startDeps } = await start({ startDeps: defaultStartDeps() }); chrome.setIsVisible(false); - const component = mount(chrome.getHeaderComponent()); + const component = mount( + + {chrome.getHeaderComponent()} + + ); const chromeless = findTestSubject(component, 'kibanaHeaderChromeless'); expect(chromeless.length).toBe(1); @@ -418,7 +432,7 @@ describe('start', () => { const promise = chrome.getBreadcrumbsAppendExtension$().pipe(toArray()).toPromise(); chrome.setBreadcrumbsAppendExtension({ - content: (element) => () => {}, + content: () => () => {}, }); service.stop(); diff --git a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx index cf0fb81f7407e..3cc1c30877a89 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/chrome_service.tsx @@ -398,6 +398,7 @@ export class ChromeService { globalHelpExtensionMenuLinks$={globalHelpExtensionMenuLinks$} actionMenu$={application.currentActionMenu$} breadcrumbs$={currentProjectBreadcrumbs$} + customBranding$={customBranding$} helpExtension$={helpExtension$.pipe(takeUntil(this.stop$))} helpSupportUrl$={helpSupportUrl$.pipe(takeUntil(this.stop$))} helpMenuLinks$={helpMenuLinks$} diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx index ed23d25434664..694007921537f 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx @@ -40,7 +40,7 @@ export function buildBreadcrumbs({ activeNodes: ChromeProjectNavigationNode[][]; solutionNavigations?: { definitions: SolutionNavigationDefinitions; - activeId: string; + activeId: string | null; onChange: (id: string) => void; }; }): ChromeProjectBreadcrumb[] { @@ -106,7 +106,7 @@ function buildRootCrumb({ cloudLinks: CloudLinks; solutionNavigations?: { definitions: SolutionNavigationDefinitions; - activeId: string; + activeId: string | null; onChange: (id: string) => void; }; }): ChromeProjectBreadcrumb { diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts index 71fac1455031b..312290683f63f 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts @@ -328,6 +328,7 @@ describe('initNavigation()', () => { "href": "/app/discover", "id": "discover", "isElasticInternalLink": false, + "onClick": undefined, "path": "rootNav:analytics.discover", "sideNavStatus": "visible", "title": "DISCOVER", @@ -346,6 +347,7 @@ describe('initNavigation()', () => { "href": "/app/dashboards", "id": "dashboards", "isElasticInternalLink": false, + "onClick": undefined, "path": "rootNav:analytics.dashboards", "sideNavStatus": "visible", "title": "DASHBOARDS", @@ -364,6 +366,7 @@ describe('initNavigation()', () => { "href": "/app/visualize", "id": "visualize", "isElasticInternalLink": false, + "onClick": undefined, "path": "rootNav:analytics.visualize", "sideNavStatus": "visible", "title": "VISUALIZE", @@ -374,6 +377,7 @@ describe('initNavigation()', () => { "icon": "stats", "id": "rootNav:analytics", "isElasticInternalLink": false, + "onClick": undefined, "path": "rootNav:analytics", "renderAs": "accordion", "sideNavStatus": "visible", diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts index ddd00cea5b37e..03e40d7678f02 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts @@ -114,9 +114,7 @@ export class ProjectNavigationService { ); return { - setProjectHome: (homeHref: string) => { - this.projectHome$.next(homeHref); - }, + setProjectHome: this.setProjectHome.bind(this), getProjectHome$: () => { return this.projectHome$.asObservable(); }, @@ -162,6 +160,7 @@ export class ProjectNavigationService { chromeBreadcrumbs$, this.projectName$, this.solutionNavDefinitions$, + this.nextSolutionNavDefinitionId$, this.activeSolutionNavDefinitionId$, this.cloudLinks$, ]).pipe( @@ -172,12 +171,13 @@ export class ProjectNavigationService { chromeBreadcrumbs, projectName, solutionNavDefinitions, + nextSolutionNavDefinitionId, activeSolutionNavDefinitionId, cloudLinks, ]) => { const solutionNavigations = Object.keys(solutionNavDefinitions).length > 0 && - activeSolutionNavDefinitionId !== null + (nextSolutionNavDefinitionId !== null || activeSolutionNavDefinitionId !== null) ? { definitions: solutionNavDefinitions, activeId: activeSolutionNavDefinitionId, @@ -406,14 +406,25 @@ export class ProjectNavigationService { return; } - const { sideNavComponent } = definition; + const { sideNavComponent, homePage = '' } = definition; + const homePageLink = this.navLinksService?.get(homePage); + if (sideNavComponent) { this.setSideNavComponent(sideNavComponent); } + + if (homePageLink) { + this.setProjectHome(homePageLink.href); + } + this.initNavigation(nextId, definition.navigationTree$); }); } + private setProjectHome(homeHref: string) { + this.projectHome$.next(homeHref); + } + private goToSolutionHome(id: string) { const definitions = this.solutionNavDefinitions$.getValue(); const definition = definitions[id]; diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts index cbc199bbca51e..6e84ab54c11f1 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts @@ -23,6 +23,7 @@ import type { ItemDefinition, } from '@kbn/core-chrome-browser/src'; import type { Location } from 'history'; +import type { MouseEventHandler } from 'react'; import { getPresets } from './navigation_presets'; const wrapIdx = (index: number): string => `[${index}]`; @@ -212,15 +213,17 @@ function getNodeStatus( deepLink, cloudLink, sideNavStatus, + onClick, }: { link?: string; deepLink?: ChromeNavLink; cloudLink?: CloudLinkId; sideNavStatus?: SideNavNodeStatus; + onClick?: MouseEventHandler; }, { cloudLinks }: { cloudLinks: CloudLinks } ): SideNavNodeStatus | 'remove' { - if (link && !deepLink) { + if (link && !deepLink && !onClick) { // If a link is provided, but no deepLink is found, don't render anything return 'remove'; } @@ -259,7 +262,7 @@ function validateNodeProps< LinkId extends AppDeepLinkId = AppDeepLinkId, Id extends string = string, ChildrenId extends string = Id ->({ id, link, href, cloudLink, renderAs }: NodeDefinition) { +>({ id, link, href, cloudLink, renderAs, onClick }: NodeDefinition) { if (link && cloudLink) { throw new Error( `[Chrome navigation] Error in node [${id}]. Only one of "link" or "cloudLink" can be provided.` @@ -275,9 +278,9 @@ function validateNodeProps< `[Chrome navigation] Error in node [${id}]. If renderAs is set to "panelOpener", a "link" must also be provided.` ); } - if (renderAs === 'item' && !link) { + if (renderAs === 'item' && !link && !onClick) { throw new Error( - `[Chrome navigation] Error in node [${id}]. If renderAs is set to "item", a "link" must also be provided.` + `[Chrome navigation] Error in node [${id}]. If renderAs is set to "item", a "link" or "onClick" must also be provided.` ); } } @@ -302,7 +305,7 @@ const initNavNode = < ): ChromeProjectNavigationNode | null => { validateNodeProps(node); - const { cloudLink, link, children, ...navNodeFromProps } = node; + const { cloudLink, link, children, onClick, ...navNodeFromProps } = node; const deepLink = link !== undefined ? deepLinks[link] : undefined; const sideNavStatus = getNodeStatus( { @@ -310,6 +313,7 @@ const initNavNode = < deepLink, cloudLink, sideNavStatus: navNodeFromProps.sideNavStatus, + onClick, }, { cloudLinks } ); @@ -324,7 +328,7 @@ const initNavNode = < const href = isElasticInternalLink ? cloudLinks[cloudLink]?.href : node.href; const path = parentNodePath ? `${parentNodePath}.${id}` : id; - if (href && !isAbsoluteLink(href)) { + if (href && !isAbsoluteLink(href) && !onClick) { throw new Error(`href must be an absolute URL. Node id [${id}].`); } @@ -332,6 +336,7 @@ const initNavNode = < ...navNodeFromProps, id, href: getNavigationNodeHref({ href, deepLink }), + onClick, path, title, deepLink, diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx index 04e5773e176bd..10a6c75d709be 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.test.tsx @@ -33,6 +33,7 @@ describe('Header', () => { navControlsLeft$: Rx.of([]), navControlsCenter$: Rx.of([]), navControlsRight$: Rx.of([]), + customBranding$: Rx.of({}), prependBasePath: (str) => `hello/world/${str}`, toggleSideNav: jest.fn(), }; @@ -46,5 +47,16 @@ describe('Header', () => { expect(await screen.findByTestId('euiCollapsibleNavButton')).toBeVisible(); expect(await screen.findByText('Hello, world!')).toBeVisible(); + expect(screen.queryByTestId(/customLogo/)).toBeNull(); + }); + + it('renders custom branding logo', async () => { + const { queryByTestId } = render( + + Hello, world! + + ); + + expect(queryByTestId(/customLogo/)).not.toBeNull(); }); }); diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx index 77aef1053a8a2..637e87773cf7a 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx @@ -14,6 +14,7 @@ import { EuiLoadingSpinner, useEuiTheme, EuiThemeComputed, + EuiImage, } from '@elastic/eui'; import { css } from '@emotion/react'; import type { InternalApplicationStart } from '@kbn/core-application-browser-internal'; @@ -33,7 +34,9 @@ import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { Router } from '@kbn/shared-ux-router'; import React, { useCallback } from 'react'; import useObservable from 'react-use/lib/useObservable'; -import { debounceTime, Observable, of } from 'rxjs'; +import { debounceTime, Observable } from 'rxjs'; +import type { CustomBranding } from '@kbn/core-custom-branding-common'; + import { useHeaderActionMenuMounter } from '../header/header_action_menu'; import { Breadcrumbs } from './breadcrumbs'; import { HeaderHelpMenu } from '../header/header_help_menu'; @@ -46,11 +49,11 @@ import { ProjectNavigation } from './navigation'; const getHeaderCss = ({ size, colors }: EuiThemeComputed) => ({ logo: { container: css` - display: inline-block; + display: flex; + align-items: center; + justify-content: center; min-width: 56px; /* 56 = 40 + 8 + 8 */ - padding: 0 ${size.s}; cursor: pointer; - margin-left: -${size.s}; // to get equal spacing between .euiCollapsibleNavButtonWrapper, logo and breadcrumbs `, logo: css` min-width: 0; /* overrides min-width: 40px */ @@ -113,6 +116,7 @@ export interface Props { actionMenu$: Observable; docLinks: DocLinksStart; children: React.ReactNode; + customBranding$: Observable; globalHelpExtensionMenuLinks$: Observable; helpExtension$: Observable; helpSupportUrl$: Observable; @@ -130,46 +134,77 @@ export interface Props { const LOADING_DEBOUNCE_TIME = 80; -type LogoProps = Pick & { +type LogoProps = Pick< + Props, + 'application' | 'homeHref$' | 'loadingCount$' | 'prependBasePath' | 'customBranding$' +> & { logoCss: HeaderCss['logo']; }; -const Logo = (props: LogoProps) => { - const loadingCount = useObservable( - props.loadingCount$.pipe(debounceTime(LOADING_DEBOUNCE_TIME)), - 0 - ); - - const homeHref = useObservable(props.homeHref$, '/app/home'); +const Logo = ({ + loadingCount$, + homeHref$, + prependBasePath, + application, + logoCss, + customBranding$, +}: LogoProps) => { + const loadingCount = useObservable(loadingCount$.pipe(debounceTime(LOADING_DEBOUNCE_TIME)), 0); + const homeHref = useObservable(homeHref$, '/app/home'); + const customBranding = useObservable(customBranding$, {}); + const { logo } = customBranding; let fullHref: string | undefined; if (homeHref) { - fullHref = props.prependBasePath(homeHref); + fullHref = prependBasePath(homeHref); } const navigateHome = useCallback( (event: React.MouseEvent) => { if (fullHref) { - props.application.navigateToUrl(fullHref); + application.navigateToUrl(fullHref); } event.preventDefault(); }, - [fullHref, props.application] + [fullHref, application] ); + const renderLogo = () => { + if (logo) { + return ( + + + + ); + } + + return ( + + ); + }; + return ( - + {loadingCount === 0 ? ( - + renderLogo() ) : ( - + { const headerActionMenuMounter = useHeaderActionMenuMounter(observables.actionMenu$); @@ -200,7 +236,7 @@ export const ProjectHeader = ({ <> @@ -220,6 +256,7 @@ export const ProjectHeader = ({ application={application} homeHref$={observables.homeHref$} loadingCount$={observables.loadingCount$} + customBranding$={customBranding$} logoCss={logoCss} /> diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx index abb617e988724..b6cc812b9a23c 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx @@ -21,7 +21,7 @@ export const getSolutionNavSwitcherBreadCrumb = ({ cloudLinks, }: { definitions: SolutionNavigationDefinitions; - activeId: string; + activeId: string | null; onChange: (id: string) => void; cloudLinks: CloudLinks; }): ChromeProjectBreadcrumb => { diff --git a/packages/core/chrome/core-chrome-browser-internal/tsconfig.json b/packages/core/chrome/core-chrome-browser-internal/tsconfig.json index ceb3cd525a19d..5d81526f2c970 100644 --- a/packages/core/chrome/core-chrome-browser-internal/tsconfig.json +++ b/packages/core/chrome/core-chrome-browser-internal/tsconfig.json @@ -52,6 +52,9 @@ "@kbn/core-base-browser-mocks", "@kbn/logging", "@kbn/logging-mocks", + "@kbn/core-i18n-browser-mocks", + "@kbn/core-theme-browser-mocks", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", diff --git a/packages/core/chrome/core-chrome-browser/index.ts b/packages/core/chrome/core-chrome-browser/index.ts index 431e83db04afa..27c20f502bc06 100644 --- a/packages/core/chrome/core-chrome-browser/index.ts +++ b/packages/core/chrome/core-chrome-browser/index.ts @@ -56,4 +56,5 @@ export type { NavigationTreeDefinitionUI, SolutionNavigationDefinition, SolutionNavigationDefinitions, + EuiSideNavItemTypeEnhanced, } from './src'; diff --git a/packages/core/chrome/core-chrome-browser/src/index.ts b/packages/core/chrome/core-chrome-browser/src/index.ts index 4c0ca3f12a506..a287499cd73ff 100644 --- a/packages/core/chrome/core-chrome-browser/src/index.ts +++ b/packages/core/chrome/core-chrome-browser/src/index.ts @@ -55,4 +55,5 @@ export type { NavigationTreeDefinitionUI, SolutionNavigationDefinition, SolutionNavigationDefinitions, + EuiSideNavItemTypeEnhanced, } from './project_navigation'; diff --git a/packages/core/chrome/core-chrome-browser/src/project_navigation.ts b/packages/core/chrome/core-chrome-browser/src/project_navigation.ts index b198b88b52839..75f3b3be8edce 100644 --- a/packages/core/chrome/core-chrome-browser/src/project_navigation.ts +++ b/packages/core/chrome/core-chrome-browser/src/project_navigation.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import type { ComponentType } from 'react'; +import type { ComponentType, MouseEventHandler } from 'react'; import type { Location } from 'history'; -import type { EuiThemeSizes, IconType } from '@elastic/eui'; +import type { EuiSideNavItemType, EuiThemeSizes, IconType } from '@elastic/eui'; import type { Observable } from 'rxjs'; import type { AppId as DevToolsApp, DeepLinkId as DevToolsLink } from '@kbn/deeplinks-devtools'; import type { @@ -128,6 +128,10 @@ interface NodeDefinitionBase { * href for absolute links only. Internal links should use "link". */ href?: string; + /** + * Custom handler to execute when clicking on the node. This handler takes precedence over the "link" or "href" props. + */ + onClick?: MouseEventHandler; /** * Optional status to indicate if the breadcrumb should be hidden when this node is active. * @default 'visible' @@ -434,3 +438,15 @@ export interface SolutionNavigationDefinition = Omit, 'items'> & { + items?: Array>; + iconToString?: string; + nameToString?: string; +}; diff --git a/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/error_toast.test.tsx.snap b/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/error_toast.test.tsx.snap index 3f21369a67da1..3c7645d3ce333 100644 --- a/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/error_toast.test.tsx.snap +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/__snapshots__/error_toast.test.tsx.snap @@ -1,7 +1,35 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`renders matching snapshot 1`] = ` - +

@@ -23,5 +51,5 @@ exports[`renders matching snapshot 1`] = ` /> - + `; diff --git a/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx b/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx index e494b0294f948..d47293b883632 100644 --- a/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx +++ b/packages/core/notifications/core-notifications-browser-internal/src/toasts/error_toast.tsx @@ -111,7 +111,7 @@ export function ErrorToast({ ...startServices }: ErrorToastProps) { return ( - +

{toastMessage}

- +
); } diff --git a/packages/core/root/core-root-browser-internal/src/core_system.ts b/packages/core/root/core-root-browser-internal/src/core_system.ts index c9dcbf064823a..f06f1becbf248 100644 --- a/packages/core/root/core-root-browser-internal/src/core_system.ts +++ b/packages/core/root/core-root-browser-internal/src/core_system.ts @@ -291,14 +291,14 @@ export class CoreSystem { const analytics = this.analytics.start(); const security = this.security.start(); const userProfile = this.userProfile.start(); - const injectedMetadata = await this.injectedMetadata.start(); - const uiSettings = await this.uiSettings.start(); - const settings = await this.settings.start(); + const injectedMetadata = this.injectedMetadata.start(); + const uiSettings = this.uiSettings.start(); + const settings = this.settings.start(); const docLinks = this.docLinks.start({ injectedMetadata }); - const http = await this.http.start(); + const http = this.http.start(); const savedObjects = await this.savedObjects.start({ http }); - const i18n = await this.i18n.start(); - const fatalErrors = await this.fatalErrors.start(); + const i18n = this.i18n.start(); + const fatalErrors = this.fatalErrors.start(); const theme = this.theme.start(); await this.integrations.start({ uiSettings }); @@ -345,7 +345,16 @@ export class CoreSystem { }); const deprecations = this.deprecations.start({ http }); - this.coreApp.start({ application, docLinks, http, notifications, uiSettings }); + this.coreApp.start({ + application, + docLinks, + http, + notifications, + uiSettings, + analytics, + i18n, + theme, + }); const core: InternalCoreStart = { analytics, diff --git a/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts b/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts index 36671f2089bb2..236e279ef27fe 100644 --- a/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts +++ b/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts @@ -146,7 +146,7 @@ const fullStatusResponse: () => Type> = () => }, { meta: { - id: 'core.status.response', + id: 'core_status_response', description: `Kibana's operational status as well as a detailed breakdown of plugin statuses indication of various loads (like event loop utilization and network traffic) at time of request.`, }, } @@ -163,7 +163,7 @@ const redactedStatusResponse = () => }, { meta: { - id: 'core.status.redactedResponse', + id: 'core_status_redactedResponse', description: `A minimal representation of Kibana's operational status.`, }, } diff --git a/packages/kbn-config-schema/index.ts b/packages/kbn-config-schema/index.ts index 0ab1fd640d7af..c6ef8c2ce99dc 100644 --- a/packages/kbn-config-schema/index.ts +++ b/packages/kbn-config-schema/index.ts @@ -49,6 +49,7 @@ import { URIType, StreamType, UnionTypeOptions, + Lazy, } from './src/types'; export type { AnyType, ConditionalType, TypeOf, Props, SchemaStructureEntry, NullableProps }; @@ -216,6 +217,13 @@ function conditional( return new ConditionalType(leftOperand, rightOperand, equalType, notEqualType, options); } +/** + * Useful for creating recursive schemas. + */ +function lazy(id: string) { + return new Lazy(id); +} + export const schema = { any, arrayOf, @@ -226,6 +234,7 @@ export const schema = { contextRef, duration, ip, + lazy, literal, mapOf, maybe, @@ -245,7 +254,6 @@ export type Schema = typeof schema; import { META_FIELD_X_OAS_ANY, - META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_OPTIONAL, META_FIELD_X_OAS_DEPRECATED, META_FIELD_X_OAS_MAX_LENGTH, @@ -255,7 +263,6 @@ import { export const metaFields = Object.freeze({ META_FIELD_X_OAS_ANY, - META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_OPTIONAL, META_FIELD_X_OAS_DEPRECATED, META_FIELD_X_OAS_MAX_LENGTH, diff --git a/packages/kbn-config-schema/src/oas_meta_fields.ts b/packages/kbn-config-schema/src/oas_meta_fields.ts index 814bb32e7ea41..d1846be8ecf14 100644 --- a/packages/kbn-config-schema/src/oas_meta_fields.ts +++ b/packages/kbn-config-schema/src/oas_meta_fields.ts @@ -15,6 +15,5 @@ export const META_FIELD_X_OAS_MIN_LENGTH = 'x-oas-min-length' as const; export const META_FIELD_X_OAS_MAX_LENGTH = 'x-oas-max-length' as const; export const META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES = 'x-oas-get-additional-properties' as const; -export const META_FIELD_X_OAS_REF_ID = 'x-oas-ref-id' as const; export const META_FIELD_X_OAS_DEPRECATED = 'x-oas-deprecated' as const; export const META_FIELD_X_OAS_ANY = 'x-oas-any-type' as const; diff --git a/packages/kbn-config-schema/src/types/index.ts b/packages/kbn-config-schema/src/types/index.ts index e3d8db0b2302d..78eab0957557d 100644 --- a/packages/kbn-config-schema/src/types/index.ts +++ b/packages/kbn-config-schema/src/types/index.ts @@ -40,3 +40,4 @@ export { URIType } from './uri_type'; export { NeverType } from './never_type'; export type { IpOptions } from './ip_type'; export { IpType } from './ip_type'; +export { Lazy } from './lazy'; diff --git a/packages/kbn-config-schema/src/types/lazy.test.ts b/packages/kbn-config-schema/src/types/lazy.test.ts new file mode 100644 index 0000000000000..52864a9c825a8 --- /dev/null +++ b/packages/kbn-config-schema/src/types/lazy.test.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, schema } from '../..'; + +interface RecursiveType { + name: string; + self: undefined | RecursiveType; +} + +// Test our recursive type inference +{ + const id = 'recursive'; + // @ts-expect-error + const testObject: Type = schema.object( + { + name: schema.string(), + notSelf: schema.lazy(id), // this declaration should fail + }, + { meta: { id } } + ); +} + +describe('lazy', () => { + const id = 'recursive'; + const object = schema.object( + { + name: schema.string(), + self: schema.lazy(id), + }, + { meta: { id } } + ); + + it('allows recursive runtime types to be defined', () => { + const self: RecursiveType = { + name: 'self1', + self: { + name: 'self2', + self: { + name: 'self3', + self: { + name: 'self4', + self: undefined, + }, + }, + }, + }; + const { value, error } = object.getSchema().validate(self); + expect(error).toBeUndefined(); + expect(value).toEqual(self); + }); + + it('detects invalid recursive types as expected', () => { + const invalidSelf = { + name: 'self1', + self: { + name: 123, + self: undefined, + }, + }; + + const { error, value } = object.getSchema().validate(invalidSelf); + expect(value).toEqual(invalidSelf); + expect(error?.message).toBe('expected value of type [string] but got [number]'); + }); +}); diff --git a/packages/kbn-config-schema/src/types/lazy.ts b/packages/kbn-config-schema/src/types/lazy.ts new file mode 100644 index 0000000000000..28dda1b701394 --- /dev/null +++ b/packages/kbn-config-schema/src/types/lazy.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Type } from './type'; +import { internals } from '../internals'; + +/** + * Use this type to construct recursive runtime schemas. + */ +export class Lazy extends Type { + constructor(id: string) { + super(internals.link(`#${id}`)); + } +} diff --git a/packages/kbn-config-schema/src/types/object_type.test.ts b/packages/kbn-config-schema/src/types/object_type.test.ts index 12ed554e11099..bf92d22615504 100644 --- a/packages/kbn-config-schema/src/types/object_type.test.ts +++ b/packages/kbn-config-schema/src/types/object_type.test.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { get } from 'lodash'; import { expectType } from 'tsd'; import { schema } from '../..'; import { TypeOf } from './object_type'; @@ -21,6 +22,16 @@ test('returns value by default', () => { expect(type.validate(value)).toEqual({ name: 'test' }); }); +test('meta', () => { + const type = schema.object( + { + name: schema.string(), + }, + { meta: { id: 'test_id' } } + ); + expect(get(type.getSchema().describe(), 'flags.id')).toEqual('test_id'); +}); + test('returns empty object if undefined', () => { const type = schema.object({}); expect(type.validate(undefined)).toEqual({}); diff --git a/packages/kbn-config-schema/src/types/object_type.ts b/packages/kbn-config-schema/src/types/object_type.ts index 702d6d100847e..d5193b5e0fc38 100644 --- a/packages/kbn-config-schema/src/types/object_type.ts +++ b/packages/kbn-config-schema/src/types/object_type.ts @@ -69,8 +69,16 @@ interface UnknownOptions { unknowns?: OptionsForUnknowns; } +interface ObjectTypeOptionsMeta { + /** + * A string that uniquely identifies this schema. Used when generating OAS + * to create refs instead of inline schemas. + */ + id?: string; +} + export type ObjectTypeOptions

= TypeOptions> & - UnknownOptions; + UnknownOptions & { meta?: TypeOptions>['meta'] & ObjectTypeOptionsMeta }; export class ObjectType

extends Type> { private props: P; @@ -83,7 +91,7 @@ export class ObjectType

extends Type> for (const [key, value] of Object.entries(props)) { schemaKeys[key] = value.getSchema(); } - const schema = internals + let schema = internals .object() .keys(schemaKeys) .default() @@ -91,6 +99,10 @@ export class ObjectType

extends Type> .unknown(unknowns === 'allow') .options({ stripUnknown: { objects: unknowns === 'ignore' } }); + if (options.meta?.id) { + schema = schema.id(options.meta.id); + } + super(schema, typeOptions); this.props = props; this.propSchemas = schemaKeys; diff --git a/packages/kbn-config-schema/src/types/type.test.ts b/packages/kbn-config-schema/src/types/type.test.ts index a4784af2e8b62..a0ca8603d46f0 100644 --- a/packages/kbn-config-schema/src/types/type.test.ts +++ b/packages/kbn-config-schema/src/types/type.test.ts @@ -9,7 +9,7 @@ import { get } from 'lodash'; import { internals } from '../internals'; import { Type, TypeOptions } from './type'; -import { META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_DEPRECATED } from '../oas_meta_fields'; +import { META_FIELD_X_OAS_DEPRECATED } from '../oas_meta_fields'; class MyType extends Type { constructor(opts: TypeOptions = {}) { @@ -20,12 +20,11 @@ class MyType extends Type { describe('meta', () => { it('sets meta when provided', () => { const type = new MyType({ - meta: { description: 'my description', id: 'foo', deprecated: true }, + meta: { description: 'my description', deprecated: true }, }); const meta = type.getSchema().describe(); expect(get(meta, 'flags.description')).toBe('my description'); - expect(get(meta, `metas[0].${META_FIELD_X_OAS_REF_ID}`)).toBe('foo'); - expect(get(meta, `metas[1].${META_FIELD_X_OAS_DEPRECATED}`)).toBe(true); + expect(get(meta, `metas[0].${META_FIELD_X_OAS_DEPRECATED}`)).toBe(true); }); it('does not set meta when no provided', () => { diff --git a/packages/kbn-config-schema/src/types/type.ts b/packages/kbn-config-schema/src/types/type.ts index 80ed3f90fdd2a..652eae077d5af 100644 --- a/packages/kbn-config-schema/src/types/type.ts +++ b/packages/kbn-config-schema/src/types/type.ts @@ -7,7 +7,7 @@ */ import type { AnySchema, CustomValidator, ErrorReport } from 'joi'; -import { META_FIELD_X_OAS_DEPRECATED, META_FIELD_X_OAS_REF_ID } from '../oas_meta_fields'; +import { META_FIELD_X_OAS_DEPRECATED } from '../oas_meta_fields'; import { SchemaTypeError, ValidationError } from '../errors'; import { Reference } from '../references'; @@ -24,11 +24,6 @@ export interface TypeMeta { * Whether this field is deprecated. */ deprecated?: boolean; - /** - * A string that uniquely identifies this schema. Used when generating OAS - * to create refs instead of inline schemas. - */ - id?: string; } export interface TypeOptions { @@ -112,9 +107,6 @@ export abstract class Type { if (options.meta.description) { schema = schema.description(options.meta.description); } - if (options.meta.id) { - schema = schema.meta({ [META_FIELD_X_OAS_REF_ID]: options.meta.id }); - } if (options.meta.deprecated) { schema = schema.meta({ [META_FIELD_X_OAS_DEPRECATED]: true }); } diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 68bd793b3d5c9..a599f9a2bf0b6 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -858,6 +858,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D remoteESOoutput: `${FLEET_DOCS}monitor-elastic-agent.html#external-elasticsearch-monitoring`, performancePresets: `${FLEET_DOCS}es-output-settings.html#es-output-settings-performance-tuning-settings`, scalingKubernetesResourcesAndLimits: `${FLEET_DOCS}scaling-on-kubernetes.html#_specifying_resources_and_limits_in_agent_manifests`, + roleAndPrivileges: `${FLEET_DOCS}fleet-roles-and-privileges.html`, }, ecs: { guide: `${ELASTIC_WEBSITE_URL}guide/en/ecs/${ECS_VERSION}/index.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index fb59c867cff9d..567652df3123c 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -551,6 +551,7 @@ export interface DocLinks { remoteESOoutput: string; performancePresets: string; scalingKubernetesResourcesAndLimits: string; + roleAndPrivileges: string; }>; readonly ecs: { readonly guide: string; diff --git a/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml b/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml index def2ff2cdeb55..5d70bb0044fc5 100644 --- a/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml +++ b/packages/kbn-es/src/serverless_resources/project_roles/security/roles.yml @@ -468,6 +468,7 @@ soc_manager: - feature_siem.actions_log_management_all - feature_siem.file_operations_all - feature_siem.execute_operations_all + - feature_siem.scan_operations_all - feature_securitySolutionCases.all - feature_securitySolutionAssistant.all - feature_actions.all @@ -644,9 +645,10 @@ endpoint_operations_analyst: - feature_siem.blocklist_all - feature_siem.host_isolation_all - feature_siem.process_operations_all - - feature_siem.actions_log_management_all # Response History + - feature_siem.actions_log_management_all - feature_siem.file_operations_all - - feature_siem.execute_operations_all # Execute + - feature_siem.execute_operations_all + - feature_siem.scan_operations_all - feature_securitySolutionCases.all - feature_securitySolutionAssistant.all - feature_actions.all diff --git a/packages/kbn-es/src/utils/docker.test.ts b/packages/kbn-es/src/utils/docker.test.ts index ec706a64a96ac..b3e7bd30ad83e 100644 --- a/packages/kbn-es/src/utils/docker.test.ts +++ b/packages/kbn-es/src/utils/docker.test.ts @@ -438,7 +438,6 @@ describe('resolveEsArgs()', () => { kibanaUrl: 'https://localhost:5601/', }); - expect(esArgs).toHaveLength(26); expect(esArgs).toMatchInlineSnapshot(` Array [ "--env", @@ -448,6 +447,8 @@ describe('resolveEsArgs()', () => { "--env", "xpack.security.http.ssl.verification_mode=certificate", "--env", + "xpack.security.authc.native_role_mappings.enabled=true", + "--env", "xpack.security.authc.realms.saml.cloud-saml-kibana.order=0", "--env", "xpack.security.authc.realms.saml.cloud-saml-kibana.idp.metadata.path=/usr/share/elasticsearch/config/secrets/idp_metadata.xml", @@ -477,7 +478,6 @@ describe('resolveEsArgs()', () => { kibanaUrl: 'https://localhost:5601/', }); - expect(esArgs).toHaveLength(8); expect(esArgs).toMatchInlineSnapshot(` Array [ "--env", diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index b0795a70f7d72..60232c97897d2 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -486,6 +486,10 @@ export function resolveEsArgs( ) { const trimTrailingSlash = (url: string) => (url.endsWith('/') ? url.slice(0, -1) : url); + // The mock IDP setup requires a custom role mapping, but since native role mappings are disabled by default in + // Serverless, we have to re-enable them explicitly here. + esArgs.set('xpack.security.authc.native_role_mappings.enabled', 'true'); + esArgs.set(`xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.order`, '0'); esArgs.set( `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.idp.metadata.path`, diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 index a4e0492ce1c61..1f0ba47ebbda2 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 @@ -21,6 +21,7 @@ INLINESTATS : 'inlinestats' -> pushMode(EXPRESSION_MODE); KEEP : 'keep' -> pushMode(PROJECT_MODE); LIMIT : 'limit' -> pushMode(EXPRESSION_MODE); META : 'meta' -> pushMode(META_MODE); +METRICS : 'metrics' -> pushMode(METRICS_MODE); MV_EXPAND : 'mv_expand' -> pushMode(MVEXPAND_MODE); RENAME : 'rename' -> pushMode(RENAME_MODE); ROW : 'row' -> pushMode(EXPRESSION_MODE); @@ -41,6 +42,16 @@ MULTILINE_COMMENT WS : [ \r\n\t]+ -> channel(HIDDEN) ; + +fragment INDEX_UNQUOTED_IDENTIFIER_PART + : ~[=`|,[\]/ \t\r\n] + | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment + ; + +INDEX_UNQUOTED_IDENTIFIER + : INDEX_UNQUOTED_IDENTIFIER_PART+ + ; + // // Explain // @@ -201,13 +212,8 @@ FROM_QUOTED_STRING : QUOTED_STRING -> type(QUOTED_STRING); METADATA : 'metadata'; -fragment FROM_UNQUOTED_IDENTIFIER_PART - : ~[=`|,[\]/ \t\r\n] - | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment - ; - -FROM_UNQUOTED_IDENTIFIER - : FROM_UNQUOTED_IDENTIFIER_PART+ +FROM_INDEX_UNQUOTED_IDENTIFIER + : INDEX_UNQUOTED_IDENTIFIER -> type(INDEX_UNQUOTED_IDENTIFIER) ; FROM_LINE_COMMENT @@ -432,3 +438,61 @@ SETTTING_MULTILINE_COMMENT SETTING_WS : WS -> channel(HIDDEN) ; + + +// +// METRICS command +// +mode METRICS_MODE; +METRICS_PIPE : PIPE -> type(PIPE), popMode; + +METRICS_INDEX_UNQUOTED_IDENTIFIER + : INDEX_UNQUOTED_IDENTIFIER -> type(INDEX_UNQUOTED_IDENTIFIER), popMode, pushMode(CLOSING_METRICS_MODE) + ; + +METRICS_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +METRICS_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +METRICS_WS + : WS -> channel(HIDDEN) + ; + +// TODO: remove this workaround mode - see https://github.com/elastic/elasticsearch/issues/108528 +mode CLOSING_METRICS_MODE; + +CLOSING_METRICS_COMMA + : COMMA -> type(COMMA), popMode, pushMode(METRICS_MODE) + ; + +CLOSING_METRICS_LINE_COMMENT + : LINE_COMMENT -> channel(HIDDEN) + ; + +CLOSING_METRICS_MULTILINE_COMMENT + : MULTILINE_COMMENT -> channel(HIDDEN) + ; + +CLOSING_METRICS_WS + : WS -> channel(HIDDEN) + ; + +CLOSING_METRICS_QUOTED_IDENTIFIER + : QUOTED_IDENTIFIER -> popMode, pushMode(EXPRESSION_MODE), type(QUOTED_IDENTIFIER) + ; + +CLOSING_METRICS_UNQUOTED_IDENTIFIER + :UNQUOTED_IDENTIFIER -> popMode, pushMode(EXPRESSION_MODE), type(UNQUOTED_IDENTIFIER) + ; + +CLOSING_METRICS_BY + :BY -> popMode, pushMode(EXPRESSION_MODE), type(BY) + ; + +CLOSING_METRICS_PIPE + : PIPE -> type(PIPE), popMode + ; \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp index fad6acad9ab58..83ae6a73b0576 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp @@ -11,6 +11,7 @@ null 'keep' 'limit' 'meta' +'metrics' 'mv_expand' 'rename' 'row' @@ -25,6 +26,7 @@ null null null null +null '|' null null @@ -79,7 +81,6 @@ null null null null -null 'as' null null @@ -109,6 +110,12 @@ null null null null +null +null +null +null +null +null token symbolic names: null @@ -123,6 +130,7 @@ INLINESTATS KEEP LIMIT META +METRICS MV_EXPAND RENAME ROW @@ -134,6 +142,7 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS +INDEX_UNQUOTED_IDENTIFIER EXPLAIN_WS EXPLAIN_LINE_COMMENT EXPLAIN_MULTILINE_COMMENT @@ -184,7 +193,6 @@ EXPR_LINE_COMMENT EXPR_MULTILINE_COMMENT EXPR_WS METADATA -FROM_UNQUOTED_IDENTIFIER FROM_LINE_COMMENT FROM_MULTILINE_COMMENT FROM_WS @@ -221,6 +229,12 @@ SETTING SETTING_LINE_COMMENT SETTTING_MULTILINE_COMMENT SETTING_WS +METRICS_LINE_COMMENT +METRICS_MULTILINE_COMMENT +METRICS_WS +CLOSING_METRICS_LINE_COMMENT +CLOSING_METRICS_MULTILINE_COMMENT +CLOSING_METRICS_WS rule names: DISSECT @@ -234,6 +248,7 @@ INLINESTATS KEEP LIMIT META +METRICS MV_EXPAND RENAME ROW @@ -245,6 +260,8 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS +INDEX_UNQUOTED_IDENTIFIER_PART +INDEX_UNQUOTED_IDENTIFIER EXPLAIN_OPENING_BRACKET EXPLAIN_PIPE EXPLAIN_WS @@ -314,8 +331,7 @@ FROM_COMMA FROM_ASSIGN FROM_QUOTED_STRING METADATA -FROM_UNQUOTED_IDENTIFIER_PART -FROM_UNQUOTED_IDENTIFIER +FROM_INDEX_UNQUOTED_IDENTIFIER FROM_LINE_COMMENT FROM_MULTILINE_COMMENT FROM_WS @@ -381,6 +397,19 @@ SETTING SETTING_LINE_COMMENT SETTTING_MULTILINE_COMMENT SETTING_WS +METRICS_PIPE +METRICS_INDEX_UNQUOTED_IDENTIFIER +METRICS_LINE_COMMENT +METRICS_MULTILINE_COMMENT +METRICS_WS +CLOSING_METRICS_COMMA +CLOSING_METRICS_LINE_COMMENT +CLOSING_METRICS_MULTILINE_COMMENT +CLOSING_METRICS_WS +CLOSING_METRICS_QUOTED_IDENTIFIER +CLOSING_METRICS_UNQUOTED_IDENTIFIER +CLOSING_METRICS_BY +CLOSING_METRICS_PIPE channel names: DEFAULT_TOKEN_CHANNEL @@ -399,6 +428,8 @@ MVEXPAND_MODE SHOW_MODE META_MODE SETTING_MODE +METRICS_MODE +CLOSING_METRICS_MODE atn: -[4, 0, 109, 1187, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 4, 18, 480, 8, 18, 11, 18, 12, 18, 481, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 490, 8, 19, 10, 19, 12, 19, 493, 9, 19, 1, 19, 3, 19, 496, 8, 19, 1, 19, 3, 19, 499, 8, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 508, 8, 20, 10, 20, 12, 20, 511, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 519, 8, 21, 11, 21, 12, 21, 520, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 562, 8, 32, 1, 32, 4, 32, 565, 8, 32, 11, 32, 12, 32, 566, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 576, 8, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 3, 37, 583, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 588, 8, 38, 10, 38, 12, 38, 591, 9, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 599, 8, 38, 10, 38, 12, 38, 602, 9, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 609, 8, 38, 1, 38, 3, 38, 612, 8, 38, 3, 38, 614, 8, 38, 1, 39, 4, 39, 617, 8, 39, 11, 39, 12, 39, 618, 1, 40, 4, 40, 622, 8, 40, 11, 40, 12, 40, 623, 1, 40, 1, 40, 5, 40, 628, 8, 40, 10, 40, 12, 40, 631, 9, 40, 1, 40, 1, 40, 4, 40, 635, 8, 40, 11, 40, 12, 40, 636, 1, 40, 4, 40, 640, 8, 40, 11, 40, 12, 40, 641, 1, 40, 1, 40, 5, 40, 646, 8, 40, 10, 40, 12, 40, 649, 9, 40, 3, 40, 651, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 4, 40, 657, 8, 40, 11, 40, 12, 40, 658, 1, 40, 1, 40, 3, 40, 663, 8, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 5, 78, 794, 8, 78, 10, 78, 12, 78, 797, 9, 78, 1, 78, 1, 78, 3, 78, 801, 8, 78, 1, 78, 4, 78, 804, 8, 78, 11, 78, 12, 78, 805, 3, 78, 808, 8, 78, 1, 79, 1, 79, 4, 79, 812, 8, 79, 11, 79, 12, 79, 813, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 3, 91, 869, 8, 91, 1, 92, 4, 92, 872, 8, 92, 11, 92, 12, 92, 873, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 905, 8, 99, 1, 100, 1, 100, 3, 100, 909, 8, 100, 1, 100, 5, 100, 912, 8, 100, 10, 100, 12, 100, 915, 9, 100, 1, 100, 1, 100, 3, 100, 919, 8, 100, 1, 100, 4, 100, 922, 8, 100, 11, 100, 12, 100, 923, 3, 100, 926, 8, 100, 1, 101, 1, 101, 4, 101, 930, 8, 101, 11, 101, 12, 101, 931, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 4, 119, 1007, 8, 119, 11, 119, 12, 119, 1008, 1, 119, 1, 119, 3, 119, 1013, 8, 119, 1, 119, 4, 119, 1016, 8, 119, 11, 119, 12, 119, 1017, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 4, 154, 1172, 8, 154, 11, 154, 12, 154, 1173, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 2, 509, 600, 0, 158, 12, 1, 14, 2, 16, 3, 18, 4, 20, 5, 22, 6, 24, 7, 26, 8, 28, 9, 30, 10, 32, 11, 34, 12, 36, 13, 38, 14, 40, 15, 42, 16, 44, 17, 46, 18, 48, 19, 50, 20, 52, 21, 54, 22, 56, 0, 58, 0, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 65, 166, 66, 168, 67, 170, 0, 172, 68, 174, 69, 176, 70, 178, 71, 180, 0, 182, 0, 184, 0, 186, 0, 188, 0, 190, 0, 192, 72, 194, 0, 196, 73, 198, 74, 200, 75, 202, 76, 204, 0, 206, 0, 208, 0, 210, 0, 212, 0, 214, 77, 216, 78, 218, 79, 220, 80, 222, 0, 224, 0, 226, 0, 228, 0, 230, 81, 232, 0, 234, 82, 236, 83, 238, 84, 240, 0, 242, 0, 244, 85, 246, 86, 248, 0, 250, 87, 252, 0, 254, 0, 256, 88, 258, 89, 260, 90, 262, 0, 264, 0, 266, 0, 268, 0, 270, 0, 272, 0, 274, 0, 276, 91, 278, 92, 280, 93, 282, 0, 284, 0, 286, 0, 288, 0, 290, 94, 292, 95, 294, 96, 296, 0, 298, 97, 300, 98, 302, 99, 304, 100, 306, 0, 308, 101, 310, 102, 312, 103, 314, 104, 316, 0, 318, 105, 320, 106, 322, 107, 324, 108, 326, 109, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 2, 0, 85, 85, 117, 117, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1214, 0, 12, 1, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 1, 56, 1, 0, 0, 0, 1, 58, 1, 0, 0, 0, 1, 60, 1, 0, 0, 0, 1, 62, 1, 0, 0, 0, 1, 64, 1, 0, 0, 0, 2, 66, 1, 0, 0, 0, 2, 88, 1, 0, 0, 0, 2, 90, 1, 0, 0, 0, 2, 92, 1, 0, 0, 0, 2, 94, 1, 0, 0, 0, 2, 96, 1, 0, 0, 0, 2, 98, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 3, 180, 1, 0, 0, 0, 3, 182, 1, 0, 0, 0, 3, 184, 1, 0, 0, 0, 3, 186, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 3, 190, 1, 0, 0, 0, 3, 192, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 4, 204, 1, 0, 0, 0, 4, 206, 1, 0, 0, 0, 4, 208, 1, 0, 0, 0, 4, 214, 1, 0, 0, 0, 4, 216, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 6, 240, 1, 0, 0, 0, 6, 242, 1, 0, 0, 0, 6, 244, 1, 0, 0, 0, 6, 246, 1, 0, 0, 0, 6, 250, 1, 0, 0, 0, 6, 252, 1, 0, 0, 0, 6, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 7, 262, 1, 0, 0, 0, 7, 264, 1, 0, 0, 0, 7, 266, 1, 0, 0, 0, 7, 268, 1, 0, 0, 0, 7, 270, 1, 0, 0, 0, 7, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 8, 282, 1, 0, 0, 0, 8, 284, 1, 0, 0, 0, 8, 286, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 8, 290, 1, 0, 0, 0, 8, 292, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 9, 296, 1, 0, 0, 0, 9, 298, 1, 0, 0, 0, 9, 300, 1, 0, 0, 0, 9, 302, 1, 0, 0, 0, 9, 304, 1, 0, 0, 0, 10, 306, 1, 0, 0, 0, 10, 308, 1, 0, 0, 0, 10, 310, 1, 0, 0, 0, 10, 312, 1, 0, 0, 0, 10, 314, 1, 0, 0, 0, 11, 316, 1, 0, 0, 0, 11, 318, 1, 0, 0, 0, 11, 320, 1, 0, 0, 0, 11, 322, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 11, 326, 1, 0, 0, 0, 12, 328, 1, 0, 0, 0, 14, 338, 1, 0, 0, 0, 16, 345, 1, 0, 0, 0, 18, 354, 1, 0, 0, 0, 20, 361, 1, 0, 0, 0, 22, 371, 1, 0, 0, 0, 24, 378, 1, 0, 0, 0, 26, 385, 1, 0, 0, 0, 28, 399, 1, 0, 0, 0, 30, 406, 1, 0, 0, 0, 32, 414, 1, 0, 0, 0, 34, 421, 1, 0, 0, 0, 36, 433, 1, 0, 0, 0, 38, 442, 1, 0, 0, 0, 40, 448, 1, 0, 0, 0, 42, 455, 1, 0, 0, 0, 44, 462, 1, 0, 0, 0, 46, 470, 1, 0, 0, 0, 48, 479, 1, 0, 0, 0, 50, 485, 1, 0, 0, 0, 52, 502, 1, 0, 0, 0, 54, 518, 1, 0, 0, 0, 56, 524, 1, 0, 0, 0, 58, 529, 1, 0, 0, 0, 60, 534, 1, 0, 0, 0, 62, 538, 1, 0, 0, 0, 64, 542, 1, 0, 0, 0, 66, 546, 1, 0, 0, 0, 68, 550, 1, 0, 0, 0, 70, 552, 1, 0, 0, 0, 72, 554, 1, 0, 0, 0, 74, 557, 1, 0, 0, 0, 76, 559, 1, 0, 0, 0, 78, 568, 1, 0, 0, 0, 80, 570, 1, 0, 0, 0, 82, 575, 1, 0, 0, 0, 84, 577, 1, 0, 0, 0, 86, 582, 1, 0, 0, 0, 88, 613, 1, 0, 0, 0, 90, 616, 1, 0, 0, 0, 92, 662, 1, 0, 0, 0, 94, 664, 1, 0, 0, 0, 96, 667, 1, 0, 0, 0, 98, 671, 1, 0, 0, 0, 100, 675, 1, 0, 0, 0, 102, 677, 1, 0, 0, 0, 104, 680, 1, 0, 0, 0, 106, 682, 1, 0, 0, 0, 108, 687, 1, 0, 0, 0, 110, 689, 1, 0, 0, 0, 112, 695, 1, 0, 0, 0, 114, 701, 1, 0, 0, 0, 116, 706, 1, 0, 0, 0, 118, 708, 1, 0, 0, 0, 120, 711, 1, 0, 0, 0, 122, 714, 1, 0, 0, 0, 124, 719, 1, 0, 0, 0, 126, 723, 1, 0, 0, 0, 128, 728, 1, 0, 0, 0, 130, 734, 1, 0, 0, 0, 132, 737, 1, 0, 0, 0, 134, 739, 1, 0, 0, 0, 136, 745, 1, 0, 0, 0, 138, 747, 1, 0, 0, 0, 140, 752, 1, 0, 0, 0, 142, 755, 1, 0, 0, 0, 144, 758, 1, 0, 0, 0, 146, 761, 1, 0, 0, 0, 148, 763, 1, 0, 0, 0, 150, 766, 1, 0, 0, 0, 152, 768, 1, 0, 0, 0, 154, 771, 1, 0, 0, 0, 156, 773, 1, 0, 0, 0, 158, 775, 1, 0, 0, 0, 160, 777, 1, 0, 0, 0, 162, 779, 1, 0, 0, 0, 164, 781, 1, 0, 0, 0, 166, 786, 1, 0, 0, 0, 168, 807, 1, 0, 0, 0, 170, 809, 1, 0, 0, 0, 172, 817, 1, 0, 0, 0, 174, 819, 1, 0, 0, 0, 176, 823, 1, 0, 0, 0, 178, 827, 1, 0, 0, 0, 180, 831, 1, 0, 0, 0, 182, 836, 1, 0, 0, 0, 184, 840, 1, 0, 0, 0, 186, 844, 1, 0, 0, 0, 188, 848, 1, 0, 0, 0, 190, 852, 1, 0, 0, 0, 192, 856, 1, 0, 0, 0, 194, 868, 1, 0, 0, 0, 196, 871, 1, 0, 0, 0, 198, 875, 1, 0, 0, 0, 200, 879, 1, 0, 0, 0, 202, 883, 1, 0, 0, 0, 204, 887, 1, 0, 0, 0, 206, 892, 1, 0, 0, 0, 208, 896, 1, 0, 0, 0, 210, 904, 1, 0, 0, 0, 212, 925, 1, 0, 0, 0, 214, 929, 1, 0, 0, 0, 216, 933, 1, 0, 0, 0, 218, 937, 1, 0, 0, 0, 220, 941, 1, 0, 0, 0, 222, 945, 1, 0, 0, 0, 224, 950, 1, 0, 0, 0, 226, 954, 1, 0, 0, 0, 228, 958, 1, 0, 0, 0, 230, 962, 1, 0, 0, 0, 232, 965, 1, 0, 0, 0, 234, 969, 1, 0, 0, 0, 236, 973, 1, 0, 0, 0, 238, 977, 1, 0, 0, 0, 240, 981, 1, 0, 0, 0, 242, 986, 1, 0, 0, 0, 244, 991, 1, 0, 0, 0, 246, 996, 1, 0, 0, 0, 248, 1003, 1, 0, 0, 0, 250, 1012, 1, 0, 0, 0, 252, 1019, 1, 0, 0, 0, 254, 1023, 1, 0, 0, 0, 256, 1027, 1, 0, 0, 0, 258, 1031, 1, 0, 0, 0, 260, 1035, 1, 0, 0, 0, 262, 1039, 1, 0, 0, 0, 264, 1045, 1, 0, 0, 0, 266, 1049, 1, 0, 0, 0, 268, 1053, 1, 0, 0, 0, 270, 1057, 1, 0, 0, 0, 272, 1061, 1, 0, 0, 0, 274, 1065, 1, 0, 0, 0, 276, 1069, 1, 0, 0, 0, 278, 1073, 1, 0, 0, 0, 280, 1077, 1, 0, 0, 0, 282, 1081, 1, 0, 0, 0, 284, 1086, 1, 0, 0, 0, 286, 1090, 1, 0, 0, 0, 288, 1094, 1, 0, 0, 0, 290, 1098, 1, 0, 0, 0, 292, 1102, 1, 0, 0, 0, 294, 1106, 1, 0, 0, 0, 296, 1110, 1, 0, 0, 0, 298, 1115, 1, 0, 0, 0, 300, 1120, 1, 0, 0, 0, 302, 1124, 1, 0, 0, 0, 304, 1128, 1, 0, 0, 0, 306, 1132, 1, 0, 0, 0, 308, 1137, 1, 0, 0, 0, 310, 1147, 1, 0, 0, 0, 312, 1151, 1, 0, 0, 0, 314, 1155, 1, 0, 0, 0, 316, 1159, 1, 0, 0, 0, 318, 1164, 1, 0, 0, 0, 320, 1171, 1, 0, 0, 0, 322, 1175, 1, 0, 0, 0, 324, 1179, 1, 0, 0, 0, 326, 1183, 1, 0, 0, 0, 328, 329, 7, 0, 0, 0, 329, 330, 7, 1, 0, 0, 330, 331, 7, 2, 0, 0, 331, 332, 7, 2, 0, 0, 332, 333, 7, 3, 0, 0, 333, 334, 7, 4, 0, 0, 334, 335, 7, 5, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 6, 0, 0, 0, 337, 13, 1, 0, 0, 0, 338, 339, 7, 0, 0, 0, 339, 340, 7, 6, 0, 0, 340, 341, 7, 7, 0, 0, 341, 342, 7, 8, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 6, 1, 1, 0, 344, 15, 1, 0, 0, 0, 345, 346, 7, 3, 0, 0, 346, 347, 7, 9, 0, 0, 347, 348, 7, 6, 0, 0, 348, 349, 7, 1, 0, 0, 349, 350, 7, 4, 0, 0, 350, 351, 7, 10, 0, 0, 351, 352, 1, 0, 0, 0, 352, 353, 6, 2, 2, 0, 353, 17, 1, 0, 0, 0, 354, 355, 7, 3, 0, 0, 355, 356, 7, 11, 0, 0, 356, 357, 7, 12, 0, 0, 357, 358, 7, 13, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 6, 3, 0, 0, 360, 19, 1, 0, 0, 0, 361, 362, 7, 3, 0, 0, 362, 363, 7, 14, 0, 0, 363, 364, 7, 8, 0, 0, 364, 365, 7, 13, 0, 0, 365, 366, 7, 12, 0, 0, 366, 367, 7, 1, 0, 0, 367, 368, 7, 9, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 6, 4, 3, 0, 370, 21, 1, 0, 0, 0, 371, 372, 7, 15, 0, 0, 372, 373, 7, 6, 0, 0, 373, 374, 7, 7, 0, 0, 374, 375, 7, 16, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 6, 5, 4, 0, 377, 23, 1, 0, 0, 0, 378, 379, 7, 17, 0, 0, 379, 380, 7, 6, 0, 0, 380, 381, 7, 7, 0, 0, 381, 382, 7, 18, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 6, 6, 0, 0, 384, 25, 1, 0, 0, 0, 385, 386, 7, 1, 0, 0, 386, 387, 7, 9, 0, 0, 387, 388, 7, 13, 0, 0, 388, 389, 7, 1, 0, 0, 389, 390, 7, 9, 0, 0, 390, 391, 7, 3, 0, 0, 391, 392, 7, 2, 0, 0, 392, 393, 7, 5, 0, 0, 393, 394, 7, 12, 0, 0, 394, 395, 7, 5, 0, 0, 395, 396, 7, 2, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 6, 7, 0, 0, 398, 27, 1, 0, 0, 0, 399, 400, 7, 18, 0, 0, 400, 401, 7, 3, 0, 0, 401, 402, 7, 3, 0, 0, 402, 403, 7, 8, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 6, 8, 1, 0, 405, 29, 1, 0, 0, 0, 406, 407, 7, 13, 0, 0, 407, 408, 7, 1, 0, 0, 408, 409, 7, 16, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 5, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 6, 9, 0, 0, 413, 31, 1, 0, 0, 0, 414, 415, 7, 16, 0, 0, 415, 416, 7, 3, 0, 0, 416, 417, 7, 5, 0, 0, 417, 418, 7, 12, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 6, 10, 5, 0, 420, 33, 1, 0, 0, 0, 421, 422, 7, 16, 0, 0, 422, 423, 7, 11, 0, 0, 423, 424, 5, 95, 0, 0, 424, 425, 7, 3, 0, 0, 425, 426, 7, 14, 0, 0, 426, 427, 7, 8, 0, 0, 427, 428, 7, 12, 0, 0, 428, 429, 7, 9, 0, 0, 429, 430, 7, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 6, 11, 6, 0, 432, 35, 1, 0, 0, 0, 433, 434, 7, 6, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 9, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 16, 0, 0, 438, 439, 7, 3, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 6, 12, 7, 0, 441, 37, 1, 0, 0, 0, 442, 443, 7, 6, 0, 0, 443, 444, 7, 7, 0, 0, 444, 445, 7, 19, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 6, 13, 0, 0, 447, 39, 1, 0, 0, 0, 448, 449, 7, 2, 0, 0, 449, 450, 7, 10, 0, 0, 450, 451, 7, 7, 0, 0, 451, 452, 7, 19, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 6, 14, 8, 0, 454, 41, 1, 0, 0, 0, 455, 456, 7, 2, 0, 0, 456, 457, 7, 7, 0, 0, 457, 458, 7, 6, 0, 0, 458, 459, 7, 5, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 6, 15, 0, 0, 461, 43, 1, 0, 0, 0, 462, 463, 7, 2, 0, 0, 463, 464, 7, 5, 0, 0, 464, 465, 7, 12, 0, 0, 465, 466, 7, 5, 0, 0, 466, 467, 7, 2, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 6, 16, 0, 0, 469, 45, 1, 0, 0, 0, 470, 471, 7, 19, 0, 0, 471, 472, 7, 10, 0, 0, 472, 473, 7, 3, 0, 0, 473, 474, 7, 6, 0, 0, 474, 475, 7, 3, 0, 0, 475, 476, 1, 0, 0, 0, 476, 477, 6, 17, 0, 0, 477, 47, 1, 0, 0, 0, 478, 480, 8, 20, 0, 0, 479, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 479, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 484, 6, 18, 0, 0, 484, 49, 1, 0, 0, 0, 485, 486, 5, 47, 0, 0, 486, 487, 5, 47, 0, 0, 487, 491, 1, 0, 0, 0, 488, 490, 8, 21, 0, 0, 489, 488, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 495, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 496, 5, 13, 0, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 498, 1, 0, 0, 0, 497, 499, 5, 10, 0, 0, 498, 497, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 501, 6, 19, 9, 0, 501, 51, 1, 0, 0, 0, 502, 503, 5, 47, 0, 0, 503, 504, 5, 42, 0, 0, 504, 509, 1, 0, 0, 0, 505, 508, 3, 52, 20, 0, 506, 508, 9, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 506, 1, 0, 0, 0, 508, 511, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 512, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 512, 513, 5, 42, 0, 0, 513, 514, 5, 47, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 6, 20, 9, 0, 516, 53, 1, 0, 0, 0, 517, 519, 7, 22, 0, 0, 518, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 6, 21, 9, 0, 523, 55, 1, 0, 0, 0, 524, 525, 3, 164, 76, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 22, 10, 0, 527, 528, 6, 22, 11, 0, 528, 57, 1, 0, 0, 0, 529, 530, 3, 66, 27, 0, 530, 531, 1, 0, 0, 0, 531, 532, 6, 23, 12, 0, 532, 533, 6, 23, 13, 0, 533, 59, 1, 0, 0, 0, 534, 535, 3, 54, 21, 0, 535, 536, 1, 0, 0, 0, 536, 537, 6, 24, 9, 0, 537, 61, 1, 0, 0, 0, 538, 539, 3, 50, 19, 0, 539, 540, 1, 0, 0, 0, 540, 541, 6, 25, 9, 0, 541, 63, 1, 0, 0, 0, 542, 543, 3, 52, 20, 0, 543, 544, 1, 0, 0, 0, 544, 545, 6, 26, 9, 0, 545, 65, 1, 0, 0, 0, 546, 547, 5, 124, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 6, 27, 13, 0, 549, 67, 1, 0, 0, 0, 550, 551, 7, 23, 0, 0, 551, 69, 1, 0, 0, 0, 552, 553, 7, 24, 0, 0, 553, 71, 1, 0, 0, 0, 554, 555, 5, 92, 0, 0, 555, 556, 7, 25, 0, 0, 556, 73, 1, 0, 0, 0, 557, 558, 8, 26, 0, 0, 558, 75, 1, 0, 0, 0, 559, 561, 7, 3, 0, 0, 560, 562, 7, 27, 0, 0, 561, 560, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 564, 1, 0, 0, 0, 563, 565, 3, 68, 28, 0, 564, 563, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 77, 1, 0, 0, 0, 568, 569, 5, 64, 0, 0, 569, 79, 1, 0, 0, 0, 570, 571, 5, 96, 0, 0, 571, 81, 1, 0, 0, 0, 572, 576, 8, 28, 0, 0, 573, 574, 5, 96, 0, 0, 574, 576, 5, 96, 0, 0, 575, 572, 1, 0, 0, 0, 575, 573, 1, 0, 0, 0, 576, 83, 1, 0, 0, 0, 577, 578, 5, 95, 0, 0, 578, 85, 1, 0, 0, 0, 579, 583, 3, 70, 29, 0, 580, 583, 3, 68, 28, 0, 581, 583, 3, 84, 36, 0, 582, 579, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 581, 1, 0, 0, 0, 583, 87, 1, 0, 0, 0, 584, 589, 5, 34, 0, 0, 585, 588, 3, 72, 30, 0, 586, 588, 3, 74, 31, 0, 587, 585, 1, 0, 0, 0, 587, 586, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 592, 614, 5, 34, 0, 0, 593, 594, 5, 34, 0, 0, 594, 595, 5, 34, 0, 0, 595, 596, 5, 34, 0, 0, 596, 600, 1, 0, 0, 0, 597, 599, 8, 21, 0, 0, 598, 597, 1, 0, 0, 0, 599, 602, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 603, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 603, 604, 5, 34, 0, 0, 604, 605, 5, 34, 0, 0, 605, 606, 5, 34, 0, 0, 606, 608, 1, 0, 0, 0, 607, 609, 5, 34, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 611, 1, 0, 0, 0, 610, 612, 5, 34, 0, 0, 611, 610, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 614, 1, 0, 0, 0, 613, 584, 1, 0, 0, 0, 613, 593, 1, 0, 0, 0, 614, 89, 1, 0, 0, 0, 615, 617, 3, 68, 28, 0, 616, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 91, 1, 0, 0, 0, 620, 622, 3, 68, 28, 0, 621, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 629, 3, 108, 48, 0, 626, 628, 3, 68, 28, 0, 627, 626, 1, 0, 0, 0, 628, 631, 1, 0, 0, 0, 629, 627, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 663, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 632, 634, 3, 108, 48, 0, 633, 635, 3, 68, 28, 0, 634, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 663, 1, 0, 0, 0, 638, 640, 3, 68, 28, 0, 639, 638, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 650, 1, 0, 0, 0, 643, 647, 3, 108, 48, 0, 644, 646, 3, 68, 28, 0, 645, 644, 1, 0, 0, 0, 646, 649, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 651, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 650, 643, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 3, 76, 32, 0, 653, 663, 1, 0, 0, 0, 654, 656, 3, 108, 48, 0, 655, 657, 3, 68, 28, 0, 656, 655, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 661, 3, 76, 32, 0, 661, 663, 1, 0, 0, 0, 662, 621, 1, 0, 0, 0, 662, 632, 1, 0, 0, 0, 662, 639, 1, 0, 0, 0, 662, 654, 1, 0, 0, 0, 663, 93, 1, 0, 0, 0, 664, 665, 7, 29, 0, 0, 665, 666, 7, 30, 0, 0, 666, 95, 1, 0, 0, 0, 667, 668, 7, 12, 0, 0, 668, 669, 7, 9, 0, 0, 669, 670, 7, 0, 0, 0, 670, 97, 1, 0, 0, 0, 671, 672, 7, 12, 0, 0, 672, 673, 7, 2, 0, 0, 673, 674, 7, 4, 0, 0, 674, 99, 1, 0, 0, 0, 675, 676, 5, 61, 0, 0, 676, 101, 1, 0, 0, 0, 677, 678, 5, 58, 0, 0, 678, 679, 5, 58, 0, 0, 679, 103, 1, 0, 0, 0, 680, 681, 5, 44, 0, 0, 681, 105, 1, 0, 0, 0, 682, 683, 7, 0, 0, 0, 683, 684, 7, 3, 0, 0, 684, 685, 7, 2, 0, 0, 685, 686, 7, 4, 0, 0, 686, 107, 1, 0, 0, 0, 687, 688, 5, 46, 0, 0, 688, 109, 1, 0, 0, 0, 689, 690, 7, 15, 0, 0, 690, 691, 7, 12, 0, 0, 691, 692, 7, 13, 0, 0, 692, 693, 7, 2, 0, 0, 693, 694, 7, 3, 0, 0, 694, 111, 1, 0, 0, 0, 695, 696, 7, 15, 0, 0, 696, 697, 7, 1, 0, 0, 697, 698, 7, 6, 0, 0, 698, 699, 7, 2, 0, 0, 699, 700, 7, 5, 0, 0, 700, 113, 1, 0, 0, 0, 701, 702, 7, 13, 0, 0, 702, 703, 7, 12, 0, 0, 703, 704, 7, 2, 0, 0, 704, 705, 7, 5, 0, 0, 705, 115, 1, 0, 0, 0, 706, 707, 5, 40, 0, 0, 707, 117, 1, 0, 0, 0, 708, 709, 7, 1, 0, 0, 709, 710, 7, 9, 0, 0, 710, 119, 1, 0, 0, 0, 711, 712, 7, 1, 0, 0, 712, 713, 7, 2, 0, 0, 713, 121, 1, 0, 0, 0, 714, 715, 7, 13, 0, 0, 715, 716, 7, 1, 0, 0, 716, 717, 7, 18, 0, 0, 717, 718, 7, 3, 0, 0, 718, 123, 1, 0, 0, 0, 719, 720, 7, 9, 0, 0, 720, 721, 7, 7, 0, 0, 721, 722, 7, 5, 0, 0, 722, 125, 1, 0, 0, 0, 723, 724, 7, 9, 0, 0, 724, 725, 7, 31, 0, 0, 725, 726, 7, 13, 0, 0, 726, 727, 7, 13, 0, 0, 727, 127, 1, 0, 0, 0, 728, 729, 7, 9, 0, 0, 729, 730, 7, 31, 0, 0, 730, 731, 7, 13, 0, 0, 731, 732, 7, 13, 0, 0, 732, 733, 7, 2, 0, 0, 733, 129, 1, 0, 0, 0, 734, 735, 7, 7, 0, 0, 735, 736, 7, 6, 0, 0, 736, 131, 1, 0, 0, 0, 737, 738, 5, 63, 0, 0, 738, 133, 1, 0, 0, 0, 739, 740, 7, 6, 0, 0, 740, 741, 7, 13, 0, 0, 741, 742, 7, 1, 0, 0, 742, 743, 7, 18, 0, 0, 743, 744, 7, 3, 0, 0, 744, 135, 1, 0, 0, 0, 745, 746, 5, 41, 0, 0, 746, 137, 1, 0, 0, 0, 747, 748, 7, 5, 0, 0, 748, 749, 7, 6, 0, 0, 749, 750, 7, 31, 0, 0, 750, 751, 7, 3, 0, 0, 751, 139, 1, 0, 0, 0, 752, 753, 5, 61, 0, 0, 753, 754, 5, 61, 0, 0, 754, 141, 1, 0, 0, 0, 755, 756, 5, 61, 0, 0, 756, 757, 5, 126, 0, 0, 757, 143, 1, 0, 0, 0, 758, 759, 5, 33, 0, 0, 759, 760, 5, 61, 0, 0, 760, 145, 1, 0, 0, 0, 761, 762, 5, 60, 0, 0, 762, 147, 1, 0, 0, 0, 763, 764, 5, 60, 0, 0, 764, 765, 5, 61, 0, 0, 765, 149, 1, 0, 0, 0, 766, 767, 5, 62, 0, 0, 767, 151, 1, 0, 0, 0, 768, 769, 5, 62, 0, 0, 769, 770, 5, 61, 0, 0, 770, 153, 1, 0, 0, 0, 771, 772, 5, 43, 0, 0, 772, 155, 1, 0, 0, 0, 773, 774, 5, 45, 0, 0, 774, 157, 1, 0, 0, 0, 775, 776, 5, 42, 0, 0, 776, 159, 1, 0, 0, 0, 777, 778, 5, 47, 0, 0, 778, 161, 1, 0, 0, 0, 779, 780, 5, 37, 0, 0, 780, 163, 1, 0, 0, 0, 781, 782, 5, 91, 0, 0, 782, 783, 1, 0, 0, 0, 783, 784, 6, 76, 0, 0, 784, 785, 6, 76, 0, 0, 785, 165, 1, 0, 0, 0, 786, 787, 5, 93, 0, 0, 787, 788, 1, 0, 0, 0, 788, 789, 6, 77, 13, 0, 789, 790, 6, 77, 13, 0, 790, 167, 1, 0, 0, 0, 791, 795, 3, 70, 29, 0, 792, 794, 3, 86, 37, 0, 793, 792, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 808, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 801, 3, 84, 36, 0, 799, 801, 3, 78, 33, 0, 800, 798, 1, 0, 0, 0, 800, 799, 1, 0, 0, 0, 801, 803, 1, 0, 0, 0, 802, 804, 3, 86, 37, 0, 803, 802, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 803, 1, 0, 0, 0, 805, 806, 1, 0, 0, 0, 806, 808, 1, 0, 0, 0, 807, 791, 1, 0, 0, 0, 807, 800, 1, 0, 0, 0, 808, 169, 1, 0, 0, 0, 809, 811, 3, 80, 34, 0, 810, 812, 3, 82, 35, 0, 811, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 811, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 816, 3, 80, 34, 0, 816, 171, 1, 0, 0, 0, 817, 818, 3, 170, 79, 0, 818, 173, 1, 0, 0, 0, 819, 820, 3, 50, 19, 0, 820, 821, 1, 0, 0, 0, 821, 822, 6, 81, 9, 0, 822, 175, 1, 0, 0, 0, 823, 824, 3, 52, 20, 0, 824, 825, 1, 0, 0, 0, 825, 826, 6, 82, 9, 0, 826, 177, 1, 0, 0, 0, 827, 828, 3, 54, 21, 0, 828, 829, 1, 0, 0, 0, 829, 830, 6, 83, 9, 0, 830, 179, 1, 0, 0, 0, 831, 832, 3, 66, 27, 0, 832, 833, 1, 0, 0, 0, 833, 834, 6, 84, 12, 0, 834, 835, 6, 84, 13, 0, 835, 181, 1, 0, 0, 0, 836, 837, 3, 164, 76, 0, 837, 838, 1, 0, 0, 0, 838, 839, 6, 85, 10, 0, 839, 183, 1, 0, 0, 0, 840, 841, 3, 166, 77, 0, 841, 842, 1, 0, 0, 0, 842, 843, 6, 86, 14, 0, 843, 185, 1, 0, 0, 0, 844, 845, 3, 104, 46, 0, 845, 846, 1, 0, 0, 0, 846, 847, 6, 87, 15, 0, 847, 187, 1, 0, 0, 0, 848, 849, 3, 100, 44, 0, 849, 850, 1, 0, 0, 0, 850, 851, 6, 88, 16, 0, 851, 189, 1, 0, 0, 0, 852, 853, 3, 88, 38, 0, 853, 854, 1, 0, 0, 0, 854, 855, 6, 89, 17, 0, 855, 191, 1, 0, 0, 0, 856, 857, 7, 16, 0, 0, 857, 858, 7, 3, 0, 0, 858, 859, 7, 5, 0, 0, 859, 860, 7, 12, 0, 0, 860, 861, 7, 0, 0, 0, 861, 862, 7, 12, 0, 0, 862, 863, 7, 5, 0, 0, 863, 864, 7, 12, 0, 0, 864, 193, 1, 0, 0, 0, 865, 869, 8, 32, 0, 0, 866, 867, 5, 47, 0, 0, 867, 869, 8, 33, 0, 0, 868, 865, 1, 0, 0, 0, 868, 866, 1, 0, 0, 0, 869, 195, 1, 0, 0, 0, 870, 872, 3, 194, 91, 0, 871, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 871, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 197, 1, 0, 0, 0, 875, 876, 3, 50, 19, 0, 876, 877, 1, 0, 0, 0, 877, 878, 6, 93, 9, 0, 878, 199, 1, 0, 0, 0, 879, 880, 3, 52, 20, 0, 880, 881, 1, 0, 0, 0, 881, 882, 6, 94, 9, 0, 882, 201, 1, 0, 0, 0, 883, 884, 3, 54, 21, 0, 884, 885, 1, 0, 0, 0, 885, 886, 6, 95, 9, 0, 886, 203, 1, 0, 0, 0, 887, 888, 3, 66, 27, 0, 888, 889, 1, 0, 0, 0, 889, 890, 6, 96, 12, 0, 890, 891, 6, 96, 13, 0, 891, 205, 1, 0, 0, 0, 892, 893, 3, 108, 48, 0, 893, 894, 1, 0, 0, 0, 894, 895, 6, 97, 18, 0, 895, 207, 1, 0, 0, 0, 896, 897, 3, 104, 46, 0, 897, 898, 1, 0, 0, 0, 898, 899, 6, 98, 15, 0, 899, 209, 1, 0, 0, 0, 900, 905, 3, 70, 29, 0, 901, 905, 3, 68, 28, 0, 902, 905, 3, 84, 36, 0, 903, 905, 3, 158, 73, 0, 904, 900, 1, 0, 0, 0, 904, 901, 1, 0, 0, 0, 904, 902, 1, 0, 0, 0, 904, 903, 1, 0, 0, 0, 905, 211, 1, 0, 0, 0, 906, 909, 3, 70, 29, 0, 907, 909, 3, 158, 73, 0, 908, 906, 1, 0, 0, 0, 908, 907, 1, 0, 0, 0, 909, 913, 1, 0, 0, 0, 910, 912, 3, 210, 99, 0, 911, 910, 1, 0, 0, 0, 912, 915, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 926, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 916, 919, 3, 84, 36, 0, 917, 919, 3, 78, 33, 0, 918, 916, 1, 0, 0, 0, 918, 917, 1, 0, 0, 0, 919, 921, 1, 0, 0, 0, 920, 922, 3, 210, 99, 0, 921, 920, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 921, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 926, 1, 0, 0, 0, 925, 908, 1, 0, 0, 0, 925, 918, 1, 0, 0, 0, 926, 213, 1, 0, 0, 0, 927, 930, 3, 212, 100, 0, 928, 930, 3, 170, 79, 0, 929, 927, 1, 0, 0, 0, 929, 928, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 215, 1, 0, 0, 0, 933, 934, 3, 50, 19, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 102, 9, 0, 936, 217, 1, 0, 0, 0, 937, 938, 3, 52, 20, 0, 938, 939, 1, 0, 0, 0, 939, 940, 6, 103, 9, 0, 940, 219, 1, 0, 0, 0, 941, 942, 3, 54, 21, 0, 942, 943, 1, 0, 0, 0, 943, 944, 6, 104, 9, 0, 944, 221, 1, 0, 0, 0, 945, 946, 3, 66, 27, 0, 946, 947, 1, 0, 0, 0, 947, 948, 6, 105, 12, 0, 948, 949, 6, 105, 13, 0, 949, 223, 1, 0, 0, 0, 950, 951, 3, 100, 44, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 106, 16, 0, 953, 225, 1, 0, 0, 0, 954, 955, 3, 104, 46, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 107, 15, 0, 957, 227, 1, 0, 0, 0, 958, 959, 3, 108, 48, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 108, 18, 0, 961, 229, 1, 0, 0, 0, 962, 963, 7, 12, 0, 0, 963, 964, 7, 2, 0, 0, 964, 231, 1, 0, 0, 0, 965, 966, 3, 214, 101, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 110, 19, 0, 968, 233, 1, 0, 0, 0, 969, 970, 3, 50, 19, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 111, 9, 0, 972, 235, 1, 0, 0, 0, 973, 974, 3, 52, 20, 0, 974, 975, 1, 0, 0, 0, 975, 976, 6, 112, 9, 0, 976, 237, 1, 0, 0, 0, 977, 978, 3, 54, 21, 0, 978, 979, 1, 0, 0, 0, 979, 980, 6, 113, 9, 0, 980, 239, 1, 0, 0, 0, 981, 982, 3, 66, 27, 0, 982, 983, 1, 0, 0, 0, 983, 984, 6, 114, 12, 0, 984, 985, 6, 114, 13, 0, 985, 241, 1, 0, 0, 0, 986, 987, 3, 164, 76, 0, 987, 988, 1, 0, 0, 0, 988, 989, 6, 115, 10, 0, 989, 990, 6, 115, 20, 0, 990, 243, 1, 0, 0, 0, 991, 992, 7, 7, 0, 0, 992, 993, 7, 9, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 6, 116, 21, 0, 995, 245, 1, 0, 0, 0, 996, 997, 7, 19, 0, 0, 997, 998, 7, 1, 0, 0, 998, 999, 7, 5, 0, 0, 999, 1000, 7, 10, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 6, 117, 21, 0, 1002, 247, 1, 0, 0, 0, 1003, 1004, 8, 34, 0, 0, 1004, 249, 1, 0, 0, 0, 1005, 1007, 3, 248, 118, 0, 1006, 1005, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 3, 318, 153, 0, 1011, 1013, 1, 0, 0, 0, 1012, 1006, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1015, 1, 0, 0, 0, 1014, 1016, 3, 248, 118, 0, 1015, 1014, 1, 0, 0, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 251, 1, 0, 0, 0, 1019, 1020, 3, 172, 80, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 6, 120, 22, 0, 1022, 253, 1, 0, 0, 0, 1023, 1024, 3, 250, 119, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 121, 23, 0, 1026, 255, 1, 0, 0, 0, 1027, 1028, 3, 50, 19, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 122, 9, 0, 1030, 257, 1, 0, 0, 0, 1031, 1032, 3, 52, 20, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 6, 123, 9, 0, 1034, 259, 1, 0, 0, 0, 1035, 1036, 3, 54, 21, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 124, 9, 0, 1038, 261, 1, 0, 0, 0, 1039, 1040, 3, 66, 27, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 125, 12, 0, 1042, 1043, 6, 125, 13, 0, 1043, 1044, 6, 125, 13, 0, 1044, 263, 1, 0, 0, 0, 1045, 1046, 3, 100, 44, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1048, 6, 126, 16, 0, 1048, 265, 1, 0, 0, 0, 1049, 1050, 3, 104, 46, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1052, 6, 127, 15, 0, 1052, 267, 1, 0, 0, 0, 1053, 1054, 3, 108, 48, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1056, 6, 128, 18, 0, 1056, 269, 1, 0, 0, 0, 1057, 1058, 3, 246, 117, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 6, 129, 24, 0, 1060, 271, 1, 0, 0, 0, 1061, 1062, 3, 214, 101, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1064, 6, 130, 19, 0, 1064, 273, 1, 0, 0, 0, 1065, 1066, 3, 172, 80, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 6, 131, 22, 0, 1068, 275, 1, 0, 0, 0, 1069, 1070, 3, 50, 19, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1072, 6, 132, 9, 0, 1072, 277, 1, 0, 0, 0, 1073, 1074, 3, 52, 20, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 133, 9, 0, 1076, 279, 1, 0, 0, 0, 1077, 1078, 3, 54, 21, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 6, 134, 9, 0, 1080, 281, 1, 0, 0, 0, 1081, 1082, 3, 66, 27, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 135, 12, 0, 1084, 1085, 6, 135, 13, 0, 1085, 283, 1, 0, 0, 0, 1086, 1087, 3, 108, 48, 0, 1087, 1088, 1, 0, 0, 0, 1088, 1089, 6, 136, 18, 0, 1089, 285, 1, 0, 0, 0, 1090, 1091, 3, 172, 80, 0, 1091, 1092, 1, 0, 0, 0, 1092, 1093, 6, 137, 22, 0, 1093, 287, 1, 0, 0, 0, 1094, 1095, 3, 168, 78, 0, 1095, 1096, 1, 0, 0, 0, 1096, 1097, 6, 138, 25, 0, 1097, 289, 1, 0, 0, 0, 1098, 1099, 3, 50, 19, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 6, 139, 9, 0, 1101, 291, 1, 0, 0, 0, 1102, 1103, 3, 52, 20, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1105, 6, 140, 9, 0, 1105, 293, 1, 0, 0, 0, 1106, 1107, 3, 54, 21, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 141, 9, 0, 1109, 295, 1, 0, 0, 0, 1110, 1111, 3, 66, 27, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1113, 6, 142, 12, 0, 1113, 1114, 6, 142, 13, 0, 1114, 297, 1, 0, 0, 0, 1115, 1116, 7, 1, 0, 0, 1116, 1117, 7, 9, 0, 0, 1117, 1118, 7, 15, 0, 0, 1118, 1119, 7, 7, 0, 0, 1119, 299, 1, 0, 0, 0, 1120, 1121, 3, 50, 19, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 144, 9, 0, 1123, 301, 1, 0, 0, 0, 1124, 1125, 3, 52, 20, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 145, 9, 0, 1127, 303, 1, 0, 0, 0, 1128, 1129, 3, 54, 21, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1131, 6, 146, 9, 0, 1131, 305, 1, 0, 0, 0, 1132, 1133, 3, 66, 27, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 147, 12, 0, 1135, 1136, 6, 147, 13, 0, 1136, 307, 1, 0, 0, 0, 1137, 1138, 7, 15, 0, 0, 1138, 1139, 7, 31, 0, 0, 1139, 1140, 7, 9, 0, 0, 1140, 1141, 7, 4, 0, 0, 1141, 1142, 7, 5, 0, 0, 1142, 1143, 7, 1, 0, 0, 1143, 1144, 7, 7, 0, 0, 1144, 1145, 7, 9, 0, 0, 1145, 1146, 7, 2, 0, 0, 1146, 309, 1, 0, 0, 0, 1147, 1148, 3, 50, 19, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1150, 6, 149, 9, 0, 1150, 311, 1, 0, 0, 0, 1151, 1152, 3, 52, 20, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, 6, 150, 9, 0, 1154, 313, 1, 0, 0, 0, 1155, 1156, 3, 54, 21, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 6, 151, 9, 0, 1158, 315, 1, 0, 0, 0, 1159, 1160, 3, 166, 77, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 6, 152, 14, 0, 1162, 1163, 6, 152, 13, 0, 1163, 317, 1, 0, 0, 0, 1164, 1165, 5, 58, 0, 0, 1165, 319, 1, 0, 0, 0, 1166, 1172, 3, 78, 33, 0, 1167, 1172, 3, 68, 28, 0, 1168, 1172, 3, 108, 48, 0, 1169, 1172, 3, 70, 29, 0, 1170, 1172, 3, 84, 36, 0, 1171, 1166, 1, 0, 0, 0, 1171, 1167, 1, 0, 0, 0, 1171, 1168, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 321, 1, 0, 0, 0, 1175, 1176, 3, 50, 19, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 6, 155, 9, 0, 1178, 323, 1, 0, 0, 0, 1179, 1180, 3, 52, 20, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 6, 156, 9, 0, 1182, 325, 1, 0, 0, 0, 1183, 1184, 3, 54, 21, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 6, 157, 9, 0, 1186, 327, 1, 0, 0, 0, 58, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 481, 491, 495, 498, 507, 509, 520, 561, 566, 575, 582, 587, 589, 600, 608, 611, 613, 618, 623, 629, 636, 641, 647, 650, 658, 662, 795, 800, 805, 807, 813, 868, 873, 904, 908, 913, 918, 923, 925, 929, 931, 1008, 1012, 1017, 1171, 1173, 26, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 65, 0, 5, 0, 0, 7, 26, 0, 4, 0, 0, 7, 66, 0, 7, 35, 0, 7, 33, 0, 7, 27, 0, 7, 37, 0, 7, 77, 0, 5, 11, 0, 5, 7, 0, 7, 68, 0, 7, 87, 0, 7, 86, 0, 7, 67, 0] \ No newline at end of file +[4, 0, 116, 1297, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 522, 8, 19, 11, 19, 12, 19, 523, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 532, 8, 20, 10, 20, 12, 20, 535, 9, 20, 1, 20, 3, 20, 538, 8, 20, 1, 20, 3, 20, 541, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 550, 8, 21, 10, 21, 12, 21, 553, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 4, 22, 561, 8, 22, 11, 22, 12, 22, 562, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 3, 23, 570, 8, 23, 1, 24, 4, 24, 573, 8, 24, 11, 24, 12, 24, 574, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 3, 35, 614, 8, 35, 1, 35, 4, 35, 617, 8, 35, 11, 35, 12, 35, 618, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 3, 38, 628, 8, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 635, 8, 40, 1, 41, 1, 41, 1, 41, 5, 41, 640, 8, 41, 10, 41, 12, 41, 643, 9, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 651, 8, 41, 10, 41, 12, 41, 654, 9, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 661, 8, 41, 1, 41, 3, 41, 664, 8, 41, 3, 41, 666, 8, 41, 1, 42, 4, 42, 669, 8, 42, 11, 42, 12, 42, 670, 1, 43, 4, 43, 674, 8, 43, 11, 43, 12, 43, 675, 1, 43, 1, 43, 5, 43, 680, 8, 43, 10, 43, 12, 43, 683, 9, 43, 1, 43, 1, 43, 4, 43, 687, 8, 43, 11, 43, 12, 43, 688, 1, 43, 4, 43, 692, 8, 43, 11, 43, 12, 43, 693, 1, 43, 1, 43, 5, 43, 698, 8, 43, 10, 43, 12, 43, 701, 9, 43, 3, 43, 703, 8, 43, 1, 43, 1, 43, 1, 43, 1, 43, 4, 43, 709, 8, 43, 11, 43, 12, 43, 710, 1, 43, 1, 43, 3, 43, 715, 8, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 5, 81, 846, 8, 81, 10, 81, 12, 81, 849, 9, 81, 1, 81, 1, 81, 3, 81, 853, 8, 81, 1, 81, 4, 81, 856, 8, 81, 11, 81, 12, 81, 857, 3, 81, 860, 8, 81, 1, 82, 1, 82, 4, 82, 864, 8, 82, 11, 82, 12, 82, 865, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 951, 8, 101, 1, 102, 1, 102, 3, 102, 955, 8, 102, 1, 102, 5, 102, 958, 8, 102, 10, 102, 12, 102, 961, 9, 102, 1, 102, 1, 102, 3, 102, 965, 8, 102, 1, 102, 4, 102, 968, 8, 102, 11, 102, 12, 102, 969, 3, 102, 972, 8, 102, 1, 103, 1, 103, 4, 103, 976, 8, 103, 11, 103, 12, 103, 977, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 4, 121, 1053, 8, 121, 11, 121, 12, 121, 1054, 1, 121, 1, 121, 3, 121, 1059, 8, 121, 1, 121, 4, 121, 1062, 8, 121, 11, 121, 12, 121, 1063, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 4, 156, 1218, 8, 156, 11, 156, 12, 156, 1219, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 2, 551, 652, 0, 173, 14, 1, 16, 2, 18, 3, 20, 4, 22, 5, 24, 6, 26, 7, 28, 8, 30, 9, 32, 10, 34, 11, 36, 12, 38, 13, 40, 14, 42, 15, 44, 16, 46, 17, 48, 18, 50, 19, 52, 20, 54, 21, 56, 22, 58, 23, 60, 0, 62, 24, 64, 0, 66, 0, 68, 25, 70, 26, 72, 27, 74, 28, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 29, 98, 30, 100, 31, 102, 32, 104, 33, 106, 34, 108, 35, 110, 36, 112, 37, 114, 38, 116, 39, 118, 40, 120, 41, 122, 42, 124, 43, 126, 44, 128, 45, 130, 46, 132, 47, 134, 48, 136, 49, 138, 50, 140, 51, 142, 52, 144, 53, 146, 54, 148, 55, 150, 56, 152, 57, 154, 58, 156, 59, 158, 60, 160, 61, 162, 62, 164, 63, 166, 64, 168, 65, 170, 66, 172, 67, 174, 68, 176, 69, 178, 0, 180, 70, 182, 71, 184, 72, 186, 73, 188, 0, 190, 0, 192, 0, 194, 0, 196, 0, 198, 0, 200, 74, 202, 0, 204, 75, 206, 76, 208, 77, 210, 0, 212, 0, 214, 0, 216, 0, 218, 0, 220, 78, 222, 79, 224, 80, 226, 81, 228, 0, 230, 0, 232, 0, 234, 0, 236, 82, 238, 0, 240, 83, 242, 84, 244, 85, 246, 0, 248, 0, 250, 86, 252, 87, 254, 0, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 91, 268, 0, 270, 0, 272, 0, 274, 0, 276, 0, 278, 0, 280, 0, 282, 92, 284, 93, 286, 94, 288, 0, 290, 0, 292, 0, 294, 0, 296, 95, 298, 96, 300, 97, 302, 0, 304, 98, 306, 99, 308, 100, 310, 101, 312, 0, 314, 102, 316, 103, 318, 104, 320, 105, 322, 0, 324, 106, 326, 107, 328, 108, 330, 109, 332, 110, 334, 0, 336, 0, 338, 111, 340, 112, 342, 113, 344, 0, 346, 114, 348, 115, 350, 116, 352, 0, 354, 0, 356, 0, 358, 0, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 2, 0, 85, 85, 117, 117, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1322, 0, 14, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 1, 64, 1, 0, 0, 0, 1, 66, 1, 0, 0, 0, 1, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 2, 74, 1, 0, 0, 0, 2, 96, 1, 0, 0, 0, 2, 98, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 3, 190, 1, 0, 0, 0, 3, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 4, 210, 1, 0, 0, 0, 4, 212, 1, 0, 0, 0, 4, 214, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 6, 246, 1, 0, 0, 0, 6, 248, 1, 0, 0, 0, 6, 250, 1, 0, 0, 0, 6, 252, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 7, 268, 1, 0, 0, 0, 7, 270, 1, 0, 0, 0, 7, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 8, 288, 1, 0, 0, 0, 8, 290, 1, 0, 0, 0, 8, 292, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 9, 302, 1, 0, 0, 0, 9, 304, 1, 0, 0, 0, 9, 306, 1, 0, 0, 0, 9, 308, 1, 0, 0, 0, 9, 310, 1, 0, 0, 0, 10, 312, 1, 0, 0, 0, 10, 314, 1, 0, 0, 0, 10, 316, 1, 0, 0, 0, 10, 318, 1, 0, 0, 0, 10, 320, 1, 0, 0, 0, 11, 322, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 11, 326, 1, 0, 0, 0, 11, 328, 1, 0, 0, 0, 11, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 12, 334, 1, 0, 0, 0, 12, 336, 1, 0, 0, 0, 12, 338, 1, 0, 0, 0, 12, 340, 1, 0, 0, 0, 12, 342, 1, 0, 0, 0, 13, 344, 1, 0, 0, 0, 13, 346, 1, 0, 0, 0, 13, 348, 1, 0, 0, 0, 13, 350, 1, 0, 0, 0, 13, 352, 1, 0, 0, 0, 13, 354, 1, 0, 0, 0, 13, 356, 1, 0, 0, 0, 13, 358, 1, 0, 0, 0, 14, 360, 1, 0, 0, 0, 16, 370, 1, 0, 0, 0, 18, 377, 1, 0, 0, 0, 20, 386, 1, 0, 0, 0, 22, 393, 1, 0, 0, 0, 24, 403, 1, 0, 0, 0, 26, 410, 1, 0, 0, 0, 28, 417, 1, 0, 0, 0, 30, 431, 1, 0, 0, 0, 32, 438, 1, 0, 0, 0, 34, 446, 1, 0, 0, 0, 36, 453, 1, 0, 0, 0, 38, 463, 1, 0, 0, 0, 40, 475, 1, 0, 0, 0, 42, 484, 1, 0, 0, 0, 44, 490, 1, 0, 0, 0, 46, 497, 1, 0, 0, 0, 48, 504, 1, 0, 0, 0, 50, 512, 1, 0, 0, 0, 52, 521, 1, 0, 0, 0, 54, 527, 1, 0, 0, 0, 56, 544, 1, 0, 0, 0, 58, 560, 1, 0, 0, 0, 60, 569, 1, 0, 0, 0, 62, 572, 1, 0, 0, 0, 64, 576, 1, 0, 0, 0, 66, 581, 1, 0, 0, 0, 68, 586, 1, 0, 0, 0, 70, 590, 1, 0, 0, 0, 72, 594, 1, 0, 0, 0, 74, 598, 1, 0, 0, 0, 76, 602, 1, 0, 0, 0, 78, 604, 1, 0, 0, 0, 80, 606, 1, 0, 0, 0, 82, 609, 1, 0, 0, 0, 84, 611, 1, 0, 0, 0, 86, 620, 1, 0, 0, 0, 88, 622, 1, 0, 0, 0, 90, 627, 1, 0, 0, 0, 92, 629, 1, 0, 0, 0, 94, 634, 1, 0, 0, 0, 96, 665, 1, 0, 0, 0, 98, 668, 1, 0, 0, 0, 100, 714, 1, 0, 0, 0, 102, 716, 1, 0, 0, 0, 104, 719, 1, 0, 0, 0, 106, 723, 1, 0, 0, 0, 108, 727, 1, 0, 0, 0, 110, 729, 1, 0, 0, 0, 112, 732, 1, 0, 0, 0, 114, 734, 1, 0, 0, 0, 116, 739, 1, 0, 0, 0, 118, 741, 1, 0, 0, 0, 120, 747, 1, 0, 0, 0, 122, 753, 1, 0, 0, 0, 124, 758, 1, 0, 0, 0, 126, 760, 1, 0, 0, 0, 128, 763, 1, 0, 0, 0, 130, 766, 1, 0, 0, 0, 132, 771, 1, 0, 0, 0, 134, 775, 1, 0, 0, 0, 136, 780, 1, 0, 0, 0, 138, 786, 1, 0, 0, 0, 140, 789, 1, 0, 0, 0, 142, 791, 1, 0, 0, 0, 144, 797, 1, 0, 0, 0, 146, 799, 1, 0, 0, 0, 148, 804, 1, 0, 0, 0, 150, 807, 1, 0, 0, 0, 152, 810, 1, 0, 0, 0, 154, 813, 1, 0, 0, 0, 156, 815, 1, 0, 0, 0, 158, 818, 1, 0, 0, 0, 160, 820, 1, 0, 0, 0, 162, 823, 1, 0, 0, 0, 164, 825, 1, 0, 0, 0, 166, 827, 1, 0, 0, 0, 168, 829, 1, 0, 0, 0, 170, 831, 1, 0, 0, 0, 172, 833, 1, 0, 0, 0, 174, 838, 1, 0, 0, 0, 176, 859, 1, 0, 0, 0, 178, 861, 1, 0, 0, 0, 180, 869, 1, 0, 0, 0, 182, 871, 1, 0, 0, 0, 184, 875, 1, 0, 0, 0, 186, 879, 1, 0, 0, 0, 188, 883, 1, 0, 0, 0, 190, 888, 1, 0, 0, 0, 192, 892, 1, 0, 0, 0, 194, 896, 1, 0, 0, 0, 196, 900, 1, 0, 0, 0, 198, 904, 1, 0, 0, 0, 200, 908, 1, 0, 0, 0, 202, 917, 1, 0, 0, 0, 204, 921, 1, 0, 0, 0, 206, 925, 1, 0, 0, 0, 208, 929, 1, 0, 0, 0, 210, 933, 1, 0, 0, 0, 212, 938, 1, 0, 0, 0, 214, 942, 1, 0, 0, 0, 216, 950, 1, 0, 0, 0, 218, 971, 1, 0, 0, 0, 220, 975, 1, 0, 0, 0, 222, 979, 1, 0, 0, 0, 224, 983, 1, 0, 0, 0, 226, 987, 1, 0, 0, 0, 228, 991, 1, 0, 0, 0, 230, 996, 1, 0, 0, 0, 232, 1000, 1, 0, 0, 0, 234, 1004, 1, 0, 0, 0, 236, 1008, 1, 0, 0, 0, 238, 1011, 1, 0, 0, 0, 240, 1015, 1, 0, 0, 0, 242, 1019, 1, 0, 0, 0, 244, 1023, 1, 0, 0, 0, 246, 1027, 1, 0, 0, 0, 248, 1032, 1, 0, 0, 0, 250, 1037, 1, 0, 0, 0, 252, 1042, 1, 0, 0, 0, 254, 1049, 1, 0, 0, 0, 256, 1058, 1, 0, 0, 0, 258, 1065, 1, 0, 0, 0, 260, 1069, 1, 0, 0, 0, 262, 1073, 1, 0, 0, 0, 264, 1077, 1, 0, 0, 0, 266, 1081, 1, 0, 0, 0, 268, 1085, 1, 0, 0, 0, 270, 1091, 1, 0, 0, 0, 272, 1095, 1, 0, 0, 0, 274, 1099, 1, 0, 0, 0, 276, 1103, 1, 0, 0, 0, 278, 1107, 1, 0, 0, 0, 280, 1111, 1, 0, 0, 0, 282, 1115, 1, 0, 0, 0, 284, 1119, 1, 0, 0, 0, 286, 1123, 1, 0, 0, 0, 288, 1127, 1, 0, 0, 0, 290, 1132, 1, 0, 0, 0, 292, 1136, 1, 0, 0, 0, 294, 1140, 1, 0, 0, 0, 296, 1144, 1, 0, 0, 0, 298, 1148, 1, 0, 0, 0, 300, 1152, 1, 0, 0, 0, 302, 1156, 1, 0, 0, 0, 304, 1161, 1, 0, 0, 0, 306, 1166, 1, 0, 0, 0, 308, 1170, 1, 0, 0, 0, 310, 1174, 1, 0, 0, 0, 312, 1178, 1, 0, 0, 0, 314, 1183, 1, 0, 0, 0, 316, 1193, 1, 0, 0, 0, 318, 1197, 1, 0, 0, 0, 320, 1201, 1, 0, 0, 0, 322, 1205, 1, 0, 0, 0, 324, 1210, 1, 0, 0, 0, 326, 1217, 1, 0, 0, 0, 328, 1221, 1, 0, 0, 0, 330, 1225, 1, 0, 0, 0, 332, 1229, 1, 0, 0, 0, 334, 1233, 1, 0, 0, 0, 336, 1238, 1, 0, 0, 0, 338, 1244, 1, 0, 0, 0, 340, 1248, 1, 0, 0, 0, 342, 1252, 1, 0, 0, 0, 344, 1256, 1, 0, 0, 0, 346, 1262, 1, 0, 0, 0, 348, 1266, 1, 0, 0, 0, 350, 1270, 1, 0, 0, 0, 352, 1274, 1, 0, 0, 0, 354, 1280, 1, 0, 0, 0, 356, 1286, 1, 0, 0, 0, 358, 1292, 1, 0, 0, 0, 360, 361, 7, 0, 0, 0, 361, 362, 7, 1, 0, 0, 362, 363, 7, 2, 0, 0, 363, 364, 7, 2, 0, 0, 364, 365, 7, 3, 0, 0, 365, 366, 7, 4, 0, 0, 366, 367, 7, 5, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 6, 0, 0, 0, 369, 15, 1, 0, 0, 0, 370, 371, 7, 0, 0, 0, 371, 372, 7, 6, 0, 0, 372, 373, 7, 7, 0, 0, 373, 374, 7, 8, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 6, 1, 1, 0, 376, 17, 1, 0, 0, 0, 377, 378, 7, 3, 0, 0, 378, 379, 7, 9, 0, 0, 379, 380, 7, 6, 0, 0, 380, 381, 7, 1, 0, 0, 381, 382, 7, 4, 0, 0, 382, 383, 7, 10, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 6, 2, 2, 0, 385, 19, 1, 0, 0, 0, 386, 387, 7, 3, 0, 0, 387, 388, 7, 11, 0, 0, 388, 389, 7, 12, 0, 0, 389, 390, 7, 13, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 6, 3, 0, 0, 392, 21, 1, 0, 0, 0, 393, 394, 7, 3, 0, 0, 394, 395, 7, 14, 0, 0, 395, 396, 7, 8, 0, 0, 396, 397, 7, 13, 0, 0, 397, 398, 7, 12, 0, 0, 398, 399, 7, 1, 0, 0, 399, 400, 7, 9, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 6, 4, 3, 0, 402, 23, 1, 0, 0, 0, 403, 404, 7, 15, 0, 0, 404, 405, 7, 6, 0, 0, 405, 406, 7, 7, 0, 0, 406, 407, 7, 16, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 6, 5, 4, 0, 409, 25, 1, 0, 0, 0, 410, 411, 7, 17, 0, 0, 411, 412, 7, 6, 0, 0, 412, 413, 7, 7, 0, 0, 413, 414, 7, 18, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 6, 6, 0, 0, 416, 27, 1, 0, 0, 0, 417, 418, 7, 1, 0, 0, 418, 419, 7, 9, 0, 0, 419, 420, 7, 13, 0, 0, 420, 421, 7, 1, 0, 0, 421, 422, 7, 9, 0, 0, 422, 423, 7, 3, 0, 0, 423, 424, 7, 2, 0, 0, 424, 425, 7, 5, 0, 0, 425, 426, 7, 12, 0, 0, 426, 427, 7, 5, 0, 0, 427, 428, 7, 2, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 6, 7, 0, 0, 430, 29, 1, 0, 0, 0, 431, 432, 7, 18, 0, 0, 432, 433, 7, 3, 0, 0, 433, 434, 7, 3, 0, 0, 434, 435, 7, 8, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 6, 8, 1, 0, 437, 31, 1, 0, 0, 0, 438, 439, 7, 13, 0, 0, 439, 440, 7, 1, 0, 0, 440, 441, 7, 16, 0, 0, 441, 442, 7, 1, 0, 0, 442, 443, 7, 5, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 6, 9, 0, 0, 445, 33, 1, 0, 0, 0, 446, 447, 7, 16, 0, 0, 447, 448, 7, 3, 0, 0, 448, 449, 7, 5, 0, 0, 449, 450, 7, 12, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 10, 5, 0, 452, 35, 1, 0, 0, 0, 453, 454, 7, 16, 0, 0, 454, 455, 7, 3, 0, 0, 455, 456, 7, 5, 0, 0, 456, 457, 7, 6, 0, 0, 457, 458, 7, 1, 0, 0, 458, 459, 7, 4, 0, 0, 459, 460, 7, 2, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 6, 11, 6, 0, 462, 37, 1, 0, 0, 0, 463, 464, 7, 16, 0, 0, 464, 465, 7, 11, 0, 0, 465, 466, 5, 95, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 14, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 7, 12, 0, 0, 470, 471, 7, 9, 0, 0, 471, 472, 7, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 6, 12, 7, 0, 474, 39, 1, 0, 0, 0, 475, 476, 7, 6, 0, 0, 476, 477, 7, 3, 0, 0, 477, 478, 7, 9, 0, 0, 478, 479, 7, 12, 0, 0, 479, 480, 7, 16, 0, 0, 480, 481, 7, 3, 0, 0, 481, 482, 1, 0, 0, 0, 482, 483, 6, 13, 8, 0, 483, 41, 1, 0, 0, 0, 484, 485, 7, 6, 0, 0, 485, 486, 7, 7, 0, 0, 486, 487, 7, 19, 0, 0, 487, 488, 1, 0, 0, 0, 488, 489, 6, 14, 0, 0, 489, 43, 1, 0, 0, 0, 490, 491, 7, 2, 0, 0, 491, 492, 7, 10, 0, 0, 492, 493, 7, 7, 0, 0, 493, 494, 7, 19, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 6, 15, 9, 0, 496, 45, 1, 0, 0, 0, 497, 498, 7, 2, 0, 0, 498, 499, 7, 7, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 5, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 6, 16, 0, 0, 503, 47, 1, 0, 0, 0, 504, 505, 7, 2, 0, 0, 505, 506, 7, 5, 0, 0, 506, 507, 7, 12, 0, 0, 507, 508, 7, 5, 0, 0, 508, 509, 7, 2, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 6, 17, 0, 0, 511, 49, 1, 0, 0, 0, 512, 513, 7, 19, 0, 0, 513, 514, 7, 10, 0, 0, 514, 515, 7, 3, 0, 0, 515, 516, 7, 6, 0, 0, 516, 517, 7, 3, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 6, 18, 0, 0, 519, 51, 1, 0, 0, 0, 520, 522, 8, 20, 0, 0, 521, 520, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 6, 19, 0, 0, 526, 53, 1, 0, 0, 0, 527, 528, 5, 47, 0, 0, 528, 529, 5, 47, 0, 0, 529, 533, 1, 0, 0, 0, 530, 532, 8, 21, 0, 0, 531, 530, 1, 0, 0, 0, 532, 535, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 537, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 536, 538, 5, 13, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 540, 1, 0, 0, 0, 539, 541, 5, 10, 0, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 20, 10, 0, 543, 55, 1, 0, 0, 0, 544, 545, 5, 47, 0, 0, 545, 546, 5, 42, 0, 0, 546, 551, 1, 0, 0, 0, 547, 550, 3, 56, 21, 0, 548, 550, 9, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 555, 5, 42, 0, 0, 555, 556, 5, 47, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 21, 10, 0, 558, 57, 1, 0, 0, 0, 559, 561, 7, 22, 0, 0, 560, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 6, 22, 10, 0, 565, 59, 1, 0, 0, 0, 566, 570, 8, 23, 0, 0, 567, 568, 5, 47, 0, 0, 568, 570, 8, 24, 0, 0, 569, 566, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 570, 61, 1, 0, 0, 0, 571, 573, 3, 60, 23, 0, 572, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 572, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 63, 1, 0, 0, 0, 576, 577, 3, 172, 79, 0, 577, 578, 1, 0, 0, 0, 578, 579, 6, 25, 11, 0, 579, 580, 6, 25, 12, 0, 580, 65, 1, 0, 0, 0, 581, 582, 3, 74, 30, 0, 582, 583, 1, 0, 0, 0, 583, 584, 6, 26, 13, 0, 584, 585, 6, 26, 14, 0, 585, 67, 1, 0, 0, 0, 586, 587, 3, 58, 22, 0, 587, 588, 1, 0, 0, 0, 588, 589, 6, 27, 10, 0, 589, 69, 1, 0, 0, 0, 590, 591, 3, 54, 20, 0, 591, 592, 1, 0, 0, 0, 592, 593, 6, 28, 10, 0, 593, 71, 1, 0, 0, 0, 594, 595, 3, 56, 21, 0, 595, 596, 1, 0, 0, 0, 596, 597, 6, 29, 10, 0, 597, 73, 1, 0, 0, 0, 598, 599, 5, 124, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 6, 30, 14, 0, 601, 75, 1, 0, 0, 0, 602, 603, 7, 25, 0, 0, 603, 77, 1, 0, 0, 0, 604, 605, 7, 26, 0, 0, 605, 79, 1, 0, 0, 0, 606, 607, 5, 92, 0, 0, 607, 608, 7, 27, 0, 0, 608, 81, 1, 0, 0, 0, 609, 610, 8, 28, 0, 0, 610, 83, 1, 0, 0, 0, 611, 613, 7, 3, 0, 0, 612, 614, 7, 29, 0, 0, 613, 612, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 617, 3, 76, 31, 0, 616, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 85, 1, 0, 0, 0, 620, 621, 5, 64, 0, 0, 621, 87, 1, 0, 0, 0, 622, 623, 5, 96, 0, 0, 623, 89, 1, 0, 0, 0, 624, 628, 8, 30, 0, 0, 625, 626, 5, 96, 0, 0, 626, 628, 5, 96, 0, 0, 627, 624, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 628, 91, 1, 0, 0, 0, 629, 630, 5, 95, 0, 0, 630, 93, 1, 0, 0, 0, 631, 635, 3, 78, 32, 0, 632, 635, 3, 76, 31, 0, 633, 635, 3, 92, 39, 0, 634, 631, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 633, 1, 0, 0, 0, 635, 95, 1, 0, 0, 0, 636, 641, 5, 34, 0, 0, 637, 640, 3, 80, 33, 0, 638, 640, 3, 82, 34, 0, 639, 637, 1, 0, 0, 0, 639, 638, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 644, 1, 0, 0, 0, 643, 641, 1, 0, 0, 0, 644, 666, 5, 34, 0, 0, 645, 646, 5, 34, 0, 0, 646, 647, 5, 34, 0, 0, 647, 648, 5, 34, 0, 0, 648, 652, 1, 0, 0, 0, 649, 651, 8, 21, 0, 0, 650, 649, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 652, 650, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 652, 1, 0, 0, 0, 655, 656, 5, 34, 0, 0, 656, 657, 5, 34, 0, 0, 657, 658, 5, 34, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 5, 34, 0, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 664, 5, 34, 0, 0, 663, 662, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 666, 1, 0, 0, 0, 665, 636, 1, 0, 0, 0, 665, 645, 1, 0, 0, 0, 666, 97, 1, 0, 0, 0, 667, 669, 3, 76, 31, 0, 668, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 668, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 99, 1, 0, 0, 0, 672, 674, 3, 76, 31, 0, 673, 672, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 673, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 681, 3, 116, 51, 0, 678, 680, 3, 76, 31, 0, 679, 678, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 715, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 686, 3, 116, 51, 0, 685, 687, 3, 76, 31, 0, 686, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 715, 1, 0, 0, 0, 690, 692, 3, 76, 31, 0, 691, 690, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 702, 1, 0, 0, 0, 695, 699, 3, 116, 51, 0, 696, 698, 3, 76, 31, 0, 697, 696, 1, 0, 0, 0, 698, 701, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 703, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 702, 695, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 705, 3, 84, 35, 0, 705, 715, 1, 0, 0, 0, 706, 708, 3, 116, 51, 0, 707, 709, 3, 76, 31, 0, 708, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 713, 3, 84, 35, 0, 713, 715, 1, 0, 0, 0, 714, 673, 1, 0, 0, 0, 714, 684, 1, 0, 0, 0, 714, 691, 1, 0, 0, 0, 714, 706, 1, 0, 0, 0, 715, 101, 1, 0, 0, 0, 716, 717, 7, 31, 0, 0, 717, 718, 7, 32, 0, 0, 718, 103, 1, 0, 0, 0, 719, 720, 7, 12, 0, 0, 720, 721, 7, 9, 0, 0, 721, 722, 7, 0, 0, 0, 722, 105, 1, 0, 0, 0, 723, 724, 7, 12, 0, 0, 724, 725, 7, 2, 0, 0, 725, 726, 7, 4, 0, 0, 726, 107, 1, 0, 0, 0, 727, 728, 5, 61, 0, 0, 728, 109, 1, 0, 0, 0, 729, 730, 5, 58, 0, 0, 730, 731, 5, 58, 0, 0, 731, 111, 1, 0, 0, 0, 732, 733, 5, 44, 0, 0, 733, 113, 1, 0, 0, 0, 734, 735, 7, 0, 0, 0, 735, 736, 7, 3, 0, 0, 736, 737, 7, 2, 0, 0, 737, 738, 7, 4, 0, 0, 738, 115, 1, 0, 0, 0, 739, 740, 5, 46, 0, 0, 740, 117, 1, 0, 0, 0, 741, 742, 7, 15, 0, 0, 742, 743, 7, 12, 0, 0, 743, 744, 7, 13, 0, 0, 744, 745, 7, 2, 0, 0, 745, 746, 7, 3, 0, 0, 746, 119, 1, 0, 0, 0, 747, 748, 7, 15, 0, 0, 748, 749, 7, 1, 0, 0, 749, 750, 7, 6, 0, 0, 750, 751, 7, 2, 0, 0, 751, 752, 7, 5, 0, 0, 752, 121, 1, 0, 0, 0, 753, 754, 7, 13, 0, 0, 754, 755, 7, 12, 0, 0, 755, 756, 7, 2, 0, 0, 756, 757, 7, 5, 0, 0, 757, 123, 1, 0, 0, 0, 758, 759, 5, 40, 0, 0, 759, 125, 1, 0, 0, 0, 760, 761, 7, 1, 0, 0, 761, 762, 7, 9, 0, 0, 762, 127, 1, 0, 0, 0, 763, 764, 7, 1, 0, 0, 764, 765, 7, 2, 0, 0, 765, 129, 1, 0, 0, 0, 766, 767, 7, 13, 0, 0, 767, 768, 7, 1, 0, 0, 768, 769, 7, 18, 0, 0, 769, 770, 7, 3, 0, 0, 770, 131, 1, 0, 0, 0, 771, 772, 7, 9, 0, 0, 772, 773, 7, 7, 0, 0, 773, 774, 7, 5, 0, 0, 774, 133, 1, 0, 0, 0, 775, 776, 7, 9, 0, 0, 776, 777, 7, 33, 0, 0, 777, 778, 7, 13, 0, 0, 778, 779, 7, 13, 0, 0, 779, 135, 1, 0, 0, 0, 780, 781, 7, 9, 0, 0, 781, 782, 7, 33, 0, 0, 782, 783, 7, 13, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 2, 0, 0, 785, 137, 1, 0, 0, 0, 786, 787, 7, 7, 0, 0, 787, 788, 7, 6, 0, 0, 788, 139, 1, 0, 0, 0, 789, 790, 5, 63, 0, 0, 790, 141, 1, 0, 0, 0, 791, 792, 7, 6, 0, 0, 792, 793, 7, 13, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 18, 0, 0, 795, 796, 7, 3, 0, 0, 796, 143, 1, 0, 0, 0, 797, 798, 5, 41, 0, 0, 798, 145, 1, 0, 0, 0, 799, 800, 7, 5, 0, 0, 800, 801, 7, 6, 0, 0, 801, 802, 7, 33, 0, 0, 802, 803, 7, 3, 0, 0, 803, 147, 1, 0, 0, 0, 804, 805, 5, 61, 0, 0, 805, 806, 5, 61, 0, 0, 806, 149, 1, 0, 0, 0, 807, 808, 5, 61, 0, 0, 808, 809, 5, 126, 0, 0, 809, 151, 1, 0, 0, 0, 810, 811, 5, 33, 0, 0, 811, 812, 5, 61, 0, 0, 812, 153, 1, 0, 0, 0, 813, 814, 5, 60, 0, 0, 814, 155, 1, 0, 0, 0, 815, 816, 5, 60, 0, 0, 816, 817, 5, 61, 0, 0, 817, 157, 1, 0, 0, 0, 818, 819, 5, 62, 0, 0, 819, 159, 1, 0, 0, 0, 820, 821, 5, 62, 0, 0, 821, 822, 5, 61, 0, 0, 822, 161, 1, 0, 0, 0, 823, 824, 5, 43, 0, 0, 824, 163, 1, 0, 0, 0, 825, 826, 5, 45, 0, 0, 826, 165, 1, 0, 0, 0, 827, 828, 5, 42, 0, 0, 828, 167, 1, 0, 0, 0, 829, 830, 5, 47, 0, 0, 830, 169, 1, 0, 0, 0, 831, 832, 5, 37, 0, 0, 832, 171, 1, 0, 0, 0, 833, 834, 5, 91, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 6, 79, 0, 0, 836, 837, 6, 79, 0, 0, 837, 173, 1, 0, 0, 0, 838, 839, 5, 93, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 6, 80, 14, 0, 841, 842, 6, 80, 14, 0, 842, 175, 1, 0, 0, 0, 843, 847, 3, 78, 32, 0, 844, 846, 3, 94, 40, 0, 845, 844, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 845, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 860, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 850, 853, 3, 92, 39, 0, 851, 853, 3, 86, 36, 0, 852, 850, 1, 0, 0, 0, 852, 851, 1, 0, 0, 0, 853, 855, 1, 0, 0, 0, 854, 856, 3, 94, 40, 0, 855, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 855, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 1, 0, 0, 0, 859, 843, 1, 0, 0, 0, 859, 852, 1, 0, 0, 0, 860, 177, 1, 0, 0, 0, 861, 863, 3, 88, 37, 0, 862, 864, 3, 90, 38, 0, 863, 862, 1, 0, 0, 0, 864, 865, 1, 0, 0, 0, 865, 863, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 867, 1, 0, 0, 0, 867, 868, 3, 88, 37, 0, 868, 179, 1, 0, 0, 0, 869, 870, 3, 178, 82, 0, 870, 181, 1, 0, 0, 0, 871, 872, 3, 54, 20, 0, 872, 873, 1, 0, 0, 0, 873, 874, 6, 84, 10, 0, 874, 183, 1, 0, 0, 0, 875, 876, 3, 56, 21, 0, 876, 877, 1, 0, 0, 0, 877, 878, 6, 85, 10, 0, 878, 185, 1, 0, 0, 0, 879, 880, 3, 58, 22, 0, 880, 881, 1, 0, 0, 0, 881, 882, 6, 86, 10, 0, 882, 187, 1, 0, 0, 0, 883, 884, 3, 74, 30, 0, 884, 885, 1, 0, 0, 0, 885, 886, 6, 87, 13, 0, 886, 887, 6, 87, 14, 0, 887, 189, 1, 0, 0, 0, 888, 889, 3, 172, 79, 0, 889, 890, 1, 0, 0, 0, 890, 891, 6, 88, 11, 0, 891, 191, 1, 0, 0, 0, 892, 893, 3, 174, 80, 0, 893, 894, 1, 0, 0, 0, 894, 895, 6, 89, 15, 0, 895, 193, 1, 0, 0, 0, 896, 897, 3, 112, 49, 0, 897, 898, 1, 0, 0, 0, 898, 899, 6, 90, 16, 0, 899, 195, 1, 0, 0, 0, 900, 901, 3, 108, 47, 0, 901, 902, 1, 0, 0, 0, 902, 903, 6, 91, 17, 0, 903, 197, 1, 0, 0, 0, 904, 905, 3, 96, 41, 0, 905, 906, 1, 0, 0, 0, 906, 907, 6, 92, 18, 0, 907, 199, 1, 0, 0, 0, 908, 909, 7, 16, 0, 0, 909, 910, 7, 3, 0, 0, 910, 911, 7, 5, 0, 0, 911, 912, 7, 12, 0, 0, 912, 913, 7, 0, 0, 0, 913, 914, 7, 12, 0, 0, 914, 915, 7, 5, 0, 0, 915, 916, 7, 12, 0, 0, 916, 201, 1, 0, 0, 0, 917, 918, 3, 62, 24, 0, 918, 919, 1, 0, 0, 0, 919, 920, 6, 94, 19, 0, 920, 203, 1, 0, 0, 0, 921, 922, 3, 54, 20, 0, 922, 923, 1, 0, 0, 0, 923, 924, 6, 95, 10, 0, 924, 205, 1, 0, 0, 0, 925, 926, 3, 56, 21, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 96, 10, 0, 928, 207, 1, 0, 0, 0, 929, 930, 3, 58, 22, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 97, 10, 0, 932, 209, 1, 0, 0, 0, 933, 934, 3, 74, 30, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 98, 13, 0, 936, 937, 6, 98, 14, 0, 937, 211, 1, 0, 0, 0, 938, 939, 3, 116, 51, 0, 939, 940, 1, 0, 0, 0, 940, 941, 6, 99, 20, 0, 941, 213, 1, 0, 0, 0, 942, 943, 3, 112, 49, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 100, 16, 0, 945, 215, 1, 0, 0, 0, 946, 951, 3, 78, 32, 0, 947, 951, 3, 76, 31, 0, 948, 951, 3, 92, 39, 0, 949, 951, 3, 166, 76, 0, 950, 946, 1, 0, 0, 0, 950, 947, 1, 0, 0, 0, 950, 948, 1, 0, 0, 0, 950, 949, 1, 0, 0, 0, 951, 217, 1, 0, 0, 0, 952, 955, 3, 78, 32, 0, 953, 955, 3, 166, 76, 0, 954, 952, 1, 0, 0, 0, 954, 953, 1, 0, 0, 0, 955, 959, 1, 0, 0, 0, 956, 958, 3, 216, 101, 0, 957, 956, 1, 0, 0, 0, 958, 961, 1, 0, 0, 0, 959, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 972, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 962, 965, 3, 92, 39, 0, 963, 965, 3, 86, 36, 0, 964, 962, 1, 0, 0, 0, 964, 963, 1, 0, 0, 0, 965, 967, 1, 0, 0, 0, 966, 968, 3, 216, 101, 0, 967, 966, 1, 0, 0, 0, 968, 969, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 972, 1, 0, 0, 0, 971, 954, 1, 0, 0, 0, 971, 964, 1, 0, 0, 0, 972, 219, 1, 0, 0, 0, 973, 976, 3, 218, 102, 0, 974, 976, 3, 178, 82, 0, 975, 973, 1, 0, 0, 0, 975, 974, 1, 0, 0, 0, 976, 977, 1, 0, 0, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 221, 1, 0, 0, 0, 979, 980, 3, 54, 20, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 104, 10, 0, 982, 223, 1, 0, 0, 0, 983, 984, 3, 56, 21, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 105, 10, 0, 986, 225, 1, 0, 0, 0, 987, 988, 3, 58, 22, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 106, 10, 0, 990, 227, 1, 0, 0, 0, 991, 992, 3, 74, 30, 0, 992, 993, 1, 0, 0, 0, 993, 994, 6, 107, 13, 0, 994, 995, 6, 107, 14, 0, 995, 229, 1, 0, 0, 0, 996, 997, 3, 108, 47, 0, 997, 998, 1, 0, 0, 0, 998, 999, 6, 108, 17, 0, 999, 231, 1, 0, 0, 0, 1000, 1001, 3, 112, 49, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 6, 109, 16, 0, 1003, 233, 1, 0, 0, 0, 1004, 1005, 3, 116, 51, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 6, 110, 20, 0, 1007, 235, 1, 0, 0, 0, 1008, 1009, 7, 12, 0, 0, 1009, 1010, 7, 2, 0, 0, 1010, 237, 1, 0, 0, 0, 1011, 1012, 3, 220, 103, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 6, 112, 21, 0, 1014, 239, 1, 0, 0, 0, 1015, 1016, 3, 54, 20, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 6, 113, 10, 0, 1018, 241, 1, 0, 0, 0, 1019, 1020, 3, 56, 21, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 6, 114, 10, 0, 1022, 243, 1, 0, 0, 0, 1023, 1024, 3, 58, 22, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 6, 115, 10, 0, 1026, 245, 1, 0, 0, 0, 1027, 1028, 3, 74, 30, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 116, 13, 0, 1030, 1031, 6, 116, 14, 0, 1031, 247, 1, 0, 0, 0, 1032, 1033, 3, 172, 79, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 6, 117, 11, 0, 1035, 1036, 6, 117, 22, 0, 1036, 249, 1, 0, 0, 0, 1037, 1038, 7, 7, 0, 0, 1038, 1039, 7, 9, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 118, 23, 0, 1041, 251, 1, 0, 0, 0, 1042, 1043, 7, 19, 0, 0, 1043, 1044, 7, 1, 0, 0, 1044, 1045, 7, 5, 0, 0, 1045, 1046, 7, 10, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1048, 6, 119, 23, 0, 1048, 253, 1, 0, 0, 0, 1049, 1050, 8, 34, 0, 0, 1050, 255, 1, 0, 0, 0, 1051, 1053, 3, 254, 120, 0, 1052, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1057, 3, 324, 155, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1052, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1061, 1, 0, 0, 0, 1060, 1062, 3, 254, 120, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 257, 1, 0, 0, 0, 1065, 1066, 3, 180, 83, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 6, 122, 24, 0, 1068, 259, 1, 0, 0, 0, 1069, 1070, 3, 256, 121, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1072, 6, 123, 25, 0, 1072, 261, 1, 0, 0, 0, 1073, 1074, 3, 54, 20, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 124, 10, 0, 1076, 263, 1, 0, 0, 0, 1077, 1078, 3, 56, 21, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 6, 125, 10, 0, 1080, 265, 1, 0, 0, 0, 1081, 1082, 3, 58, 22, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 126, 10, 0, 1084, 267, 1, 0, 0, 0, 1085, 1086, 3, 74, 30, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1088, 6, 127, 13, 0, 1088, 1089, 6, 127, 14, 0, 1089, 1090, 6, 127, 14, 0, 1090, 269, 1, 0, 0, 0, 1091, 1092, 3, 108, 47, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 128, 17, 0, 1094, 271, 1, 0, 0, 0, 1095, 1096, 3, 112, 49, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 129, 16, 0, 1098, 273, 1, 0, 0, 0, 1099, 1100, 3, 116, 51, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 130, 20, 0, 1102, 275, 1, 0, 0, 0, 1103, 1104, 3, 252, 119, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 6, 131, 26, 0, 1106, 277, 1, 0, 0, 0, 1107, 1108, 3, 220, 103, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 132, 21, 0, 1110, 279, 1, 0, 0, 0, 1111, 1112, 3, 180, 83, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 133, 24, 0, 1114, 281, 1, 0, 0, 0, 1115, 1116, 3, 54, 20, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 134, 10, 0, 1118, 283, 1, 0, 0, 0, 1119, 1120, 3, 56, 21, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 135, 10, 0, 1122, 285, 1, 0, 0, 0, 1123, 1124, 3, 58, 22, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 136, 10, 0, 1126, 287, 1, 0, 0, 0, 1127, 1128, 3, 74, 30, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 137, 13, 0, 1130, 1131, 6, 137, 14, 0, 1131, 289, 1, 0, 0, 0, 1132, 1133, 3, 116, 51, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 138, 20, 0, 1135, 291, 1, 0, 0, 0, 1136, 1137, 3, 180, 83, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 6, 139, 24, 0, 1139, 293, 1, 0, 0, 0, 1140, 1141, 3, 176, 81, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1143, 6, 140, 27, 0, 1143, 295, 1, 0, 0, 0, 1144, 1145, 3, 54, 20, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 6, 141, 10, 0, 1147, 297, 1, 0, 0, 0, 1148, 1149, 3, 56, 21, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1151, 6, 142, 10, 0, 1151, 299, 1, 0, 0, 0, 1152, 1153, 3, 58, 22, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 6, 143, 10, 0, 1155, 301, 1, 0, 0, 0, 1156, 1157, 3, 74, 30, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 6, 144, 13, 0, 1159, 1160, 6, 144, 14, 0, 1160, 303, 1, 0, 0, 0, 1161, 1162, 7, 1, 0, 0, 1162, 1163, 7, 9, 0, 0, 1163, 1164, 7, 15, 0, 0, 1164, 1165, 7, 7, 0, 0, 1165, 305, 1, 0, 0, 0, 1166, 1167, 3, 54, 20, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 146, 10, 0, 1169, 307, 1, 0, 0, 0, 1170, 1171, 3, 56, 21, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 147, 10, 0, 1173, 309, 1, 0, 0, 0, 1174, 1175, 3, 58, 22, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 148, 10, 0, 1177, 311, 1, 0, 0, 0, 1178, 1179, 3, 74, 30, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 149, 13, 0, 1181, 1182, 6, 149, 14, 0, 1182, 313, 1, 0, 0, 0, 1183, 1184, 7, 15, 0, 0, 1184, 1185, 7, 33, 0, 0, 1185, 1186, 7, 9, 0, 0, 1186, 1187, 7, 4, 0, 0, 1187, 1188, 7, 5, 0, 0, 1188, 1189, 7, 1, 0, 0, 1189, 1190, 7, 7, 0, 0, 1190, 1191, 7, 9, 0, 0, 1191, 1192, 7, 2, 0, 0, 1192, 315, 1, 0, 0, 0, 1193, 1194, 3, 54, 20, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 6, 151, 10, 0, 1196, 317, 1, 0, 0, 0, 1197, 1198, 3, 56, 21, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1200, 6, 152, 10, 0, 1200, 319, 1, 0, 0, 0, 1201, 1202, 3, 58, 22, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 153, 10, 0, 1204, 321, 1, 0, 0, 0, 1205, 1206, 3, 174, 80, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 154, 15, 0, 1208, 1209, 6, 154, 14, 0, 1209, 323, 1, 0, 0, 0, 1210, 1211, 5, 58, 0, 0, 1211, 325, 1, 0, 0, 0, 1212, 1218, 3, 86, 36, 0, 1213, 1218, 3, 76, 31, 0, 1214, 1218, 3, 116, 51, 0, 1215, 1218, 3, 78, 32, 0, 1216, 1218, 3, 92, 39, 0, 1217, 1212, 1, 0, 0, 0, 1217, 1213, 1, 0, 0, 0, 1217, 1214, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1216, 1, 0, 0, 0, 1218, 1219, 1, 0, 0, 0, 1219, 1217, 1, 0, 0, 0, 1219, 1220, 1, 0, 0, 0, 1220, 327, 1, 0, 0, 0, 1221, 1222, 3, 54, 20, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1224, 6, 157, 10, 0, 1224, 329, 1, 0, 0, 0, 1225, 1226, 3, 56, 21, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 158, 10, 0, 1228, 331, 1, 0, 0, 0, 1229, 1230, 3, 58, 22, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 159, 10, 0, 1232, 333, 1, 0, 0, 0, 1233, 1234, 3, 74, 30, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 6, 160, 13, 0, 1236, 1237, 6, 160, 14, 0, 1237, 335, 1, 0, 0, 0, 1238, 1239, 3, 62, 24, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 161, 19, 0, 1241, 1242, 6, 161, 14, 0, 1242, 1243, 6, 161, 28, 0, 1243, 337, 1, 0, 0, 0, 1244, 1245, 3, 54, 20, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 162, 10, 0, 1247, 339, 1, 0, 0, 0, 1248, 1249, 3, 56, 21, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 163, 10, 0, 1251, 341, 1, 0, 0, 0, 1252, 1253, 3, 58, 22, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 164, 10, 0, 1255, 343, 1, 0, 0, 0, 1256, 1257, 3, 112, 49, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 6, 165, 16, 0, 1259, 1260, 6, 165, 14, 0, 1260, 1261, 6, 165, 6, 0, 1261, 345, 1, 0, 0, 0, 1262, 1263, 3, 54, 20, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 166, 10, 0, 1265, 347, 1, 0, 0, 0, 1266, 1267, 3, 56, 21, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 167, 10, 0, 1269, 349, 1, 0, 0, 0, 1270, 1271, 3, 58, 22, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 168, 10, 0, 1273, 351, 1, 0, 0, 0, 1274, 1275, 3, 180, 83, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 169, 14, 0, 1277, 1278, 6, 169, 0, 0, 1278, 1279, 6, 169, 24, 0, 1279, 353, 1, 0, 0, 0, 1280, 1281, 3, 176, 81, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 6, 170, 14, 0, 1283, 1284, 6, 170, 0, 0, 1284, 1285, 6, 170, 27, 0, 1285, 355, 1, 0, 0, 0, 1286, 1287, 3, 102, 44, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 171, 14, 0, 1289, 1290, 6, 171, 0, 0, 1290, 1291, 6, 171, 29, 0, 1291, 357, 1, 0, 0, 0, 1292, 1293, 3, 74, 30, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 6, 172, 13, 0, 1295, 1296, 6, 172, 14, 0, 1296, 359, 1, 0, 0, 0, 60, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 523, 533, 537, 540, 549, 551, 562, 569, 574, 613, 618, 627, 634, 639, 641, 652, 660, 663, 665, 670, 675, 681, 688, 693, 699, 702, 710, 714, 847, 852, 857, 859, 865, 950, 954, 959, 964, 969, 971, 975, 977, 1054, 1058, 1063, 1217, 1219, 30, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 10, 0, 5, 12, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 67, 0, 5, 0, 0, 7, 28, 0, 4, 0, 0, 7, 68, 0, 7, 37, 0, 7, 35, 0, 7, 29, 0, 7, 24, 0, 7, 39, 0, 7, 78, 0, 5, 11, 0, 5, 7, 0, 7, 70, 0, 7, 88, 0, 7, 87, 0, 7, 69, 0, 5, 13, 0, 7, 32, 0] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens index d2e7a695282ec..0e2d796eda847 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens @@ -9,104 +9,111 @@ INLINESTATS=8 KEEP=9 LIMIT=10 META=11 -MV_EXPAND=12 -RENAME=13 -ROW=14 -SHOW=15 -SORT=16 -STATS=17 -WHERE=18 -UNKNOWN_CMD=19 -LINE_COMMENT=20 -MULTILINE_COMMENT=21 -WS=22 -EXPLAIN_WS=23 -EXPLAIN_LINE_COMMENT=24 -EXPLAIN_MULTILINE_COMMENT=25 -PIPE=26 -QUOTED_STRING=27 -INTEGER_LITERAL=28 -DECIMAL_LITERAL=29 -BY=30 -AND=31 -ASC=32 -ASSIGN=33 -CAST_OP=34 -COMMA=35 -DESC=36 -DOT=37 -FALSE=38 -FIRST=39 -LAST=40 -LP=41 -IN=42 -IS=43 -LIKE=44 -NOT=45 -NULL=46 -NULLS=47 -OR=48 -PARAM=49 -RLIKE=50 -RP=51 -TRUE=52 -EQ=53 -CIEQ=54 -NEQ=55 -LT=56 -LTE=57 -GT=58 -GTE=59 -PLUS=60 -MINUS=61 -ASTERISK=62 -SLASH=63 -PERCENT=64 -OPENING_BRACKET=65 -CLOSING_BRACKET=66 -UNQUOTED_IDENTIFIER=67 -QUOTED_IDENTIFIER=68 -EXPR_LINE_COMMENT=69 -EXPR_MULTILINE_COMMENT=70 -EXPR_WS=71 -METADATA=72 -FROM_UNQUOTED_IDENTIFIER=73 -FROM_LINE_COMMENT=74 -FROM_MULTILINE_COMMENT=75 -FROM_WS=76 -ID_PATTERN=77 -PROJECT_LINE_COMMENT=78 -PROJECT_MULTILINE_COMMENT=79 -PROJECT_WS=80 -AS=81 -RENAME_LINE_COMMENT=82 -RENAME_MULTILINE_COMMENT=83 -RENAME_WS=84 -ON=85 -WITH=86 -ENRICH_POLICY_NAME=87 -ENRICH_LINE_COMMENT=88 -ENRICH_MULTILINE_COMMENT=89 -ENRICH_WS=90 -ENRICH_FIELD_LINE_COMMENT=91 -ENRICH_FIELD_MULTILINE_COMMENT=92 -ENRICH_FIELD_WS=93 -MVEXPAND_LINE_COMMENT=94 -MVEXPAND_MULTILINE_COMMENT=95 -MVEXPAND_WS=96 -INFO=97 -SHOW_LINE_COMMENT=98 -SHOW_MULTILINE_COMMENT=99 -SHOW_WS=100 -FUNCTIONS=101 -META_LINE_COMMENT=102 -META_MULTILINE_COMMENT=103 -META_WS=104 -COLON=105 -SETTING=106 -SETTING_LINE_COMMENT=107 -SETTTING_MULTILINE_COMMENT=108 -SETTING_WS=109 +METRICS=12 +MV_EXPAND=13 +RENAME=14 +ROW=15 +SHOW=16 +SORT=17 +STATS=18 +WHERE=19 +UNKNOWN_CMD=20 +LINE_COMMENT=21 +MULTILINE_COMMENT=22 +WS=23 +INDEX_UNQUOTED_IDENTIFIER=24 +EXPLAIN_WS=25 +EXPLAIN_LINE_COMMENT=26 +EXPLAIN_MULTILINE_COMMENT=27 +PIPE=28 +QUOTED_STRING=29 +INTEGER_LITERAL=30 +DECIMAL_LITERAL=31 +BY=32 +AND=33 +ASC=34 +ASSIGN=35 +CAST_OP=36 +COMMA=37 +DESC=38 +DOT=39 +FALSE=40 +FIRST=41 +LAST=42 +LP=43 +IN=44 +IS=45 +LIKE=46 +NOT=47 +NULL=48 +NULLS=49 +OR=50 +PARAM=51 +RLIKE=52 +RP=53 +TRUE=54 +EQ=55 +CIEQ=56 +NEQ=57 +LT=58 +LTE=59 +GT=60 +GTE=61 +PLUS=62 +MINUS=63 +ASTERISK=64 +SLASH=65 +PERCENT=66 +OPENING_BRACKET=67 +CLOSING_BRACKET=68 +UNQUOTED_IDENTIFIER=69 +QUOTED_IDENTIFIER=70 +EXPR_LINE_COMMENT=71 +EXPR_MULTILINE_COMMENT=72 +EXPR_WS=73 +METADATA=74 +FROM_LINE_COMMENT=75 +FROM_MULTILINE_COMMENT=76 +FROM_WS=77 +ID_PATTERN=78 +PROJECT_LINE_COMMENT=79 +PROJECT_MULTILINE_COMMENT=80 +PROJECT_WS=81 +AS=82 +RENAME_LINE_COMMENT=83 +RENAME_MULTILINE_COMMENT=84 +RENAME_WS=85 +ON=86 +WITH=87 +ENRICH_POLICY_NAME=88 +ENRICH_LINE_COMMENT=89 +ENRICH_MULTILINE_COMMENT=90 +ENRICH_WS=91 +ENRICH_FIELD_LINE_COMMENT=92 +ENRICH_FIELD_MULTILINE_COMMENT=93 +ENRICH_FIELD_WS=94 +MVEXPAND_LINE_COMMENT=95 +MVEXPAND_MULTILINE_COMMENT=96 +MVEXPAND_WS=97 +INFO=98 +SHOW_LINE_COMMENT=99 +SHOW_MULTILINE_COMMENT=100 +SHOW_WS=101 +FUNCTIONS=102 +META_LINE_COMMENT=103 +META_MULTILINE_COMMENT=104 +META_WS=105 +COLON=106 +SETTING=107 +SETTING_LINE_COMMENT=108 +SETTTING_MULTILINE_COMMENT=109 +SETTING_WS=110 +METRICS_LINE_COMMENT=111 +METRICS_MULTILINE_COMMENT=112 +METRICS_WS=113 +CLOSING_METRICS_LINE_COMMENT=114 +CLOSING_METRICS_MULTILINE_COMMENT=115 +CLOSING_METRICS_WS=116 'dissect'=1 'drop'=2 'enrich'=3 @@ -118,54 +125,55 @@ SETTING_WS=109 'keep'=9 'limit'=10 'meta'=11 -'mv_expand'=12 -'rename'=13 -'row'=14 -'show'=15 -'sort'=16 -'stats'=17 -'where'=18 -'|'=26 -'by'=30 -'and'=31 -'asc'=32 -'='=33 -'::'=34 -','=35 -'desc'=36 -'.'=37 -'false'=38 -'first'=39 -'last'=40 -'('=41 -'in'=42 -'is'=43 -'like'=44 -'not'=45 -'null'=46 -'nulls'=47 -'or'=48 -'?'=49 -'rlike'=50 -')'=51 -'true'=52 -'=='=53 -'=~'=54 -'!='=55 -'<'=56 -'<='=57 -'>'=58 -'>='=59 -'+'=60 -'-'=61 -'*'=62 -'/'=63 -'%'=64 -']'=66 -'metadata'=72 -'as'=81 -'on'=85 -'with'=86 -'info'=97 -'functions'=101 -':'=105 +'metrics'=12 +'mv_expand'=13 +'rename'=14 +'row'=15 +'show'=16 +'sort'=17 +'stats'=18 +'where'=19 +'|'=28 +'by'=32 +'and'=33 +'asc'=34 +'='=35 +'::'=36 +','=37 +'desc'=38 +'.'=39 +'false'=40 +'first'=41 +'last'=42 +'('=43 +'in'=44 +'is'=45 +'like'=46 +'not'=47 +'null'=48 +'nulls'=49 +'or'=50 +'?'=51 +'rlike'=52 +')'=53 +'true'=54 +'=='=55 +'=~'=56 +'!='=57 +'<'=58 +'<='=59 +'>'=60 +'>='=61 +'+'=62 +'-'=63 +'*'=64 +'/'=65 +'%'=66 +']'=68 +'metadata'=74 +'as'=82 +'on'=86 +'with'=87 +'info'=98 +'functions'=102 +':'=106 diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts index 33ff8b4a75db3..abd594fb6b564 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -24,104 +24,111 @@ export default class esql_lexer extends Lexer { public static readonly KEEP = 9; public static readonly LIMIT = 10; public static readonly META = 11; - public static readonly MV_EXPAND = 12; - public static readonly RENAME = 13; - public static readonly ROW = 14; - public static readonly SHOW = 15; - public static readonly SORT = 16; - public static readonly STATS = 17; - public static readonly WHERE = 18; - public static readonly UNKNOWN_CMD = 19; - public static readonly LINE_COMMENT = 20; - public static readonly MULTILINE_COMMENT = 21; - public static readonly WS = 22; - public static readonly EXPLAIN_WS = 23; - public static readonly EXPLAIN_LINE_COMMENT = 24; - public static readonly EXPLAIN_MULTILINE_COMMENT = 25; - public static readonly PIPE = 26; - public static readonly QUOTED_STRING = 27; - public static readonly INTEGER_LITERAL = 28; - public static readonly DECIMAL_LITERAL = 29; - public static readonly BY = 30; - public static readonly AND = 31; - public static readonly ASC = 32; - public static readonly ASSIGN = 33; - public static readonly CAST_OP = 34; - public static readonly COMMA = 35; - public static readonly DESC = 36; - public static readonly DOT = 37; - public static readonly FALSE = 38; - public static readonly FIRST = 39; - public static readonly LAST = 40; - public static readonly LP = 41; - public static readonly IN = 42; - public static readonly IS = 43; - public static readonly LIKE = 44; - public static readonly NOT = 45; - public static readonly NULL = 46; - public static readonly NULLS = 47; - public static readonly OR = 48; - public static readonly PARAM = 49; - public static readonly RLIKE = 50; - public static readonly RP = 51; - public static readonly TRUE = 52; - public static readonly EQ = 53; - public static readonly CIEQ = 54; - public static readonly NEQ = 55; - public static readonly LT = 56; - public static readonly LTE = 57; - public static readonly GT = 58; - public static readonly GTE = 59; - public static readonly PLUS = 60; - public static readonly MINUS = 61; - public static readonly ASTERISK = 62; - public static readonly SLASH = 63; - public static readonly PERCENT = 64; - public static readonly OPENING_BRACKET = 65; - public static readonly CLOSING_BRACKET = 66; - public static readonly UNQUOTED_IDENTIFIER = 67; - public static readonly QUOTED_IDENTIFIER = 68; - public static readonly EXPR_LINE_COMMENT = 69; - public static readonly EXPR_MULTILINE_COMMENT = 70; - public static readonly EXPR_WS = 71; - public static readonly METADATA = 72; - public static readonly FROM_UNQUOTED_IDENTIFIER = 73; - public static readonly FROM_LINE_COMMENT = 74; - public static readonly FROM_MULTILINE_COMMENT = 75; - public static readonly FROM_WS = 76; - public static readonly ID_PATTERN = 77; - public static readonly PROJECT_LINE_COMMENT = 78; - public static readonly PROJECT_MULTILINE_COMMENT = 79; - public static readonly PROJECT_WS = 80; - public static readonly AS = 81; - public static readonly RENAME_LINE_COMMENT = 82; - public static readonly RENAME_MULTILINE_COMMENT = 83; - public static readonly RENAME_WS = 84; - public static readonly ON = 85; - public static readonly WITH = 86; - public static readonly ENRICH_POLICY_NAME = 87; - public static readonly ENRICH_LINE_COMMENT = 88; - public static readonly ENRICH_MULTILINE_COMMENT = 89; - public static readonly ENRICH_WS = 90; - public static readonly ENRICH_FIELD_LINE_COMMENT = 91; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 92; - public static readonly ENRICH_FIELD_WS = 93; - public static readonly MVEXPAND_LINE_COMMENT = 94; - public static readonly MVEXPAND_MULTILINE_COMMENT = 95; - public static readonly MVEXPAND_WS = 96; - public static readonly INFO = 97; - public static readonly SHOW_LINE_COMMENT = 98; - public static readonly SHOW_MULTILINE_COMMENT = 99; - public static readonly SHOW_WS = 100; - public static readonly FUNCTIONS = 101; - public static readonly META_LINE_COMMENT = 102; - public static readonly META_MULTILINE_COMMENT = 103; - public static readonly META_WS = 104; - public static readonly COLON = 105; - public static readonly SETTING = 106; - public static readonly SETTING_LINE_COMMENT = 107; - public static readonly SETTTING_MULTILINE_COMMENT = 108; - public static readonly SETTING_WS = 109; + public static readonly METRICS = 12; + public static readonly MV_EXPAND = 13; + public static readonly RENAME = 14; + public static readonly ROW = 15; + public static readonly SHOW = 16; + public static readonly SORT = 17; + public static readonly STATS = 18; + public static readonly WHERE = 19; + public static readonly UNKNOWN_CMD = 20; + public static readonly LINE_COMMENT = 21; + public static readonly MULTILINE_COMMENT = 22; + public static readonly WS = 23; + public static readonly INDEX_UNQUOTED_IDENTIFIER = 24; + public static readonly EXPLAIN_WS = 25; + public static readonly EXPLAIN_LINE_COMMENT = 26; + public static readonly EXPLAIN_MULTILINE_COMMENT = 27; + public static readonly PIPE = 28; + public static readonly QUOTED_STRING = 29; + public static readonly INTEGER_LITERAL = 30; + public static readonly DECIMAL_LITERAL = 31; + public static readonly BY = 32; + public static readonly AND = 33; + public static readonly ASC = 34; + public static readonly ASSIGN = 35; + public static readonly CAST_OP = 36; + public static readonly COMMA = 37; + public static readonly DESC = 38; + public static readonly DOT = 39; + public static readonly FALSE = 40; + public static readonly FIRST = 41; + public static readonly LAST = 42; + public static readonly LP = 43; + public static readonly IN = 44; + public static readonly IS = 45; + public static readonly LIKE = 46; + public static readonly NOT = 47; + public static readonly NULL = 48; + public static readonly NULLS = 49; + public static readonly OR = 50; + public static readonly PARAM = 51; + public static readonly RLIKE = 52; + public static readonly RP = 53; + public static readonly TRUE = 54; + public static readonly EQ = 55; + public static readonly CIEQ = 56; + public static readonly NEQ = 57; + public static readonly LT = 58; + public static readonly LTE = 59; + public static readonly GT = 60; + public static readonly GTE = 61; + public static readonly PLUS = 62; + public static readonly MINUS = 63; + public static readonly ASTERISK = 64; + public static readonly SLASH = 65; + public static readonly PERCENT = 66; + public static readonly OPENING_BRACKET = 67; + public static readonly CLOSING_BRACKET = 68; + public static readonly UNQUOTED_IDENTIFIER = 69; + public static readonly QUOTED_IDENTIFIER = 70; + public static readonly EXPR_LINE_COMMENT = 71; + public static readonly EXPR_MULTILINE_COMMENT = 72; + public static readonly EXPR_WS = 73; + public static readonly METADATA = 74; + public static readonly FROM_LINE_COMMENT = 75; + public static readonly FROM_MULTILINE_COMMENT = 76; + public static readonly FROM_WS = 77; + public static readonly ID_PATTERN = 78; + public static readonly PROJECT_LINE_COMMENT = 79; + public static readonly PROJECT_MULTILINE_COMMENT = 80; + public static readonly PROJECT_WS = 81; + public static readonly AS = 82; + public static readonly RENAME_LINE_COMMENT = 83; + public static readonly RENAME_MULTILINE_COMMENT = 84; + public static readonly RENAME_WS = 85; + public static readonly ON = 86; + public static readonly WITH = 87; + public static readonly ENRICH_POLICY_NAME = 88; + public static readonly ENRICH_LINE_COMMENT = 89; + public static readonly ENRICH_MULTILINE_COMMENT = 90; + public static readonly ENRICH_WS = 91; + public static readonly ENRICH_FIELD_LINE_COMMENT = 92; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 93; + public static readonly ENRICH_FIELD_WS = 94; + public static readonly MVEXPAND_LINE_COMMENT = 95; + public static readonly MVEXPAND_MULTILINE_COMMENT = 96; + public static readonly MVEXPAND_WS = 97; + public static readonly INFO = 98; + public static readonly SHOW_LINE_COMMENT = 99; + public static readonly SHOW_MULTILINE_COMMENT = 100; + public static readonly SHOW_WS = 101; + public static readonly FUNCTIONS = 102; + public static readonly META_LINE_COMMENT = 103; + public static readonly META_MULTILINE_COMMENT = 104; + public static readonly META_WS = 105; + public static readonly COLON = 106; + public static readonly SETTING = 107; + public static readonly SETTING_LINE_COMMENT = 108; + public static readonly SETTTING_MULTILINE_COMMENT = 109; + public static readonly SETTING_WS = 110; + public static readonly METRICS_LINE_COMMENT = 111; + public static readonly METRICS_MULTILINE_COMMENT = 112; + public static readonly METRICS_WS = 113; + public static readonly CLOSING_METRICS_LINE_COMMENT = 114; + public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 115; + public static readonly CLOSING_METRICS_WS = 116; public static readonly EOF = Token.EOF; public static readonly EXPLAIN_MODE = 1; public static readonly EXPRESSION_MODE = 2; @@ -134,6 +141,8 @@ export default class esql_lexer extends Lexer { public static readonly SHOW_MODE = 9; public static readonly META_MODE = 10; public static readonly SETTING_MODE = 11; + public static readonly METRICS_MODE = 12; + public static readonly CLOSING_METRICS_MODE = 13; public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", @@ -142,7 +151,8 @@ export default class esql_lexer extends Lexer { "'from'", "'grok'", "'inlinestats'", "'keep'", "'limit'", - "'meta'", "'mv_expand'", + "'meta'", "'metrics'", + "'mv_expand'", "'rename'", "'row'", "'show'", "'sort'", "'stats'", @@ -150,45 +160,44 @@ export default class esql_lexer extends Lexer { null, null, null, null, null, null, - "'|'", null, + null, "'|'", null, null, - "'by'", "'and'", - "'asc'", "'='", - "'::'", "','", - "'desc'", "'.'", - "'false'", "'first'", - "'last'", "'('", - "'in'", "'is'", - "'like'", "'not'", - "'null'", "'nulls'", - "'or'", "'?'", - "'rlike'", "')'", - "'true'", "'=='", - "'=~'", "'!='", - "'<'", "'<='", - "'>'", "'>='", - "'+'", "'-'", - "'*'", "'/'", - "'%'", null, - "']'", null, + null, "'by'", + "'and'", "'asc'", + "'='", "'::'", + "','", "'desc'", + "'.'", "'false'", + "'first'", "'last'", + "'('", "'in'", + "'is'", "'like'", + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", + null, "']'", null, null, null, null, - "'metadata'", + null, "'metadata'", null, null, null, null, null, null, + null, "'as'", null, null, - "'as'", null, + null, "'on'", + "'with'", null, null, null, - "'on'", "'with'", null, null, null, null, null, null, + null, "'info'", null, null, - null, null, - "'info'", null, - null, null, - "'functions'", + null, "'functions'", null, null, null, "':'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", @@ -197,14 +206,16 @@ export default class esql_lexer extends Lexer { "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", - "META", "MV_EXPAND", + "META", "METRICS", + "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "EXPLAIN_WS", + "WS", "INDEX_UNQUOTED_IDENTIFIER", + "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "PIPE", "QUOTED_STRING", @@ -236,7 +247,6 @@ export default class esql_lexer extends Lexer { "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", - "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", @@ -268,46 +278,58 @@ export default class esql_lexer extends Lexer { "COLON", "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", - "SETTING_WS" ]; + "SETTING_WS", + "METRICS_LINE_COMMENT", + "METRICS_MULTILINE_COMMENT", + "METRICS_WS", + "CLOSING_METRICS_LINE_COMMENT", + "CLOSING_METRICS_MULTILINE_COMMENT", + "CLOSING_METRICS_WS" ]; public static readonly modeNames: string[] = [ "DEFAULT_MODE", "EXPLAIN_MODE", "EXPRESSION_MODE", "FROM_MODE", "PROJECT_MODE", "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", - "META_MODE", "SETTING_MODE", ]; + "META_MODE", "SETTING_MODE", + "METRICS_MODE", "CLOSING_METRICS_MODE", ]; public static readonly ruleNames: string[] = [ "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", - "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", - "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", - "EXPLAIN_MULTILINE_COMMENT", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", - "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", - "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", - "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", "DESC", - "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", - "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", - "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", - "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", - "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COMMA", "FROM_ASSIGN", - "FROM_QUOTED_STRING", "METADATA", "FROM_UNQUOTED_IDENTIFIER_PART", "FROM_UNQUOTED_IDENTIFIER", - "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", - "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", - "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", - "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", - "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", - "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", - "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", - "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", - "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", - "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", - "SHOW_WS", "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", + "KEEP", "LIMIT", "META", "METRICS", "MV_EXPAND", "RENAME", "ROW", "SHOW", + "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", + "WS", "INDEX_UNQUOTED_IDENTIFIER_PART", "INDEX_UNQUOTED_IDENTIFIER", "EXPLAIN_OPENING_BRACKET", + "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", + "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", + "QUOTED_STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", + "ASSIGN", "CAST_OP", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", + "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", + "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", + "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", + "FROM_CLOSING_BRACKET", "FROM_COMMA", "FROM_ASSIGN", "FROM_QUOTED_STRING", + "METADATA", "FROM_INDEX_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", + "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", + "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", + "ENRICH_POLICY_NAME", "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", + "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", + "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", + "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_PIPE", + "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", "MVEXPAND_UNQUOTED_IDENTIFIER", + "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", + "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", + "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", "META_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "METRICS_PIPE", "METRICS_INDEX_UNQUOTED_IDENTIFIER", + "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COMMA", + "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS", + "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", + "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE", ]; @@ -328,407 +350,447 @@ export default class esql_lexer extends Lexer { public get modeNames(): string[] { return esql_lexer.modeNames; } - public static readonly _serializedATN: number[] = [4,0,109,1187,6,-1,6, - -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2, - 2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10, - 2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2, - 18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25, - 7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7, - 32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,39, - 2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2,46,7,46,2, - 47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53,7,53,2,54, - 7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7,60,2,61,7, - 61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,2,66,7,66,2,67,7,67,2,68,7,68, - 2,69,7,69,2,70,7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2, - 76,7,76,2,77,7,77,2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83, - 7,83,2,84,7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7, - 90,2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7,97, - 2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103,7,103,2,104, - 7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108,2,109,7,109,2,110, - 7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114,7,114,2,115,7,115,2,116, - 7,116,2,117,7,117,2,118,7,118,2,119,7,119,2,120,7,120,2,121,7,121,2,122, - 7,122,2,123,7,123,2,124,7,124,2,125,7,125,2,126,7,126,2,127,7,127,2,128, - 7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133,7,133,2,134, - 7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140, - 7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146, - 7,146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,2,152, - 7,152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157,7,157,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1, - 2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1, - 4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1, - 6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1, - 8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1, - 10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1, - 13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1, - 17,1,17,1,18,4,18,480,8,18,11,18,12,18,481,1,18,1,18,1,19,1,19,1,19,1,19, - 5,19,490,8,19,10,19,12,19,493,9,19,1,19,3,19,496,8,19,1,19,3,19,499,8,19, - 1,19,1,19,1,20,1,20,1,20,1,20,1,20,5,20,508,8,20,10,20,12,20,511,9,20,1, - 20,1,20,1,20,1,20,1,20,1,21,4,21,519,8,21,11,21,12,21,520,1,21,1,21,1,22, - 1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,25,1, - 25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,28,1,28,1,29,1,29, - 1,30,1,30,1,30,1,31,1,31,1,32,1,32,3,32,562,8,32,1,32,4,32,565,8,32,11, - 32,12,32,566,1,33,1,33,1,34,1,34,1,35,1,35,1,35,3,35,576,8,35,1,36,1,36, - 1,37,1,37,1,37,3,37,583,8,37,1,38,1,38,1,38,5,38,588,8,38,10,38,12,38,591, - 9,38,1,38,1,38,1,38,1,38,1,38,1,38,5,38,599,8,38,10,38,12,38,602,9,38,1, - 38,1,38,1,38,1,38,1,38,3,38,609,8,38,1,38,3,38,612,8,38,3,38,614,8,38,1, - 39,4,39,617,8,39,11,39,12,39,618,1,40,4,40,622,8,40,11,40,12,40,623,1,40, - 1,40,5,40,628,8,40,10,40,12,40,631,9,40,1,40,1,40,4,40,635,8,40,11,40,12, - 40,636,1,40,4,40,640,8,40,11,40,12,40,641,1,40,1,40,5,40,646,8,40,10,40, - 12,40,649,9,40,3,40,651,8,40,1,40,1,40,1,40,1,40,4,40,657,8,40,11,40,12, - 40,658,1,40,1,40,3,40,663,8,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,43, - 1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,45,1,46,1,46,1,47,1,47,1,47,1,47,1, - 47,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50, - 1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,53,1,53,1,53,1,54,1,54,1,54,1,55,1, - 55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,58,1,58, - 1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1, - 61,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,1,66, - 1,66,1,66,1,67,1,67,1,68,1,68,1,68,1,69,1,69,1,70,1,70,1,70,1,71,1,71,1, - 72,1,72,1,73,1,73,1,74,1,74,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77, - 1,77,1,77,1,77,1,78,1,78,5,78,794,8,78,10,78,12,78,797,9,78,1,78,1,78,3, - 78,801,8,78,1,78,4,78,804,8,78,11,78,12,78,805,3,78,808,8,78,1,79,1,79, - 4,79,812,8,79,11,79,12,79,813,1,79,1,79,1,80,1,80,1,81,1,81,1,81,1,81,1, - 82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,85,1,85, - 1,85,1,85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1, - 89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91, - 1,91,3,91,869,8,91,1,92,4,92,872,8,92,11,92,12,92,873,1,93,1,93,1,93,1, - 93,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,97, - 1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,3,99,905,8,99,1, - 100,1,100,3,100,909,8,100,1,100,5,100,912,8,100,10,100,12,100,915,9,100, - 1,100,1,100,3,100,919,8,100,1,100,4,100,922,8,100,11,100,12,100,923,3,100, - 926,8,100,1,101,1,101,4,101,930,8,101,11,101,12,101,931,1,102,1,102,1,102, - 1,102,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105,1,105, - 1,105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,108,1,108, - 1,108,1,108,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111, - 1,111,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,114,1,114,1,114, - 1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116, - 1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,119,4,119,1007, - 8,119,11,119,12,119,1008,1,119,1,119,3,119,1013,8,119,1,119,4,119,1016, - 8,119,11,119,12,119,1017,1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121, - 1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124, - 1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,127,1,127, - 1,127,1,127,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,130,1,130, - 1,130,1,130,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133, - 1,133,1,133,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,135,1,136, - 1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139, - 1,139,1,139,1,139,1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,142, - 1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,143,1,144,1,144,1,144, - 1,144,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1,147,1,147,1,147, - 1,147,1,147,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148,1,148, - 1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151, - 1,152,1,152,1,152,1,152,1,152,1,153,1,153,1,154,1,154,1,154,1,154,1,154, - 4,154,1172,8,154,11,154,12,154,1173,1,155,1,155,1,155,1,155,1,156,1,156, - 1,156,1,156,1,157,1,157,1,157,1,157,2,509,600,0,158,12,1,14,2,16,3,18,4, - 20,5,22,6,24,7,26,8,28,9,30,10,32,11,34,12,36,13,38,14,40,15,42,16,44,17, - 46,18,48,19,50,20,52,21,54,22,56,0,58,0,60,23,62,24,64,25,66,26,68,0,70, - 0,72,0,74,0,76,0,78,0,80,0,82,0,84,0,86,0,88,27,90,28,92,29,94,30,96,31, - 98,32,100,33,102,34,104,35,106,36,108,37,110,38,112,39,114,40,116,41,118, - 42,120,43,122,44,124,45,126,46,128,47,130,48,132,49,134,50,136,51,138,52, - 140,53,142,54,144,55,146,56,148,57,150,58,152,59,154,60,156,61,158,62,160, - 63,162,64,164,65,166,66,168,67,170,0,172,68,174,69,176,70,178,71,180,0, - 182,0,184,0,186,0,188,0,190,0,192,72,194,0,196,73,198,74,200,75,202,76, - 204,0,206,0,208,0,210,0,212,0,214,77,216,78,218,79,220,80,222,0,224,0,226, - 0,228,0,230,81,232,0,234,82,236,83,238,84,240,0,242,0,244,85,246,86,248, - 0,250,87,252,0,254,0,256,88,258,89,260,90,262,0,264,0,266,0,268,0,270,0, - 272,0,274,0,276,91,278,92,280,93,282,0,284,0,286,0,288,0,290,94,292,95, - 294,96,296,0,298,97,300,98,302,99,304,100,306,0,308,101,310,102,312,103, - 314,104,316,0,318,105,320,106,322,107,324,108,326,109,12,0,1,2,3,4,5,6, - 7,8,9,10,11,35,2,0,68,68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2, - 0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0, - 79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0, - 86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70, - 70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,87, - 87,119,119,6,0,9,10,13,13,32,32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9, - 10,13,13,32,32,1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92, - 92,110,110,114,114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45, - 1,0,96,96,2,0,66,66,98,98,2,0,89,89,121,121,2,0,85,85,117,117,10,0,9,10, + public static readonly _serializedATN: number[] = [4,0,116,1297,6,-1,6, + -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0,7,0, + 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, + 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, + 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, + 7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7, + 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, + 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, + 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53, + 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7, + 60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,2,66,7,66,2,67,7,67, + 2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74,7,74,2, + 75,7,75,2,76,7,76,2,77,7,77,2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82, + 7,82,2,83,7,83,2,84,7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7, + 89,2,90,7,90,2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96, + 2,97,7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, + 7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108,2,109, + 7,109,2,110,7,110,2,111,7,111,2,112,7,112,2,113,7,113,2,114,7,114,2,115, + 7,115,2,116,7,116,2,117,7,117,2,118,7,118,2,119,7,119,2,120,7,120,2,121, + 7,121,2,122,7,122,2,123,7,123,2,124,7,124,2,125,7,125,2,126,7,126,2,127, + 7,127,2,128,7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133, + 7,133,2,134,7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139, + 7,139,2,140,7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145, + 7,145,2,146,7,146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151, + 7,151,2,152,7,152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157, + 7,157,2,158,7,158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162,2,163, + 7,163,2,164,7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,2,169, + 7,169,2,170,7,170,2,171,7,171,2,172,7,172,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, + 0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1, + 2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1, + 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1, + 9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1, + 12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, + 1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18, + 1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,4,19,522,8,19,11,19,12,19,523,1, + 19,1,19,1,20,1,20,1,20,1,20,5,20,532,8,20,10,20,12,20,535,9,20,1,20,3,20, + 538,8,20,1,20,3,20,541,8,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,5,21,550, + 8,21,10,21,12,21,553,9,21,1,21,1,21,1,21,1,21,1,21,1,22,4,22,561,8,22,11, + 22,12,22,562,1,22,1,22,1,23,1,23,1,23,3,23,570,8,23,1,24,4,24,573,8,24, + 11,24,12,24,574,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,27, + 1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1, + 30,1,31,1,31,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,35,1,35,3,35,614,8,35, + 1,35,4,35,617,8,35,11,35,12,35,618,1,36,1,36,1,37,1,37,1,38,1,38,1,38,3, + 38,628,8,38,1,39,1,39,1,40,1,40,1,40,3,40,635,8,40,1,41,1,41,1,41,5,41, + 640,8,41,10,41,12,41,643,9,41,1,41,1,41,1,41,1,41,1,41,1,41,5,41,651,8, + 41,10,41,12,41,654,9,41,1,41,1,41,1,41,1,41,1,41,3,41,661,8,41,1,41,3,41, + 664,8,41,3,41,666,8,41,1,42,4,42,669,8,42,11,42,12,42,670,1,43,4,43,674, + 8,43,11,43,12,43,675,1,43,1,43,5,43,680,8,43,10,43,12,43,683,9,43,1,43, + 1,43,4,43,687,8,43,11,43,12,43,688,1,43,4,43,692,8,43,11,43,12,43,693,1, + 43,1,43,5,43,698,8,43,10,43,12,43,701,9,43,3,43,703,8,43,1,43,1,43,1,43, + 1,43,4,43,709,8,43,11,43,12,43,710,1,43,1,43,3,43,715,8,43,1,44,1,44,1, + 44,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,48,1,48,1,48,1,49, + 1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1, + 53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,56,1,56, + 1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,60,1, + 60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,63,1,63, + 1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,67,1, + 67,1,67,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,71,1,71,1,71,1,72,1,72, + 1,73,1,73,1,73,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78,1,78,1,79,1, + 79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,81,1,81,5,81,846,8,81,10,81, + 12,81,849,9,81,1,81,1,81,3,81,853,8,81,1,81,4,81,856,8,81,11,81,12,81,857, + 3,81,860,8,81,1,82,1,82,4,82,864,8,82,11,82,12,82,865,1,82,1,82,1,83,1, + 83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1,87, + 1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1, + 90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93, + 1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1, + 96,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,100, + 1,100,1,100,1,100,1,101,1,101,1,101,1,101,3,101,951,8,101,1,102,1,102,3, + 102,955,8,102,1,102,5,102,958,8,102,10,102,12,102,961,9,102,1,102,1,102, + 3,102,965,8,102,1,102,4,102,968,8,102,11,102,12,102,969,3,102,972,8,102, + 1,103,1,103,4,103,976,8,103,11,103,12,103,977,1,104,1,104,1,104,1,104,1, + 105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1, + 107,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1, + 110,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1, + 114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1, + 116,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1, + 119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,121,4,121,1053,8,121,11, + 121,12,121,1054,1,121,1,121,3,121,1059,8,121,1,121,4,121,1062,8,121,11, + 121,12,121,1063,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,124,1, + 124,1,124,1,124,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,127,1, + 127,1,127,1,127,1,127,1,127,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1, + 129,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1, + 132,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1, + 135,1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137,1,137,1,138,1,138,1, + 138,1,138,1,139,1,139,1,139,1,139,1,140,1,140,1,140,1,140,1,141,1,141,1, + 141,1,141,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144,1, + 144,1,144,1,144,1,145,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1, + 147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1, + 149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,151,1, + 151,1,151,1,151,1,152,1,152,1,152,1,152,1,153,1,153,1,153,1,153,1,154,1, + 154,1,154,1,154,1,154,1,155,1,155,1,156,1,156,1,156,1,156,1,156,4,156,1218, + 8,156,11,156,12,156,1219,1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158, + 1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,160,1,161,1,161,1,161, + 1,161,1,161,1,161,1,162,1,162,1,162,1,162,1,163,1,163,1,163,1,163,1,164, + 1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,165,1,165,1,166,1,166,1,166, + 1,166,1,167,1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,169,1,169,1,169, + 1,169,1,169,1,169,1,170,1,170,1,170,1,170,1,170,1,170,1,171,1,171,1,171, + 1,171,1,171,1,171,1,172,1,172,1,172,1,172,1,172,2,551,652,0,173,14,1,16, + 2,18,3,20,4,22,5,24,6,26,7,28,8,30,9,32,10,34,11,36,12,38,13,40,14,42,15, + 44,16,46,17,48,18,50,19,52,20,54,21,56,22,58,23,60,0,62,24,64,0,66,0,68, + 25,70,26,72,27,74,28,76,0,78,0,80,0,82,0,84,0,86,0,88,0,90,0,92,0,94,0, + 96,29,98,30,100,31,102,32,104,33,106,34,108,35,110,36,112,37,114,38,116, + 39,118,40,120,41,122,42,124,43,126,44,128,45,130,46,132,47,134,48,136,49, + 138,50,140,51,142,52,144,53,146,54,148,55,150,56,152,57,154,58,156,59,158, + 60,160,61,162,62,164,63,166,64,168,65,170,66,172,67,174,68,176,69,178,0, + 180,70,182,71,184,72,186,73,188,0,190,0,192,0,194,0,196,0,198,0,200,74, + 202,0,204,75,206,76,208,77,210,0,212,0,214,0,216,0,218,0,220,78,222,79, + 224,80,226,81,228,0,230,0,232,0,234,0,236,82,238,0,240,83,242,84,244,85, + 246,0,248,0,250,86,252,87,254,0,256,88,258,0,260,0,262,89,264,90,266,91, + 268,0,270,0,272,0,274,0,276,0,278,0,280,0,282,92,284,93,286,94,288,0,290, + 0,292,0,294,0,296,95,298,96,300,97,302,0,304,98,306,99,308,100,310,101, + 312,0,314,102,316,103,318,104,320,105,322,0,324,106,326,107,328,108,330, + 109,332,110,334,0,336,0,338,111,340,112,342,113,344,0,346,114,348,115,350, + 116,352,0,354,0,356,0,358,0,14,0,1,2,3,4,5,6,7,8,9,10,11,12,13,35,2,0,68, + 68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2,0,69,69,101,101,2,0,67, + 67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0,79,79,111,111,2,0,80,80, + 112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0,86,86,118,118,2,0,65,65, + 97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70,70,102,102,2,0,77,77,109, + 109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,87,87,119,119,6,0,9,10,13,13, + 32,32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,10,0,9,10, 13,13,32,32,44,44,47,47,61,61,91,91,93,93,96,96,124,124,2,0,42,42,47,47, - 11,0,9,10,13,13,32,32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124,124, - 1214,0,12,1,0,0,0,0,14,1,0,0,0,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0, - 22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0, - 0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0, - 44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0, - 0,0,1,56,1,0,0,0,1,58,1,0,0,0,1,60,1,0,0,0,1,62,1,0,0,0,1,64,1,0,0,0,2, - 66,1,0,0,0,2,88,1,0,0,0,2,90,1,0,0,0,2,92,1,0,0,0,2,94,1,0,0,0,2,96,1,0, - 0,0,2,98,1,0,0,0,2,100,1,0,0,0,2,102,1,0,0,0,2,104,1,0,0,0,2,106,1,0,0, - 0,2,108,1,0,0,0,2,110,1,0,0,0,2,112,1,0,0,0,2,114,1,0,0,0,2,116,1,0,0,0, - 2,118,1,0,0,0,2,120,1,0,0,0,2,122,1,0,0,0,2,124,1,0,0,0,2,126,1,0,0,0,2, - 128,1,0,0,0,2,130,1,0,0,0,2,132,1,0,0,0,2,134,1,0,0,0,2,136,1,0,0,0,2,138, - 1,0,0,0,2,140,1,0,0,0,2,142,1,0,0,0,2,144,1,0,0,0,2,146,1,0,0,0,2,148,1, - 0,0,0,2,150,1,0,0,0,2,152,1,0,0,0,2,154,1,0,0,0,2,156,1,0,0,0,2,158,1,0, - 0,0,2,160,1,0,0,0,2,162,1,0,0,0,2,164,1,0,0,0,2,166,1,0,0,0,2,168,1,0,0, - 0,2,172,1,0,0,0,2,174,1,0,0,0,2,176,1,0,0,0,2,178,1,0,0,0,3,180,1,0,0,0, - 3,182,1,0,0,0,3,184,1,0,0,0,3,186,1,0,0,0,3,188,1,0,0,0,3,190,1,0,0,0,3, - 192,1,0,0,0,3,196,1,0,0,0,3,198,1,0,0,0,3,200,1,0,0,0,3,202,1,0,0,0,4,204, - 1,0,0,0,4,206,1,0,0,0,4,208,1,0,0,0,4,214,1,0,0,0,4,216,1,0,0,0,4,218,1, - 0,0,0,4,220,1,0,0,0,5,222,1,0,0,0,5,224,1,0,0,0,5,226,1,0,0,0,5,228,1,0, - 0,0,5,230,1,0,0,0,5,232,1,0,0,0,5,234,1,0,0,0,5,236,1,0,0,0,5,238,1,0,0, - 0,6,240,1,0,0,0,6,242,1,0,0,0,6,244,1,0,0,0,6,246,1,0,0,0,6,250,1,0,0,0, - 6,252,1,0,0,0,6,254,1,0,0,0,6,256,1,0,0,0,6,258,1,0,0,0,6,260,1,0,0,0,7, - 262,1,0,0,0,7,264,1,0,0,0,7,266,1,0,0,0,7,268,1,0,0,0,7,270,1,0,0,0,7,272, - 1,0,0,0,7,274,1,0,0,0,7,276,1,0,0,0,7,278,1,0,0,0,7,280,1,0,0,0,8,282,1, - 0,0,0,8,284,1,0,0,0,8,286,1,0,0,0,8,288,1,0,0,0,8,290,1,0,0,0,8,292,1,0, - 0,0,8,294,1,0,0,0,9,296,1,0,0,0,9,298,1,0,0,0,9,300,1,0,0,0,9,302,1,0,0, - 0,9,304,1,0,0,0,10,306,1,0,0,0,10,308,1,0,0,0,10,310,1,0,0,0,10,312,1,0, - 0,0,10,314,1,0,0,0,11,316,1,0,0,0,11,318,1,0,0,0,11,320,1,0,0,0,11,322, - 1,0,0,0,11,324,1,0,0,0,11,326,1,0,0,0,12,328,1,0,0,0,14,338,1,0,0,0,16, - 345,1,0,0,0,18,354,1,0,0,0,20,361,1,0,0,0,22,371,1,0,0,0,24,378,1,0,0,0, - 26,385,1,0,0,0,28,399,1,0,0,0,30,406,1,0,0,0,32,414,1,0,0,0,34,421,1,0, - 0,0,36,433,1,0,0,0,38,442,1,0,0,0,40,448,1,0,0,0,42,455,1,0,0,0,44,462, - 1,0,0,0,46,470,1,0,0,0,48,479,1,0,0,0,50,485,1,0,0,0,52,502,1,0,0,0,54, - 518,1,0,0,0,56,524,1,0,0,0,58,529,1,0,0,0,60,534,1,0,0,0,62,538,1,0,0,0, - 64,542,1,0,0,0,66,546,1,0,0,0,68,550,1,0,0,0,70,552,1,0,0,0,72,554,1,0, - 0,0,74,557,1,0,0,0,76,559,1,0,0,0,78,568,1,0,0,0,80,570,1,0,0,0,82,575, - 1,0,0,0,84,577,1,0,0,0,86,582,1,0,0,0,88,613,1,0,0,0,90,616,1,0,0,0,92, - 662,1,0,0,0,94,664,1,0,0,0,96,667,1,0,0,0,98,671,1,0,0,0,100,675,1,0,0, - 0,102,677,1,0,0,0,104,680,1,0,0,0,106,682,1,0,0,0,108,687,1,0,0,0,110,689, - 1,0,0,0,112,695,1,0,0,0,114,701,1,0,0,0,116,706,1,0,0,0,118,708,1,0,0,0, - 120,711,1,0,0,0,122,714,1,0,0,0,124,719,1,0,0,0,126,723,1,0,0,0,128,728, - 1,0,0,0,130,734,1,0,0,0,132,737,1,0,0,0,134,739,1,0,0,0,136,745,1,0,0,0, - 138,747,1,0,0,0,140,752,1,0,0,0,142,755,1,0,0,0,144,758,1,0,0,0,146,761, - 1,0,0,0,148,763,1,0,0,0,150,766,1,0,0,0,152,768,1,0,0,0,154,771,1,0,0,0, - 156,773,1,0,0,0,158,775,1,0,0,0,160,777,1,0,0,0,162,779,1,0,0,0,164,781, - 1,0,0,0,166,786,1,0,0,0,168,807,1,0,0,0,170,809,1,0,0,0,172,817,1,0,0,0, - 174,819,1,0,0,0,176,823,1,0,0,0,178,827,1,0,0,0,180,831,1,0,0,0,182,836, - 1,0,0,0,184,840,1,0,0,0,186,844,1,0,0,0,188,848,1,0,0,0,190,852,1,0,0,0, - 192,856,1,0,0,0,194,868,1,0,0,0,196,871,1,0,0,0,198,875,1,0,0,0,200,879, - 1,0,0,0,202,883,1,0,0,0,204,887,1,0,0,0,206,892,1,0,0,0,208,896,1,0,0,0, - 210,904,1,0,0,0,212,925,1,0,0,0,214,929,1,0,0,0,216,933,1,0,0,0,218,937, - 1,0,0,0,220,941,1,0,0,0,222,945,1,0,0,0,224,950,1,0,0,0,226,954,1,0,0,0, - 228,958,1,0,0,0,230,962,1,0,0,0,232,965,1,0,0,0,234,969,1,0,0,0,236,973, - 1,0,0,0,238,977,1,0,0,0,240,981,1,0,0,0,242,986,1,0,0,0,244,991,1,0,0,0, - 246,996,1,0,0,0,248,1003,1,0,0,0,250,1012,1,0,0,0,252,1019,1,0,0,0,254, - 1023,1,0,0,0,256,1027,1,0,0,0,258,1031,1,0,0,0,260,1035,1,0,0,0,262,1039, - 1,0,0,0,264,1045,1,0,0,0,266,1049,1,0,0,0,268,1053,1,0,0,0,270,1057,1,0, - 0,0,272,1061,1,0,0,0,274,1065,1,0,0,0,276,1069,1,0,0,0,278,1073,1,0,0,0, - 280,1077,1,0,0,0,282,1081,1,0,0,0,284,1086,1,0,0,0,286,1090,1,0,0,0,288, - 1094,1,0,0,0,290,1098,1,0,0,0,292,1102,1,0,0,0,294,1106,1,0,0,0,296,1110, - 1,0,0,0,298,1115,1,0,0,0,300,1120,1,0,0,0,302,1124,1,0,0,0,304,1128,1,0, - 0,0,306,1132,1,0,0,0,308,1137,1,0,0,0,310,1147,1,0,0,0,312,1151,1,0,0,0, - 314,1155,1,0,0,0,316,1159,1,0,0,0,318,1164,1,0,0,0,320,1171,1,0,0,0,322, - 1175,1,0,0,0,324,1179,1,0,0,0,326,1183,1,0,0,0,328,329,7,0,0,0,329,330, - 7,1,0,0,330,331,7,2,0,0,331,332,7,2,0,0,332,333,7,3,0,0,333,334,7,4,0,0, - 334,335,7,5,0,0,335,336,1,0,0,0,336,337,6,0,0,0,337,13,1,0,0,0,338,339, - 7,0,0,0,339,340,7,6,0,0,340,341,7,7,0,0,341,342,7,8,0,0,342,343,1,0,0,0, - 343,344,6,1,1,0,344,15,1,0,0,0,345,346,7,3,0,0,346,347,7,9,0,0,347,348, - 7,6,0,0,348,349,7,1,0,0,349,350,7,4,0,0,350,351,7,10,0,0,351,352,1,0,0, - 0,352,353,6,2,2,0,353,17,1,0,0,0,354,355,7,3,0,0,355,356,7,11,0,0,356,357, - 7,12,0,0,357,358,7,13,0,0,358,359,1,0,0,0,359,360,6,3,0,0,360,19,1,0,0, - 0,361,362,7,3,0,0,362,363,7,14,0,0,363,364,7,8,0,0,364,365,7,13,0,0,365, - 366,7,12,0,0,366,367,7,1,0,0,367,368,7,9,0,0,368,369,1,0,0,0,369,370,6, - 4,3,0,370,21,1,0,0,0,371,372,7,15,0,0,372,373,7,6,0,0,373,374,7,7,0,0,374, - 375,7,16,0,0,375,376,1,0,0,0,376,377,6,5,4,0,377,23,1,0,0,0,378,379,7,17, - 0,0,379,380,7,6,0,0,380,381,7,7,0,0,381,382,7,18,0,0,382,383,1,0,0,0,383, - 384,6,6,0,0,384,25,1,0,0,0,385,386,7,1,0,0,386,387,7,9,0,0,387,388,7,13, - 0,0,388,389,7,1,0,0,389,390,7,9,0,0,390,391,7,3,0,0,391,392,7,2,0,0,392, - 393,7,5,0,0,393,394,7,12,0,0,394,395,7,5,0,0,395,396,7,2,0,0,396,397,1, - 0,0,0,397,398,6,7,0,0,398,27,1,0,0,0,399,400,7,18,0,0,400,401,7,3,0,0,401, - 402,7,3,0,0,402,403,7,8,0,0,403,404,1,0,0,0,404,405,6,8,1,0,405,29,1,0, - 0,0,406,407,7,13,0,0,407,408,7,1,0,0,408,409,7,16,0,0,409,410,7,1,0,0,410, - 411,7,5,0,0,411,412,1,0,0,0,412,413,6,9,0,0,413,31,1,0,0,0,414,415,7,16, - 0,0,415,416,7,3,0,0,416,417,7,5,0,0,417,418,7,12,0,0,418,419,1,0,0,0,419, - 420,6,10,5,0,420,33,1,0,0,0,421,422,7,16,0,0,422,423,7,11,0,0,423,424,5, - 95,0,0,424,425,7,3,0,0,425,426,7,14,0,0,426,427,7,8,0,0,427,428,7,12,0, - 0,428,429,7,9,0,0,429,430,7,0,0,0,430,431,1,0,0,0,431,432,6,11,6,0,432, - 35,1,0,0,0,433,434,7,6,0,0,434,435,7,3,0,0,435,436,7,9,0,0,436,437,7,12, - 0,0,437,438,7,16,0,0,438,439,7,3,0,0,439,440,1,0,0,0,440,441,6,12,7,0,441, - 37,1,0,0,0,442,443,7,6,0,0,443,444,7,7,0,0,444,445,7,19,0,0,445,446,1,0, - 0,0,446,447,6,13,0,0,447,39,1,0,0,0,448,449,7,2,0,0,449,450,7,10,0,0,450, - 451,7,7,0,0,451,452,7,19,0,0,452,453,1,0,0,0,453,454,6,14,8,0,454,41,1, - 0,0,0,455,456,7,2,0,0,456,457,7,7,0,0,457,458,7,6,0,0,458,459,7,5,0,0,459, - 460,1,0,0,0,460,461,6,15,0,0,461,43,1,0,0,0,462,463,7,2,0,0,463,464,7,5, - 0,0,464,465,7,12,0,0,465,466,7,5,0,0,466,467,7,2,0,0,467,468,1,0,0,0,468, - 469,6,16,0,0,469,45,1,0,0,0,470,471,7,19,0,0,471,472,7,10,0,0,472,473,7, - 3,0,0,473,474,7,6,0,0,474,475,7,3,0,0,475,476,1,0,0,0,476,477,6,17,0,0, - 477,47,1,0,0,0,478,480,8,20,0,0,479,478,1,0,0,0,480,481,1,0,0,0,481,479, - 1,0,0,0,481,482,1,0,0,0,482,483,1,0,0,0,483,484,6,18,0,0,484,49,1,0,0,0, - 485,486,5,47,0,0,486,487,5,47,0,0,487,491,1,0,0,0,488,490,8,21,0,0,489, - 488,1,0,0,0,490,493,1,0,0,0,491,489,1,0,0,0,491,492,1,0,0,0,492,495,1,0, - 0,0,493,491,1,0,0,0,494,496,5,13,0,0,495,494,1,0,0,0,495,496,1,0,0,0,496, - 498,1,0,0,0,497,499,5,10,0,0,498,497,1,0,0,0,498,499,1,0,0,0,499,500,1, - 0,0,0,500,501,6,19,9,0,501,51,1,0,0,0,502,503,5,47,0,0,503,504,5,42,0,0, - 504,509,1,0,0,0,505,508,3,52,20,0,506,508,9,0,0,0,507,505,1,0,0,0,507,506, - 1,0,0,0,508,511,1,0,0,0,509,510,1,0,0,0,509,507,1,0,0,0,510,512,1,0,0,0, - 511,509,1,0,0,0,512,513,5,42,0,0,513,514,5,47,0,0,514,515,1,0,0,0,515,516, - 6,20,9,0,516,53,1,0,0,0,517,519,7,22,0,0,518,517,1,0,0,0,519,520,1,0,0, - 0,520,518,1,0,0,0,520,521,1,0,0,0,521,522,1,0,0,0,522,523,6,21,9,0,523, - 55,1,0,0,0,524,525,3,164,76,0,525,526,1,0,0,0,526,527,6,22,10,0,527,528, - 6,22,11,0,528,57,1,0,0,0,529,530,3,66,27,0,530,531,1,0,0,0,531,532,6,23, - 12,0,532,533,6,23,13,0,533,59,1,0,0,0,534,535,3,54,21,0,535,536,1,0,0,0, - 536,537,6,24,9,0,537,61,1,0,0,0,538,539,3,50,19,0,539,540,1,0,0,0,540,541, - 6,25,9,0,541,63,1,0,0,0,542,543,3,52,20,0,543,544,1,0,0,0,544,545,6,26, - 9,0,545,65,1,0,0,0,546,547,5,124,0,0,547,548,1,0,0,0,548,549,6,27,13,0, - 549,67,1,0,0,0,550,551,7,23,0,0,551,69,1,0,0,0,552,553,7,24,0,0,553,71, - 1,0,0,0,554,555,5,92,0,0,555,556,7,25,0,0,556,73,1,0,0,0,557,558,8,26,0, - 0,558,75,1,0,0,0,559,561,7,3,0,0,560,562,7,27,0,0,561,560,1,0,0,0,561,562, - 1,0,0,0,562,564,1,0,0,0,563,565,3,68,28,0,564,563,1,0,0,0,565,566,1,0,0, - 0,566,564,1,0,0,0,566,567,1,0,0,0,567,77,1,0,0,0,568,569,5,64,0,0,569,79, - 1,0,0,0,570,571,5,96,0,0,571,81,1,0,0,0,572,576,8,28,0,0,573,574,5,96,0, - 0,574,576,5,96,0,0,575,572,1,0,0,0,575,573,1,0,0,0,576,83,1,0,0,0,577,578, - 5,95,0,0,578,85,1,0,0,0,579,583,3,70,29,0,580,583,3,68,28,0,581,583,3,84, - 36,0,582,579,1,0,0,0,582,580,1,0,0,0,582,581,1,0,0,0,583,87,1,0,0,0,584, - 589,5,34,0,0,585,588,3,72,30,0,586,588,3,74,31,0,587,585,1,0,0,0,587,586, - 1,0,0,0,588,591,1,0,0,0,589,587,1,0,0,0,589,590,1,0,0,0,590,592,1,0,0,0, - 591,589,1,0,0,0,592,614,5,34,0,0,593,594,5,34,0,0,594,595,5,34,0,0,595, - 596,5,34,0,0,596,600,1,0,0,0,597,599,8,21,0,0,598,597,1,0,0,0,599,602,1, - 0,0,0,600,601,1,0,0,0,600,598,1,0,0,0,601,603,1,0,0,0,602,600,1,0,0,0,603, - 604,5,34,0,0,604,605,5,34,0,0,605,606,5,34,0,0,606,608,1,0,0,0,607,609, - 5,34,0,0,608,607,1,0,0,0,608,609,1,0,0,0,609,611,1,0,0,0,610,612,5,34,0, - 0,611,610,1,0,0,0,611,612,1,0,0,0,612,614,1,0,0,0,613,584,1,0,0,0,613,593, - 1,0,0,0,614,89,1,0,0,0,615,617,3,68,28,0,616,615,1,0,0,0,617,618,1,0,0, - 0,618,616,1,0,0,0,618,619,1,0,0,0,619,91,1,0,0,0,620,622,3,68,28,0,621, - 620,1,0,0,0,622,623,1,0,0,0,623,621,1,0,0,0,623,624,1,0,0,0,624,625,1,0, - 0,0,625,629,3,108,48,0,626,628,3,68,28,0,627,626,1,0,0,0,628,631,1,0,0, - 0,629,627,1,0,0,0,629,630,1,0,0,0,630,663,1,0,0,0,631,629,1,0,0,0,632,634, - 3,108,48,0,633,635,3,68,28,0,634,633,1,0,0,0,635,636,1,0,0,0,636,634,1, - 0,0,0,636,637,1,0,0,0,637,663,1,0,0,0,638,640,3,68,28,0,639,638,1,0,0,0, - 640,641,1,0,0,0,641,639,1,0,0,0,641,642,1,0,0,0,642,650,1,0,0,0,643,647, - 3,108,48,0,644,646,3,68,28,0,645,644,1,0,0,0,646,649,1,0,0,0,647,645,1, - 0,0,0,647,648,1,0,0,0,648,651,1,0,0,0,649,647,1,0,0,0,650,643,1,0,0,0,650, - 651,1,0,0,0,651,652,1,0,0,0,652,653,3,76,32,0,653,663,1,0,0,0,654,656,3, - 108,48,0,655,657,3,68,28,0,656,655,1,0,0,0,657,658,1,0,0,0,658,656,1,0, - 0,0,658,659,1,0,0,0,659,660,1,0,0,0,660,661,3,76,32,0,661,663,1,0,0,0,662, - 621,1,0,0,0,662,632,1,0,0,0,662,639,1,0,0,0,662,654,1,0,0,0,663,93,1,0, - 0,0,664,665,7,29,0,0,665,666,7,30,0,0,666,95,1,0,0,0,667,668,7,12,0,0,668, - 669,7,9,0,0,669,670,7,0,0,0,670,97,1,0,0,0,671,672,7,12,0,0,672,673,7,2, - 0,0,673,674,7,4,0,0,674,99,1,0,0,0,675,676,5,61,0,0,676,101,1,0,0,0,677, - 678,5,58,0,0,678,679,5,58,0,0,679,103,1,0,0,0,680,681,5,44,0,0,681,105, - 1,0,0,0,682,683,7,0,0,0,683,684,7,3,0,0,684,685,7,2,0,0,685,686,7,4,0,0, - 686,107,1,0,0,0,687,688,5,46,0,0,688,109,1,0,0,0,689,690,7,15,0,0,690,691, - 7,12,0,0,691,692,7,13,0,0,692,693,7,2,0,0,693,694,7,3,0,0,694,111,1,0,0, - 0,695,696,7,15,0,0,696,697,7,1,0,0,697,698,7,6,0,0,698,699,7,2,0,0,699, - 700,7,5,0,0,700,113,1,0,0,0,701,702,7,13,0,0,702,703,7,12,0,0,703,704,7, - 2,0,0,704,705,7,5,0,0,705,115,1,0,0,0,706,707,5,40,0,0,707,117,1,0,0,0, - 708,709,7,1,0,0,709,710,7,9,0,0,710,119,1,0,0,0,711,712,7,1,0,0,712,713, - 7,2,0,0,713,121,1,0,0,0,714,715,7,13,0,0,715,716,7,1,0,0,716,717,7,18,0, - 0,717,718,7,3,0,0,718,123,1,0,0,0,719,720,7,9,0,0,720,721,7,7,0,0,721,722, - 7,5,0,0,722,125,1,0,0,0,723,724,7,9,0,0,724,725,7,31,0,0,725,726,7,13,0, - 0,726,727,7,13,0,0,727,127,1,0,0,0,728,729,7,9,0,0,729,730,7,31,0,0,730, - 731,7,13,0,0,731,732,7,13,0,0,732,733,7,2,0,0,733,129,1,0,0,0,734,735,7, - 7,0,0,735,736,7,6,0,0,736,131,1,0,0,0,737,738,5,63,0,0,738,133,1,0,0,0, - 739,740,7,6,0,0,740,741,7,13,0,0,741,742,7,1,0,0,742,743,7,18,0,0,743,744, - 7,3,0,0,744,135,1,0,0,0,745,746,5,41,0,0,746,137,1,0,0,0,747,748,7,5,0, - 0,748,749,7,6,0,0,749,750,7,31,0,0,750,751,7,3,0,0,751,139,1,0,0,0,752, - 753,5,61,0,0,753,754,5,61,0,0,754,141,1,0,0,0,755,756,5,61,0,0,756,757, - 5,126,0,0,757,143,1,0,0,0,758,759,5,33,0,0,759,760,5,61,0,0,760,145,1,0, - 0,0,761,762,5,60,0,0,762,147,1,0,0,0,763,764,5,60,0,0,764,765,5,61,0,0, - 765,149,1,0,0,0,766,767,5,62,0,0,767,151,1,0,0,0,768,769,5,62,0,0,769,770, - 5,61,0,0,770,153,1,0,0,0,771,772,5,43,0,0,772,155,1,0,0,0,773,774,5,45, - 0,0,774,157,1,0,0,0,775,776,5,42,0,0,776,159,1,0,0,0,777,778,5,47,0,0,778, - 161,1,0,0,0,779,780,5,37,0,0,780,163,1,0,0,0,781,782,5,91,0,0,782,783,1, - 0,0,0,783,784,6,76,0,0,784,785,6,76,0,0,785,165,1,0,0,0,786,787,5,93,0, - 0,787,788,1,0,0,0,788,789,6,77,13,0,789,790,6,77,13,0,790,167,1,0,0,0,791, - 795,3,70,29,0,792,794,3,86,37,0,793,792,1,0,0,0,794,797,1,0,0,0,795,793, - 1,0,0,0,795,796,1,0,0,0,796,808,1,0,0,0,797,795,1,0,0,0,798,801,3,84,36, - 0,799,801,3,78,33,0,800,798,1,0,0,0,800,799,1,0,0,0,801,803,1,0,0,0,802, - 804,3,86,37,0,803,802,1,0,0,0,804,805,1,0,0,0,805,803,1,0,0,0,805,806,1, - 0,0,0,806,808,1,0,0,0,807,791,1,0,0,0,807,800,1,0,0,0,808,169,1,0,0,0,809, - 811,3,80,34,0,810,812,3,82,35,0,811,810,1,0,0,0,812,813,1,0,0,0,813,811, - 1,0,0,0,813,814,1,0,0,0,814,815,1,0,0,0,815,816,3,80,34,0,816,171,1,0,0, - 0,817,818,3,170,79,0,818,173,1,0,0,0,819,820,3,50,19,0,820,821,1,0,0,0, - 821,822,6,81,9,0,822,175,1,0,0,0,823,824,3,52,20,0,824,825,1,0,0,0,825, - 826,6,82,9,0,826,177,1,0,0,0,827,828,3,54,21,0,828,829,1,0,0,0,829,830, - 6,83,9,0,830,179,1,0,0,0,831,832,3,66,27,0,832,833,1,0,0,0,833,834,6,84, - 12,0,834,835,6,84,13,0,835,181,1,0,0,0,836,837,3,164,76,0,837,838,1,0,0, - 0,838,839,6,85,10,0,839,183,1,0,0,0,840,841,3,166,77,0,841,842,1,0,0,0, - 842,843,6,86,14,0,843,185,1,0,0,0,844,845,3,104,46,0,845,846,1,0,0,0,846, - 847,6,87,15,0,847,187,1,0,0,0,848,849,3,100,44,0,849,850,1,0,0,0,850,851, - 6,88,16,0,851,189,1,0,0,0,852,853,3,88,38,0,853,854,1,0,0,0,854,855,6,89, - 17,0,855,191,1,0,0,0,856,857,7,16,0,0,857,858,7,3,0,0,858,859,7,5,0,0,859, - 860,7,12,0,0,860,861,7,0,0,0,861,862,7,12,0,0,862,863,7,5,0,0,863,864,7, - 12,0,0,864,193,1,0,0,0,865,869,8,32,0,0,866,867,5,47,0,0,867,869,8,33,0, - 0,868,865,1,0,0,0,868,866,1,0,0,0,869,195,1,0,0,0,870,872,3,194,91,0,871, - 870,1,0,0,0,872,873,1,0,0,0,873,871,1,0,0,0,873,874,1,0,0,0,874,197,1,0, - 0,0,875,876,3,50,19,0,876,877,1,0,0,0,877,878,6,93,9,0,878,199,1,0,0,0, - 879,880,3,52,20,0,880,881,1,0,0,0,881,882,6,94,9,0,882,201,1,0,0,0,883, - 884,3,54,21,0,884,885,1,0,0,0,885,886,6,95,9,0,886,203,1,0,0,0,887,888, - 3,66,27,0,888,889,1,0,0,0,889,890,6,96,12,0,890,891,6,96,13,0,891,205,1, - 0,0,0,892,893,3,108,48,0,893,894,1,0,0,0,894,895,6,97,18,0,895,207,1,0, - 0,0,896,897,3,104,46,0,897,898,1,0,0,0,898,899,6,98,15,0,899,209,1,0,0, - 0,900,905,3,70,29,0,901,905,3,68,28,0,902,905,3,84,36,0,903,905,3,158,73, - 0,904,900,1,0,0,0,904,901,1,0,0,0,904,902,1,0,0,0,904,903,1,0,0,0,905,211, - 1,0,0,0,906,909,3,70,29,0,907,909,3,158,73,0,908,906,1,0,0,0,908,907,1, - 0,0,0,909,913,1,0,0,0,910,912,3,210,99,0,911,910,1,0,0,0,912,915,1,0,0, - 0,913,911,1,0,0,0,913,914,1,0,0,0,914,926,1,0,0,0,915,913,1,0,0,0,916,919, - 3,84,36,0,917,919,3,78,33,0,918,916,1,0,0,0,918,917,1,0,0,0,919,921,1,0, - 0,0,920,922,3,210,99,0,921,920,1,0,0,0,922,923,1,0,0,0,923,921,1,0,0,0, - 923,924,1,0,0,0,924,926,1,0,0,0,925,908,1,0,0,0,925,918,1,0,0,0,926,213, - 1,0,0,0,927,930,3,212,100,0,928,930,3,170,79,0,929,927,1,0,0,0,929,928, - 1,0,0,0,930,931,1,0,0,0,931,929,1,0,0,0,931,932,1,0,0,0,932,215,1,0,0,0, - 933,934,3,50,19,0,934,935,1,0,0,0,935,936,6,102,9,0,936,217,1,0,0,0,937, - 938,3,52,20,0,938,939,1,0,0,0,939,940,6,103,9,0,940,219,1,0,0,0,941,942, - 3,54,21,0,942,943,1,0,0,0,943,944,6,104,9,0,944,221,1,0,0,0,945,946,3,66, - 27,0,946,947,1,0,0,0,947,948,6,105,12,0,948,949,6,105,13,0,949,223,1,0, - 0,0,950,951,3,100,44,0,951,952,1,0,0,0,952,953,6,106,16,0,953,225,1,0,0, - 0,954,955,3,104,46,0,955,956,1,0,0,0,956,957,6,107,15,0,957,227,1,0,0,0, - 958,959,3,108,48,0,959,960,1,0,0,0,960,961,6,108,18,0,961,229,1,0,0,0,962, - 963,7,12,0,0,963,964,7,2,0,0,964,231,1,0,0,0,965,966,3,214,101,0,966,967, - 1,0,0,0,967,968,6,110,19,0,968,233,1,0,0,0,969,970,3,50,19,0,970,971,1, - 0,0,0,971,972,6,111,9,0,972,235,1,0,0,0,973,974,3,52,20,0,974,975,1,0,0, - 0,975,976,6,112,9,0,976,237,1,0,0,0,977,978,3,54,21,0,978,979,1,0,0,0,979, - 980,6,113,9,0,980,239,1,0,0,0,981,982,3,66,27,0,982,983,1,0,0,0,983,984, - 6,114,12,0,984,985,6,114,13,0,985,241,1,0,0,0,986,987,3,164,76,0,987,988, - 1,0,0,0,988,989,6,115,10,0,989,990,6,115,20,0,990,243,1,0,0,0,991,992,7, - 7,0,0,992,993,7,9,0,0,993,994,1,0,0,0,994,995,6,116,21,0,995,245,1,0,0, - 0,996,997,7,19,0,0,997,998,7,1,0,0,998,999,7,5,0,0,999,1000,7,10,0,0,1000, - 1001,1,0,0,0,1001,1002,6,117,21,0,1002,247,1,0,0,0,1003,1004,8,34,0,0,1004, - 249,1,0,0,0,1005,1007,3,248,118,0,1006,1005,1,0,0,0,1007,1008,1,0,0,0,1008, - 1006,1,0,0,0,1008,1009,1,0,0,0,1009,1010,1,0,0,0,1010,1011,3,318,153,0, - 1011,1013,1,0,0,0,1012,1006,1,0,0,0,1012,1013,1,0,0,0,1013,1015,1,0,0,0, - 1014,1016,3,248,118,0,1015,1014,1,0,0,0,1016,1017,1,0,0,0,1017,1015,1,0, - 0,0,1017,1018,1,0,0,0,1018,251,1,0,0,0,1019,1020,3,172,80,0,1020,1021,1, - 0,0,0,1021,1022,6,120,22,0,1022,253,1,0,0,0,1023,1024,3,250,119,0,1024, - 1025,1,0,0,0,1025,1026,6,121,23,0,1026,255,1,0,0,0,1027,1028,3,50,19,0, - 1028,1029,1,0,0,0,1029,1030,6,122,9,0,1030,257,1,0,0,0,1031,1032,3,52,20, - 0,1032,1033,1,0,0,0,1033,1034,6,123,9,0,1034,259,1,0,0,0,1035,1036,3,54, - 21,0,1036,1037,1,0,0,0,1037,1038,6,124,9,0,1038,261,1,0,0,0,1039,1040,3, - 66,27,0,1040,1041,1,0,0,0,1041,1042,6,125,12,0,1042,1043,6,125,13,0,1043, - 1044,6,125,13,0,1044,263,1,0,0,0,1045,1046,3,100,44,0,1046,1047,1,0,0,0, - 1047,1048,6,126,16,0,1048,265,1,0,0,0,1049,1050,3,104,46,0,1050,1051,1, - 0,0,0,1051,1052,6,127,15,0,1052,267,1,0,0,0,1053,1054,3,108,48,0,1054,1055, - 1,0,0,0,1055,1056,6,128,18,0,1056,269,1,0,0,0,1057,1058,3,246,117,0,1058, - 1059,1,0,0,0,1059,1060,6,129,24,0,1060,271,1,0,0,0,1061,1062,3,214,101, - 0,1062,1063,1,0,0,0,1063,1064,6,130,19,0,1064,273,1,0,0,0,1065,1066,3,172, - 80,0,1066,1067,1,0,0,0,1067,1068,6,131,22,0,1068,275,1,0,0,0,1069,1070, - 3,50,19,0,1070,1071,1,0,0,0,1071,1072,6,132,9,0,1072,277,1,0,0,0,1073,1074, - 3,52,20,0,1074,1075,1,0,0,0,1075,1076,6,133,9,0,1076,279,1,0,0,0,1077,1078, - 3,54,21,0,1078,1079,1,0,0,0,1079,1080,6,134,9,0,1080,281,1,0,0,0,1081,1082, - 3,66,27,0,1082,1083,1,0,0,0,1083,1084,6,135,12,0,1084,1085,6,135,13,0,1085, - 283,1,0,0,0,1086,1087,3,108,48,0,1087,1088,1,0,0,0,1088,1089,6,136,18,0, - 1089,285,1,0,0,0,1090,1091,3,172,80,0,1091,1092,1,0,0,0,1092,1093,6,137, - 22,0,1093,287,1,0,0,0,1094,1095,3,168,78,0,1095,1096,1,0,0,0,1096,1097, - 6,138,25,0,1097,289,1,0,0,0,1098,1099,3,50,19,0,1099,1100,1,0,0,0,1100, - 1101,6,139,9,0,1101,291,1,0,0,0,1102,1103,3,52,20,0,1103,1104,1,0,0,0,1104, - 1105,6,140,9,0,1105,293,1,0,0,0,1106,1107,3,54,21,0,1107,1108,1,0,0,0,1108, - 1109,6,141,9,0,1109,295,1,0,0,0,1110,1111,3,66,27,0,1111,1112,1,0,0,0,1112, - 1113,6,142,12,0,1113,1114,6,142,13,0,1114,297,1,0,0,0,1115,1116,7,1,0,0, - 1116,1117,7,9,0,0,1117,1118,7,15,0,0,1118,1119,7,7,0,0,1119,299,1,0,0,0, - 1120,1121,3,50,19,0,1121,1122,1,0,0,0,1122,1123,6,144,9,0,1123,301,1,0, - 0,0,1124,1125,3,52,20,0,1125,1126,1,0,0,0,1126,1127,6,145,9,0,1127,303, - 1,0,0,0,1128,1129,3,54,21,0,1129,1130,1,0,0,0,1130,1131,6,146,9,0,1131, - 305,1,0,0,0,1132,1133,3,66,27,0,1133,1134,1,0,0,0,1134,1135,6,147,12,0, - 1135,1136,6,147,13,0,1136,307,1,0,0,0,1137,1138,7,15,0,0,1138,1139,7,31, - 0,0,1139,1140,7,9,0,0,1140,1141,7,4,0,0,1141,1142,7,5,0,0,1142,1143,7,1, - 0,0,1143,1144,7,7,0,0,1144,1145,7,9,0,0,1145,1146,7,2,0,0,1146,309,1,0, - 0,0,1147,1148,3,50,19,0,1148,1149,1,0,0,0,1149,1150,6,149,9,0,1150,311, - 1,0,0,0,1151,1152,3,52,20,0,1152,1153,1,0,0,0,1153,1154,6,150,9,0,1154, - 313,1,0,0,0,1155,1156,3,54,21,0,1156,1157,1,0,0,0,1157,1158,6,151,9,0,1158, - 315,1,0,0,0,1159,1160,3,166,77,0,1160,1161,1,0,0,0,1161,1162,6,152,14,0, - 1162,1163,6,152,13,0,1163,317,1,0,0,0,1164,1165,5,58,0,0,1165,319,1,0,0, - 0,1166,1172,3,78,33,0,1167,1172,3,68,28,0,1168,1172,3,108,48,0,1169,1172, - 3,70,29,0,1170,1172,3,84,36,0,1171,1166,1,0,0,0,1171,1167,1,0,0,0,1171, - 1168,1,0,0,0,1171,1169,1,0,0,0,1171,1170,1,0,0,0,1172,1173,1,0,0,0,1173, - 1171,1,0,0,0,1173,1174,1,0,0,0,1174,321,1,0,0,0,1175,1176,3,50,19,0,1176, - 1177,1,0,0,0,1177,1178,6,155,9,0,1178,323,1,0,0,0,1179,1180,3,52,20,0,1180, - 1181,1,0,0,0,1181,1182,6,156,9,0,1182,325,1,0,0,0,1183,1184,3,54,21,0,1184, - 1185,1,0,0,0,1185,1186,6,157,9,0,1186,327,1,0,0,0,58,0,1,2,3,4,5,6,7,8, - 9,10,11,481,491,495,498,507,509,520,561,566,575,582,587,589,600,608,611, - 613,618,623,629,636,641,647,650,658,662,795,800,805,807,813,868,873,904, - 908,913,918,923,925,929,931,1008,1012,1017,1171,1173,26,5,2,0,5,4,0,5,6, - 0,5,1,0,5,3,0,5,10,0,5,8,0,5,5,0,5,9,0,0,1,0,7,65,0,5,0,0,7,26,0,4,0,0, - 7,66,0,7,35,0,7,33,0,7,27,0,7,37,0,7,77,0,5,11,0,5,7,0,7,68,0,7,87,0,7, - 86,0,7,67,0]; + 1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114, + 114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66, + 66,98,98,2,0,89,89,121,121,2,0,85,85,117,117,11,0,9,10,13,13,32,32,34,35, + 44,44,47,47,58,58,60,60,62,63,92,92,124,124,1322,0,14,1,0,0,0,0,16,1,0, + 0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0, + 28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0, + 0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0, + 50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,62,1,0, + 0,0,1,64,1,0,0,0,1,66,1,0,0,0,1,68,1,0,0,0,1,70,1,0,0,0,1,72,1,0,0,0,2, + 74,1,0,0,0,2,96,1,0,0,0,2,98,1,0,0,0,2,100,1,0,0,0,2,102,1,0,0,0,2,104, + 1,0,0,0,2,106,1,0,0,0,2,108,1,0,0,0,2,110,1,0,0,0,2,112,1,0,0,0,2,114,1, + 0,0,0,2,116,1,0,0,0,2,118,1,0,0,0,2,120,1,0,0,0,2,122,1,0,0,0,2,124,1,0, + 0,0,2,126,1,0,0,0,2,128,1,0,0,0,2,130,1,0,0,0,2,132,1,0,0,0,2,134,1,0,0, + 0,2,136,1,0,0,0,2,138,1,0,0,0,2,140,1,0,0,0,2,142,1,0,0,0,2,144,1,0,0,0, + 2,146,1,0,0,0,2,148,1,0,0,0,2,150,1,0,0,0,2,152,1,0,0,0,2,154,1,0,0,0,2, + 156,1,0,0,0,2,158,1,0,0,0,2,160,1,0,0,0,2,162,1,0,0,0,2,164,1,0,0,0,2,166, + 1,0,0,0,2,168,1,0,0,0,2,170,1,0,0,0,2,172,1,0,0,0,2,174,1,0,0,0,2,176,1, + 0,0,0,2,180,1,0,0,0,2,182,1,0,0,0,2,184,1,0,0,0,2,186,1,0,0,0,3,188,1,0, + 0,0,3,190,1,0,0,0,3,192,1,0,0,0,3,194,1,0,0,0,3,196,1,0,0,0,3,198,1,0,0, + 0,3,200,1,0,0,0,3,202,1,0,0,0,3,204,1,0,0,0,3,206,1,0,0,0,3,208,1,0,0,0, + 4,210,1,0,0,0,4,212,1,0,0,0,4,214,1,0,0,0,4,220,1,0,0,0,4,222,1,0,0,0,4, + 224,1,0,0,0,4,226,1,0,0,0,5,228,1,0,0,0,5,230,1,0,0,0,5,232,1,0,0,0,5,234, + 1,0,0,0,5,236,1,0,0,0,5,238,1,0,0,0,5,240,1,0,0,0,5,242,1,0,0,0,5,244,1, + 0,0,0,6,246,1,0,0,0,6,248,1,0,0,0,6,250,1,0,0,0,6,252,1,0,0,0,6,256,1,0, + 0,0,6,258,1,0,0,0,6,260,1,0,0,0,6,262,1,0,0,0,6,264,1,0,0,0,6,266,1,0,0, + 0,7,268,1,0,0,0,7,270,1,0,0,0,7,272,1,0,0,0,7,274,1,0,0,0,7,276,1,0,0,0, + 7,278,1,0,0,0,7,280,1,0,0,0,7,282,1,0,0,0,7,284,1,0,0,0,7,286,1,0,0,0,8, + 288,1,0,0,0,8,290,1,0,0,0,8,292,1,0,0,0,8,294,1,0,0,0,8,296,1,0,0,0,8,298, + 1,0,0,0,8,300,1,0,0,0,9,302,1,0,0,0,9,304,1,0,0,0,9,306,1,0,0,0,9,308,1, + 0,0,0,9,310,1,0,0,0,10,312,1,0,0,0,10,314,1,0,0,0,10,316,1,0,0,0,10,318, + 1,0,0,0,10,320,1,0,0,0,11,322,1,0,0,0,11,324,1,0,0,0,11,326,1,0,0,0,11, + 328,1,0,0,0,11,330,1,0,0,0,11,332,1,0,0,0,12,334,1,0,0,0,12,336,1,0,0,0, + 12,338,1,0,0,0,12,340,1,0,0,0,12,342,1,0,0,0,13,344,1,0,0,0,13,346,1,0, + 0,0,13,348,1,0,0,0,13,350,1,0,0,0,13,352,1,0,0,0,13,354,1,0,0,0,13,356, + 1,0,0,0,13,358,1,0,0,0,14,360,1,0,0,0,16,370,1,0,0,0,18,377,1,0,0,0,20, + 386,1,0,0,0,22,393,1,0,0,0,24,403,1,0,0,0,26,410,1,0,0,0,28,417,1,0,0,0, + 30,431,1,0,0,0,32,438,1,0,0,0,34,446,1,0,0,0,36,453,1,0,0,0,38,463,1,0, + 0,0,40,475,1,0,0,0,42,484,1,0,0,0,44,490,1,0,0,0,46,497,1,0,0,0,48,504, + 1,0,0,0,50,512,1,0,0,0,52,521,1,0,0,0,54,527,1,0,0,0,56,544,1,0,0,0,58, + 560,1,0,0,0,60,569,1,0,0,0,62,572,1,0,0,0,64,576,1,0,0,0,66,581,1,0,0,0, + 68,586,1,0,0,0,70,590,1,0,0,0,72,594,1,0,0,0,74,598,1,0,0,0,76,602,1,0, + 0,0,78,604,1,0,0,0,80,606,1,0,0,0,82,609,1,0,0,0,84,611,1,0,0,0,86,620, + 1,0,0,0,88,622,1,0,0,0,90,627,1,0,0,0,92,629,1,0,0,0,94,634,1,0,0,0,96, + 665,1,0,0,0,98,668,1,0,0,0,100,714,1,0,0,0,102,716,1,0,0,0,104,719,1,0, + 0,0,106,723,1,0,0,0,108,727,1,0,0,0,110,729,1,0,0,0,112,732,1,0,0,0,114, + 734,1,0,0,0,116,739,1,0,0,0,118,741,1,0,0,0,120,747,1,0,0,0,122,753,1,0, + 0,0,124,758,1,0,0,0,126,760,1,0,0,0,128,763,1,0,0,0,130,766,1,0,0,0,132, + 771,1,0,0,0,134,775,1,0,0,0,136,780,1,0,0,0,138,786,1,0,0,0,140,789,1,0, + 0,0,142,791,1,0,0,0,144,797,1,0,0,0,146,799,1,0,0,0,148,804,1,0,0,0,150, + 807,1,0,0,0,152,810,1,0,0,0,154,813,1,0,0,0,156,815,1,0,0,0,158,818,1,0, + 0,0,160,820,1,0,0,0,162,823,1,0,0,0,164,825,1,0,0,0,166,827,1,0,0,0,168, + 829,1,0,0,0,170,831,1,0,0,0,172,833,1,0,0,0,174,838,1,0,0,0,176,859,1,0, + 0,0,178,861,1,0,0,0,180,869,1,0,0,0,182,871,1,0,0,0,184,875,1,0,0,0,186, + 879,1,0,0,0,188,883,1,0,0,0,190,888,1,0,0,0,192,892,1,0,0,0,194,896,1,0, + 0,0,196,900,1,0,0,0,198,904,1,0,0,0,200,908,1,0,0,0,202,917,1,0,0,0,204, + 921,1,0,0,0,206,925,1,0,0,0,208,929,1,0,0,0,210,933,1,0,0,0,212,938,1,0, + 0,0,214,942,1,0,0,0,216,950,1,0,0,0,218,971,1,0,0,0,220,975,1,0,0,0,222, + 979,1,0,0,0,224,983,1,0,0,0,226,987,1,0,0,0,228,991,1,0,0,0,230,996,1,0, + 0,0,232,1000,1,0,0,0,234,1004,1,0,0,0,236,1008,1,0,0,0,238,1011,1,0,0,0, + 240,1015,1,0,0,0,242,1019,1,0,0,0,244,1023,1,0,0,0,246,1027,1,0,0,0,248, + 1032,1,0,0,0,250,1037,1,0,0,0,252,1042,1,0,0,0,254,1049,1,0,0,0,256,1058, + 1,0,0,0,258,1065,1,0,0,0,260,1069,1,0,0,0,262,1073,1,0,0,0,264,1077,1,0, + 0,0,266,1081,1,0,0,0,268,1085,1,0,0,0,270,1091,1,0,0,0,272,1095,1,0,0,0, + 274,1099,1,0,0,0,276,1103,1,0,0,0,278,1107,1,0,0,0,280,1111,1,0,0,0,282, + 1115,1,0,0,0,284,1119,1,0,0,0,286,1123,1,0,0,0,288,1127,1,0,0,0,290,1132, + 1,0,0,0,292,1136,1,0,0,0,294,1140,1,0,0,0,296,1144,1,0,0,0,298,1148,1,0, + 0,0,300,1152,1,0,0,0,302,1156,1,0,0,0,304,1161,1,0,0,0,306,1166,1,0,0,0, + 308,1170,1,0,0,0,310,1174,1,0,0,0,312,1178,1,0,0,0,314,1183,1,0,0,0,316, + 1193,1,0,0,0,318,1197,1,0,0,0,320,1201,1,0,0,0,322,1205,1,0,0,0,324,1210, + 1,0,0,0,326,1217,1,0,0,0,328,1221,1,0,0,0,330,1225,1,0,0,0,332,1229,1,0, + 0,0,334,1233,1,0,0,0,336,1238,1,0,0,0,338,1244,1,0,0,0,340,1248,1,0,0,0, + 342,1252,1,0,0,0,344,1256,1,0,0,0,346,1262,1,0,0,0,348,1266,1,0,0,0,350, + 1270,1,0,0,0,352,1274,1,0,0,0,354,1280,1,0,0,0,356,1286,1,0,0,0,358,1292, + 1,0,0,0,360,361,7,0,0,0,361,362,7,1,0,0,362,363,7,2,0,0,363,364,7,2,0,0, + 364,365,7,3,0,0,365,366,7,4,0,0,366,367,7,5,0,0,367,368,1,0,0,0,368,369, + 6,0,0,0,369,15,1,0,0,0,370,371,7,0,0,0,371,372,7,6,0,0,372,373,7,7,0,0, + 373,374,7,8,0,0,374,375,1,0,0,0,375,376,6,1,1,0,376,17,1,0,0,0,377,378, + 7,3,0,0,378,379,7,9,0,0,379,380,7,6,0,0,380,381,7,1,0,0,381,382,7,4,0,0, + 382,383,7,10,0,0,383,384,1,0,0,0,384,385,6,2,2,0,385,19,1,0,0,0,386,387, + 7,3,0,0,387,388,7,11,0,0,388,389,7,12,0,0,389,390,7,13,0,0,390,391,1,0, + 0,0,391,392,6,3,0,0,392,21,1,0,0,0,393,394,7,3,0,0,394,395,7,14,0,0,395, + 396,7,8,0,0,396,397,7,13,0,0,397,398,7,12,0,0,398,399,7,1,0,0,399,400,7, + 9,0,0,400,401,1,0,0,0,401,402,6,4,3,0,402,23,1,0,0,0,403,404,7,15,0,0,404, + 405,7,6,0,0,405,406,7,7,0,0,406,407,7,16,0,0,407,408,1,0,0,0,408,409,6, + 5,4,0,409,25,1,0,0,0,410,411,7,17,0,0,411,412,7,6,0,0,412,413,7,7,0,0,413, + 414,7,18,0,0,414,415,1,0,0,0,415,416,6,6,0,0,416,27,1,0,0,0,417,418,7,1, + 0,0,418,419,7,9,0,0,419,420,7,13,0,0,420,421,7,1,0,0,421,422,7,9,0,0,422, + 423,7,3,0,0,423,424,7,2,0,0,424,425,7,5,0,0,425,426,7,12,0,0,426,427,7, + 5,0,0,427,428,7,2,0,0,428,429,1,0,0,0,429,430,6,7,0,0,430,29,1,0,0,0,431, + 432,7,18,0,0,432,433,7,3,0,0,433,434,7,3,0,0,434,435,7,8,0,0,435,436,1, + 0,0,0,436,437,6,8,1,0,437,31,1,0,0,0,438,439,7,13,0,0,439,440,7,1,0,0,440, + 441,7,16,0,0,441,442,7,1,0,0,442,443,7,5,0,0,443,444,1,0,0,0,444,445,6, + 9,0,0,445,33,1,0,0,0,446,447,7,16,0,0,447,448,7,3,0,0,448,449,7,5,0,0,449, + 450,7,12,0,0,450,451,1,0,0,0,451,452,6,10,5,0,452,35,1,0,0,0,453,454,7, + 16,0,0,454,455,7,3,0,0,455,456,7,5,0,0,456,457,7,6,0,0,457,458,7,1,0,0, + 458,459,7,4,0,0,459,460,7,2,0,0,460,461,1,0,0,0,461,462,6,11,6,0,462,37, + 1,0,0,0,463,464,7,16,0,0,464,465,7,11,0,0,465,466,5,95,0,0,466,467,7,3, + 0,0,467,468,7,14,0,0,468,469,7,8,0,0,469,470,7,12,0,0,470,471,7,9,0,0,471, + 472,7,0,0,0,472,473,1,0,0,0,473,474,6,12,7,0,474,39,1,0,0,0,475,476,7,6, + 0,0,476,477,7,3,0,0,477,478,7,9,0,0,478,479,7,12,0,0,479,480,7,16,0,0,480, + 481,7,3,0,0,481,482,1,0,0,0,482,483,6,13,8,0,483,41,1,0,0,0,484,485,7,6, + 0,0,485,486,7,7,0,0,486,487,7,19,0,0,487,488,1,0,0,0,488,489,6,14,0,0,489, + 43,1,0,0,0,490,491,7,2,0,0,491,492,7,10,0,0,492,493,7,7,0,0,493,494,7,19, + 0,0,494,495,1,0,0,0,495,496,6,15,9,0,496,45,1,0,0,0,497,498,7,2,0,0,498, + 499,7,7,0,0,499,500,7,6,0,0,500,501,7,5,0,0,501,502,1,0,0,0,502,503,6,16, + 0,0,503,47,1,0,0,0,504,505,7,2,0,0,505,506,7,5,0,0,506,507,7,12,0,0,507, + 508,7,5,0,0,508,509,7,2,0,0,509,510,1,0,0,0,510,511,6,17,0,0,511,49,1,0, + 0,0,512,513,7,19,0,0,513,514,7,10,0,0,514,515,7,3,0,0,515,516,7,6,0,0,516, + 517,7,3,0,0,517,518,1,0,0,0,518,519,6,18,0,0,519,51,1,0,0,0,520,522,8,20, + 0,0,521,520,1,0,0,0,522,523,1,0,0,0,523,521,1,0,0,0,523,524,1,0,0,0,524, + 525,1,0,0,0,525,526,6,19,0,0,526,53,1,0,0,0,527,528,5,47,0,0,528,529,5, + 47,0,0,529,533,1,0,0,0,530,532,8,21,0,0,531,530,1,0,0,0,532,535,1,0,0,0, + 533,531,1,0,0,0,533,534,1,0,0,0,534,537,1,0,0,0,535,533,1,0,0,0,536,538, + 5,13,0,0,537,536,1,0,0,0,537,538,1,0,0,0,538,540,1,0,0,0,539,541,5,10,0, + 0,540,539,1,0,0,0,540,541,1,0,0,0,541,542,1,0,0,0,542,543,6,20,10,0,543, + 55,1,0,0,0,544,545,5,47,0,0,545,546,5,42,0,0,546,551,1,0,0,0,547,550,3, + 56,21,0,548,550,9,0,0,0,549,547,1,0,0,0,549,548,1,0,0,0,550,553,1,0,0,0, + 551,552,1,0,0,0,551,549,1,0,0,0,552,554,1,0,0,0,553,551,1,0,0,0,554,555, + 5,42,0,0,555,556,5,47,0,0,556,557,1,0,0,0,557,558,6,21,10,0,558,57,1,0, + 0,0,559,561,7,22,0,0,560,559,1,0,0,0,561,562,1,0,0,0,562,560,1,0,0,0,562, + 563,1,0,0,0,563,564,1,0,0,0,564,565,6,22,10,0,565,59,1,0,0,0,566,570,8, + 23,0,0,567,568,5,47,0,0,568,570,8,24,0,0,569,566,1,0,0,0,569,567,1,0,0, + 0,570,61,1,0,0,0,571,573,3,60,23,0,572,571,1,0,0,0,573,574,1,0,0,0,574, + 572,1,0,0,0,574,575,1,0,0,0,575,63,1,0,0,0,576,577,3,172,79,0,577,578,1, + 0,0,0,578,579,6,25,11,0,579,580,6,25,12,0,580,65,1,0,0,0,581,582,3,74,30, + 0,582,583,1,0,0,0,583,584,6,26,13,0,584,585,6,26,14,0,585,67,1,0,0,0,586, + 587,3,58,22,0,587,588,1,0,0,0,588,589,6,27,10,0,589,69,1,0,0,0,590,591, + 3,54,20,0,591,592,1,0,0,0,592,593,6,28,10,0,593,71,1,0,0,0,594,595,3,56, + 21,0,595,596,1,0,0,0,596,597,6,29,10,0,597,73,1,0,0,0,598,599,5,124,0,0, + 599,600,1,0,0,0,600,601,6,30,14,0,601,75,1,0,0,0,602,603,7,25,0,0,603,77, + 1,0,0,0,604,605,7,26,0,0,605,79,1,0,0,0,606,607,5,92,0,0,607,608,7,27,0, + 0,608,81,1,0,0,0,609,610,8,28,0,0,610,83,1,0,0,0,611,613,7,3,0,0,612,614, + 7,29,0,0,613,612,1,0,0,0,613,614,1,0,0,0,614,616,1,0,0,0,615,617,3,76,31, + 0,616,615,1,0,0,0,617,618,1,0,0,0,618,616,1,0,0,0,618,619,1,0,0,0,619,85, + 1,0,0,0,620,621,5,64,0,0,621,87,1,0,0,0,622,623,5,96,0,0,623,89,1,0,0,0, + 624,628,8,30,0,0,625,626,5,96,0,0,626,628,5,96,0,0,627,624,1,0,0,0,627, + 625,1,0,0,0,628,91,1,0,0,0,629,630,5,95,0,0,630,93,1,0,0,0,631,635,3,78, + 32,0,632,635,3,76,31,0,633,635,3,92,39,0,634,631,1,0,0,0,634,632,1,0,0, + 0,634,633,1,0,0,0,635,95,1,0,0,0,636,641,5,34,0,0,637,640,3,80,33,0,638, + 640,3,82,34,0,639,637,1,0,0,0,639,638,1,0,0,0,640,643,1,0,0,0,641,639,1, + 0,0,0,641,642,1,0,0,0,642,644,1,0,0,0,643,641,1,0,0,0,644,666,5,34,0,0, + 645,646,5,34,0,0,646,647,5,34,0,0,647,648,5,34,0,0,648,652,1,0,0,0,649, + 651,8,21,0,0,650,649,1,0,0,0,651,654,1,0,0,0,652,653,1,0,0,0,652,650,1, + 0,0,0,653,655,1,0,0,0,654,652,1,0,0,0,655,656,5,34,0,0,656,657,5,34,0,0, + 657,658,5,34,0,0,658,660,1,0,0,0,659,661,5,34,0,0,660,659,1,0,0,0,660,661, + 1,0,0,0,661,663,1,0,0,0,662,664,5,34,0,0,663,662,1,0,0,0,663,664,1,0,0, + 0,664,666,1,0,0,0,665,636,1,0,0,0,665,645,1,0,0,0,666,97,1,0,0,0,667,669, + 3,76,31,0,668,667,1,0,0,0,669,670,1,0,0,0,670,668,1,0,0,0,670,671,1,0,0, + 0,671,99,1,0,0,0,672,674,3,76,31,0,673,672,1,0,0,0,674,675,1,0,0,0,675, + 673,1,0,0,0,675,676,1,0,0,0,676,677,1,0,0,0,677,681,3,116,51,0,678,680, + 3,76,31,0,679,678,1,0,0,0,680,683,1,0,0,0,681,679,1,0,0,0,681,682,1,0,0, + 0,682,715,1,0,0,0,683,681,1,0,0,0,684,686,3,116,51,0,685,687,3,76,31,0, + 686,685,1,0,0,0,687,688,1,0,0,0,688,686,1,0,0,0,688,689,1,0,0,0,689,715, + 1,0,0,0,690,692,3,76,31,0,691,690,1,0,0,0,692,693,1,0,0,0,693,691,1,0,0, + 0,693,694,1,0,0,0,694,702,1,0,0,0,695,699,3,116,51,0,696,698,3,76,31,0, + 697,696,1,0,0,0,698,701,1,0,0,0,699,697,1,0,0,0,699,700,1,0,0,0,700,703, + 1,0,0,0,701,699,1,0,0,0,702,695,1,0,0,0,702,703,1,0,0,0,703,704,1,0,0,0, + 704,705,3,84,35,0,705,715,1,0,0,0,706,708,3,116,51,0,707,709,3,76,31,0, + 708,707,1,0,0,0,709,710,1,0,0,0,710,708,1,0,0,0,710,711,1,0,0,0,711,712, + 1,0,0,0,712,713,3,84,35,0,713,715,1,0,0,0,714,673,1,0,0,0,714,684,1,0,0, + 0,714,691,1,0,0,0,714,706,1,0,0,0,715,101,1,0,0,0,716,717,7,31,0,0,717, + 718,7,32,0,0,718,103,1,0,0,0,719,720,7,12,0,0,720,721,7,9,0,0,721,722,7, + 0,0,0,722,105,1,0,0,0,723,724,7,12,0,0,724,725,7,2,0,0,725,726,7,4,0,0, + 726,107,1,0,0,0,727,728,5,61,0,0,728,109,1,0,0,0,729,730,5,58,0,0,730,731, + 5,58,0,0,731,111,1,0,0,0,732,733,5,44,0,0,733,113,1,0,0,0,734,735,7,0,0, + 0,735,736,7,3,0,0,736,737,7,2,0,0,737,738,7,4,0,0,738,115,1,0,0,0,739,740, + 5,46,0,0,740,117,1,0,0,0,741,742,7,15,0,0,742,743,7,12,0,0,743,744,7,13, + 0,0,744,745,7,2,0,0,745,746,7,3,0,0,746,119,1,0,0,0,747,748,7,15,0,0,748, + 749,7,1,0,0,749,750,7,6,0,0,750,751,7,2,0,0,751,752,7,5,0,0,752,121,1,0, + 0,0,753,754,7,13,0,0,754,755,7,12,0,0,755,756,7,2,0,0,756,757,7,5,0,0,757, + 123,1,0,0,0,758,759,5,40,0,0,759,125,1,0,0,0,760,761,7,1,0,0,761,762,7, + 9,0,0,762,127,1,0,0,0,763,764,7,1,0,0,764,765,7,2,0,0,765,129,1,0,0,0,766, + 767,7,13,0,0,767,768,7,1,0,0,768,769,7,18,0,0,769,770,7,3,0,0,770,131,1, + 0,0,0,771,772,7,9,0,0,772,773,7,7,0,0,773,774,7,5,0,0,774,133,1,0,0,0,775, + 776,7,9,0,0,776,777,7,33,0,0,777,778,7,13,0,0,778,779,7,13,0,0,779,135, + 1,0,0,0,780,781,7,9,0,0,781,782,7,33,0,0,782,783,7,13,0,0,783,784,7,13, + 0,0,784,785,7,2,0,0,785,137,1,0,0,0,786,787,7,7,0,0,787,788,7,6,0,0,788, + 139,1,0,0,0,789,790,5,63,0,0,790,141,1,0,0,0,791,792,7,6,0,0,792,793,7, + 13,0,0,793,794,7,1,0,0,794,795,7,18,0,0,795,796,7,3,0,0,796,143,1,0,0,0, + 797,798,5,41,0,0,798,145,1,0,0,0,799,800,7,5,0,0,800,801,7,6,0,0,801,802, + 7,33,0,0,802,803,7,3,0,0,803,147,1,0,0,0,804,805,5,61,0,0,805,806,5,61, + 0,0,806,149,1,0,0,0,807,808,5,61,0,0,808,809,5,126,0,0,809,151,1,0,0,0, + 810,811,5,33,0,0,811,812,5,61,0,0,812,153,1,0,0,0,813,814,5,60,0,0,814, + 155,1,0,0,0,815,816,5,60,0,0,816,817,5,61,0,0,817,157,1,0,0,0,818,819,5, + 62,0,0,819,159,1,0,0,0,820,821,5,62,0,0,821,822,5,61,0,0,822,161,1,0,0, + 0,823,824,5,43,0,0,824,163,1,0,0,0,825,826,5,45,0,0,826,165,1,0,0,0,827, + 828,5,42,0,0,828,167,1,0,0,0,829,830,5,47,0,0,830,169,1,0,0,0,831,832,5, + 37,0,0,832,171,1,0,0,0,833,834,5,91,0,0,834,835,1,0,0,0,835,836,6,79,0, + 0,836,837,6,79,0,0,837,173,1,0,0,0,838,839,5,93,0,0,839,840,1,0,0,0,840, + 841,6,80,14,0,841,842,6,80,14,0,842,175,1,0,0,0,843,847,3,78,32,0,844,846, + 3,94,40,0,845,844,1,0,0,0,846,849,1,0,0,0,847,845,1,0,0,0,847,848,1,0,0, + 0,848,860,1,0,0,0,849,847,1,0,0,0,850,853,3,92,39,0,851,853,3,86,36,0,852, + 850,1,0,0,0,852,851,1,0,0,0,853,855,1,0,0,0,854,856,3,94,40,0,855,854,1, + 0,0,0,856,857,1,0,0,0,857,855,1,0,0,0,857,858,1,0,0,0,858,860,1,0,0,0,859, + 843,1,0,0,0,859,852,1,0,0,0,860,177,1,0,0,0,861,863,3,88,37,0,862,864,3, + 90,38,0,863,862,1,0,0,0,864,865,1,0,0,0,865,863,1,0,0,0,865,866,1,0,0,0, + 866,867,1,0,0,0,867,868,3,88,37,0,868,179,1,0,0,0,869,870,3,178,82,0,870, + 181,1,0,0,0,871,872,3,54,20,0,872,873,1,0,0,0,873,874,6,84,10,0,874,183, + 1,0,0,0,875,876,3,56,21,0,876,877,1,0,0,0,877,878,6,85,10,0,878,185,1,0, + 0,0,879,880,3,58,22,0,880,881,1,0,0,0,881,882,6,86,10,0,882,187,1,0,0,0, + 883,884,3,74,30,0,884,885,1,0,0,0,885,886,6,87,13,0,886,887,6,87,14,0,887, + 189,1,0,0,0,888,889,3,172,79,0,889,890,1,0,0,0,890,891,6,88,11,0,891,191, + 1,0,0,0,892,893,3,174,80,0,893,894,1,0,0,0,894,895,6,89,15,0,895,193,1, + 0,0,0,896,897,3,112,49,0,897,898,1,0,0,0,898,899,6,90,16,0,899,195,1,0, + 0,0,900,901,3,108,47,0,901,902,1,0,0,0,902,903,6,91,17,0,903,197,1,0,0, + 0,904,905,3,96,41,0,905,906,1,0,0,0,906,907,6,92,18,0,907,199,1,0,0,0,908, + 909,7,16,0,0,909,910,7,3,0,0,910,911,7,5,0,0,911,912,7,12,0,0,912,913,7, + 0,0,0,913,914,7,12,0,0,914,915,7,5,0,0,915,916,7,12,0,0,916,201,1,0,0,0, + 917,918,3,62,24,0,918,919,1,0,0,0,919,920,6,94,19,0,920,203,1,0,0,0,921, + 922,3,54,20,0,922,923,1,0,0,0,923,924,6,95,10,0,924,205,1,0,0,0,925,926, + 3,56,21,0,926,927,1,0,0,0,927,928,6,96,10,0,928,207,1,0,0,0,929,930,3,58, + 22,0,930,931,1,0,0,0,931,932,6,97,10,0,932,209,1,0,0,0,933,934,3,74,30, + 0,934,935,1,0,0,0,935,936,6,98,13,0,936,937,6,98,14,0,937,211,1,0,0,0,938, + 939,3,116,51,0,939,940,1,0,0,0,940,941,6,99,20,0,941,213,1,0,0,0,942,943, + 3,112,49,0,943,944,1,0,0,0,944,945,6,100,16,0,945,215,1,0,0,0,946,951,3, + 78,32,0,947,951,3,76,31,0,948,951,3,92,39,0,949,951,3,166,76,0,950,946, + 1,0,0,0,950,947,1,0,0,0,950,948,1,0,0,0,950,949,1,0,0,0,951,217,1,0,0,0, + 952,955,3,78,32,0,953,955,3,166,76,0,954,952,1,0,0,0,954,953,1,0,0,0,955, + 959,1,0,0,0,956,958,3,216,101,0,957,956,1,0,0,0,958,961,1,0,0,0,959,957, + 1,0,0,0,959,960,1,0,0,0,960,972,1,0,0,0,961,959,1,0,0,0,962,965,3,92,39, + 0,963,965,3,86,36,0,964,962,1,0,0,0,964,963,1,0,0,0,965,967,1,0,0,0,966, + 968,3,216,101,0,967,966,1,0,0,0,968,969,1,0,0,0,969,967,1,0,0,0,969,970, + 1,0,0,0,970,972,1,0,0,0,971,954,1,0,0,0,971,964,1,0,0,0,972,219,1,0,0,0, + 973,976,3,218,102,0,974,976,3,178,82,0,975,973,1,0,0,0,975,974,1,0,0,0, + 976,977,1,0,0,0,977,975,1,0,0,0,977,978,1,0,0,0,978,221,1,0,0,0,979,980, + 3,54,20,0,980,981,1,0,0,0,981,982,6,104,10,0,982,223,1,0,0,0,983,984,3, + 56,21,0,984,985,1,0,0,0,985,986,6,105,10,0,986,225,1,0,0,0,987,988,3,58, + 22,0,988,989,1,0,0,0,989,990,6,106,10,0,990,227,1,0,0,0,991,992,3,74,30, + 0,992,993,1,0,0,0,993,994,6,107,13,0,994,995,6,107,14,0,995,229,1,0,0,0, + 996,997,3,108,47,0,997,998,1,0,0,0,998,999,6,108,17,0,999,231,1,0,0,0,1000, + 1001,3,112,49,0,1001,1002,1,0,0,0,1002,1003,6,109,16,0,1003,233,1,0,0,0, + 1004,1005,3,116,51,0,1005,1006,1,0,0,0,1006,1007,6,110,20,0,1007,235,1, + 0,0,0,1008,1009,7,12,0,0,1009,1010,7,2,0,0,1010,237,1,0,0,0,1011,1012,3, + 220,103,0,1012,1013,1,0,0,0,1013,1014,6,112,21,0,1014,239,1,0,0,0,1015, + 1016,3,54,20,0,1016,1017,1,0,0,0,1017,1018,6,113,10,0,1018,241,1,0,0,0, + 1019,1020,3,56,21,0,1020,1021,1,0,0,0,1021,1022,6,114,10,0,1022,243,1,0, + 0,0,1023,1024,3,58,22,0,1024,1025,1,0,0,0,1025,1026,6,115,10,0,1026,245, + 1,0,0,0,1027,1028,3,74,30,0,1028,1029,1,0,0,0,1029,1030,6,116,13,0,1030, + 1031,6,116,14,0,1031,247,1,0,0,0,1032,1033,3,172,79,0,1033,1034,1,0,0,0, + 1034,1035,6,117,11,0,1035,1036,6,117,22,0,1036,249,1,0,0,0,1037,1038,7, + 7,0,0,1038,1039,7,9,0,0,1039,1040,1,0,0,0,1040,1041,6,118,23,0,1041,251, + 1,0,0,0,1042,1043,7,19,0,0,1043,1044,7,1,0,0,1044,1045,7,5,0,0,1045,1046, + 7,10,0,0,1046,1047,1,0,0,0,1047,1048,6,119,23,0,1048,253,1,0,0,0,1049,1050, + 8,34,0,0,1050,255,1,0,0,0,1051,1053,3,254,120,0,1052,1051,1,0,0,0,1053, + 1054,1,0,0,0,1054,1052,1,0,0,0,1054,1055,1,0,0,0,1055,1056,1,0,0,0,1056, + 1057,3,324,155,0,1057,1059,1,0,0,0,1058,1052,1,0,0,0,1058,1059,1,0,0,0, + 1059,1061,1,0,0,0,1060,1062,3,254,120,0,1061,1060,1,0,0,0,1062,1063,1,0, + 0,0,1063,1061,1,0,0,0,1063,1064,1,0,0,0,1064,257,1,0,0,0,1065,1066,3,180, + 83,0,1066,1067,1,0,0,0,1067,1068,6,122,24,0,1068,259,1,0,0,0,1069,1070, + 3,256,121,0,1070,1071,1,0,0,0,1071,1072,6,123,25,0,1072,261,1,0,0,0,1073, + 1074,3,54,20,0,1074,1075,1,0,0,0,1075,1076,6,124,10,0,1076,263,1,0,0,0, + 1077,1078,3,56,21,0,1078,1079,1,0,0,0,1079,1080,6,125,10,0,1080,265,1,0, + 0,0,1081,1082,3,58,22,0,1082,1083,1,0,0,0,1083,1084,6,126,10,0,1084,267, + 1,0,0,0,1085,1086,3,74,30,0,1086,1087,1,0,0,0,1087,1088,6,127,13,0,1088, + 1089,6,127,14,0,1089,1090,6,127,14,0,1090,269,1,0,0,0,1091,1092,3,108,47, + 0,1092,1093,1,0,0,0,1093,1094,6,128,17,0,1094,271,1,0,0,0,1095,1096,3,112, + 49,0,1096,1097,1,0,0,0,1097,1098,6,129,16,0,1098,273,1,0,0,0,1099,1100, + 3,116,51,0,1100,1101,1,0,0,0,1101,1102,6,130,20,0,1102,275,1,0,0,0,1103, + 1104,3,252,119,0,1104,1105,1,0,0,0,1105,1106,6,131,26,0,1106,277,1,0,0, + 0,1107,1108,3,220,103,0,1108,1109,1,0,0,0,1109,1110,6,132,21,0,1110,279, + 1,0,0,0,1111,1112,3,180,83,0,1112,1113,1,0,0,0,1113,1114,6,133,24,0,1114, + 281,1,0,0,0,1115,1116,3,54,20,0,1116,1117,1,0,0,0,1117,1118,6,134,10,0, + 1118,283,1,0,0,0,1119,1120,3,56,21,0,1120,1121,1,0,0,0,1121,1122,6,135, + 10,0,1122,285,1,0,0,0,1123,1124,3,58,22,0,1124,1125,1,0,0,0,1125,1126,6, + 136,10,0,1126,287,1,0,0,0,1127,1128,3,74,30,0,1128,1129,1,0,0,0,1129,1130, + 6,137,13,0,1130,1131,6,137,14,0,1131,289,1,0,0,0,1132,1133,3,116,51,0,1133, + 1134,1,0,0,0,1134,1135,6,138,20,0,1135,291,1,0,0,0,1136,1137,3,180,83,0, + 1137,1138,1,0,0,0,1138,1139,6,139,24,0,1139,293,1,0,0,0,1140,1141,3,176, + 81,0,1141,1142,1,0,0,0,1142,1143,6,140,27,0,1143,295,1,0,0,0,1144,1145, + 3,54,20,0,1145,1146,1,0,0,0,1146,1147,6,141,10,0,1147,297,1,0,0,0,1148, + 1149,3,56,21,0,1149,1150,1,0,0,0,1150,1151,6,142,10,0,1151,299,1,0,0,0, + 1152,1153,3,58,22,0,1153,1154,1,0,0,0,1154,1155,6,143,10,0,1155,301,1,0, + 0,0,1156,1157,3,74,30,0,1157,1158,1,0,0,0,1158,1159,6,144,13,0,1159,1160, + 6,144,14,0,1160,303,1,0,0,0,1161,1162,7,1,0,0,1162,1163,7,9,0,0,1163,1164, + 7,15,0,0,1164,1165,7,7,0,0,1165,305,1,0,0,0,1166,1167,3,54,20,0,1167,1168, + 1,0,0,0,1168,1169,6,146,10,0,1169,307,1,0,0,0,1170,1171,3,56,21,0,1171, + 1172,1,0,0,0,1172,1173,6,147,10,0,1173,309,1,0,0,0,1174,1175,3,58,22,0, + 1175,1176,1,0,0,0,1176,1177,6,148,10,0,1177,311,1,0,0,0,1178,1179,3,74, + 30,0,1179,1180,1,0,0,0,1180,1181,6,149,13,0,1181,1182,6,149,14,0,1182,313, + 1,0,0,0,1183,1184,7,15,0,0,1184,1185,7,33,0,0,1185,1186,7,9,0,0,1186,1187, + 7,4,0,0,1187,1188,7,5,0,0,1188,1189,7,1,0,0,1189,1190,7,7,0,0,1190,1191, + 7,9,0,0,1191,1192,7,2,0,0,1192,315,1,0,0,0,1193,1194,3,54,20,0,1194,1195, + 1,0,0,0,1195,1196,6,151,10,0,1196,317,1,0,0,0,1197,1198,3,56,21,0,1198, + 1199,1,0,0,0,1199,1200,6,152,10,0,1200,319,1,0,0,0,1201,1202,3,58,22,0, + 1202,1203,1,0,0,0,1203,1204,6,153,10,0,1204,321,1,0,0,0,1205,1206,3,174, + 80,0,1206,1207,1,0,0,0,1207,1208,6,154,15,0,1208,1209,6,154,14,0,1209,323, + 1,0,0,0,1210,1211,5,58,0,0,1211,325,1,0,0,0,1212,1218,3,86,36,0,1213,1218, + 3,76,31,0,1214,1218,3,116,51,0,1215,1218,3,78,32,0,1216,1218,3,92,39,0, + 1217,1212,1,0,0,0,1217,1213,1,0,0,0,1217,1214,1,0,0,0,1217,1215,1,0,0,0, + 1217,1216,1,0,0,0,1218,1219,1,0,0,0,1219,1217,1,0,0,0,1219,1220,1,0,0,0, + 1220,327,1,0,0,0,1221,1222,3,54,20,0,1222,1223,1,0,0,0,1223,1224,6,157, + 10,0,1224,329,1,0,0,0,1225,1226,3,56,21,0,1226,1227,1,0,0,0,1227,1228,6, + 158,10,0,1228,331,1,0,0,0,1229,1230,3,58,22,0,1230,1231,1,0,0,0,1231,1232, + 6,159,10,0,1232,333,1,0,0,0,1233,1234,3,74,30,0,1234,1235,1,0,0,0,1235, + 1236,6,160,13,0,1236,1237,6,160,14,0,1237,335,1,0,0,0,1238,1239,3,62,24, + 0,1239,1240,1,0,0,0,1240,1241,6,161,19,0,1241,1242,6,161,14,0,1242,1243, + 6,161,28,0,1243,337,1,0,0,0,1244,1245,3,54,20,0,1245,1246,1,0,0,0,1246, + 1247,6,162,10,0,1247,339,1,0,0,0,1248,1249,3,56,21,0,1249,1250,1,0,0,0, + 1250,1251,6,163,10,0,1251,341,1,0,0,0,1252,1253,3,58,22,0,1253,1254,1,0, + 0,0,1254,1255,6,164,10,0,1255,343,1,0,0,0,1256,1257,3,112,49,0,1257,1258, + 1,0,0,0,1258,1259,6,165,16,0,1259,1260,6,165,14,0,1260,1261,6,165,6,0,1261, + 345,1,0,0,0,1262,1263,3,54,20,0,1263,1264,1,0,0,0,1264,1265,6,166,10,0, + 1265,347,1,0,0,0,1266,1267,3,56,21,0,1267,1268,1,0,0,0,1268,1269,6,167, + 10,0,1269,349,1,0,0,0,1270,1271,3,58,22,0,1271,1272,1,0,0,0,1272,1273,6, + 168,10,0,1273,351,1,0,0,0,1274,1275,3,180,83,0,1275,1276,1,0,0,0,1276,1277, + 6,169,14,0,1277,1278,6,169,0,0,1278,1279,6,169,24,0,1279,353,1,0,0,0,1280, + 1281,3,176,81,0,1281,1282,1,0,0,0,1282,1283,6,170,14,0,1283,1284,6,170, + 0,0,1284,1285,6,170,27,0,1285,355,1,0,0,0,1286,1287,3,102,44,0,1287,1288, + 1,0,0,0,1288,1289,6,171,14,0,1289,1290,6,171,0,0,1290,1291,6,171,29,0,1291, + 357,1,0,0,0,1292,1293,3,74,30,0,1293,1294,1,0,0,0,1294,1295,6,172,13,0, + 1295,1296,6,172,14,0,1296,359,1,0,0,0,60,0,1,2,3,4,5,6,7,8,9,10,11,12,13, + 523,533,537,540,549,551,562,569,574,613,618,627,634,639,641,652,660,663, + 665,670,675,681,688,693,699,702,710,714,847,852,857,859,865,950,954,959, + 964,969,971,975,977,1054,1058,1063,1217,1219,30,5,2,0,5,4,0,5,6,0,5,1,0, + 5,3,0,5,10,0,5,12,0,5,8,0,5,5,0,5,9,0,0,1,0,7,67,0,5,0,0,7,28,0,4,0,0,7, + 68,0,7,37,0,7,35,0,7,29,0,7,24,0,7,39,0,7,78,0,5,11,0,5,7,0,7,70,0,7,88, + 0,7,87,0,7,69,0,5,13,0,7,32,0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 index b3496a20e3b8f..9e9b64b006e36 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 @@ -7,6 +7,14 @@ // DO NOT MODIFY THIS FILE BY HAND. IT IS MANAGED BY A CI JOB. + +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + parser grammar esql_parser; options {tokenVocab=esql_lexer;} @@ -24,6 +32,7 @@ sourceCommand : explainCommand | fromCommand | rowCommand + | metricsCommand | showCommand | metaCommand ; @@ -105,11 +114,11 @@ field ; fromCommand - : FROM fromIdentifier (COMMA fromIdentifier)* metadata? + : FROM indexIdentifier (COMMA indexIdentifier)* metadata? ; -fromIdentifier - : FROM_UNQUOTED_IDENTIFIER +indexIdentifier + : INDEX_UNQUOTED_IDENTIFIER ; metadata @@ -118,13 +127,17 @@ metadata ; metadataOption - : METADATA fromIdentifier (COMMA fromIdentifier)* + : METADATA indexIdentifier (COMMA indexIdentifier)* ; deprecated_metadata : OPENING_BRACKET metadataOption CLOSING_BRACKET ; +metricsCommand + : METRICS indexIdentifier (COMMA indexIdentifier)* aggregates=fields? (BY grouping=fields)? + ; + evalCommand : EVAL fields ; diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp index 04dbf1b4a43dd..d6f90975aefac 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.interp @@ -11,6 +11,7 @@ null 'keep' 'limit' 'meta' +'metrics' 'mv_expand' 'rename' 'row' @@ -25,6 +26,7 @@ null null null null +null '|' null null @@ -79,7 +81,6 @@ null null null null -null 'as' null null @@ -109,6 +110,12 @@ null null null null +null +null +null +null +null +null token symbolic names: null @@ -123,6 +130,7 @@ INLINESTATS KEEP LIMIT META +METRICS MV_EXPAND RENAME ROW @@ -134,6 +142,7 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS +INDEX_UNQUOTED_IDENTIFIER EXPLAIN_WS EXPLAIN_LINE_COMMENT EXPLAIN_MULTILINE_COMMENT @@ -184,7 +193,6 @@ EXPR_LINE_COMMENT EXPR_MULTILINE_COMMENT EXPR_WS METADATA -FROM_UNQUOTED_IDENTIFIER FROM_LINE_COMMENT FROM_MULTILINE_COMMENT FROM_WS @@ -221,6 +229,12 @@ SETTING SETTING_LINE_COMMENT SETTTING_MULTILINE_COMMENT SETTING_WS +METRICS_LINE_COMMENT +METRICS_MULTILINE_COMMENT +METRICS_WS +CLOSING_METRICS_LINE_COMMENT +CLOSING_METRICS_MULTILINE_COMMENT +CLOSING_METRICS_WS rule names: singleStatement @@ -239,10 +253,11 @@ rowCommand fields field fromCommand -fromIdentifier +indexIdentifier metadata metadataOption deprecated_metadata +metricsCommand evalCommand statsCommand inlinestatsCommand @@ -278,4 +293,4 @@ enrichWithClause atn: -[4, 1, 109, 523, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 114, 8, 1, 10, 1, 12, 1, 117, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 124, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 139, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 151, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 158, 8, 5, 10, 5, 12, 5, 161, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 168, 8, 5, 1, 5, 1, 5, 3, 5, 172, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 180, 8, 5, 10, 5, 12, 5, 183, 9, 5, 1, 6, 1, 6, 3, 6, 187, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 194, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 199, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 206, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 212, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 220, 8, 8, 10, 8, 12, 8, 223, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 238, 8, 9, 10, 9, 12, 9, 241, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 249, 8, 10, 10, 10, 12, 10, 252, 9, 10, 3, 10, 254, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 266, 8, 13, 10, 13, 12, 13, 269, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 276, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 282, 8, 15, 10, 15, 12, 15, 285, 9, 15, 1, 15, 3, 15, 288, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 294, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 300, 8, 18, 10, 18, 12, 18, 303, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 314, 8, 21, 1, 21, 1, 21, 3, 21, 318, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 324, 8, 22, 1, 23, 1, 23, 1, 23, 5, 23, 329, 8, 23, 10, 23, 12, 23, 332, 9, 23, 1, 24, 1, 24, 1, 24, 5, 24, 337, 8, 24, 10, 24, 12, 24, 340, 9, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 359, 8, 27, 10, 27, 12, 27, 362, 9, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 370, 8, 27, 10, 27, 12, 27, 373, 9, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 381, 8, 27, 10, 27, 12, 27, 384, 9, 27, 1, 27, 1, 27, 3, 27, 388, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 397, 8, 29, 10, 29, 12, 29, 400, 9, 29, 1, 30, 1, 30, 3, 30, 404, 8, 30, 1, 30, 1, 30, 3, 30, 408, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 414, 8, 31, 10, 31, 12, 31, 417, 9, 31, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 423, 8, 32, 10, 32, 12, 32, 426, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 432, 8, 33, 10, 33, 12, 33, 435, 9, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 445, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 457, 8, 38, 10, 38, 12, 38, 460, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 3, 41, 470, 8, 41, 1, 42, 3, 42, 473, 8, 42, 1, 42, 1, 42, 1, 43, 3, 43, 478, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 503, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 509, 8, 50, 10, 50, 12, 50, 512, 9, 50, 3, 50, 514, 8, 50, 1, 51, 1, 51, 1, 51, 3, 51, 519, 8, 51, 1, 51, 1, 51, 1, 51, 0, 4, 2, 10, 16, 18, 52, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 0, 7, 1, 0, 60, 61, 1, 0, 62, 64, 1, 0, 67, 68, 2, 0, 32, 32, 36, 36, 1, 0, 39, 40, 2, 0, 38, 38, 52, 52, 2, 0, 53, 53, 55, 59, 548, 0, 104, 1, 0, 0, 0, 2, 107, 1, 0, 0, 0, 4, 123, 1, 0, 0, 0, 6, 138, 1, 0, 0, 0, 8, 140, 1, 0, 0, 0, 10, 171, 1, 0, 0, 0, 12, 198, 1, 0, 0, 0, 14, 205, 1, 0, 0, 0, 16, 211, 1, 0, 0, 0, 18, 232, 1, 0, 0, 0, 20, 242, 1, 0, 0, 0, 22, 257, 1, 0, 0, 0, 24, 259, 1, 0, 0, 0, 26, 262, 1, 0, 0, 0, 28, 275, 1, 0, 0, 0, 30, 277, 1, 0, 0, 0, 32, 289, 1, 0, 0, 0, 34, 293, 1, 0, 0, 0, 36, 295, 1, 0, 0, 0, 38, 304, 1, 0, 0, 0, 40, 308, 1, 0, 0, 0, 42, 311, 1, 0, 0, 0, 44, 319, 1, 0, 0, 0, 46, 325, 1, 0, 0, 0, 48, 333, 1, 0, 0, 0, 50, 341, 1, 0, 0, 0, 52, 343, 1, 0, 0, 0, 54, 387, 1, 0, 0, 0, 56, 389, 1, 0, 0, 0, 58, 392, 1, 0, 0, 0, 60, 401, 1, 0, 0, 0, 62, 409, 1, 0, 0, 0, 64, 418, 1, 0, 0, 0, 66, 427, 1, 0, 0, 0, 68, 436, 1, 0, 0, 0, 70, 440, 1, 0, 0, 0, 72, 446, 1, 0, 0, 0, 74, 450, 1, 0, 0, 0, 76, 453, 1, 0, 0, 0, 78, 461, 1, 0, 0, 0, 80, 465, 1, 0, 0, 0, 82, 469, 1, 0, 0, 0, 84, 472, 1, 0, 0, 0, 86, 477, 1, 0, 0, 0, 88, 481, 1, 0, 0, 0, 90, 483, 1, 0, 0, 0, 92, 485, 1, 0, 0, 0, 94, 488, 1, 0, 0, 0, 96, 492, 1, 0, 0, 0, 98, 495, 1, 0, 0, 0, 100, 498, 1, 0, 0, 0, 102, 518, 1, 0, 0, 0, 104, 105, 3, 2, 1, 0, 105, 106, 5, 0, 0, 1, 106, 1, 1, 0, 0, 0, 107, 108, 6, 1, -1, 0, 108, 109, 3, 4, 2, 0, 109, 115, 1, 0, 0, 0, 110, 111, 10, 1, 0, 0, 111, 112, 5, 26, 0, 0, 112, 114, 3, 6, 3, 0, 113, 110, 1, 0, 0, 0, 114, 117, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 3, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 118, 124, 3, 92, 46, 0, 119, 124, 3, 30, 15, 0, 120, 124, 3, 24, 12, 0, 121, 124, 3, 96, 48, 0, 122, 124, 3, 98, 49, 0, 123, 118, 1, 0, 0, 0, 123, 119, 1, 0, 0, 0, 123, 120, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 123, 122, 1, 0, 0, 0, 124, 5, 1, 0, 0, 0, 125, 139, 3, 40, 20, 0, 126, 139, 3, 44, 22, 0, 127, 139, 3, 56, 28, 0, 128, 139, 3, 62, 31, 0, 129, 139, 3, 58, 29, 0, 130, 139, 3, 42, 21, 0, 131, 139, 3, 8, 4, 0, 132, 139, 3, 64, 32, 0, 133, 139, 3, 66, 33, 0, 134, 139, 3, 70, 35, 0, 135, 139, 3, 72, 36, 0, 136, 139, 3, 100, 50, 0, 137, 139, 3, 74, 37, 0, 138, 125, 1, 0, 0, 0, 138, 126, 1, 0, 0, 0, 138, 127, 1, 0, 0, 0, 138, 128, 1, 0, 0, 0, 138, 129, 1, 0, 0, 0, 138, 130, 1, 0, 0, 0, 138, 131, 1, 0, 0, 0, 138, 132, 1, 0, 0, 0, 138, 133, 1, 0, 0, 0, 138, 134, 1, 0, 0, 0, 138, 135, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 138, 137, 1, 0, 0, 0, 139, 7, 1, 0, 0, 0, 140, 141, 5, 18, 0, 0, 141, 142, 3, 10, 5, 0, 142, 9, 1, 0, 0, 0, 143, 144, 6, 5, -1, 0, 144, 145, 5, 45, 0, 0, 145, 172, 3, 10, 5, 7, 146, 172, 3, 14, 7, 0, 147, 172, 3, 12, 6, 0, 148, 150, 3, 14, 7, 0, 149, 151, 5, 45, 0, 0, 150, 149, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 152, 1, 0, 0, 0, 152, 153, 5, 42, 0, 0, 153, 154, 5, 41, 0, 0, 154, 159, 3, 14, 7, 0, 155, 156, 5, 35, 0, 0, 156, 158, 3, 14, 7, 0, 157, 155, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 51, 0, 0, 163, 172, 1, 0, 0, 0, 164, 165, 3, 14, 7, 0, 165, 167, 5, 43, 0, 0, 166, 168, 5, 45, 0, 0, 167, 166, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 170, 5, 46, 0, 0, 170, 172, 1, 0, 0, 0, 171, 143, 1, 0, 0, 0, 171, 146, 1, 0, 0, 0, 171, 147, 1, 0, 0, 0, 171, 148, 1, 0, 0, 0, 171, 164, 1, 0, 0, 0, 172, 181, 1, 0, 0, 0, 173, 174, 10, 4, 0, 0, 174, 175, 5, 31, 0, 0, 175, 180, 3, 10, 5, 5, 176, 177, 10, 3, 0, 0, 177, 178, 5, 48, 0, 0, 178, 180, 3, 10, 5, 4, 179, 173, 1, 0, 0, 0, 179, 176, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 11, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 184, 186, 3, 14, 7, 0, 185, 187, 5, 45, 0, 0, 186, 185, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 5, 44, 0, 0, 189, 190, 3, 88, 44, 0, 190, 199, 1, 0, 0, 0, 191, 193, 3, 14, 7, 0, 192, 194, 5, 45, 0, 0, 193, 192, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 196, 5, 50, 0, 0, 196, 197, 3, 88, 44, 0, 197, 199, 1, 0, 0, 0, 198, 184, 1, 0, 0, 0, 198, 191, 1, 0, 0, 0, 199, 13, 1, 0, 0, 0, 200, 206, 3, 16, 8, 0, 201, 202, 3, 16, 8, 0, 202, 203, 3, 90, 45, 0, 203, 204, 3, 16, 8, 0, 204, 206, 1, 0, 0, 0, 205, 200, 1, 0, 0, 0, 205, 201, 1, 0, 0, 0, 206, 15, 1, 0, 0, 0, 207, 208, 6, 8, -1, 0, 208, 212, 3, 18, 9, 0, 209, 210, 7, 0, 0, 0, 210, 212, 3, 16, 8, 3, 211, 207, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 212, 221, 1, 0, 0, 0, 213, 214, 10, 2, 0, 0, 214, 215, 7, 1, 0, 0, 215, 220, 3, 16, 8, 3, 216, 217, 10, 1, 0, 0, 217, 218, 7, 0, 0, 0, 218, 220, 3, 16, 8, 2, 219, 213, 1, 0, 0, 0, 219, 216, 1, 0, 0, 0, 220, 223, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 17, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 224, 225, 6, 9, -1, 0, 225, 233, 3, 54, 27, 0, 226, 233, 3, 46, 23, 0, 227, 233, 3, 20, 10, 0, 228, 229, 5, 41, 0, 0, 229, 230, 3, 10, 5, 0, 230, 231, 5, 51, 0, 0, 231, 233, 1, 0, 0, 0, 232, 224, 1, 0, 0, 0, 232, 226, 1, 0, 0, 0, 232, 227, 1, 0, 0, 0, 232, 228, 1, 0, 0, 0, 233, 239, 1, 0, 0, 0, 234, 235, 10, 1, 0, 0, 235, 236, 5, 34, 0, 0, 236, 238, 3, 22, 11, 0, 237, 234, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 19, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 3, 50, 25, 0, 243, 253, 5, 41, 0, 0, 244, 254, 5, 62, 0, 0, 245, 250, 3, 10, 5, 0, 246, 247, 5, 35, 0, 0, 247, 249, 3, 10, 5, 0, 248, 246, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 244, 1, 0, 0, 0, 253, 245, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 5, 51, 0, 0, 256, 21, 1, 0, 0, 0, 257, 258, 3, 50, 25, 0, 258, 23, 1, 0, 0, 0, 259, 260, 5, 14, 0, 0, 260, 261, 3, 26, 13, 0, 261, 25, 1, 0, 0, 0, 262, 267, 3, 28, 14, 0, 263, 264, 5, 35, 0, 0, 264, 266, 3, 28, 14, 0, 265, 263, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 27, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 276, 3, 10, 5, 0, 271, 272, 3, 46, 23, 0, 272, 273, 5, 33, 0, 0, 273, 274, 3, 10, 5, 0, 274, 276, 1, 0, 0, 0, 275, 270, 1, 0, 0, 0, 275, 271, 1, 0, 0, 0, 276, 29, 1, 0, 0, 0, 277, 278, 5, 6, 0, 0, 278, 283, 3, 32, 16, 0, 279, 280, 5, 35, 0, 0, 280, 282, 3, 32, 16, 0, 281, 279, 1, 0, 0, 0, 282, 285, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 286, 288, 3, 34, 17, 0, 287, 286, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 31, 1, 0, 0, 0, 289, 290, 5, 73, 0, 0, 290, 33, 1, 0, 0, 0, 291, 294, 3, 36, 18, 0, 292, 294, 3, 38, 19, 0, 293, 291, 1, 0, 0, 0, 293, 292, 1, 0, 0, 0, 294, 35, 1, 0, 0, 0, 295, 296, 5, 72, 0, 0, 296, 301, 3, 32, 16, 0, 297, 298, 5, 35, 0, 0, 298, 300, 3, 32, 16, 0, 299, 297, 1, 0, 0, 0, 300, 303, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 37, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 3, 36, 18, 0, 306, 307, 5, 66, 0, 0, 307, 39, 1, 0, 0, 0, 308, 309, 5, 4, 0, 0, 309, 310, 3, 26, 13, 0, 310, 41, 1, 0, 0, 0, 311, 313, 5, 17, 0, 0, 312, 314, 3, 26, 13, 0, 313, 312, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 316, 5, 30, 0, 0, 316, 318, 3, 26, 13, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 43, 1, 0, 0, 0, 319, 320, 5, 8, 0, 0, 320, 323, 3, 26, 13, 0, 321, 322, 5, 30, 0, 0, 322, 324, 3, 26, 13, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 45, 1, 0, 0, 0, 325, 330, 3, 50, 25, 0, 326, 327, 5, 37, 0, 0, 327, 329, 3, 50, 25, 0, 328, 326, 1, 0, 0, 0, 329, 332, 1, 0, 0, 0, 330, 328, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 47, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 333, 338, 3, 52, 26, 0, 334, 335, 5, 37, 0, 0, 335, 337, 3, 52, 26, 0, 336, 334, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 49, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 341, 342, 7, 2, 0, 0, 342, 51, 1, 0, 0, 0, 343, 344, 5, 77, 0, 0, 344, 53, 1, 0, 0, 0, 345, 388, 5, 46, 0, 0, 346, 347, 3, 86, 43, 0, 347, 348, 5, 67, 0, 0, 348, 388, 1, 0, 0, 0, 349, 388, 3, 84, 42, 0, 350, 388, 3, 86, 43, 0, 351, 388, 3, 80, 40, 0, 352, 388, 5, 49, 0, 0, 353, 388, 3, 88, 44, 0, 354, 355, 5, 65, 0, 0, 355, 360, 3, 82, 41, 0, 356, 357, 5, 35, 0, 0, 357, 359, 3, 82, 41, 0, 358, 356, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 363, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 363, 364, 5, 66, 0, 0, 364, 388, 1, 0, 0, 0, 365, 366, 5, 65, 0, 0, 366, 371, 3, 80, 40, 0, 367, 368, 5, 35, 0, 0, 368, 370, 3, 80, 40, 0, 369, 367, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 66, 0, 0, 375, 388, 1, 0, 0, 0, 376, 377, 5, 65, 0, 0, 377, 382, 3, 88, 44, 0, 378, 379, 5, 35, 0, 0, 379, 381, 3, 88, 44, 0, 380, 378, 1, 0, 0, 0, 381, 384, 1, 0, 0, 0, 382, 380, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 385, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 385, 386, 5, 66, 0, 0, 386, 388, 1, 0, 0, 0, 387, 345, 1, 0, 0, 0, 387, 346, 1, 0, 0, 0, 387, 349, 1, 0, 0, 0, 387, 350, 1, 0, 0, 0, 387, 351, 1, 0, 0, 0, 387, 352, 1, 0, 0, 0, 387, 353, 1, 0, 0, 0, 387, 354, 1, 0, 0, 0, 387, 365, 1, 0, 0, 0, 387, 376, 1, 0, 0, 0, 388, 55, 1, 0, 0, 0, 389, 390, 5, 10, 0, 0, 390, 391, 5, 28, 0, 0, 391, 57, 1, 0, 0, 0, 392, 393, 5, 16, 0, 0, 393, 398, 3, 60, 30, 0, 394, 395, 5, 35, 0, 0, 395, 397, 3, 60, 30, 0, 396, 394, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 59, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 403, 3, 10, 5, 0, 402, 404, 7, 3, 0, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 406, 5, 47, 0, 0, 406, 408, 7, 4, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 61, 1, 0, 0, 0, 409, 410, 5, 9, 0, 0, 410, 415, 3, 48, 24, 0, 411, 412, 5, 35, 0, 0, 412, 414, 3, 48, 24, 0, 413, 411, 1, 0, 0, 0, 414, 417, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 63, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 418, 419, 5, 2, 0, 0, 419, 424, 3, 48, 24, 0, 420, 421, 5, 35, 0, 0, 421, 423, 3, 48, 24, 0, 422, 420, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 65, 1, 0, 0, 0, 426, 424, 1, 0, 0, 0, 427, 428, 5, 13, 0, 0, 428, 433, 3, 68, 34, 0, 429, 430, 5, 35, 0, 0, 430, 432, 3, 68, 34, 0, 431, 429, 1, 0, 0, 0, 432, 435, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 67, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 436, 437, 3, 48, 24, 0, 437, 438, 5, 81, 0, 0, 438, 439, 3, 48, 24, 0, 439, 69, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 3, 18, 9, 0, 442, 444, 3, 88, 44, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 71, 1, 0, 0, 0, 446, 447, 5, 7, 0, 0, 447, 448, 3, 18, 9, 0, 448, 449, 3, 88, 44, 0, 449, 73, 1, 0, 0, 0, 450, 451, 5, 12, 0, 0, 451, 452, 3, 46, 23, 0, 452, 75, 1, 0, 0, 0, 453, 458, 3, 78, 39, 0, 454, 455, 5, 35, 0, 0, 455, 457, 3, 78, 39, 0, 456, 454, 1, 0, 0, 0, 457, 460, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 77, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 461, 462, 3, 50, 25, 0, 462, 463, 5, 33, 0, 0, 463, 464, 3, 54, 27, 0, 464, 79, 1, 0, 0, 0, 465, 466, 7, 5, 0, 0, 466, 81, 1, 0, 0, 0, 467, 470, 3, 84, 42, 0, 468, 470, 3, 86, 43, 0, 469, 467, 1, 0, 0, 0, 469, 468, 1, 0, 0, 0, 470, 83, 1, 0, 0, 0, 471, 473, 7, 0, 0, 0, 472, 471, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 475, 5, 29, 0, 0, 475, 85, 1, 0, 0, 0, 476, 478, 7, 0, 0, 0, 477, 476, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 480, 5, 28, 0, 0, 480, 87, 1, 0, 0, 0, 481, 482, 5, 27, 0, 0, 482, 89, 1, 0, 0, 0, 483, 484, 7, 6, 0, 0, 484, 91, 1, 0, 0, 0, 485, 486, 5, 5, 0, 0, 486, 487, 3, 94, 47, 0, 487, 93, 1, 0, 0, 0, 488, 489, 5, 65, 0, 0, 489, 490, 3, 2, 1, 0, 490, 491, 5, 66, 0, 0, 491, 95, 1, 0, 0, 0, 492, 493, 5, 15, 0, 0, 493, 494, 5, 97, 0, 0, 494, 97, 1, 0, 0, 0, 495, 496, 5, 11, 0, 0, 496, 497, 5, 101, 0, 0, 497, 99, 1, 0, 0, 0, 498, 499, 5, 3, 0, 0, 499, 502, 5, 87, 0, 0, 500, 501, 5, 85, 0, 0, 501, 503, 3, 48, 24, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 513, 1, 0, 0, 0, 504, 505, 5, 86, 0, 0, 505, 510, 3, 102, 51, 0, 506, 507, 5, 35, 0, 0, 507, 509, 3, 102, 51, 0, 508, 506, 1, 0, 0, 0, 509, 512, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 514, 1, 0, 0, 0, 512, 510, 1, 0, 0, 0, 513, 504, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 101, 1, 0, 0, 0, 515, 516, 3, 48, 24, 0, 516, 517, 5, 33, 0, 0, 517, 519, 1, 0, 0, 0, 518, 515, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 3, 48, 24, 0, 521, 103, 1, 0, 0, 0, 50, 115, 123, 138, 150, 159, 167, 171, 179, 181, 186, 193, 198, 205, 211, 219, 221, 232, 239, 250, 253, 267, 275, 283, 287, 293, 301, 313, 317, 323, 330, 338, 360, 371, 382, 387, 398, 403, 407, 415, 424, 433, 444, 458, 469, 472, 477, 502, 510, 513, 518] \ No newline at end of file +[4, 1, 116, 542, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 116, 8, 1, 10, 1, 12, 1, 119, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 127, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 142, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 154, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 161, 8, 5, 10, 5, 12, 5, 164, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 171, 8, 5, 1, 5, 1, 5, 3, 5, 175, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 183, 8, 5, 10, 5, 12, 5, 186, 9, 5, 1, 6, 1, 6, 3, 6, 190, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 197, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 202, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 209, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 215, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 223, 8, 8, 10, 8, 12, 8, 226, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 236, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 241, 8, 9, 10, 9, 12, 9, 244, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 3, 10, 257, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 269, 8, 13, 10, 13, 12, 13, 272, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 279, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 285, 8, 15, 10, 15, 12, 15, 288, 9, 15, 1, 15, 3, 15, 291, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 297, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 303, 8, 18, 10, 18, 12, 18, 306, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 316, 8, 20, 10, 20, 12, 20, 319, 9, 20, 1, 20, 3, 20, 322, 8, 20, 1, 20, 1, 20, 3, 20, 326, 8, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 333, 8, 22, 1, 22, 1, 22, 3, 22, 337, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 343, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 348, 8, 24, 10, 24, 12, 24, 351, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 356, 8, 25, 10, 25, 12, 25, 359, 9, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 378, 8, 28, 10, 28, 12, 28, 381, 9, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 389, 8, 28, 10, 28, 12, 28, 392, 9, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 400, 8, 28, 10, 28, 12, 28, 403, 9, 28, 1, 28, 1, 28, 3, 28, 407, 8, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 416, 8, 30, 10, 30, 12, 30, 419, 9, 30, 1, 31, 1, 31, 3, 31, 423, 8, 31, 1, 31, 1, 31, 3, 31, 427, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 433, 8, 32, 10, 32, 12, 32, 436, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 442, 8, 33, 10, 33, 12, 33, 445, 9, 33, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 451, 8, 34, 10, 34, 12, 34, 454, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 464, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 5, 39, 476, 8, 39, 10, 39, 12, 39, 479, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 489, 8, 42, 1, 43, 3, 43, 492, 8, 43, 1, 43, 1, 43, 1, 44, 3, 44, 497, 8, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 522, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 528, 8, 51, 10, 51, 12, 51, 531, 9, 51, 3, 51, 533, 8, 51, 1, 52, 1, 52, 1, 52, 3, 52, 538, 8, 52, 1, 52, 1, 52, 1, 52, 0, 4, 2, 10, 16, 18, 53, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 0, 7, 1, 0, 62, 63, 1, 0, 64, 66, 1, 0, 69, 70, 2, 0, 34, 34, 38, 38, 1, 0, 41, 42, 2, 0, 40, 40, 54, 54, 2, 0, 55, 55, 57, 61, 570, 0, 106, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 4, 126, 1, 0, 0, 0, 6, 141, 1, 0, 0, 0, 8, 143, 1, 0, 0, 0, 10, 174, 1, 0, 0, 0, 12, 201, 1, 0, 0, 0, 14, 208, 1, 0, 0, 0, 16, 214, 1, 0, 0, 0, 18, 235, 1, 0, 0, 0, 20, 245, 1, 0, 0, 0, 22, 260, 1, 0, 0, 0, 24, 262, 1, 0, 0, 0, 26, 265, 1, 0, 0, 0, 28, 278, 1, 0, 0, 0, 30, 280, 1, 0, 0, 0, 32, 292, 1, 0, 0, 0, 34, 296, 1, 0, 0, 0, 36, 298, 1, 0, 0, 0, 38, 307, 1, 0, 0, 0, 40, 311, 1, 0, 0, 0, 42, 327, 1, 0, 0, 0, 44, 330, 1, 0, 0, 0, 46, 338, 1, 0, 0, 0, 48, 344, 1, 0, 0, 0, 50, 352, 1, 0, 0, 0, 52, 360, 1, 0, 0, 0, 54, 362, 1, 0, 0, 0, 56, 406, 1, 0, 0, 0, 58, 408, 1, 0, 0, 0, 60, 411, 1, 0, 0, 0, 62, 420, 1, 0, 0, 0, 64, 428, 1, 0, 0, 0, 66, 437, 1, 0, 0, 0, 68, 446, 1, 0, 0, 0, 70, 455, 1, 0, 0, 0, 72, 459, 1, 0, 0, 0, 74, 465, 1, 0, 0, 0, 76, 469, 1, 0, 0, 0, 78, 472, 1, 0, 0, 0, 80, 480, 1, 0, 0, 0, 82, 484, 1, 0, 0, 0, 84, 488, 1, 0, 0, 0, 86, 491, 1, 0, 0, 0, 88, 496, 1, 0, 0, 0, 90, 500, 1, 0, 0, 0, 92, 502, 1, 0, 0, 0, 94, 504, 1, 0, 0, 0, 96, 507, 1, 0, 0, 0, 98, 511, 1, 0, 0, 0, 100, 514, 1, 0, 0, 0, 102, 517, 1, 0, 0, 0, 104, 537, 1, 0, 0, 0, 106, 107, 3, 2, 1, 0, 107, 108, 5, 0, 0, 1, 108, 1, 1, 0, 0, 0, 109, 110, 6, 1, -1, 0, 110, 111, 3, 4, 2, 0, 111, 117, 1, 0, 0, 0, 112, 113, 10, 1, 0, 0, 113, 114, 5, 28, 0, 0, 114, 116, 3, 6, 3, 0, 115, 112, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 3, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 127, 3, 94, 47, 0, 121, 127, 3, 30, 15, 0, 122, 127, 3, 24, 12, 0, 123, 127, 3, 40, 20, 0, 124, 127, 3, 98, 49, 0, 125, 127, 3, 100, 50, 0, 126, 120, 1, 0, 0, 0, 126, 121, 1, 0, 0, 0, 126, 122, 1, 0, 0, 0, 126, 123, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 125, 1, 0, 0, 0, 127, 5, 1, 0, 0, 0, 128, 142, 3, 42, 21, 0, 129, 142, 3, 46, 23, 0, 130, 142, 3, 58, 29, 0, 131, 142, 3, 64, 32, 0, 132, 142, 3, 60, 30, 0, 133, 142, 3, 44, 22, 0, 134, 142, 3, 8, 4, 0, 135, 142, 3, 66, 33, 0, 136, 142, 3, 68, 34, 0, 137, 142, 3, 72, 36, 0, 138, 142, 3, 74, 37, 0, 139, 142, 3, 102, 51, 0, 140, 142, 3, 76, 38, 0, 141, 128, 1, 0, 0, 0, 141, 129, 1, 0, 0, 0, 141, 130, 1, 0, 0, 0, 141, 131, 1, 0, 0, 0, 141, 132, 1, 0, 0, 0, 141, 133, 1, 0, 0, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 141, 140, 1, 0, 0, 0, 142, 7, 1, 0, 0, 0, 143, 144, 5, 19, 0, 0, 144, 145, 3, 10, 5, 0, 145, 9, 1, 0, 0, 0, 146, 147, 6, 5, -1, 0, 147, 148, 5, 47, 0, 0, 148, 175, 3, 10, 5, 7, 149, 175, 3, 14, 7, 0, 150, 175, 3, 12, 6, 0, 151, 153, 3, 14, 7, 0, 152, 154, 5, 47, 0, 0, 153, 152, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 155, 1, 0, 0, 0, 155, 156, 5, 44, 0, 0, 156, 157, 5, 43, 0, 0, 157, 162, 3, 14, 7, 0, 158, 159, 5, 37, 0, 0, 159, 161, 3, 14, 7, 0, 160, 158, 1, 0, 0, 0, 161, 164, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 162, 163, 1, 0, 0, 0, 163, 165, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 165, 166, 5, 53, 0, 0, 166, 175, 1, 0, 0, 0, 167, 168, 3, 14, 7, 0, 168, 170, 5, 45, 0, 0, 169, 171, 5, 47, 0, 0, 170, 169, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 5, 48, 0, 0, 173, 175, 1, 0, 0, 0, 174, 146, 1, 0, 0, 0, 174, 149, 1, 0, 0, 0, 174, 150, 1, 0, 0, 0, 174, 151, 1, 0, 0, 0, 174, 167, 1, 0, 0, 0, 175, 184, 1, 0, 0, 0, 176, 177, 10, 4, 0, 0, 177, 178, 5, 33, 0, 0, 178, 183, 3, 10, 5, 5, 179, 180, 10, 3, 0, 0, 180, 181, 5, 50, 0, 0, 181, 183, 3, 10, 5, 4, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 186, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 11, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 187, 189, 3, 14, 7, 0, 188, 190, 5, 47, 0, 0, 189, 188, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 5, 46, 0, 0, 192, 193, 3, 90, 45, 0, 193, 202, 1, 0, 0, 0, 194, 196, 3, 14, 7, 0, 195, 197, 5, 47, 0, 0, 196, 195, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 5, 52, 0, 0, 199, 200, 3, 90, 45, 0, 200, 202, 1, 0, 0, 0, 201, 187, 1, 0, 0, 0, 201, 194, 1, 0, 0, 0, 202, 13, 1, 0, 0, 0, 203, 209, 3, 16, 8, 0, 204, 205, 3, 16, 8, 0, 205, 206, 3, 92, 46, 0, 206, 207, 3, 16, 8, 0, 207, 209, 1, 0, 0, 0, 208, 203, 1, 0, 0, 0, 208, 204, 1, 0, 0, 0, 209, 15, 1, 0, 0, 0, 210, 211, 6, 8, -1, 0, 211, 215, 3, 18, 9, 0, 212, 213, 7, 0, 0, 0, 213, 215, 3, 16, 8, 3, 214, 210, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 224, 1, 0, 0, 0, 216, 217, 10, 2, 0, 0, 217, 218, 7, 1, 0, 0, 218, 223, 3, 16, 8, 3, 219, 220, 10, 1, 0, 0, 220, 221, 7, 0, 0, 0, 221, 223, 3, 16, 8, 2, 222, 216, 1, 0, 0, 0, 222, 219, 1, 0, 0, 0, 223, 226, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 225, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 227, 228, 6, 9, -1, 0, 228, 236, 3, 56, 28, 0, 229, 236, 3, 48, 24, 0, 230, 236, 3, 20, 10, 0, 231, 232, 5, 43, 0, 0, 232, 233, 3, 10, 5, 0, 233, 234, 5, 53, 0, 0, 234, 236, 1, 0, 0, 0, 235, 227, 1, 0, 0, 0, 235, 229, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 235, 231, 1, 0, 0, 0, 236, 242, 1, 0, 0, 0, 237, 238, 10, 1, 0, 0, 238, 239, 5, 36, 0, 0, 239, 241, 3, 22, 11, 0, 240, 237, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 19, 1, 0, 0, 0, 244, 242, 1, 0, 0, 0, 245, 246, 3, 52, 26, 0, 246, 256, 5, 43, 0, 0, 247, 257, 5, 64, 0, 0, 248, 253, 3, 10, 5, 0, 249, 250, 5, 37, 0, 0, 250, 252, 3, 10, 5, 0, 251, 249, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 257, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 247, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 5, 53, 0, 0, 259, 21, 1, 0, 0, 0, 260, 261, 3, 52, 26, 0, 261, 23, 1, 0, 0, 0, 262, 263, 5, 15, 0, 0, 263, 264, 3, 26, 13, 0, 264, 25, 1, 0, 0, 0, 265, 270, 3, 28, 14, 0, 266, 267, 5, 37, 0, 0, 267, 269, 3, 28, 14, 0, 268, 266, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 27, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 279, 3, 10, 5, 0, 274, 275, 3, 48, 24, 0, 275, 276, 5, 35, 0, 0, 276, 277, 3, 10, 5, 0, 277, 279, 1, 0, 0, 0, 278, 273, 1, 0, 0, 0, 278, 274, 1, 0, 0, 0, 279, 29, 1, 0, 0, 0, 280, 281, 5, 6, 0, 0, 281, 286, 3, 32, 16, 0, 282, 283, 5, 37, 0, 0, 283, 285, 3, 32, 16, 0, 284, 282, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 289, 291, 3, 34, 17, 0, 290, 289, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 31, 1, 0, 0, 0, 292, 293, 5, 24, 0, 0, 293, 33, 1, 0, 0, 0, 294, 297, 3, 36, 18, 0, 295, 297, 3, 38, 19, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 35, 1, 0, 0, 0, 298, 299, 5, 74, 0, 0, 299, 304, 3, 32, 16, 0, 300, 301, 5, 37, 0, 0, 301, 303, 3, 32, 16, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 37, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 67, 0, 0, 308, 309, 3, 36, 18, 0, 309, 310, 5, 68, 0, 0, 310, 39, 1, 0, 0, 0, 311, 312, 5, 12, 0, 0, 312, 317, 3, 32, 16, 0, 313, 314, 5, 37, 0, 0, 314, 316, 3, 32, 16, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 322, 3, 26, 13, 0, 321, 320, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 324, 5, 32, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 41, 1, 0, 0, 0, 327, 328, 5, 4, 0, 0, 328, 329, 3, 26, 13, 0, 329, 43, 1, 0, 0, 0, 330, 332, 5, 18, 0, 0, 331, 333, 3, 26, 13, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 336, 1, 0, 0, 0, 334, 335, 5, 32, 0, 0, 335, 337, 3, 26, 13, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 45, 1, 0, 0, 0, 338, 339, 5, 8, 0, 0, 339, 342, 3, 26, 13, 0, 340, 341, 5, 32, 0, 0, 341, 343, 3, 26, 13, 0, 342, 340, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 47, 1, 0, 0, 0, 344, 349, 3, 52, 26, 0, 345, 346, 5, 39, 0, 0, 346, 348, 3, 52, 26, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 49, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 357, 3, 54, 27, 0, 353, 354, 5, 39, 0, 0, 354, 356, 3, 54, 27, 0, 355, 353, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 51, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 360, 361, 7, 2, 0, 0, 361, 53, 1, 0, 0, 0, 362, 363, 5, 78, 0, 0, 363, 55, 1, 0, 0, 0, 364, 407, 5, 48, 0, 0, 365, 366, 3, 88, 44, 0, 366, 367, 5, 69, 0, 0, 367, 407, 1, 0, 0, 0, 368, 407, 3, 86, 43, 0, 369, 407, 3, 88, 44, 0, 370, 407, 3, 82, 41, 0, 371, 407, 5, 51, 0, 0, 372, 407, 3, 90, 45, 0, 373, 374, 5, 67, 0, 0, 374, 379, 3, 84, 42, 0, 375, 376, 5, 37, 0, 0, 376, 378, 3, 84, 42, 0, 377, 375, 1, 0, 0, 0, 378, 381, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 382, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 382, 383, 5, 68, 0, 0, 383, 407, 1, 0, 0, 0, 384, 385, 5, 67, 0, 0, 385, 390, 3, 82, 41, 0, 386, 387, 5, 37, 0, 0, 387, 389, 3, 82, 41, 0, 388, 386, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 393, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 394, 5, 68, 0, 0, 394, 407, 1, 0, 0, 0, 395, 396, 5, 67, 0, 0, 396, 401, 3, 90, 45, 0, 397, 398, 5, 37, 0, 0, 398, 400, 3, 90, 45, 0, 399, 397, 1, 0, 0, 0, 400, 403, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 404, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 404, 405, 5, 68, 0, 0, 405, 407, 1, 0, 0, 0, 406, 364, 1, 0, 0, 0, 406, 365, 1, 0, 0, 0, 406, 368, 1, 0, 0, 0, 406, 369, 1, 0, 0, 0, 406, 370, 1, 0, 0, 0, 406, 371, 1, 0, 0, 0, 406, 372, 1, 0, 0, 0, 406, 373, 1, 0, 0, 0, 406, 384, 1, 0, 0, 0, 406, 395, 1, 0, 0, 0, 407, 57, 1, 0, 0, 0, 408, 409, 5, 10, 0, 0, 409, 410, 5, 30, 0, 0, 410, 59, 1, 0, 0, 0, 411, 412, 5, 17, 0, 0, 412, 417, 3, 62, 31, 0, 413, 414, 5, 37, 0, 0, 414, 416, 3, 62, 31, 0, 415, 413, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 61, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 420, 422, 3, 10, 5, 0, 421, 423, 7, 3, 0, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 425, 5, 49, 0, 0, 425, 427, 7, 4, 0, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 63, 1, 0, 0, 0, 428, 429, 5, 9, 0, 0, 429, 434, 3, 50, 25, 0, 430, 431, 5, 37, 0, 0, 431, 433, 3, 50, 25, 0, 432, 430, 1, 0, 0, 0, 433, 436, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 65, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 437, 438, 5, 2, 0, 0, 438, 443, 3, 50, 25, 0, 439, 440, 5, 37, 0, 0, 440, 442, 3, 50, 25, 0, 441, 439, 1, 0, 0, 0, 442, 445, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 67, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 446, 447, 5, 14, 0, 0, 447, 452, 3, 70, 35, 0, 448, 449, 5, 37, 0, 0, 449, 451, 3, 70, 35, 0, 450, 448, 1, 0, 0, 0, 451, 454, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 69, 1, 0, 0, 0, 454, 452, 1, 0, 0, 0, 455, 456, 3, 50, 25, 0, 456, 457, 5, 82, 0, 0, 457, 458, 3, 50, 25, 0, 458, 71, 1, 0, 0, 0, 459, 460, 5, 1, 0, 0, 460, 461, 3, 18, 9, 0, 461, 463, 3, 90, 45, 0, 462, 464, 3, 78, 39, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 73, 1, 0, 0, 0, 465, 466, 5, 7, 0, 0, 466, 467, 3, 18, 9, 0, 467, 468, 3, 90, 45, 0, 468, 75, 1, 0, 0, 0, 469, 470, 5, 13, 0, 0, 470, 471, 3, 48, 24, 0, 471, 77, 1, 0, 0, 0, 472, 477, 3, 80, 40, 0, 473, 474, 5, 37, 0, 0, 474, 476, 3, 80, 40, 0, 475, 473, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 79, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 481, 3, 52, 26, 0, 481, 482, 5, 35, 0, 0, 482, 483, 3, 56, 28, 0, 483, 81, 1, 0, 0, 0, 484, 485, 7, 5, 0, 0, 485, 83, 1, 0, 0, 0, 486, 489, 3, 86, 43, 0, 487, 489, 3, 88, 44, 0, 488, 486, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 85, 1, 0, 0, 0, 490, 492, 7, 0, 0, 0, 491, 490, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 5, 31, 0, 0, 494, 87, 1, 0, 0, 0, 495, 497, 7, 0, 0, 0, 496, 495, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 5, 30, 0, 0, 499, 89, 1, 0, 0, 0, 500, 501, 5, 29, 0, 0, 501, 91, 1, 0, 0, 0, 502, 503, 7, 6, 0, 0, 503, 93, 1, 0, 0, 0, 504, 505, 5, 5, 0, 0, 505, 506, 3, 96, 48, 0, 506, 95, 1, 0, 0, 0, 507, 508, 5, 67, 0, 0, 508, 509, 3, 2, 1, 0, 509, 510, 5, 68, 0, 0, 510, 97, 1, 0, 0, 0, 511, 512, 5, 16, 0, 0, 512, 513, 5, 98, 0, 0, 513, 99, 1, 0, 0, 0, 514, 515, 5, 11, 0, 0, 515, 516, 5, 102, 0, 0, 516, 101, 1, 0, 0, 0, 517, 518, 5, 3, 0, 0, 518, 521, 5, 88, 0, 0, 519, 520, 5, 86, 0, 0, 520, 522, 3, 50, 25, 0, 521, 519, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 532, 1, 0, 0, 0, 523, 524, 5, 87, 0, 0, 524, 529, 3, 104, 52, 0, 525, 526, 5, 37, 0, 0, 526, 528, 3, 104, 52, 0, 527, 525, 1, 0, 0, 0, 528, 531, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 533, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 532, 523, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 103, 1, 0, 0, 0, 534, 535, 3, 50, 25, 0, 535, 536, 5, 35, 0, 0, 536, 538, 1, 0, 0, 0, 537, 534, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 50, 25, 0, 540, 105, 1, 0, 0, 0, 53, 117, 126, 141, 153, 162, 170, 174, 182, 184, 189, 196, 201, 208, 214, 222, 224, 235, 242, 253, 256, 270, 278, 286, 290, 296, 304, 317, 321, 325, 332, 336, 342, 349, 357, 379, 390, 401, 406, 417, 422, 426, 434, 443, 452, 463, 477, 488, 491, 496, 521, 529, 532, 537] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens index d2e7a695282ec..0e2d796eda847 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens @@ -9,104 +9,111 @@ INLINESTATS=8 KEEP=9 LIMIT=10 META=11 -MV_EXPAND=12 -RENAME=13 -ROW=14 -SHOW=15 -SORT=16 -STATS=17 -WHERE=18 -UNKNOWN_CMD=19 -LINE_COMMENT=20 -MULTILINE_COMMENT=21 -WS=22 -EXPLAIN_WS=23 -EXPLAIN_LINE_COMMENT=24 -EXPLAIN_MULTILINE_COMMENT=25 -PIPE=26 -QUOTED_STRING=27 -INTEGER_LITERAL=28 -DECIMAL_LITERAL=29 -BY=30 -AND=31 -ASC=32 -ASSIGN=33 -CAST_OP=34 -COMMA=35 -DESC=36 -DOT=37 -FALSE=38 -FIRST=39 -LAST=40 -LP=41 -IN=42 -IS=43 -LIKE=44 -NOT=45 -NULL=46 -NULLS=47 -OR=48 -PARAM=49 -RLIKE=50 -RP=51 -TRUE=52 -EQ=53 -CIEQ=54 -NEQ=55 -LT=56 -LTE=57 -GT=58 -GTE=59 -PLUS=60 -MINUS=61 -ASTERISK=62 -SLASH=63 -PERCENT=64 -OPENING_BRACKET=65 -CLOSING_BRACKET=66 -UNQUOTED_IDENTIFIER=67 -QUOTED_IDENTIFIER=68 -EXPR_LINE_COMMENT=69 -EXPR_MULTILINE_COMMENT=70 -EXPR_WS=71 -METADATA=72 -FROM_UNQUOTED_IDENTIFIER=73 -FROM_LINE_COMMENT=74 -FROM_MULTILINE_COMMENT=75 -FROM_WS=76 -ID_PATTERN=77 -PROJECT_LINE_COMMENT=78 -PROJECT_MULTILINE_COMMENT=79 -PROJECT_WS=80 -AS=81 -RENAME_LINE_COMMENT=82 -RENAME_MULTILINE_COMMENT=83 -RENAME_WS=84 -ON=85 -WITH=86 -ENRICH_POLICY_NAME=87 -ENRICH_LINE_COMMENT=88 -ENRICH_MULTILINE_COMMENT=89 -ENRICH_WS=90 -ENRICH_FIELD_LINE_COMMENT=91 -ENRICH_FIELD_MULTILINE_COMMENT=92 -ENRICH_FIELD_WS=93 -MVEXPAND_LINE_COMMENT=94 -MVEXPAND_MULTILINE_COMMENT=95 -MVEXPAND_WS=96 -INFO=97 -SHOW_LINE_COMMENT=98 -SHOW_MULTILINE_COMMENT=99 -SHOW_WS=100 -FUNCTIONS=101 -META_LINE_COMMENT=102 -META_MULTILINE_COMMENT=103 -META_WS=104 -COLON=105 -SETTING=106 -SETTING_LINE_COMMENT=107 -SETTTING_MULTILINE_COMMENT=108 -SETTING_WS=109 +METRICS=12 +MV_EXPAND=13 +RENAME=14 +ROW=15 +SHOW=16 +SORT=17 +STATS=18 +WHERE=19 +UNKNOWN_CMD=20 +LINE_COMMENT=21 +MULTILINE_COMMENT=22 +WS=23 +INDEX_UNQUOTED_IDENTIFIER=24 +EXPLAIN_WS=25 +EXPLAIN_LINE_COMMENT=26 +EXPLAIN_MULTILINE_COMMENT=27 +PIPE=28 +QUOTED_STRING=29 +INTEGER_LITERAL=30 +DECIMAL_LITERAL=31 +BY=32 +AND=33 +ASC=34 +ASSIGN=35 +CAST_OP=36 +COMMA=37 +DESC=38 +DOT=39 +FALSE=40 +FIRST=41 +LAST=42 +LP=43 +IN=44 +IS=45 +LIKE=46 +NOT=47 +NULL=48 +NULLS=49 +OR=50 +PARAM=51 +RLIKE=52 +RP=53 +TRUE=54 +EQ=55 +CIEQ=56 +NEQ=57 +LT=58 +LTE=59 +GT=60 +GTE=61 +PLUS=62 +MINUS=63 +ASTERISK=64 +SLASH=65 +PERCENT=66 +OPENING_BRACKET=67 +CLOSING_BRACKET=68 +UNQUOTED_IDENTIFIER=69 +QUOTED_IDENTIFIER=70 +EXPR_LINE_COMMENT=71 +EXPR_MULTILINE_COMMENT=72 +EXPR_WS=73 +METADATA=74 +FROM_LINE_COMMENT=75 +FROM_MULTILINE_COMMENT=76 +FROM_WS=77 +ID_PATTERN=78 +PROJECT_LINE_COMMENT=79 +PROJECT_MULTILINE_COMMENT=80 +PROJECT_WS=81 +AS=82 +RENAME_LINE_COMMENT=83 +RENAME_MULTILINE_COMMENT=84 +RENAME_WS=85 +ON=86 +WITH=87 +ENRICH_POLICY_NAME=88 +ENRICH_LINE_COMMENT=89 +ENRICH_MULTILINE_COMMENT=90 +ENRICH_WS=91 +ENRICH_FIELD_LINE_COMMENT=92 +ENRICH_FIELD_MULTILINE_COMMENT=93 +ENRICH_FIELD_WS=94 +MVEXPAND_LINE_COMMENT=95 +MVEXPAND_MULTILINE_COMMENT=96 +MVEXPAND_WS=97 +INFO=98 +SHOW_LINE_COMMENT=99 +SHOW_MULTILINE_COMMENT=100 +SHOW_WS=101 +FUNCTIONS=102 +META_LINE_COMMENT=103 +META_MULTILINE_COMMENT=104 +META_WS=105 +COLON=106 +SETTING=107 +SETTING_LINE_COMMENT=108 +SETTTING_MULTILINE_COMMENT=109 +SETTING_WS=110 +METRICS_LINE_COMMENT=111 +METRICS_MULTILINE_COMMENT=112 +METRICS_WS=113 +CLOSING_METRICS_LINE_COMMENT=114 +CLOSING_METRICS_MULTILINE_COMMENT=115 +CLOSING_METRICS_WS=116 'dissect'=1 'drop'=2 'enrich'=3 @@ -118,54 +125,55 @@ SETTING_WS=109 'keep'=9 'limit'=10 'meta'=11 -'mv_expand'=12 -'rename'=13 -'row'=14 -'show'=15 -'sort'=16 -'stats'=17 -'where'=18 -'|'=26 -'by'=30 -'and'=31 -'asc'=32 -'='=33 -'::'=34 -','=35 -'desc'=36 -'.'=37 -'false'=38 -'first'=39 -'last'=40 -'('=41 -'in'=42 -'is'=43 -'like'=44 -'not'=45 -'null'=46 -'nulls'=47 -'or'=48 -'?'=49 -'rlike'=50 -')'=51 -'true'=52 -'=='=53 -'=~'=54 -'!='=55 -'<'=56 -'<='=57 -'>'=58 -'>='=59 -'+'=60 -'-'=61 -'*'=62 -'/'=63 -'%'=64 -']'=66 -'metadata'=72 -'as'=81 -'on'=85 -'with'=86 -'info'=97 -'functions'=101 -':'=105 +'metrics'=12 +'mv_expand'=13 +'rename'=14 +'row'=15 +'show'=16 +'sort'=17 +'stats'=18 +'where'=19 +'|'=28 +'by'=32 +'and'=33 +'asc'=34 +'='=35 +'::'=36 +','=37 +'desc'=38 +'.'=39 +'false'=40 +'first'=41 +'last'=42 +'('=43 +'in'=44 +'is'=45 +'like'=46 +'not'=47 +'null'=48 +'nulls'=49 +'or'=50 +'?'=51 +'rlike'=52 +')'=53 +'true'=54 +'=='=55 +'=~'=56 +'!='=57 +'<'=58 +'<='=59 +'>'=60 +'>='=61 +'+'=62 +'-'=63 +'*'=64 +'/'=65 +'%'=66 +']'=68 +'metadata'=74 +'as'=82 +'on'=86 +'with'=87 +'info'=98 +'functions'=102 +':'=106 diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts index d0258b35756e9..7b755516a0475 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.ts @@ -29,104 +29,111 @@ export default class esql_parser extends Parser { public static readonly KEEP = 9; public static readonly LIMIT = 10; public static readonly META = 11; - public static readonly MV_EXPAND = 12; - public static readonly RENAME = 13; - public static readonly ROW = 14; - public static readonly SHOW = 15; - public static readonly SORT = 16; - public static readonly STATS = 17; - public static readonly WHERE = 18; - public static readonly UNKNOWN_CMD = 19; - public static readonly LINE_COMMENT = 20; - public static readonly MULTILINE_COMMENT = 21; - public static readonly WS = 22; - public static readonly EXPLAIN_WS = 23; - public static readonly EXPLAIN_LINE_COMMENT = 24; - public static readonly EXPLAIN_MULTILINE_COMMENT = 25; - public static readonly PIPE = 26; - public static readonly QUOTED_STRING = 27; - public static readonly INTEGER_LITERAL = 28; - public static readonly DECIMAL_LITERAL = 29; - public static readonly BY = 30; - public static readonly AND = 31; - public static readonly ASC = 32; - public static readonly ASSIGN = 33; - public static readonly CAST_OP = 34; - public static readonly COMMA = 35; - public static readonly DESC = 36; - public static readonly DOT = 37; - public static readonly FALSE = 38; - public static readonly FIRST = 39; - public static readonly LAST = 40; - public static readonly LP = 41; - public static readonly IN = 42; - public static readonly IS = 43; - public static readonly LIKE = 44; - public static readonly NOT = 45; - public static readonly NULL = 46; - public static readonly NULLS = 47; - public static readonly OR = 48; - public static readonly PARAM = 49; - public static readonly RLIKE = 50; - public static readonly RP = 51; - public static readonly TRUE = 52; - public static readonly EQ = 53; - public static readonly CIEQ = 54; - public static readonly NEQ = 55; - public static readonly LT = 56; - public static readonly LTE = 57; - public static readonly GT = 58; - public static readonly GTE = 59; - public static readonly PLUS = 60; - public static readonly MINUS = 61; - public static readonly ASTERISK = 62; - public static readonly SLASH = 63; - public static readonly PERCENT = 64; - public static readonly OPENING_BRACKET = 65; - public static readonly CLOSING_BRACKET = 66; - public static readonly UNQUOTED_IDENTIFIER = 67; - public static readonly QUOTED_IDENTIFIER = 68; - public static readonly EXPR_LINE_COMMENT = 69; - public static readonly EXPR_MULTILINE_COMMENT = 70; - public static readonly EXPR_WS = 71; - public static readonly METADATA = 72; - public static readonly FROM_UNQUOTED_IDENTIFIER = 73; - public static readonly FROM_LINE_COMMENT = 74; - public static readonly FROM_MULTILINE_COMMENT = 75; - public static readonly FROM_WS = 76; - public static readonly ID_PATTERN = 77; - public static readonly PROJECT_LINE_COMMENT = 78; - public static readonly PROJECT_MULTILINE_COMMENT = 79; - public static readonly PROJECT_WS = 80; - public static readonly AS = 81; - public static readonly RENAME_LINE_COMMENT = 82; - public static readonly RENAME_MULTILINE_COMMENT = 83; - public static readonly RENAME_WS = 84; - public static readonly ON = 85; - public static readonly WITH = 86; - public static readonly ENRICH_POLICY_NAME = 87; - public static readonly ENRICH_LINE_COMMENT = 88; - public static readonly ENRICH_MULTILINE_COMMENT = 89; - public static readonly ENRICH_WS = 90; - public static readonly ENRICH_FIELD_LINE_COMMENT = 91; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 92; - public static readonly ENRICH_FIELD_WS = 93; - public static readonly MVEXPAND_LINE_COMMENT = 94; - public static readonly MVEXPAND_MULTILINE_COMMENT = 95; - public static readonly MVEXPAND_WS = 96; - public static readonly INFO = 97; - public static readonly SHOW_LINE_COMMENT = 98; - public static readonly SHOW_MULTILINE_COMMENT = 99; - public static readonly SHOW_WS = 100; - public static readonly FUNCTIONS = 101; - public static readonly META_LINE_COMMENT = 102; - public static readonly META_MULTILINE_COMMENT = 103; - public static readonly META_WS = 104; - public static readonly COLON = 105; - public static readonly SETTING = 106; - public static readonly SETTING_LINE_COMMENT = 107; - public static readonly SETTTING_MULTILINE_COMMENT = 108; - public static readonly SETTING_WS = 109; + public static readonly METRICS = 12; + public static readonly MV_EXPAND = 13; + public static readonly RENAME = 14; + public static readonly ROW = 15; + public static readonly SHOW = 16; + public static readonly SORT = 17; + public static readonly STATS = 18; + public static readonly WHERE = 19; + public static readonly UNKNOWN_CMD = 20; + public static readonly LINE_COMMENT = 21; + public static readonly MULTILINE_COMMENT = 22; + public static readonly WS = 23; + public static readonly INDEX_UNQUOTED_IDENTIFIER = 24; + public static readonly EXPLAIN_WS = 25; + public static readonly EXPLAIN_LINE_COMMENT = 26; + public static readonly EXPLAIN_MULTILINE_COMMENT = 27; + public static readonly PIPE = 28; + public static readonly QUOTED_STRING = 29; + public static readonly INTEGER_LITERAL = 30; + public static readonly DECIMAL_LITERAL = 31; + public static readonly BY = 32; + public static readonly AND = 33; + public static readonly ASC = 34; + public static readonly ASSIGN = 35; + public static readonly CAST_OP = 36; + public static readonly COMMA = 37; + public static readonly DESC = 38; + public static readonly DOT = 39; + public static readonly FALSE = 40; + public static readonly FIRST = 41; + public static readonly LAST = 42; + public static readonly LP = 43; + public static readonly IN = 44; + public static readonly IS = 45; + public static readonly LIKE = 46; + public static readonly NOT = 47; + public static readonly NULL = 48; + public static readonly NULLS = 49; + public static readonly OR = 50; + public static readonly PARAM = 51; + public static readonly RLIKE = 52; + public static readonly RP = 53; + public static readonly TRUE = 54; + public static readonly EQ = 55; + public static readonly CIEQ = 56; + public static readonly NEQ = 57; + public static readonly LT = 58; + public static readonly LTE = 59; + public static readonly GT = 60; + public static readonly GTE = 61; + public static readonly PLUS = 62; + public static readonly MINUS = 63; + public static readonly ASTERISK = 64; + public static readonly SLASH = 65; + public static readonly PERCENT = 66; + public static readonly OPENING_BRACKET = 67; + public static readonly CLOSING_BRACKET = 68; + public static readonly UNQUOTED_IDENTIFIER = 69; + public static readonly QUOTED_IDENTIFIER = 70; + public static readonly EXPR_LINE_COMMENT = 71; + public static readonly EXPR_MULTILINE_COMMENT = 72; + public static readonly EXPR_WS = 73; + public static readonly METADATA = 74; + public static readonly FROM_LINE_COMMENT = 75; + public static readonly FROM_MULTILINE_COMMENT = 76; + public static readonly FROM_WS = 77; + public static readonly ID_PATTERN = 78; + public static readonly PROJECT_LINE_COMMENT = 79; + public static readonly PROJECT_MULTILINE_COMMENT = 80; + public static readonly PROJECT_WS = 81; + public static readonly AS = 82; + public static readonly RENAME_LINE_COMMENT = 83; + public static readonly RENAME_MULTILINE_COMMENT = 84; + public static readonly RENAME_WS = 85; + public static readonly ON = 86; + public static readonly WITH = 87; + public static readonly ENRICH_POLICY_NAME = 88; + public static readonly ENRICH_LINE_COMMENT = 89; + public static readonly ENRICH_MULTILINE_COMMENT = 90; + public static readonly ENRICH_WS = 91; + public static readonly ENRICH_FIELD_LINE_COMMENT = 92; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 93; + public static readonly ENRICH_FIELD_WS = 94; + public static readonly MVEXPAND_LINE_COMMENT = 95; + public static readonly MVEXPAND_MULTILINE_COMMENT = 96; + public static readonly MVEXPAND_WS = 97; + public static readonly INFO = 98; + public static readonly SHOW_LINE_COMMENT = 99; + public static readonly SHOW_MULTILINE_COMMENT = 100; + public static readonly SHOW_WS = 101; + public static readonly FUNCTIONS = 102; + public static readonly META_LINE_COMMENT = 103; + public static readonly META_MULTILINE_COMMENT = 104; + public static readonly META_WS = 105; + public static readonly COLON = 106; + public static readonly SETTING = 107; + public static readonly SETTING_LINE_COMMENT = 108; + public static readonly SETTTING_MULTILINE_COMMENT = 109; + public static readonly SETTING_WS = 110; + public static readonly METRICS_LINE_COMMENT = 111; + public static readonly METRICS_MULTILINE_COMMENT = 112; + public static readonly METRICS_WS = 113; + public static readonly CLOSING_METRICS_LINE_COMMENT = 114; + public static readonly CLOSING_METRICS_MULTILINE_COMMENT = 115; + public static readonly CLOSING_METRICS_WS = 116; public static readonly EOF = Token.EOF; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; @@ -144,49 +151,51 @@ export default class esql_parser extends Parser { public static readonly RULE_fields = 13; public static readonly RULE_field = 14; public static readonly RULE_fromCommand = 15; - public static readonly RULE_fromIdentifier = 16; + public static readonly RULE_indexIdentifier = 16; public static readonly RULE_metadata = 17; public static readonly RULE_metadataOption = 18; public static readonly RULE_deprecated_metadata = 19; - public static readonly RULE_evalCommand = 20; - public static readonly RULE_statsCommand = 21; - public static readonly RULE_inlinestatsCommand = 22; - public static readonly RULE_qualifiedName = 23; - public static readonly RULE_qualifiedNamePattern = 24; - public static readonly RULE_identifier = 25; - public static readonly RULE_identifierPattern = 26; - public static readonly RULE_constant = 27; - public static readonly RULE_limitCommand = 28; - public static readonly RULE_sortCommand = 29; - public static readonly RULE_orderExpression = 30; - public static readonly RULE_keepCommand = 31; - public static readonly RULE_dropCommand = 32; - public static readonly RULE_renameCommand = 33; - public static readonly RULE_renameClause = 34; - public static readonly RULE_dissectCommand = 35; - public static readonly RULE_grokCommand = 36; - public static readonly RULE_mvExpandCommand = 37; - public static readonly RULE_commandOptions = 38; - public static readonly RULE_commandOption = 39; - public static readonly RULE_booleanValue = 40; - public static readonly RULE_numericValue = 41; - public static readonly RULE_decimalValue = 42; - public static readonly RULE_integerValue = 43; - public static readonly RULE_string = 44; - public static readonly RULE_comparisonOperator = 45; - public static readonly RULE_explainCommand = 46; - public static readonly RULE_subqueryExpression = 47; - public static readonly RULE_showCommand = 48; - public static readonly RULE_metaCommand = 49; - public static readonly RULE_enrichCommand = 50; - public static readonly RULE_enrichWithClause = 51; + public static readonly RULE_metricsCommand = 20; + public static readonly RULE_evalCommand = 21; + public static readonly RULE_statsCommand = 22; + public static readonly RULE_inlinestatsCommand = 23; + public static readonly RULE_qualifiedName = 24; + public static readonly RULE_qualifiedNamePattern = 25; + public static readonly RULE_identifier = 26; + public static readonly RULE_identifierPattern = 27; + public static readonly RULE_constant = 28; + public static readonly RULE_limitCommand = 29; + public static readonly RULE_sortCommand = 30; + public static readonly RULE_orderExpression = 31; + public static readonly RULE_keepCommand = 32; + public static readonly RULE_dropCommand = 33; + public static readonly RULE_renameCommand = 34; + public static readonly RULE_renameClause = 35; + public static readonly RULE_dissectCommand = 36; + public static readonly RULE_grokCommand = 37; + public static readonly RULE_mvExpandCommand = 38; + public static readonly RULE_commandOptions = 39; + public static readonly RULE_commandOption = 40; + public static readonly RULE_booleanValue = 41; + public static readonly RULE_numericValue = 42; + public static readonly RULE_decimalValue = 43; + public static readonly RULE_integerValue = 44; + public static readonly RULE_string = 45; + public static readonly RULE_comparisonOperator = 46; + public static readonly RULE_explainCommand = 47; + public static readonly RULE_subqueryExpression = 48; + public static readonly RULE_showCommand = 49; + public static readonly RULE_metaCommand = 50; + public static readonly RULE_enrichCommand = 51; + public static readonly RULE_enrichWithClause = 52; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", "'grok'", "'inlinestats'", "'keep'", "'limit'", - "'meta'", "'mv_expand'", + "'meta'", "'metrics'", + "'mv_expand'", "'rename'", "'row'", "'show'", "'sort'", "'stats'", @@ -194,45 +203,44 @@ export default class esql_parser extends Parser { null, null, null, null, null, null, - "'|'", null, + null, "'|'", null, null, - "'by'", "'and'", - "'asc'", "'='", - "'::'", "','", - "'desc'", "'.'", - "'false'", "'first'", - "'last'", "'('", - "'in'", "'is'", - "'like'", "'not'", - "'null'", "'nulls'", - "'or'", "'?'", - "'rlike'", "')'", - "'true'", "'=='", - "'=~'", "'!='", - "'<'", "'<='", - "'>'", "'>='", - "'+'", "'-'", - "'*'", "'/'", - "'%'", null, - "']'", null, + null, "'by'", + "'and'", "'asc'", + "'='", "'::'", + "','", "'desc'", + "'.'", "'false'", + "'first'", "'last'", + "'('", "'in'", + "'is'", "'like'", + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", + null, "']'", null, null, null, null, - "'metadata'", + null, "'metadata'", null, null, null, null, null, null, + null, "'as'", null, null, - "'as'", null, + null, "'on'", + "'with'", null, null, null, - "'on'", "'with'", null, null, null, null, null, null, + null, "'info'", null, null, - null, null, - "'info'", null, - null, null, - "'functions'", + null, "'functions'", null, null, null, "':'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", @@ -241,14 +249,16 @@ export default class esql_parser extends Parser { "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", - "META", "MV_EXPAND", + "META", "METRICS", + "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "EXPLAIN_WS", + "WS", "INDEX_UNQUOTED_IDENTIFIER", + "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "PIPE", "QUOTED_STRING", @@ -280,7 +290,6 @@ export default class esql_parser extends Parser { "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", - "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", @@ -312,18 +321,24 @@ export default class esql_parser extends Parser { "COLON", "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", - "SETTING_WS" ]; + "SETTING_WS", + "METRICS_LINE_COMMENT", + "METRICS_MULTILINE_COMMENT", + "METRICS_WS", + "CLOSING_METRICS_LINE_COMMENT", + "CLOSING_METRICS_MULTILINE_COMMENT", + "CLOSING_METRICS_WS" ]; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", "booleanExpression", "regexBooleanExpression", "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", "dataType", "rowCommand", "fields", - "field", "fromCommand", "fromIdentifier", "metadata", "metadataOption", - "deprecated_metadata", "evalCommand", "statsCommand", "inlinestatsCommand", - "qualifiedName", "qualifiedNamePattern", "identifier", "identifierPattern", - "constant", "limitCommand", "sortCommand", "orderExpression", "keepCommand", - "dropCommand", "renameCommand", "renameClause", "dissectCommand", "grokCommand", - "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", + "field", "fromCommand", "indexIdentifier", "metadata", "metadataOption", + "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", + "inlinestatsCommand", "qualifiedName", "qualifiedNamePattern", "identifier", + "identifierPattern", "constant", "limitCommand", "sortCommand", "orderExpression", + "keepCommand", "dropCommand", "renameCommand", "renameClause", "dissectCommand", + "grokCommand", "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", "explainCommand", "subqueryExpression", "showCommand", "metaCommand", "enrichCommand", "enrichWithClause", @@ -349,9 +364,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 104; + this.state = 106; this.query(0); - this.state = 105; + this.state = 107; this.match(esql_parser.EOF); } } @@ -393,11 +408,11 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 108; + this.state = 110; this.sourceCommand(); } this._ctx.stop = this._input.LT(-1); - this.state = 115; + this.state = 117; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -410,18 +425,18 @@ export default class esql_parser extends Parser { { localctx = new CompositeQueryContext(this, new QueryContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_query); - this.state = 110; + this.state = 112; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 111; + this.state = 113; this.match(esql_parser.PIPE); - this.state = 112; + this.state = 114; this.processingCommand(); } } } - this.state = 117; + this.state = 119; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); } @@ -446,41 +461,48 @@ export default class esql_parser extends Parser { let localctx: SourceCommandContext = new SourceCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 123; + this.state = 126; this._errHandler.sync(this); switch (this._input.LA(1)) { case 5: this.enterOuterAlt(localctx, 1); { - this.state = 118; + this.state = 120; this.explainCommand(); } break; case 6: this.enterOuterAlt(localctx, 2); { - this.state = 119; + this.state = 121; this.fromCommand(); } break; - case 14: + case 15: this.enterOuterAlt(localctx, 3); { - this.state = 120; + this.state = 122; this.rowCommand(); } break; - case 15: + case 12: this.enterOuterAlt(localctx, 4); { - this.state = 121; + this.state = 123; + this.metricsCommand(); + } + break; + case 16: + this.enterOuterAlt(localctx, 5); + { + this.state = 124; this.showCommand(); } break; case 11: - this.enterOuterAlt(localctx, 5); + this.enterOuterAlt(localctx, 6); { - this.state = 122; + this.state = 125; this.metaCommand(); } break; @@ -507,97 +529,97 @@ export default class esql_parser extends Parser { let localctx: ProcessingCommandContext = new ProcessingCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 138; + this.state = 141; this._errHandler.sync(this); switch (this._input.LA(1)) { case 4: this.enterOuterAlt(localctx, 1); { - this.state = 125; + this.state = 128; this.evalCommand(); } break; case 8: this.enterOuterAlt(localctx, 2); { - this.state = 126; + this.state = 129; this.inlinestatsCommand(); } break; case 10: this.enterOuterAlt(localctx, 3); { - this.state = 127; + this.state = 130; this.limitCommand(); } break; case 9: this.enterOuterAlt(localctx, 4); { - this.state = 128; + this.state = 131; this.keepCommand(); } break; - case 16: + case 17: this.enterOuterAlt(localctx, 5); { - this.state = 129; + this.state = 132; this.sortCommand(); } break; - case 17: + case 18: this.enterOuterAlt(localctx, 6); { - this.state = 130; + this.state = 133; this.statsCommand(); } break; - case 18: + case 19: this.enterOuterAlt(localctx, 7); { - this.state = 131; + this.state = 134; this.whereCommand(); } break; case 2: this.enterOuterAlt(localctx, 8); { - this.state = 132; + this.state = 135; this.dropCommand(); } break; - case 13: + case 14: this.enterOuterAlt(localctx, 9); { - this.state = 133; + this.state = 136; this.renameCommand(); } break; case 1: this.enterOuterAlt(localctx, 10); { - this.state = 134; + this.state = 137; this.dissectCommand(); } break; case 7: this.enterOuterAlt(localctx, 11); { - this.state = 135; + this.state = 138; this.grokCommand(); } break; case 3: this.enterOuterAlt(localctx, 12); { - this.state = 136; + this.state = 139; this.enrichCommand(); } break; - case 12: + case 13: this.enterOuterAlt(localctx, 13); { - this.state = 137; + this.state = 140; this.mvExpandCommand(); } break; @@ -626,9 +648,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 140; + this.state = 143; this.match(esql_parser.WHERE); - this.state = 141; + this.state = 144; this.booleanExpression(0); } } @@ -666,7 +688,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 171; + this.state = 174; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -675,9 +697,9 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 144; + this.state = 147; this.match(esql_parser.NOT); - this.state = 145; + this.state = 148; this.booleanExpression(7); } break; @@ -686,7 +708,7 @@ export default class esql_parser extends Parser { localctx = new BooleanDefaultContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 146; + this.state = 149; this.valueExpression(); } break; @@ -695,7 +717,7 @@ export default class esql_parser extends Parser { localctx = new RegexExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 147; + this.state = 150; this.regexBooleanExpression(); } break; @@ -704,41 +726,41 @@ export default class esql_parser extends Parser { localctx = new LogicalInContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 148; + this.state = 151; this.valueExpression(); - this.state = 150; + this.state = 153; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===45) { + if (_la===47) { { - this.state = 149; + this.state = 152; this.match(esql_parser.NOT); } } - this.state = 152; + this.state = 155; this.match(esql_parser.IN); - this.state = 153; + this.state = 156; this.match(esql_parser.LP); - this.state = 154; + this.state = 157; this.valueExpression(); - this.state = 159; + this.state = 162; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===35) { + while (_la===37) { { { - this.state = 155; + this.state = 158; this.match(esql_parser.COMMA); - this.state = 156; + this.state = 159; this.valueExpression(); } } - this.state = 161; + this.state = 164; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 162; + this.state = 165; this.match(esql_parser.RP); } break; @@ -747,27 +769,27 @@ export default class esql_parser extends Parser { localctx = new IsNullContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 164; + this.state = 167; this.valueExpression(); - this.state = 165; + this.state = 168; this.match(esql_parser.IS); - this.state = 167; + this.state = 170; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===45) { + if (_la===47) { { - this.state = 166; + this.state = 169; this.match(esql_parser.NOT); } } - this.state = 169; + this.state = 172; this.match(esql_parser.NULL); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 181; + this.state = 184; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -777,7 +799,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 179; + this.state = 182; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -785,13 +807,13 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 173; + this.state = 176; if (!(this.precpred(this._ctx, 4))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 4)"); } - this.state = 174; + this.state = 177; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); - this.state = 175; + this.state = 178; (localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; @@ -800,20 +822,20 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 176; + this.state = 179; if (!(this.precpred(this._ctx, 3))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 3)"); } - this.state = 177; + this.state = 180; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); - this.state = 178; + this.state = 181; (localctx as LogicalBinaryContext)._right = this.booleanExpression(4); } break; } } } - this.state = 183; + this.state = 186; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); } @@ -839,48 +861,48 @@ export default class esql_parser extends Parser { this.enterRule(localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 198; + this.state = 201; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 184; + this.state = 187; this.valueExpression(); - this.state = 186; + this.state = 189; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===45) { + if (_la===47) { { - this.state = 185; + this.state = 188; this.match(esql_parser.NOT); } } - this.state = 188; + this.state = 191; localctx._kind = this.match(esql_parser.LIKE); - this.state = 189; + this.state = 192; localctx._pattern = this.string_(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 191; + this.state = 194; this.valueExpression(); - this.state = 193; + this.state = 196; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===45) { + if (_la===47) { { - this.state = 192; + this.state = 195; this.match(esql_parser.NOT); } } - this.state = 195; + this.state = 198; localctx._kind = this.match(esql_parser.RLIKE); - this.state = 196; + this.state = 199; localctx._pattern = this.string_(); } break; @@ -905,14 +927,14 @@ export default class esql_parser extends Parser { let localctx: ValueExpressionContext = new ValueExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 14, esql_parser.RULE_valueExpression); try { - this.state = 205; + this.state = 208; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: localctx = new ValueExpressionDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 200; + this.state = 203; this.operatorExpression(0); } break; @@ -920,11 +942,11 @@ export default class esql_parser extends Parser { localctx = new ComparisonContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 201; + this.state = 204; (localctx as ComparisonContext)._left = this.operatorExpression(0); - this.state = 202; + this.state = 205; this.comparisonOperator(); - this.state = 203; + this.state = 206; (localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -964,7 +986,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 211; + this.state = 214; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -973,7 +995,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 208; + this.state = 211; this.primaryExpression(0); } break; @@ -982,23 +1004,23 @@ export default class esql_parser extends Parser { localctx = new ArithmeticUnaryContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 209; + this.state = 212; (localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===60 || _la===61)) { + if(!(_la===62 || _la===63)) { (localctx as ArithmeticUnaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 210; + this.state = 213; this.operatorExpression(3); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 221; + this.state = 224; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1008,7 +1030,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 219; + this.state = 222; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -1016,21 +1038,21 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 213; + this.state = 216; if (!(this.precpred(this._ctx, 2))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 2)"); } - this.state = 214; + this.state = 217; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(((((_la - 62)) & ~0x1F) === 0 && ((1 << (_la - 62)) & 7) !== 0))) { + if(!(((((_la - 64)) & ~0x1F) === 0 && ((1 << (_la - 64)) & 7) !== 0))) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 215; + this.state = 218; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -1039,28 +1061,28 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 216; + this.state = 219; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 217; + this.state = 220; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===60 || _la===61)) { + if(!(_la===62 || _la===63)) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 218; + this.state = 221; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 223; + this.state = 226; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); } @@ -1099,7 +1121,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 232; + this.state = 235; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: @@ -1108,7 +1130,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 225; + this.state = 228; this.constant(); } break; @@ -1117,7 +1139,7 @@ export default class esql_parser extends Parser { localctx = new DereferenceContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 226; + this.state = 229; this.qualifiedName(); } break; @@ -1126,7 +1148,7 @@ export default class esql_parser extends Parser { localctx = new FunctionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 227; + this.state = 230; this.functionExpression(); } break; @@ -1135,17 +1157,17 @@ export default class esql_parser extends Parser { localctx = new ParenthesizedExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 228; + this.state = 231; this.match(esql_parser.LP); - this.state = 229; + this.state = 232; this.booleanExpression(0); - this.state = 230; + this.state = 233; this.match(esql_parser.RP); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 239; + this.state = 242; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1158,18 +1180,18 @@ export default class esql_parser extends Parser { { localctx = new InlineCastContext(this, new PrimaryExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_primaryExpression); - this.state = 234; + this.state = 237; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 235; + this.state = 238; this.match(esql_parser.CAST_OP); - this.state = 236; + this.state = 239; this.dataType(); } } } - this.state = 241; + this.state = 244; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); } @@ -1197,62 +1219,62 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 242; + this.state = 245; this.identifier(); - this.state = 243; + this.state = 246; this.match(esql_parser.LP); - this.state = 253; + this.state = 256; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 62: + case 64: { - this.state = 244; + this.state = 247; this.match(esql_parser.ASTERISK); } break; - case 27: - case 28: case 29: - case 38: - case 41: - case 45: - case 46: - case 49: - case 52: - case 60: - case 61: - case 65: + case 30: + case 31: + case 40: + case 43: + case 47: + case 48: + case 51: + case 54: + case 62: + case 63: case 67: - case 68: + case 69: + case 70: { { - this.state = 245; + this.state = 248; this.booleanExpression(0); - this.state = 250; + this.state = 253; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===35) { + while (_la===37) { { { - this.state = 246; + this.state = 249; this.match(esql_parser.COMMA); - this.state = 247; + this.state = 250; this.booleanExpression(0); } } - this.state = 252; + this.state = 255; this._errHandler.sync(this); _la = this._input.LA(1); } } } break; - case 51: + case 53: break; default: break; } - this.state = 255; + this.state = 258; this.match(esql_parser.RP); } } @@ -1278,7 +1300,7 @@ export default class esql_parser extends Parser { localctx = new ToDataTypeContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 257; + this.state = 260; this.identifier(); } } @@ -1303,9 +1325,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 259; + this.state = 262; this.match(esql_parser.ROW); - this.state = 260; + this.state = 263; this.fields(); } } @@ -1331,23 +1353,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 262; + this.state = 265; this.field(); - this.state = 267; + this.state = 270; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 263; + this.state = 266; this.match(esql_parser.COMMA); - this.state = 264; + this.state = 267; this.field(); } } } - this.state = 269; + this.state = 272; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); } @@ -1372,24 +1394,24 @@ export default class esql_parser extends Parser { let localctx: FieldContext = new FieldContext(this, this._ctx, this.state); this.enterRule(localctx, 28, esql_parser.RULE_field); try { - this.state = 275; + this.state = 278; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 270; + this.state = 273; this.booleanExpression(0); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 271; + this.state = 274; this.qualifiedName(); - this.state = 272; + this.state = 275; this.match(esql_parser.ASSIGN); - this.state = 273; + this.state = 276; this.booleanExpression(0); } break; @@ -1417,34 +1439,34 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 277; + this.state = 280; this.match(esql_parser.FROM); - this.state = 278; - this.fromIdentifier(); - this.state = 283; + this.state = 281; + this.indexIdentifier(); + this.state = 286; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 279; + this.state = 282; this.match(esql_parser.COMMA); - this.state = 280; - this.fromIdentifier(); + this.state = 283; + this.indexIdentifier(); } } } - this.state = 285; + this.state = 288; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); } - this.state = 287; + this.state = 290; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 23, this._ctx) ) { case 1: { - this.state = 286; + this.state = 289; this.metadata(); } break; @@ -1466,14 +1488,14 @@ export default class esql_parser extends Parser { return localctx; } // @RuleVersion(0) - public fromIdentifier(): FromIdentifierContext { - let localctx: FromIdentifierContext = new FromIdentifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 32, esql_parser.RULE_fromIdentifier); + public indexIdentifier(): IndexIdentifierContext { + let localctx: IndexIdentifierContext = new IndexIdentifierContext(this, this._ctx, this.state); + this.enterRule(localctx, 32, esql_parser.RULE_indexIdentifier); try { this.enterOuterAlt(localctx, 1); { - this.state = 289; - this.match(esql_parser.FROM_UNQUOTED_IDENTIFIER); + this.state = 292; + this.match(esql_parser.INDEX_UNQUOTED_IDENTIFIER); } } catch (re) { @@ -1495,20 +1517,20 @@ export default class esql_parser extends Parser { let localctx: MetadataContext = new MetadataContext(this, this._ctx, this.state); this.enterRule(localctx, 34, esql_parser.RULE_metadata); try { - this.state = 293; + this.state = 296; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 72: + case 74: this.enterOuterAlt(localctx, 1); { - this.state = 291; + this.state = 294; this.metadataOption(); } break; - case 65: + case 67: this.enterOuterAlt(localctx, 2); { - this.state = 292; + this.state = 295; this.deprecated_metadata(); } break; @@ -1538,25 +1560,25 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 295; + this.state = 298; this.match(esql_parser.METADATA); - this.state = 296; - this.fromIdentifier(); - this.state = 301; + this.state = 299; + this.indexIdentifier(); + this.state = 304; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 25, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 297; + this.state = 300; this.match(esql_parser.COMMA); - this.state = 298; - this.fromIdentifier(); + this.state = 301; + this.indexIdentifier(); } } } - this.state = 303; + this.state = 306; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 25, this._ctx); } @@ -1583,11 +1605,11 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 304; + this.state = 307; this.match(esql_parser.OPENING_BRACKET); - this.state = 305; + this.state = 308; this.metadataOption(); - this.state = 306; + this.state = 309; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1606,15 +1628,83 @@ export default class esql_parser extends Parser { return localctx; } // @RuleVersion(0) + public metricsCommand(): MetricsCommandContext { + let localctx: MetricsCommandContext = new MetricsCommandContext(this, this._ctx, this.state); + this.enterRule(localctx, 40, esql_parser.RULE_metricsCommand); + try { + let _alt: number; + this.enterOuterAlt(localctx, 1); + { + this.state = 311; + this.match(esql_parser.METRICS); + this.state = 312; + this.indexIdentifier(); + this.state = 317; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); + while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + { + { + this.state = 313; + this.match(esql_parser.COMMA); + this.state = 314; + this.indexIdentifier(); + } + } + } + this.state = 319; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); + } + this.state = 321; + this._errHandler.sync(this); + switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { + case 1: + { + this.state = 320; + localctx._aggregates = this.fields(); + } + break; + } + this.state = 325; + this._errHandler.sync(this); + switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { + case 1: + { + this.state = 323; + this.match(esql_parser.BY); + this.state = 324; + localctx._grouping = this.fields(); + } + break; + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) public evalCommand(): EvalCommandContext { let localctx: EvalCommandContext = new EvalCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 40, esql_parser.RULE_evalCommand); + this.enterRule(localctx, 42, esql_parser.RULE_evalCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 308; + this.state = 327; this.match(esql_parser.EVAL); - this.state = 309; + this.state = 328; this.fields(); } } @@ -1635,30 +1725,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public statsCommand(): StatsCommandContext { let localctx: StatsCommandContext = new StatsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 42, esql_parser.RULE_statsCommand); + this.enterRule(localctx, 44, esql_parser.RULE_statsCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 311; + this.state = 330; this.match(esql_parser.STATS); - this.state = 313; + this.state = 332; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 26, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { case 1: { - this.state = 312; + this.state = 331; localctx._stats = this.fields(); } break; } - this.state = 317; + this.state = 336; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { case 1: { - this.state = 315; + this.state = 334; this.match(esql_parser.BY); - this.state = 316; + this.state = 335; localctx._grouping = this.fields(); } break; @@ -1682,22 +1772,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public inlinestatsCommand(): InlinestatsCommandContext { let localctx: InlinestatsCommandContext = new InlinestatsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 44, esql_parser.RULE_inlinestatsCommand); + this.enterRule(localctx, 46, esql_parser.RULE_inlinestatsCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 319; + this.state = 338; this.match(esql_parser.INLINESTATS); - this.state = 320; + this.state = 339; localctx._stats = this.fields(); - this.state = 323; + this.state = 342; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { case 1: { - this.state = 321; + this.state = 340; this.match(esql_parser.BY); - this.state = 322; + this.state = 341; localctx._grouping = this.fields(); } break; @@ -1721,30 +1811,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let localctx: QualifiedNameContext = new QualifiedNameContext(this, this._ctx, this.state); - this.enterRule(localctx, 46, esql_parser.RULE_qualifiedName); + this.enterRule(localctx, 48, esql_parser.RULE_qualifiedName); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 325; + this.state = 344; this.identifier(); - this.state = 330; + this.state = 349; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 29, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 326; + this.state = 345; this.match(esql_parser.DOT); - this.state = 327; + this.state = 346; this.identifier(); } } } - this.state = 332; + this.state = 351; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 29, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); } } } @@ -1765,30 +1855,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public qualifiedNamePattern(): QualifiedNamePatternContext { let localctx: QualifiedNamePatternContext = new QualifiedNamePatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 48, esql_parser.RULE_qualifiedNamePattern); + this.enterRule(localctx, 50, esql_parser.RULE_qualifiedNamePattern); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 333; + this.state = 352; this.identifierPattern(); - this.state = 338; + this.state = 357; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 30, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 334; + this.state = 353; this.match(esql_parser.DOT); - this.state = 335; + this.state = 354; this.identifierPattern(); } } } - this.state = 340; + this.state = 359; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 30, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); } } } @@ -1809,14 +1899,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let localctx: IdentifierContext = new IdentifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 50, esql_parser.RULE_identifier); + this.enterRule(localctx, 52, esql_parser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 341; + this.state = 360; _la = this._input.LA(1); - if(!(_la===67 || _la===68)) { + if(!(_la===69 || _la===70)) { this._errHandler.recoverInline(this); } else { @@ -1842,11 +1932,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public identifierPattern(): IdentifierPatternContext { let localctx: IdentifierPatternContext = new IdentifierPatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 52, esql_parser.RULE_identifierPattern); + this.enterRule(localctx, 54, esql_parser.RULE_identifierPattern); try { this.enterOuterAlt(localctx, 1); { - this.state = 343; + this.state = 362; this.match(esql_parser.ID_PATTERN); } } @@ -1867,17 +1957,17 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public constant(): ConstantContext { let localctx: ConstantContext = new ConstantContext(this, this._ctx, this.state); - this.enterRule(localctx, 54, esql_parser.RULE_constant); + this.enterRule(localctx, 56, esql_parser.RULE_constant); let _la: number; try { - this.state = 387; + this.state = 406; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 34, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 37, this._ctx) ) { case 1: localctx = new NullLiteralContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 345; + this.state = 364; this.match(esql_parser.NULL); } break; @@ -1885,9 +1975,9 @@ export default class esql_parser extends Parser { localctx = new QualifiedIntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 346; + this.state = 365; this.integerValue(); - this.state = 347; + this.state = 366; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -1895,7 +1985,7 @@ export default class esql_parser extends Parser { localctx = new DecimalLiteralContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 349; + this.state = 368; this.decimalValue(); } break; @@ -1903,7 +1993,7 @@ export default class esql_parser extends Parser { localctx = new IntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 350; + this.state = 369; this.integerValue(); } break; @@ -1911,7 +2001,7 @@ export default class esql_parser extends Parser { localctx = new BooleanLiteralContext(this, localctx); this.enterOuterAlt(localctx, 5); { - this.state = 351; + this.state = 370; this.booleanValue(); } break; @@ -1919,7 +2009,7 @@ export default class esql_parser extends Parser { localctx = new InputParamContext(this, localctx); this.enterOuterAlt(localctx, 6); { - this.state = 352; + this.state = 371; this.match(esql_parser.PARAM); } break; @@ -1927,7 +2017,7 @@ export default class esql_parser extends Parser { localctx = new StringLiteralContext(this, localctx); this.enterOuterAlt(localctx, 7); { - this.state = 353; + this.state = 372; this.string_(); } break; @@ -1935,27 +2025,27 @@ export default class esql_parser extends Parser { localctx = new NumericArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 8); { - this.state = 354; + this.state = 373; this.match(esql_parser.OPENING_BRACKET); - this.state = 355; + this.state = 374; this.numericValue(); - this.state = 360; + this.state = 379; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===35) { + while (_la===37) { { { - this.state = 356; + this.state = 375; this.match(esql_parser.COMMA); - this.state = 357; + this.state = 376; this.numericValue(); } } - this.state = 362; + this.state = 381; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 363; + this.state = 382; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1963,27 +2053,27 @@ export default class esql_parser extends Parser { localctx = new BooleanArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 9); { - this.state = 365; + this.state = 384; this.match(esql_parser.OPENING_BRACKET); - this.state = 366; + this.state = 385; this.booleanValue(); - this.state = 371; + this.state = 390; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===35) { + while (_la===37) { { { - this.state = 367; + this.state = 386; this.match(esql_parser.COMMA); - this.state = 368; + this.state = 387; this.booleanValue(); } } - this.state = 373; + this.state = 392; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 374; + this.state = 393; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -1991,27 +2081,27 @@ export default class esql_parser extends Parser { localctx = new StringArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 10); { - this.state = 376; + this.state = 395; this.match(esql_parser.OPENING_BRACKET); - this.state = 377; + this.state = 396; this.string_(); - this.state = 382; + this.state = 401; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===35) { + while (_la===37) { { { - this.state = 378; + this.state = 397; this.match(esql_parser.COMMA); - this.state = 379; + this.state = 398; this.string_(); } } - this.state = 384; + this.state = 403; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 385; + this.state = 404; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2034,13 +2124,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let localctx: LimitCommandContext = new LimitCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 56, esql_parser.RULE_limitCommand); + this.enterRule(localctx, 58, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 389; + this.state = 408; this.match(esql_parser.LIMIT); - this.state = 390; + this.state = 409; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2061,32 +2151,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public sortCommand(): SortCommandContext { let localctx: SortCommandContext = new SortCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 58, esql_parser.RULE_sortCommand); + this.enterRule(localctx, 60, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 392; + this.state = 411; this.match(esql_parser.SORT); - this.state = 393; + this.state = 412; this.orderExpression(); - this.state = 398; + this.state = 417; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 394; + this.state = 413; this.match(esql_parser.COMMA); - this.state = 395; + this.state = 414; this.orderExpression(); } } } - this.state = 400; + this.state = 419; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); } } } @@ -2107,22 +2197,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let localctx: OrderExpressionContext = new OrderExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 60, esql_parser.RULE_orderExpression); + this.enterRule(localctx, 62, esql_parser.RULE_orderExpression); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 401; + this.state = 420; this.booleanExpression(0); - this.state = 403; + this.state = 422; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 36, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 39, this._ctx) ) { case 1: { - this.state = 402; + this.state = 421; localctx._ordering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===32 || _la===36)) { + if(!(_la===34 || _la===38)) { localctx._ordering = this._errHandler.recoverInline(this); } else { @@ -2132,17 +2222,17 @@ export default class esql_parser extends Parser { } break; } - this.state = 407; + this.state = 426; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 37, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { - this.state = 405; + this.state = 424; this.match(esql_parser.NULLS); - this.state = 406; + this.state = 425; localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===39 || _la===40)) { + if(!(_la===41 || _la===42)) { localctx._nullOrdering = this._errHandler.recoverInline(this); } else { @@ -2171,32 +2261,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let localctx: KeepCommandContext = new KeepCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 62, esql_parser.RULE_keepCommand); + this.enterRule(localctx, 64, esql_parser.RULE_keepCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 409; + this.state = 428; this.match(esql_parser.KEEP); - this.state = 410; + this.state = 429; this.qualifiedNamePattern(); - this.state = 415; + this.state = 434; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 411; + this.state = 430; this.match(esql_parser.COMMA); - this.state = 412; + this.state = 431; this.qualifiedNamePattern(); } } } - this.state = 417; + this.state = 436; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 38, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); } } } @@ -2217,32 +2307,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dropCommand(): DropCommandContext { let localctx: DropCommandContext = new DropCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 64, esql_parser.RULE_dropCommand); + this.enterRule(localctx, 66, esql_parser.RULE_dropCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 418; + this.state = 437; this.match(esql_parser.DROP); - this.state = 419; + this.state = 438; this.qualifiedNamePattern(); - this.state = 424; + this.state = 443; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 39, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 420; + this.state = 439; this.match(esql_parser.COMMA); - this.state = 421; + this.state = 440; this.qualifiedNamePattern(); } } } - this.state = 426; + this.state = 445; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 39, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); } } } @@ -2263,32 +2353,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let localctx: RenameCommandContext = new RenameCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 66, esql_parser.RULE_renameCommand); + this.enterRule(localctx, 68, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 427; + this.state = 446; this.match(esql_parser.RENAME); - this.state = 428; + this.state = 447; this.renameClause(); - this.state = 433; + this.state = 452; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 40, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 429; + this.state = 448; this.match(esql_parser.COMMA); - this.state = 430; + this.state = 449; this.renameClause(); } } } - this.state = 435; + this.state = 454; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 40, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 43, this._ctx); } } } @@ -2309,15 +2399,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameClause(): RenameClauseContext { let localctx: RenameClauseContext = new RenameClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 68, esql_parser.RULE_renameClause); + this.enterRule(localctx, 70, esql_parser.RULE_renameClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 436; + this.state = 455; localctx._oldName = this.qualifiedNamePattern(); - this.state = 437; + this.state = 456; this.match(esql_parser.AS); - this.state = 438; + this.state = 457; localctx._newName = this.qualifiedNamePattern(); } } @@ -2338,22 +2428,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let localctx: DissectCommandContext = new DissectCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 70, esql_parser.RULE_dissectCommand); + this.enterRule(localctx, 72, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 440; + this.state = 459; this.match(esql_parser.DISSECT); - this.state = 441; + this.state = 460; this.primaryExpression(0); - this.state = 442; + this.state = 461; this.string_(); - this.state = 444; + this.state = 463; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 41, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 44, this._ctx) ) { case 1: { - this.state = 443; + this.state = 462; this.commandOptions(); } break; @@ -2377,15 +2467,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let localctx: GrokCommandContext = new GrokCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 72, esql_parser.RULE_grokCommand); + this.enterRule(localctx, 74, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 446; + this.state = 465; this.match(esql_parser.GROK); - this.state = 447; + this.state = 466; this.primaryExpression(0); - this.state = 448; + this.state = 467; this.string_(); } } @@ -2406,13 +2496,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public mvExpandCommand(): MvExpandCommandContext { let localctx: MvExpandCommandContext = new MvExpandCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 74, esql_parser.RULE_mvExpandCommand); + this.enterRule(localctx, 76, esql_parser.RULE_mvExpandCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 450; + this.state = 469; this.match(esql_parser.MV_EXPAND); - this.state = 451; + this.state = 470; this.qualifiedName(); } } @@ -2433,30 +2523,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let localctx: CommandOptionsContext = new CommandOptionsContext(this, this._ctx, this.state); - this.enterRule(localctx, 76, esql_parser.RULE_commandOptions); + this.enterRule(localctx, 78, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 453; + this.state = 472; this.commandOption(); - this.state = 458; + this.state = 477; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 454; + this.state = 473; this.match(esql_parser.COMMA); - this.state = 455; + this.state = 474; this.commandOption(); } } } - this.state = 460; + this.state = 479; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); } } } @@ -2477,15 +2567,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOption(): CommandOptionContext { let localctx: CommandOptionContext = new CommandOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 78, esql_parser.RULE_commandOption); + this.enterRule(localctx, 80, esql_parser.RULE_commandOption); try { this.enterOuterAlt(localctx, 1); { - this.state = 461; + this.state = 480; this.identifier(); - this.state = 462; + this.state = 481; this.match(esql_parser.ASSIGN); - this.state = 463; + this.state = 482; this.constant(); } } @@ -2506,14 +2596,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let localctx: BooleanValueContext = new BooleanValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 80, esql_parser.RULE_booleanValue); + this.enterRule(localctx, 82, esql_parser.RULE_booleanValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 465; + this.state = 484; _la = this._input.LA(1); - if(!(_la===38 || _la===52)) { + if(!(_la===40 || _la===54)) { this._errHandler.recoverInline(this); } else { @@ -2539,22 +2629,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public numericValue(): NumericValueContext { let localctx: NumericValueContext = new NumericValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 82, esql_parser.RULE_numericValue); + this.enterRule(localctx, 84, esql_parser.RULE_numericValue); try { - this.state = 469; + this.state = 488; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 43, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 467; + this.state = 486; this.decimalValue(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 468; + this.state = 487; this.integerValue(); } break; @@ -2577,19 +2667,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let localctx: DecimalValueContext = new DecimalValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 84, esql_parser.RULE_decimalValue); + this.enterRule(localctx, 86, esql_parser.RULE_decimalValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 472; + this.state = 491; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===60 || _la===61) { + if (_la===62 || _la===63) { { - this.state = 471; + this.state = 490; _la = this._input.LA(1); - if(!(_la===60 || _la===61)) { + if(!(_la===62 || _la===63)) { this._errHandler.recoverInline(this); } else { @@ -2599,7 +2689,7 @@ export default class esql_parser extends Parser { } } - this.state = 474; + this.state = 493; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2620,19 +2710,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public integerValue(): IntegerValueContext { let localctx: IntegerValueContext = new IntegerValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 86, esql_parser.RULE_integerValue); + this.enterRule(localctx, 88, esql_parser.RULE_integerValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 477; + this.state = 496; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===60 || _la===61) { + if (_la===62 || _la===63) { { - this.state = 476; + this.state = 495; _la = this._input.LA(1); - if(!(_la===60 || _la===61)) { + if(!(_la===62 || _la===63)) { this._errHandler.recoverInline(this); } else { @@ -2642,7 +2732,7 @@ export default class esql_parser extends Parser { } } - this.state = 479; + this.state = 498; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2663,11 +2753,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public string_(): StringContext { let localctx: StringContext = new StringContext(this, this._ctx, this.state); - this.enterRule(localctx, 88, esql_parser.RULE_string); + this.enterRule(localctx, 90, esql_parser.RULE_string); try { this.enterOuterAlt(localctx, 1); { - this.state = 481; + this.state = 500; this.match(esql_parser.QUOTED_STRING); } } @@ -2688,14 +2778,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this, this._ctx, this.state); - this.enterRule(localctx, 90, esql_parser.RULE_comparisonOperator); + this.enterRule(localctx, 92, esql_parser.RULE_comparisonOperator); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 483; + this.state = 502; _la = this._input.LA(1); - if(!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & 125) !== 0))) { + if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 125) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -2721,13 +2811,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public explainCommand(): ExplainCommandContext { let localctx: ExplainCommandContext = new ExplainCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 92, esql_parser.RULE_explainCommand); + this.enterRule(localctx, 94, esql_parser.RULE_explainCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 485; + this.state = 504; this.match(esql_parser.EXPLAIN); - this.state = 486; + this.state = 505; this.subqueryExpression(); } } @@ -2748,15 +2838,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public subqueryExpression(): SubqueryExpressionContext { let localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 94, esql_parser.RULE_subqueryExpression); + this.enterRule(localctx, 96, esql_parser.RULE_subqueryExpression); try { this.enterOuterAlt(localctx, 1); { - this.state = 488; + this.state = 507; this.match(esql_parser.OPENING_BRACKET); - this.state = 489; + this.state = 508; this.query(0); - this.state = 490; + this.state = 509; this.match(esql_parser.CLOSING_BRACKET); } } @@ -2777,14 +2867,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public showCommand(): ShowCommandContext { let localctx: ShowCommandContext = new ShowCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 96, esql_parser.RULE_showCommand); + this.enterRule(localctx, 98, esql_parser.RULE_showCommand); try { localctx = new ShowInfoContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 492; + this.state = 511; this.match(esql_parser.SHOW); - this.state = 493; + this.state = 512; this.match(esql_parser.INFO); } } @@ -2805,14 +2895,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public metaCommand(): MetaCommandContext { let localctx: MetaCommandContext = new MetaCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 98, esql_parser.RULE_metaCommand); + this.enterRule(localctx, 100, esql_parser.RULE_metaCommand); try { localctx = new MetaFunctionsContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 495; + this.state = 514; this.match(esql_parser.META); - this.state = 496; + this.state = 515; this.match(esql_parser.FUNCTIONS); } } @@ -2833,53 +2923,53 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public enrichCommand(): EnrichCommandContext { let localctx: EnrichCommandContext = new EnrichCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 100, esql_parser.RULE_enrichCommand); + this.enterRule(localctx, 102, esql_parser.RULE_enrichCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 498; + this.state = 517; this.match(esql_parser.ENRICH); - this.state = 499; + this.state = 518; localctx._policyName = this.match(esql_parser.ENRICH_POLICY_NAME); - this.state = 502; + this.state = 521; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 49, this._ctx) ) { case 1: { - this.state = 500; + this.state = 519; this.match(esql_parser.ON); - this.state = 501; + this.state = 520; localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 513; + this.state = 532; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 48, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 51, this._ctx) ) { case 1: { - this.state = 504; + this.state = 523; this.match(esql_parser.WITH); - this.state = 505; + this.state = 524; this.enrichWithClause(); - this.state = 510; + this.state = 529; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 47, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 506; + this.state = 525; this.match(esql_parser.COMMA); - this.state = 507; + this.state = 526; this.enrichWithClause(); } } } - this.state = 512; + this.state = 531; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 47, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); } } break; @@ -2903,23 +2993,23 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public enrichWithClause(): EnrichWithClauseContext { let localctx: EnrichWithClauseContext = new EnrichWithClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 102, esql_parser.RULE_enrichWithClause); + this.enterRule(localctx, 104, esql_parser.RULE_enrichWithClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 518; + this.state = 537; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 49, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 52, this._ctx) ) { case 1: { - this.state = 515; + this.state = 534; localctx._newName = this.qualifiedNamePattern(); - this.state = 516; + this.state = 535; this.match(esql_parser.ASSIGN); } break; } - this.state = 520; + this.state = 539; localctx._enrichField = this.qualifiedNamePattern(); } } @@ -2984,176 +3074,183 @@ export default class esql_parser extends Parser { return true; } - public static readonly _serializedATN: number[] = [4,1,109,523,2,0,7,0, + public static readonly _serializedATN: number[] = [4,1,116,542,2,0,7,0, 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, 7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7, 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, - 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,1,0,1,0,1,0,1, - 1,1,1,1,1,1,1,1,1,1,1,5,1,114,8,1,10,1,12,1,117,9,1,1,2,1,2,1,2,1,2,1,2, - 3,2,124,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,139, - 8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,151,8,5,1,5,1,5,1,5,1,5, - 1,5,5,5,158,8,5,10,5,12,5,161,9,5,1,5,1,5,1,5,1,5,1,5,3,5,168,8,5,1,5,1, - 5,3,5,172,8,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,180,8,5,10,5,12,5,183,9,5,1,6, - 1,6,3,6,187,8,6,1,6,1,6,1,6,1,6,1,6,3,6,194,8,6,1,6,1,6,1,6,3,6,199,8,6, - 1,7,1,7,1,7,1,7,1,7,3,7,206,8,7,1,8,1,8,1,8,1,8,3,8,212,8,8,1,8,1,8,1,8, - 1,8,1,8,1,8,5,8,220,8,8,10,8,12,8,223,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1, - 9,3,9,233,8,9,1,9,1,9,1,9,5,9,238,8,9,10,9,12,9,241,9,9,1,10,1,10,1,10, - 1,10,1,10,1,10,5,10,249,8,10,10,10,12,10,252,9,10,3,10,254,8,10,1,10,1, - 10,1,11,1,11,1,12,1,12,1,12,1,13,1,13,1,13,5,13,266,8,13,10,13,12,13,269, - 9,13,1,14,1,14,1,14,1,14,1,14,3,14,276,8,14,1,15,1,15,1,15,1,15,5,15,282, - 8,15,10,15,12,15,285,9,15,1,15,3,15,288,8,15,1,16,1,16,1,17,1,17,3,17,294, - 8,17,1,18,1,18,1,18,1,18,5,18,300,8,18,10,18,12,18,303,9,18,1,19,1,19,1, - 19,1,19,1,20,1,20,1,20,1,21,1,21,3,21,314,8,21,1,21,1,21,3,21,318,8,21, - 1,22,1,22,1,22,1,22,3,22,324,8,22,1,23,1,23,1,23,5,23,329,8,23,10,23,12, - 23,332,9,23,1,24,1,24,1,24,5,24,337,8,24,10,24,12,24,340,9,24,1,25,1,25, - 1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1, - 27,5,27,359,8,27,10,27,12,27,362,9,27,1,27,1,27,1,27,1,27,1,27,1,27,5,27, - 370,8,27,10,27,12,27,373,9,27,1,27,1,27,1,27,1,27,1,27,1,27,5,27,381,8, - 27,10,27,12,27,384,9,27,1,27,1,27,3,27,388,8,27,1,28,1,28,1,28,1,29,1,29, - 1,29,1,29,5,29,397,8,29,10,29,12,29,400,9,29,1,30,1,30,3,30,404,8,30,1, - 30,1,30,3,30,408,8,30,1,31,1,31,1,31,1,31,5,31,414,8,31,10,31,12,31,417, - 9,31,1,32,1,32,1,32,1,32,5,32,423,8,32,10,32,12,32,426,9,32,1,33,1,33,1, - 33,1,33,5,33,432,8,33,10,33,12,33,435,9,33,1,34,1,34,1,34,1,34,1,35,1,35, - 1,35,1,35,3,35,445,8,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1, - 38,5,38,457,8,38,10,38,12,38,460,9,38,1,39,1,39,1,39,1,39,1,40,1,40,1,41, - 1,41,3,41,470,8,41,1,42,3,42,473,8,42,1,42,1,42,1,43,3,43,478,8,43,1,43, - 1,43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48,1,48,1, - 48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,3,50,503,8,50,1,50,1,50,1,50,1,50, - 5,50,509,8,50,10,50,12,50,512,9,50,3,50,514,8,50,1,51,1,51,1,51,3,51,519, - 8,51,1,51,1,51,1,51,0,4,2,10,16,18,52,0,2,4,6,8,10,12,14,16,18,20,22,24, - 26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72, - 74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,0,7,1,0,60,61,1,0,62,64, - 1,0,67,68,2,0,32,32,36,36,1,0,39,40,2,0,38,38,52,52,2,0,53,53,55,59,548, - 0,104,1,0,0,0,2,107,1,0,0,0,4,123,1,0,0,0,6,138,1,0,0,0,8,140,1,0,0,0,10, - 171,1,0,0,0,12,198,1,0,0,0,14,205,1,0,0,0,16,211,1,0,0,0,18,232,1,0,0,0, - 20,242,1,0,0,0,22,257,1,0,0,0,24,259,1,0,0,0,26,262,1,0,0,0,28,275,1,0, - 0,0,30,277,1,0,0,0,32,289,1,0,0,0,34,293,1,0,0,0,36,295,1,0,0,0,38,304, - 1,0,0,0,40,308,1,0,0,0,42,311,1,0,0,0,44,319,1,0,0,0,46,325,1,0,0,0,48, - 333,1,0,0,0,50,341,1,0,0,0,52,343,1,0,0,0,54,387,1,0,0,0,56,389,1,0,0,0, - 58,392,1,0,0,0,60,401,1,0,0,0,62,409,1,0,0,0,64,418,1,0,0,0,66,427,1,0, - 0,0,68,436,1,0,0,0,70,440,1,0,0,0,72,446,1,0,0,0,74,450,1,0,0,0,76,453, - 1,0,0,0,78,461,1,0,0,0,80,465,1,0,0,0,82,469,1,0,0,0,84,472,1,0,0,0,86, - 477,1,0,0,0,88,481,1,0,0,0,90,483,1,0,0,0,92,485,1,0,0,0,94,488,1,0,0,0, - 96,492,1,0,0,0,98,495,1,0,0,0,100,498,1,0,0,0,102,518,1,0,0,0,104,105,3, - 2,1,0,105,106,5,0,0,1,106,1,1,0,0,0,107,108,6,1,-1,0,108,109,3,4,2,0,109, - 115,1,0,0,0,110,111,10,1,0,0,111,112,5,26,0,0,112,114,3,6,3,0,113,110,1, - 0,0,0,114,117,1,0,0,0,115,113,1,0,0,0,115,116,1,0,0,0,116,3,1,0,0,0,117, - 115,1,0,0,0,118,124,3,92,46,0,119,124,3,30,15,0,120,124,3,24,12,0,121,124, - 3,96,48,0,122,124,3,98,49,0,123,118,1,0,0,0,123,119,1,0,0,0,123,120,1,0, - 0,0,123,121,1,0,0,0,123,122,1,0,0,0,124,5,1,0,0,0,125,139,3,40,20,0,126, - 139,3,44,22,0,127,139,3,56,28,0,128,139,3,62,31,0,129,139,3,58,29,0,130, - 139,3,42,21,0,131,139,3,8,4,0,132,139,3,64,32,0,133,139,3,66,33,0,134,139, - 3,70,35,0,135,139,3,72,36,0,136,139,3,100,50,0,137,139,3,74,37,0,138,125, - 1,0,0,0,138,126,1,0,0,0,138,127,1,0,0,0,138,128,1,0,0,0,138,129,1,0,0,0, - 138,130,1,0,0,0,138,131,1,0,0,0,138,132,1,0,0,0,138,133,1,0,0,0,138,134, - 1,0,0,0,138,135,1,0,0,0,138,136,1,0,0,0,138,137,1,0,0,0,139,7,1,0,0,0,140, - 141,5,18,0,0,141,142,3,10,5,0,142,9,1,0,0,0,143,144,6,5,-1,0,144,145,5, - 45,0,0,145,172,3,10,5,7,146,172,3,14,7,0,147,172,3,12,6,0,148,150,3,14, - 7,0,149,151,5,45,0,0,150,149,1,0,0,0,150,151,1,0,0,0,151,152,1,0,0,0,152, - 153,5,42,0,0,153,154,5,41,0,0,154,159,3,14,7,0,155,156,5,35,0,0,156,158, - 3,14,7,0,157,155,1,0,0,0,158,161,1,0,0,0,159,157,1,0,0,0,159,160,1,0,0, - 0,160,162,1,0,0,0,161,159,1,0,0,0,162,163,5,51,0,0,163,172,1,0,0,0,164, - 165,3,14,7,0,165,167,5,43,0,0,166,168,5,45,0,0,167,166,1,0,0,0,167,168, - 1,0,0,0,168,169,1,0,0,0,169,170,5,46,0,0,170,172,1,0,0,0,171,143,1,0,0, - 0,171,146,1,0,0,0,171,147,1,0,0,0,171,148,1,0,0,0,171,164,1,0,0,0,172,181, - 1,0,0,0,173,174,10,4,0,0,174,175,5,31,0,0,175,180,3,10,5,5,176,177,10,3, - 0,0,177,178,5,48,0,0,178,180,3,10,5,4,179,173,1,0,0,0,179,176,1,0,0,0,180, - 183,1,0,0,0,181,179,1,0,0,0,181,182,1,0,0,0,182,11,1,0,0,0,183,181,1,0, - 0,0,184,186,3,14,7,0,185,187,5,45,0,0,186,185,1,0,0,0,186,187,1,0,0,0,187, - 188,1,0,0,0,188,189,5,44,0,0,189,190,3,88,44,0,190,199,1,0,0,0,191,193, - 3,14,7,0,192,194,5,45,0,0,193,192,1,0,0,0,193,194,1,0,0,0,194,195,1,0,0, - 0,195,196,5,50,0,0,196,197,3,88,44,0,197,199,1,0,0,0,198,184,1,0,0,0,198, - 191,1,0,0,0,199,13,1,0,0,0,200,206,3,16,8,0,201,202,3,16,8,0,202,203,3, - 90,45,0,203,204,3,16,8,0,204,206,1,0,0,0,205,200,1,0,0,0,205,201,1,0,0, - 0,206,15,1,0,0,0,207,208,6,8,-1,0,208,212,3,18,9,0,209,210,7,0,0,0,210, - 212,3,16,8,3,211,207,1,0,0,0,211,209,1,0,0,0,212,221,1,0,0,0,213,214,10, - 2,0,0,214,215,7,1,0,0,215,220,3,16,8,3,216,217,10,1,0,0,217,218,7,0,0,0, - 218,220,3,16,8,2,219,213,1,0,0,0,219,216,1,0,0,0,220,223,1,0,0,0,221,219, - 1,0,0,0,221,222,1,0,0,0,222,17,1,0,0,0,223,221,1,0,0,0,224,225,6,9,-1,0, - 225,233,3,54,27,0,226,233,3,46,23,0,227,233,3,20,10,0,228,229,5,41,0,0, - 229,230,3,10,5,0,230,231,5,51,0,0,231,233,1,0,0,0,232,224,1,0,0,0,232,226, - 1,0,0,0,232,227,1,0,0,0,232,228,1,0,0,0,233,239,1,0,0,0,234,235,10,1,0, - 0,235,236,5,34,0,0,236,238,3,22,11,0,237,234,1,0,0,0,238,241,1,0,0,0,239, - 237,1,0,0,0,239,240,1,0,0,0,240,19,1,0,0,0,241,239,1,0,0,0,242,243,3,50, - 25,0,243,253,5,41,0,0,244,254,5,62,0,0,245,250,3,10,5,0,246,247,5,35,0, - 0,247,249,3,10,5,0,248,246,1,0,0,0,249,252,1,0,0,0,250,248,1,0,0,0,250, - 251,1,0,0,0,251,254,1,0,0,0,252,250,1,0,0,0,253,244,1,0,0,0,253,245,1,0, - 0,0,253,254,1,0,0,0,254,255,1,0,0,0,255,256,5,51,0,0,256,21,1,0,0,0,257, - 258,3,50,25,0,258,23,1,0,0,0,259,260,5,14,0,0,260,261,3,26,13,0,261,25, - 1,0,0,0,262,267,3,28,14,0,263,264,5,35,0,0,264,266,3,28,14,0,265,263,1, - 0,0,0,266,269,1,0,0,0,267,265,1,0,0,0,267,268,1,0,0,0,268,27,1,0,0,0,269, - 267,1,0,0,0,270,276,3,10,5,0,271,272,3,46,23,0,272,273,5,33,0,0,273,274, - 3,10,5,0,274,276,1,0,0,0,275,270,1,0,0,0,275,271,1,0,0,0,276,29,1,0,0,0, - 277,278,5,6,0,0,278,283,3,32,16,0,279,280,5,35,0,0,280,282,3,32,16,0,281, - 279,1,0,0,0,282,285,1,0,0,0,283,281,1,0,0,0,283,284,1,0,0,0,284,287,1,0, - 0,0,285,283,1,0,0,0,286,288,3,34,17,0,287,286,1,0,0,0,287,288,1,0,0,0,288, - 31,1,0,0,0,289,290,5,73,0,0,290,33,1,0,0,0,291,294,3,36,18,0,292,294,3, - 38,19,0,293,291,1,0,0,0,293,292,1,0,0,0,294,35,1,0,0,0,295,296,5,72,0,0, - 296,301,3,32,16,0,297,298,5,35,0,0,298,300,3,32,16,0,299,297,1,0,0,0,300, - 303,1,0,0,0,301,299,1,0,0,0,301,302,1,0,0,0,302,37,1,0,0,0,303,301,1,0, - 0,0,304,305,5,65,0,0,305,306,3,36,18,0,306,307,5,66,0,0,307,39,1,0,0,0, - 308,309,5,4,0,0,309,310,3,26,13,0,310,41,1,0,0,0,311,313,5,17,0,0,312,314, - 3,26,13,0,313,312,1,0,0,0,313,314,1,0,0,0,314,317,1,0,0,0,315,316,5,30, - 0,0,316,318,3,26,13,0,317,315,1,0,0,0,317,318,1,0,0,0,318,43,1,0,0,0,319, - 320,5,8,0,0,320,323,3,26,13,0,321,322,5,30,0,0,322,324,3,26,13,0,323,321, - 1,0,0,0,323,324,1,0,0,0,324,45,1,0,0,0,325,330,3,50,25,0,326,327,5,37,0, - 0,327,329,3,50,25,0,328,326,1,0,0,0,329,332,1,0,0,0,330,328,1,0,0,0,330, - 331,1,0,0,0,331,47,1,0,0,0,332,330,1,0,0,0,333,338,3,52,26,0,334,335,5, - 37,0,0,335,337,3,52,26,0,336,334,1,0,0,0,337,340,1,0,0,0,338,336,1,0,0, - 0,338,339,1,0,0,0,339,49,1,0,0,0,340,338,1,0,0,0,341,342,7,2,0,0,342,51, - 1,0,0,0,343,344,5,77,0,0,344,53,1,0,0,0,345,388,5,46,0,0,346,347,3,86,43, - 0,347,348,5,67,0,0,348,388,1,0,0,0,349,388,3,84,42,0,350,388,3,86,43,0, - 351,388,3,80,40,0,352,388,5,49,0,0,353,388,3,88,44,0,354,355,5,65,0,0,355, - 360,3,82,41,0,356,357,5,35,0,0,357,359,3,82,41,0,358,356,1,0,0,0,359,362, - 1,0,0,0,360,358,1,0,0,0,360,361,1,0,0,0,361,363,1,0,0,0,362,360,1,0,0,0, - 363,364,5,66,0,0,364,388,1,0,0,0,365,366,5,65,0,0,366,371,3,80,40,0,367, - 368,5,35,0,0,368,370,3,80,40,0,369,367,1,0,0,0,370,373,1,0,0,0,371,369, - 1,0,0,0,371,372,1,0,0,0,372,374,1,0,0,0,373,371,1,0,0,0,374,375,5,66,0, - 0,375,388,1,0,0,0,376,377,5,65,0,0,377,382,3,88,44,0,378,379,5,35,0,0,379, - 381,3,88,44,0,380,378,1,0,0,0,381,384,1,0,0,0,382,380,1,0,0,0,382,383,1, - 0,0,0,383,385,1,0,0,0,384,382,1,0,0,0,385,386,5,66,0,0,386,388,1,0,0,0, - 387,345,1,0,0,0,387,346,1,0,0,0,387,349,1,0,0,0,387,350,1,0,0,0,387,351, - 1,0,0,0,387,352,1,0,0,0,387,353,1,0,0,0,387,354,1,0,0,0,387,365,1,0,0,0, - 387,376,1,0,0,0,388,55,1,0,0,0,389,390,5,10,0,0,390,391,5,28,0,0,391,57, - 1,0,0,0,392,393,5,16,0,0,393,398,3,60,30,0,394,395,5,35,0,0,395,397,3,60, - 30,0,396,394,1,0,0,0,397,400,1,0,0,0,398,396,1,0,0,0,398,399,1,0,0,0,399, - 59,1,0,0,0,400,398,1,0,0,0,401,403,3,10,5,0,402,404,7,3,0,0,403,402,1,0, - 0,0,403,404,1,0,0,0,404,407,1,0,0,0,405,406,5,47,0,0,406,408,7,4,0,0,407, - 405,1,0,0,0,407,408,1,0,0,0,408,61,1,0,0,0,409,410,5,9,0,0,410,415,3,48, - 24,0,411,412,5,35,0,0,412,414,3,48,24,0,413,411,1,0,0,0,414,417,1,0,0,0, - 415,413,1,0,0,0,415,416,1,0,0,0,416,63,1,0,0,0,417,415,1,0,0,0,418,419, - 5,2,0,0,419,424,3,48,24,0,420,421,5,35,0,0,421,423,3,48,24,0,422,420,1, - 0,0,0,423,426,1,0,0,0,424,422,1,0,0,0,424,425,1,0,0,0,425,65,1,0,0,0,426, - 424,1,0,0,0,427,428,5,13,0,0,428,433,3,68,34,0,429,430,5,35,0,0,430,432, - 3,68,34,0,431,429,1,0,0,0,432,435,1,0,0,0,433,431,1,0,0,0,433,434,1,0,0, - 0,434,67,1,0,0,0,435,433,1,0,0,0,436,437,3,48,24,0,437,438,5,81,0,0,438, - 439,3,48,24,0,439,69,1,0,0,0,440,441,5,1,0,0,441,442,3,18,9,0,442,444,3, - 88,44,0,443,445,3,76,38,0,444,443,1,0,0,0,444,445,1,0,0,0,445,71,1,0,0, - 0,446,447,5,7,0,0,447,448,3,18,9,0,448,449,3,88,44,0,449,73,1,0,0,0,450, - 451,5,12,0,0,451,452,3,46,23,0,452,75,1,0,0,0,453,458,3,78,39,0,454,455, - 5,35,0,0,455,457,3,78,39,0,456,454,1,0,0,0,457,460,1,0,0,0,458,456,1,0, - 0,0,458,459,1,0,0,0,459,77,1,0,0,0,460,458,1,0,0,0,461,462,3,50,25,0,462, - 463,5,33,0,0,463,464,3,54,27,0,464,79,1,0,0,0,465,466,7,5,0,0,466,81,1, - 0,0,0,467,470,3,84,42,0,468,470,3,86,43,0,469,467,1,0,0,0,469,468,1,0,0, - 0,470,83,1,0,0,0,471,473,7,0,0,0,472,471,1,0,0,0,472,473,1,0,0,0,473,474, - 1,0,0,0,474,475,5,29,0,0,475,85,1,0,0,0,476,478,7,0,0,0,477,476,1,0,0,0, - 477,478,1,0,0,0,478,479,1,0,0,0,479,480,5,28,0,0,480,87,1,0,0,0,481,482, - 5,27,0,0,482,89,1,0,0,0,483,484,7,6,0,0,484,91,1,0,0,0,485,486,5,5,0,0, - 486,487,3,94,47,0,487,93,1,0,0,0,488,489,5,65,0,0,489,490,3,2,1,0,490,491, - 5,66,0,0,491,95,1,0,0,0,492,493,5,15,0,0,493,494,5,97,0,0,494,97,1,0,0, - 0,495,496,5,11,0,0,496,497,5,101,0,0,497,99,1,0,0,0,498,499,5,3,0,0,499, - 502,5,87,0,0,500,501,5,85,0,0,501,503,3,48,24,0,502,500,1,0,0,0,502,503, - 1,0,0,0,503,513,1,0,0,0,504,505,5,86,0,0,505,510,3,102,51,0,506,507,5,35, - 0,0,507,509,3,102,51,0,508,506,1,0,0,0,509,512,1,0,0,0,510,508,1,0,0,0, - 510,511,1,0,0,0,511,514,1,0,0,0,512,510,1,0,0,0,513,504,1,0,0,0,513,514, - 1,0,0,0,514,101,1,0,0,0,515,516,3,48,24,0,516,517,5,33,0,0,517,519,1,0, - 0,0,518,515,1,0,0,0,518,519,1,0,0,0,519,520,1,0,0,0,520,521,3,48,24,0,521, - 103,1,0,0,0,50,115,123,138,150,159,167,171,179,181,186,193,198,205,211, - 219,221,232,239,250,253,267,275,283,287,293,301,313,317,323,330,338,360, - 371,382,387,398,403,407,415,424,433,444,458,469,472,477,502,510,513,518]; + 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,1,0, + 1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,5,1,116,8,1,10,1,12,1,119,9,1,1,2,1,2,1, + 2,1,2,1,2,1,2,3,2,127,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,3,3,142,8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,154,8,5,1, + 5,1,5,1,5,1,5,1,5,5,5,161,8,5,10,5,12,5,164,9,5,1,5,1,5,1,5,1,5,1,5,3,5, + 171,8,5,1,5,1,5,3,5,175,8,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,183,8,5,10,5,12, + 5,186,9,5,1,6,1,6,3,6,190,8,6,1,6,1,6,1,6,1,6,1,6,3,6,197,8,6,1,6,1,6,1, + 6,3,6,202,8,6,1,7,1,7,1,7,1,7,1,7,3,7,209,8,7,1,8,1,8,1,8,1,8,3,8,215,8, + 8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,223,8,8,10,8,12,8,226,9,8,1,9,1,9,1,9,1,9, + 1,9,1,9,1,9,1,9,3,9,236,8,9,1,9,1,9,1,9,5,9,241,8,9,10,9,12,9,244,9,9,1, + 10,1,10,1,10,1,10,1,10,1,10,5,10,252,8,10,10,10,12,10,255,9,10,3,10,257, + 8,10,1,10,1,10,1,11,1,11,1,12,1,12,1,12,1,13,1,13,1,13,5,13,269,8,13,10, + 13,12,13,272,9,13,1,14,1,14,1,14,1,14,1,14,3,14,279,8,14,1,15,1,15,1,15, + 1,15,5,15,285,8,15,10,15,12,15,288,9,15,1,15,3,15,291,8,15,1,16,1,16,1, + 17,1,17,3,17,297,8,17,1,18,1,18,1,18,1,18,5,18,303,8,18,10,18,12,18,306, + 9,18,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,5,20,316,8,20,10,20,12,20, + 319,9,20,1,20,3,20,322,8,20,1,20,1,20,3,20,326,8,20,1,21,1,21,1,21,1,22, + 1,22,3,22,333,8,22,1,22,1,22,3,22,337,8,22,1,23,1,23,1,23,1,23,3,23,343, + 8,23,1,24,1,24,1,24,5,24,348,8,24,10,24,12,24,351,9,24,1,25,1,25,1,25,5, + 25,356,8,25,10,25,12,25,359,9,25,1,26,1,26,1,27,1,27,1,28,1,28,1,28,1,28, + 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,378,8,28,10,28,12,28, + 381,9,28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,389,8,28,10,28,12,28,392,9, + 28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,400,8,28,10,28,12,28,403,9,28,1,28, + 1,28,3,28,407,8,28,1,29,1,29,1,29,1,30,1,30,1,30,1,30,5,30,416,8,30,10, + 30,12,30,419,9,30,1,31,1,31,3,31,423,8,31,1,31,1,31,3,31,427,8,31,1,32, + 1,32,1,32,1,32,5,32,433,8,32,10,32,12,32,436,9,32,1,33,1,33,1,33,1,33,5, + 33,442,8,33,10,33,12,33,445,9,33,1,34,1,34,1,34,1,34,5,34,451,8,34,10,34, + 12,34,454,9,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,464,8,36,1, + 37,1,37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,5,39,476,8,39,10,39,12, + 39,479,9,39,1,40,1,40,1,40,1,40,1,41,1,41,1,42,1,42,3,42,489,8,42,1,43, + 3,43,492,8,43,1,43,1,43,1,44,3,44,497,8,44,1,44,1,44,1,45,1,45,1,46,1,46, + 1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,51,1, + 51,1,51,1,51,3,51,522,8,51,1,51,1,51,1,51,1,51,5,51,528,8,51,10,51,12,51, + 531,9,51,3,51,533,8,51,1,52,1,52,1,52,3,52,538,8,52,1,52,1,52,1,52,0,4, + 2,10,16,18,53,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40, + 42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88, + 90,92,94,96,98,100,102,104,0,7,1,0,62,63,1,0,64,66,1,0,69,70,2,0,34,34, + 38,38,1,0,41,42,2,0,40,40,54,54,2,0,55,55,57,61,570,0,106,1,0,0,0,2,109, + 1,0,0,0,4,126,1,0,0,0,6,141,1,0,0,0,8,143,1,0,0,0,10,174,1,0,0,0,12,201, + 1,0,0,0,14,208,1,0,0,0,16,214,1,0,0,0,18,235,1,0,0,0,20,245,1,0,0,0,22, + 260,1,0,0,0,24,262,1,0,0,0,26,265,1,0,0,0,28,278,1,0,0,0,30,280,1,0,0,0, + 32,292,1,0,0,0,34,296,1,0,0,0,36,298,1,0,0,0,38,307,1,0,0,0,40,311,1,0, + 0,0,42,327,1,0,0,0,44,330,1,0,0,0,46,338,1,0,0,0,48,344,1,0,0,0,50,352, + 1,0,0,0,52,360,1,0,0,0,54,362,1,0,0,0,56,406,1,0,0,0,58,408,1,0,0,0,60, + 411,1,0,0,0,62,420,1,0,0,0,64,428,1,0,0,0,66,437,1,0,0,0,68,446,1,0,0,0, + 70,455,1,0,0,0,72,459,1,0,0,0,74,465,1,0,0,0,76,469,1,0,0,0,78,472,1,0, + 0,0,80,480,1,0,0,0,82,484,1,0,0,0,84,488,1,0,0,0,86,491,1,0,0,0,88,496, + 1,0,0,0,90,500,1,0,0,0,92,502,1,0,0,0,94,504,1,0,0,0,96,507,1,0,0,0,98, + 511,1,0,0,0,100,514,1,0,0,0,102,517,1,0,0,0,104,537,1,0,0,0,106,107,3,2, + 1,0,107,108,5,0,0,1,108,1,1,0,0,0,109,110,6,1,-1,0,110,111,3,4,2,0,111, + 117,1,0,0,0,112,113,10,1,0,0,113,114,5,28,0,0,114,116,3,6,3,0,115,112,1, + 0,0,0,116,119,1,0,0,0,117,115,1,0,0,0,117,118,1,0,0,0,118,3,1,0,0,0,119, + 117,1,0,0,0,120,127,3,94,47,0,121,127,3,30,15,0,122,127,3,24,12,0,123,127, + 3,40,20,0,124,127,3,98,49,0,125,127,3,100,50,0,126,120,1,0,0,0,126,121, + 1,0,0,0,126,122,1,0,0,0,126,123,1,0,0,0,126,124,1,0,0,0,126,125,1,0,0,0, + 127,5,1,0,0,0,128,142,3,42,21,0,129,142,3,46,23,0,130,142,3,58,29,0,131, + 142,3,64,32,0,132,142,3,60,30,0,133,142,3,44,22,0,134,142,3,8,4,0,135,142, + 3,66,33,0,136,142,3,68,34,0,137,142,3,72,36,0,138,142,3,74,37,0,139,142, + 3,102,51,0,140,142,3,76,38,0,141,128,1,0,0,0,141,129,1,0,0,0,141,130,1, + 0,0,0,141,131,1,0,0,0,141,132,1,0,0,0,141,133,1,0,0,0,141,134,1,0,0,0,141, + 135,1,0,0,0,141,136,1,0,0,0,141,137,1,0,0,0,141,138,1,0,0,0,141,139,1,0, + 0,0,141,140,1,0,0,0,142,7,1,0,0,0,143,144,5,19,0,0,144,145,3,10,5,0,145, + 9,1,0,0,0,146,147,6,5,-1,0,147,148,5,47,0,0,148,175,3,10,5,7,149,175,3, + 14,7,0,150,175,3,12,6,0,151,153,3,14,7,0,152,154,5,47,0,0,153,152,1,0,0, + 0,153,154,1,0,0,0,154,155,1,0,0,0,155,156,5,44,0,0,156,157,5,43,0,0,157, + 162,3,14,7,0,158,159,5,37,0,0,159,161,3,14,7,0,160,158,1,0,0,0,161,164, + 1,0,0,0,162,160,1,0,0,0,162,163,1,0,0,0,163,165,1,0,0,0,164,162,1,0,0,0, + 165,166,5,53,0,0,166,175,1,0,0,0,167,168,3,14,7,0,168,170,5,45,0,0,169, + 171,5,47,0,0,170,169,1,0,0,0,170,171,1,0,0,0,171,172,1,0,0,0,172,173,5, + 48,0,0,173,175,1,0,0,0,174,146,1,0,0,0,174,149,1,0,0,0,174,150,1,0,0,0, + 174,151,1,0,0,0,174,167,1,0,0,0,175,184,1,0,0,0,176,177,10,4,0,0,177,178, + 5,33,0,0,178,183,3,10,5,5,179,180,10,3,0,0,180,181,5,50,0,0,181,183,3,10, + 5,4,182,176,1,0,0,0,182,179,1,0,0,0,183,186,1,0,0,0,184,182,1,0,0,0,184, + 185,1,0,0,0,185,11,1,0,0,0,186,184,1,0,0,0,187,189,3,14,7,0,188,190,5,47, + 0,0,189,188,1,0,0,0,189,190,1,0,0,0,190,191,1,0,0,0,191,192,5,46,0,0,192, + 193,3,90,45,0,193,202,1,0,0,0,194,196,3,14,7,0,195,197,5,47,0,0,196,195, + 1,0,0,0,196,197,1,0,0,0,197,198,1,0,0,0,198,199,5,52,0,0,199,200,3,90,45, + 0,200,202,1,0,0,0,201,187,1,0,0,0,201,194,1,0,0,0,202,13,1,0,0,0,203,209, + 3,16,8,0,204,205,3,16,8,0,205,206,3,92,46,0,206,207,3,16,8,0,207,209,1, + 0,0,0,208,203,1,0,0,0,208,204,1,0,0,0,209,15,1,0,0,0,210,211,6,8,-1,0,211, + 215,3,18,9,0,212,213,7,0,0,0,213,215,3,16,8,3,214,210,1,0,0,0,214,212,1, + 0,0,0,215,224,1,0,0,0,216,217,10,2,0,0,217,218,7,1,0,0,218,223,3,16,8,3, + 219,220,10,1,0,0,220,221,7,0,0,0,221,223,3,16,8,2,222,216,1,0,0,0,222,219, + 1,0,0,0,223,226,1,0,0,0,224,222,1,0,0,0,224,225,1,0,0,0,225,17,1,0,0,0, + 226,224,1,0,0,0,227,228,6,9,-1,0,228,236,3,56,28,0,229,236,3,48,24,0,230, + 236,3,20,10,0,231,232,5,43,0,0,232,233,3,10,5,0,233,234,5,53,0,0,234,236, + 1,0,0,0,235,227,1,0,0,0,235,229,1,0,0,0,235,230,1,0,0,0,235,231,1,0,0,0, + 236,242,1,0,0,0,237,238,10,1,0,0,238,239,5,36,0,0,239,241,3,22,11,0,240, + 237,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,242,243,1,0,0,0,243,19,1,0, + 0,0,244,242,1,0,0,0,245,246,3,52,26,0,246,256,5,43,0,0,247,257,5,64,0,0, + 248,253,3,10,5,0,249,250,5,37,0,0,250,252,3,10,5,0,251,249,1,0,0,0,252, + 255,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0,0,254,257,1,0,0,0,255,253,1,0, + 0,0,256,247,1,0,0,0,256,248,1,0,0,0,256,257,1,0,0,0,257,258,1,0,0,0,258, + 259,5,53,0,0,259,21,1,0,0,0,260,261,3,52,26,0,261,23,1,0,0,0,262,263,5, + 15,0,0,263,264,3,26,13,0,264,25,1,0,0,0,265,270,3,28,14,0,266,267,5,37, + 0,0,267,269,3,28,14,0,268,266,1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270, + 271,1,0,0,0,271,27,1,0,0,0,272,270,1,0,0,0,273,279,3,10,5,0,274,275,3,48, + 24,0,275,276,5,35,0,0,276,277,3,10,5,0,277,279,1,0,0,0,278,273,1,0,0,0, + 278,274,1,0,0,0,279,29,1,0,0,0,280,281,5,6,0,0,281,286,3,32,16,0,282,283, + 5,37,0,0,283,285,3,32,16,0,284,282,1,0,0,0,285,288,1,0,0,0,286,284,1,0, + 0,0,286,287,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,289,291,3,34,17,0,290, + 289,1,0,0,0,290,291,1,0,0,0,291,31,1,0,0,0,292,293,5,24,0,0,293,33,1,0, + 0,0,294,297,3,36,18,0,295,297,3,38,19,0,296,294,1,0,0,0,296,295,1,0,0,0, + 297,35,1,0,0,0,298,299,5,74,0,0,299,304,3,32,16,0,300,301,5,37,0,0,301, + 303,3,32,16,0,302,300,1,0,0,0,303,306,1,0,0,0,304,302,1,0,0,0,304,305,1, + 0,0,0,305,37,1,0,0,0,306,304,1,0,0,0,307,308,5,67,0,0,308,309,3,36,18,0, + 309,310,5,68,0,0,310,39,1,0,0,0,311,312,5,12,0,0,312,317,3,32,16,0,313, + 314,5,37,0,0,314,316,3,32,16,0,315,313,1,0,0,0,316,319,1,0,0,0,317,315, + 1,0,0,0,317,318,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,320,322,3,26,13, + 0,321,320,1,0,0,0,321,322,1,0,0,0,322,325,1,0,0,0,323,324,5,32,0,0,324, + 326,3,26,13,0,325,323,1,0,0,0,325,326,1,0,0,0,326,41,1,0,0,0,327,328,5, + 4,0,0,328,329,3,26,13,0,329,43,1,0,0,0,330,332,5,18,0,0,331,333,3,26,13, + 0,332,331,1,0,0,0,332,333,1,0,0,0,333,336,1,0,0,0,334,335,5,32,0,0,335, + 337,3,26,13,0,336,334,1,0,0,0,336,337,1,0,0,0,337,45,1,0,0,0,338,339,5, + 8,0,0,339,342,3,26,13,0,340,341,5,32,0,0,341,343,3,26,13,0,342,340,1,0, + 0,0,342,343,1,0,0,0,343,47,1,0,0,0,344,349,3,52,26,0,345,346,5,39,0,0,346, + 348,3,52,26,0,347,345,1,0,0,0,348,351,1,0,0,0,349,347,1,0,0,0,349,350,1, + 0,0,0,350,49,1,0,0,0,351,349,1,0,0,0,352,357,3,54,27,0,353,354,5,39,0,0, + 354,356,3,54,27,0,355,353,1,0,0,0,356,359,1,0,0,0,357,355,1,0,0,0,357,358, + 1,0,0,0,358,51,1,0,0,0,359,357,1,0,0,0,360,361,7,2,0,0,361,53,1,0,0,0,362, + 363,5,78,0,0,363,55,1,0,0,0,364,407,5,48,0,0,365,366,3,88,44,0,366,367, + 5,69,0,0,367,407,1,0,0,0,368,407,3,86,43,0,369,407,3,88,44,0,370,407,3, + 82,41,0,371,407,5,51,0,0,372,407,3,90,45,0,373,374,5,67,0,0,374,379,3,84, + 42,0,375,376,5,37,0,0,376,378,3,84,42,0,377,375,1,0,0,0,378,381,1,0,0,0, + 379,377,1,0,0,0,379,380,1,0,0,0,380,382,1,0,0,0,381,379,1,0,0,0,382,383, + 5,68,0,0,383,407,1,0,0,0,384,385,5,67,0,0,385,390,3,82,41,0,386,387,5,37, + 0,0,387,389,3,82,41,0,388,386,1,0,0,0,389,392,1,0,0,0,390,388,1,0,0,0,390, + 391,1,0,0,0,391,393,1,0,0,0,392,390,1,0,0,0,393,394,5,68,0,0,394,407,1, + 0,0,0,395,396,5,67,0,0,396,401,3,90,45,0,397,398,5,37,0,0,398,400,3,90, + 45,0,399,397,1,0,0,0,400,403,1,0,0,0,401,399,1,0,0,0,401,402,1,0,0,0,402, + 404,1,0,0,0,403,401,1,0,0,0,404,405,5,68,0,0,405,407,1,0,0,0,406,364,1, + 0,0,0,406,365,1,0,0,0,406,368,1,0,0,0,406,369,1,0,0,0,406,370,1,0,0,0,406, + 371,1,0,0,0,406,372,1,0,0,0,406,373,1,0,0,0,406,384,1,0,0,0,406,395,1,0, + 0,0,407,57,1,0,0,0,408,409,5,10,0,0,409,410,5,30,0,0,410,59,1,0,0,0,411, + 412,5,17,0,0,412,417,3,62,31,0,413,414,5,37,0,0,414,416,3,62,31,0,415,413, + 1,0,0,0,416,419,1,0,0,0,417,415,1,0,0,0,417,418,1,0,0,0,418,61,1,0,0,0, + 419,417,1,0,0,0,420,422,3,10,5,0,421,423,7,3,0,0,422,421,1,0,0,0,422,423, + 1,0,0,0,423,426,1,0,0,0,424,425,5,49,0,0,425,427,7,4,0,0,426,424,1,0,0, + 0,426,427,1,0,0,0,427,63,1,0,0,0,428,429,5,9,0,0,429,434,3,50,25,0,430, + 431,5,37,0,0,431,433,3,50,25,0,432,430,1,0,0,0,433,436,1,0,0,0,434,432, + 1,0,0,0,434,435,1,0,0,0,435,65,1,0,0,0,436,434,1,0,0,0,437,438,5,2,0,0, + 438,443,3,50,25,0,439,440,5,37,0,0,440,442,3,50,25,0,441,439,1,0,0,0,442, + 445,1,0,0,0,443,441,1,0,0,0,443,444,1,0,0,0,444,67,1,0,0,0,445,443,1,0, + 0,0,446,447,5,14,0,0,447,452,3,70,35,0,448,449,5,37,0,0,449,451,3,70,35, + 0,450,448,1,0,0,0,451,454,1,0,0,0,452,450,1,0,0,0,452,453,1,0,0,0,453,69, + 1,0,0,0,454,452,1,0,0,0,455,456,3,50,25,0,456,457,5,82,0,0,457,458,3,50, + 25,0,458,71,1,0,0,0,459,460,5,1,0,0,460,461,3,18,9,0,461,463,3,90,45,0, + 462,464,3,78,39,0,463,462,1,0,0,0,463,464,1,0,0,0,464,73,1,0,0,0,465,466, + 5,7,0,0,466,467,3,18,9,0,467,468,3,90,45,0,468,75,1,0,0,0,469,470,5,13, + 0,0,470,471,3,48,24,0,471,77,1,0,0,0,472,477,3,80,40,0,473,474,5,37,0,0, + 474,476,3,80,40,0,475,473,1,0,0,0,476,479,1,0,0,0,477,475,1,0,0,0,477,478, + 1,0,0,0,478,79,1,0,0,0,479,477,1,0,0,0,480,481,3,52,26,0,481,482,5,35,0, + 0,482,483,3,56,28,0,483,81,1,0,0,0,484,485,7,5,0,0,485,83,1,0,0,0,486,489, + 3,86,43,0,487,489,3,88,44,0,488,486,1,0,0,0,488,487,1,0,0,0,489,85,1,0, + 0,0,490,492,7,0,0,0,491,490,1,0,0,0,491,492,1,0,0,0,492,493,1,0,0,0,493, + 494,5,31,0,0,494,87,1,0,0,0,495,497,7,0,0,0,496,495,1,0,0,0,496,497,1,0, + 0,0,497,498,1,0,0,0,498,499,5,30,0,0,499,89,1,0,0,0,500,501,5,29,0,0,501, + 91,1,0,0,0,502,503,7,6,0,0,503,93,1,0,0,0,504,505,5,5,0,0,505,506,3,96, + 48,0,506,95,1,0,0,0,507,508,5,67,0,0,508,509,3,2,1,0,509,510,5,68,0,0,510, + 97,1,0,0,0,511,512,5,16,0,0,512,513,5,98,0,0,513,99,1,0,0,0,514,515,5,11, + 0,0,515,516,5,102,0,0,516,101,1,0,0,0,517,518,5,3,0,0,518,521,5,88,0,0, + 519,520,5,86,0,0,520,522,3,50,25,0,521,519,1,0,0,0,521,522,1,0,0,0,522, + 532,1,0,0,0,523,524,5,87,0,0,524,529,3,104,52,0,525,526,5,37,0,0,526,528, + 3,104,52,0,527,525,1,0,0,0,528,531,1,0,0,0,529,527,1,0,0,0,529,530,1,0, + 0,0,530,533,1,0,0,0,531,529,1,0,0,0,532,523,1,0,0,0,532,533,1,0,0,0,533, + 103,1,0,0,0,534,535,3,50,25,0,535,536,5,35,0,0,536,538,1,0,0,0,537,534, + 1,0,0,0,537,538,1,0,0,0,538,539,1,0,0,0,539,540,3,50,25,0,540,105,1,0,0, + 0,53,117,126,141,153,162,170,174,182,184,189,196,201,208,214,222,224,235, + 242,253,256,270,278,286,290,296,304,317,321,325,332,336,342,349,357,379, + 390,401,406,417,422,426,434,443,452,463,477,488,491,496,521,529,532,537]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -3268,6 +3365,9 @@ export class SourceCommandContext extends ParserRuleContext { public rowCommand(): RowCommandContext { return this.getTypedRuleContext(RowCommandContext, 0) as RowCommandContext; } + public metricsCommand(): MetricsCommandContext { + return this.getTypedRuleContext(MetricsCommandContext, 0) as MetricsCommandContext; + } public showCommand(): ShowCommandContext { return this.getTypedRuleContext(ShowCommandContext, 0) as ShowCommandContext; } @@ -4044,11 +4144,11 @@ export class FromCommandContext extends ParserRuleContext { public FROM(): TerminalNode { return this.getToken(esql_parser.FROM, 0); } - public fromIdentifier_list(): FromIdentifierContext[] { - return this.getTypedRuleContexts(FromIdentifierContext) as FromIdentifierContext[]; + public indexIdentifier_list(): IndexIdentifierContext[] { + return this.getTypedRuleContexts(IndexIdentifierContext) as IndexIdentifierContext[]; } - public fromIdentifier(i: number): FromIdentifierContext { - return this.getTypedRuleContext(FromIdentifierContext, i) as FromIdentifierContext; + public indexIdentifier(i: number): IndexIdentifierContext { + return this.getTypedRuleContext(IndexIdentifierContext, i) as IndexIdentifierContext; } public COMMA_list(): TerminalNode[] { return this.getTokens(esql_parser.COMMA); @@ -4075,25 +4175,25 @@ export class FromCommandContext extends ParserRuleContext { } -export class FromIdentifierContext extends ParserRuleContext { +export class IndexIdentifierContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); this.parser = parser; } - public FROM_UNQUOTED_IDENTIFIER(): TerminalNode { - return this.getToken(esql_parser.FROM_UNQUOTED_IDENTIFIER, 0); + public INDEX_UNQUOTED_IDENTIFIER(): TerminalNode { + return this.getToken(esql_parser.INDEX_UNQUOTED_IDENTIFIER, 0); } public get ruleIndex(): number { - return esql_parser.RULE_fromIdentifier; + return esql_parser.RULE_indexIdentifier; } public enterRule(listener: esql_parserListener): void { - if(listener.enterFromIdentifier) { - listener.enterFromIdentifier(this); + if(listener.enterIndexIdentifier) { + listener.enterIndexIdentifier(this); } } public exitRule(listener: esql_parserListener): void { - if(listener.exitFromIdentifier) { - listener.exitFromIdentifier(this); + if(listener.exitIndexIdentifier) { + listener.exitIndexIdentifier(this); } } } @@ -4134,11 +4234,11 @@ export class MetadataOptionContext extends ParserRuleContext { public METADATA(): TerminalNode { return this.getToken(esql_parser.METADATA, 0); } - public fromIdentifier_list(): FromIdentifierContext[] { - return this.getTypedRuleContexts(FromIdentifierContext) as FromIdentifierContext[]; + public indexIdentifier_list(): IndexIdentifierContext[] { + return this.getTypedRuleContexts(IndexIdentifierContext) as IndexIdentifierContext[]; } - public fromIdentifier(i: number): FromIdentifierContext { - return this.getTypedRuleContext(FromIdentifierContext, i) as FromIdentifierContext; + public indexIdentifier(i: number): IndexIdentifierContext { + return this.getTypedRuleContext(IndexIdentifierContext, i) as IndexIdentifierContext; } public COMMA_list(): TerminalNode[] { return this.getTokens(esql_parser.COMMA); @@ -4192,6 +4292,53 @@ export class Deprecated_metadataContext extends ParserRuleContext { } +export class MetricsCommandContext extends ParserRuleContext { + public _aggregates!: FieldsContext; + public _grouping!: FieldsContext; + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public METRICS(): TerminalNode { + return this.getToken(esql_parser.METRICS, 0); + } + public indexIdentifier_list(): IndexIdentifierContext[] { + return this.getTypedRuleContexts(IndexIdentifierContext) as IndexIdentifierContext[]; + } + public indexIdentifier(i: number): IndexIdentifierContext { + return this.getTypedRuleContext(IndexIdentifierContext, i) as IndexIdentifierContext; + } + public COMMA_list(): TerminalNode[] { + return this.getTokens(esql_parser.COMMA); + } + public COMMA(i: number): TerminalNode { + return this.getToken(esql_parser.COMMA, i); + } + public BY(): TerminalNode { + return this.getToken(esql_parser.BY, 0); + } + public fields_list(): FieldsContext[] { + return this.getTypedRuleContexts(FieldsContext) as FieldsContext[]; + } + public fields(i: number): FieldsContext { + return this.getTypedRuleContext(FieldsContext, i) as FieldsContext; + } + public get ruleIndex(): number { + return esql_parser.RULE_metricsCommand; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterMetricsCommand) { + listener.enterMetricsCommand(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitMetricsCommand) { + listener.exitMetricsCommand(this); + } + } +} + + export class EvalCommandContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts index 75847ae8805ac..47dad0671ae79 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts @@ -33,10 +33,11 @@ import { RowCommandContext } from "./esql_parser"; import { FieldsContext } from "./esql_parser"; import { FieldContext } from "./esql_parser"; import { FromCommandContext } from "./esql_parser"; -import { FromIdentifierContext } from "./esql_parser"; +import { IndexIdentifierContext } from "./esql_parser"; import { MetadataContext } from "./esql_parser"; import { MetadataOptionContext } from "./esql_parser"; import { Deprecated_metadataContext } from "./esql_parser"; +import { MetricsCommandContext } from "./esql_parser"; import { EvalCommandContext } from "./esql_parser"; import { StatsCommandContext } from "./esql_parser"; import { InlinestatsCommandContext } from "./esql_parser"; @@ -414,15 +415,15 @@ export default class esql_parserListener extends ParseTreeListener { */ exitFromCommand?: (ctx: FromCommandContext) => void; /** - * Enter a parse tree produced by `esql_parser.fromIdentifier`. + * Enter a parse tree produced by `esql_parser.indexIdentifier`. * @param ctx the parse tree */ - enterFromIdentifier?: (ctx: FromIdentifierContext) => void; + enterIndexIdentifier?: (ctx: IndexIdentifierContext) => void; /** - * Exit a parse tree produced by `esql_parser.fromIdentifier`. + * Exit a parse tree produced by `esql_parser.indexIdentifier`. * @param ctx the parse tree */ - exitFromIdentifier?: (ctx: FromIdentifierContext) => void; + exitIndexIdentifier?: (ctx: IndexIdentifierContext) => void; /** * Enter a parse tree produced by `esql_parser.metadata`. * @param ctx the parse tree @@ -453,6 +454,16 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitDeprecated_metadata?: (ctx: Deprecated_metadataContext) => void; + /** + * Enter a parse tree produced by `esql_parser.metricsCommand`. + * @param ctx the parse tree + */ + enterMetricsCommand?: (ctx: MetricsCommandContext) => void; + /** + * Exit a parse tree produced by `esql_parser.metricsCommand`. + * @param ctx the parse tree + */ + exitMetricsCommand?: (ctx: MetricsCommandContext) => void; /** * Enter a parse tree produced by `esql_parser.evalCommand`. * @param ctx the parse tree diff --git a/packages/kbn-esql-ast/src/ast_walker.ts b/packages/kbn-esql-ast/src/ast_walker.ts index 8e4c8ce8f9c09..e2b92a2fbf9d6 100644 --- a/packages/kbn-esql-ast/src/ast_walker.ts +++ b/packages/kbn-esql-ast/src/ast_walker.ts @@ -56,7 +56,7 @@ import { StringLiteralContext, type ValueExpressionContext, ValueExpressionDefaultContext, - FromIdentifierContext, + IndexIdentifierContext, } from './antlr/esql_parser'; import { createSource, @@ -87,7 +87,7 @@ import type { } from './types'; export function collectAllSourceIdentifiers(ctx: FromCommandContext): ESQLAstItem[] { - const fromContexts = ctx.getTypedRuleContexts(FromIdentifierContext); + const fromContexts = ctx.getTypedRuleContexts(IndexIdentifierContext); return fromContexts.map((sourceCtx) => createSource(sourceCtx)); } @@ -96,7 +96,7 @@ function extractIdentifiers( ctx: KeepCommandContext | DropCommandContext | MvExpandCommandContext | MetadataOptionContext ) { if (ctx instanceof MetadataOptionContext) { - return wrapIdentifierAsArray(ctx.fromIdentifier_list()); + return wrapIdentifierAsArray(ctx.indexIdentifier_list()); } if (ctx instanceof MvExpandCommandContext) { return wrapIdentifierAsArray(ctx.qualifiedName()); diff --git a/packages/kbn-esql-utils/index.ts b/packages/kbn-esql-utils/index.ts index f3203cba662cf..31fa7eb3a14c8 100644 --- a/packages/kbn-esql-utils/index.ts +++ b/packages/kbn-esql-utils/index.ts @@ -18,6 +18,7 @@ export { appendWhereClauseToESQLQuery, getESQLQueryColumns, getESQLQueryColumnsRaw, + getESQLResults, TextBasedLanguages, } from './src'; diff --git a/packages/kbn-esql-utils/src/index.ts b/packages/kbn-esql-utils/src/index.ts index 0b62f2aedc58d..a48765e8c0489 100644 --- a/packages/kbn-esql-utils/src/index.ts +++ b/packages/kbn-esql-utils/src/index.ts @@ -16,4 +16,4 @@ export { removeDropCommandsFromESQLQuery, } from './utils/query_parsing_helpers'; export { appendToESQLQuery, appendWhereClauseToESQLQuery } from './utils/append_to_query'; -export { getESQLQueryColumns, getESQLQueryColumnsRaw } from './utils/run_query'; +export { getESQLQueryColumns, getESQLQueryColumnsRaw, getESQLResults } from './utils/run_query'; diff --git a/packages/kbn-esql-utils/src/utils/run_query.ts b/packages/kbn-esql-utils/src/utils/run_query.ts index 099b4b876b943..099109b34a1d4 100644 --- a/packages/kbn-esql-utils/src/utils/run_query.ts +++ b/packages/kbn-esql-utils/src/utils/run_query.ts @@ -9,11 +9,24 @@ import { i18n } from '@kbn/i18n'; import type { DatatableColumn } from '@kbn/expressions-plugin/common'; import type { ISearchGeneric } from '@kbn/search-types'; import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; -import type { ESQLColumn, ESQLSearchReponse } from '@kbn/es-types'; +import type { ESQLColumn, ESQLSearchReponse, ESQLSearchParams } from '@kbn/es-types'; import { lastValueFrom } from 'rxjs'; import { ESQL_LATEST_VERSION } from '../../constants'; -export async function getESQLQueryColumns({ +export function formatESQLColumns(columns: ESQLColumn[]): DatatableColumn[] { + return columns.map(({ name, type }) => { + const kibanaType = esFieldTypeToKibanaFieldType(type); + return { + id: name, + name, + meta: { type: kibanaType, esType: type }, + } as DatatableColumn; + }); +} + +// Returns the columns exactly as being returned by the _query endpoint +// Based on the search api from the data plugin +export async function getESQLQueryColumnsRaw({ esqlQuery, search, signal, @@ -21,7 +34,7 @@ export async function getESQLQueryColumns({ esqlQuery: string; search: ISearchGeneric; signal?: AbortSignal; -}): Promise { +}): Promise { try { const response = await lastValueFrom( search( @@ -38,19 +51,7 @@ export async function getESQLQueryColumns({ ) ); - const columns = - (response.rawResponse as unknown as ESQLSearchReponse).columns?.map(({ name, type }) => { - const kibanaType = esFieldTypeToKibanaFieldType(type); - const column = { - id: name, - name, - meta: { type: kibanaType, esType: type }, - } as DatatableColumn; - - return column; - }) ?? []; - - return columns; + return (response.rawResponse as unknown as ESQLSearchReponse).columns ?? []; } catch (error) { throw new Error( i18n.translate('esqlUtils.columnsErrorMsg', { @@ -61,7 +62,9 @@ export async function getESQLQueryColumns({ } } -export async function getESQLQueryColumnsRaw({ +// Returns the columns with the kibana format +// Based on the search api from the data plugin +export async function getESQLQueryColumns({ esqlQuery, search, signal, @@ -69,24 +72,12 @@ export async function getESQLQueryColumnsRaw({ esqlQuery: string; search: ISearchGeneric; signal?: AbortSignal; -}): Promise { +}): Promise { try { - const response = await lastValueFrom( - search( - { - params: { - query: `${esqlQuery} | limit 0`, - version: ESQL_LATEST_VERSION, - }, - }, - { - abortSignal: signal, - strategy: 'esql_async', - } - ) - ); + const rawColumns = await getESQLQueryColumnsRaw({ esqlQuery, search, signal }); + const columns = formatESQLColumns(rawColumns) ?? []; - return (response.rawResponse as unknown as ESQLSearchReponse).columns ?? []; + return columns; } catch (error) { throw new Error( i18n.translate('esqlUtils.columnsErrorMsg', { @@ -96,3 +87,43 @@ export async function getESQLQueryColumnsRaw({ ); } } + +// Returns the table as being returned by the _query endpoint +// Based on the search api from the data plugin +export async function getESQLResults({ + esqlQuery, + search, + signal, + filter, + dropNullColumns, +}: { + esqlQuery: string; + search: ISearchGeneric; + signal?: AbortSignal; + filter?: unknown; + dropNullColumns?: boolean; +}): Promise<{ + response: ESQLSearchReponse; + params: ESQLSearchParams; +}> { + const result = await lastValueFrom( + search( + { + params: { + ...(filter ? { filter } : {}), + query: esqlQuery, + version: ESQL_LATEST_VERSION, + ...(dropNullColumns ? { dropNullColumns: true } : {}), + }, + }, + { + abortSignal: signal, + strategy: 'esql_async', + } + ) + ); + return { + response: result.rawResponse as unknown as ESQLSearchReponse, + params: result.requestParams as unknown as ESQLSearchParams, + }; +} 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 6cac6d45f7f75..3e68887c86f39 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -17,6 +17,7 @@ import { camelCase, partition } from 'lodash'; import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; import { groupingFunctionDefinitions } from '../definitions/grouping'; import { FunctionArgSignature } from '../definitions/types'; +import { METADATA_FIELDS } from '../shared/constants'; const triggerCharacters = [',', '(', '=', ' ']; @@ -208,7 +209,6 @@ function createCustomCallbackMocks( getFieldsFor: jest.fn(async () => finalFields), getSources: jest.fn(async () => finalSources), getPolicies: jest.fn(async () => finalPolicies), - getMetaFields: jest.fn(async () => ['_index', '_score']), }; } @@ -358,10 +358,18 @@ describe('autocomplete', () => { testSuggestions('from a, b ', ['metadata $0', ',', '|']); testSuggestions('from *,', suggestedIndexes); testSuggestions('from index', suggestedIndexes, 5 /* space before index */); - testSuggestions('from a, b [metadata ]', ['_index', '_score'], ' ]'); - testSuggestions('from a, b metadata ', ['_index', '_score'], ' '); - testSuggestions('from a, b [metadata _index, ]', ['_score'], ' ]'); - testSuggestions('from a, b metadata _index, ', ['_score'], ' '); + testSuggestions('from a, b [metadata ]', METADATA_FIELDS, ' ]'); + testSuggestions('from a, b metadata ', METADATA_FIELDS, ' '); + testSuggestions( + 'from a, b [metadata _index, ]', + METADATA_FIELDS.filter((field) => field !== '_index'), + ' ]' + ); + testSuggestions( + 'from a, b metadata _index, ', + METADATA_FIELDS.filter((field) => field !== '_index'), + ' ' + ); }); describe('show', () => { diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index 067abb3fca05c..cc16a8d8c7699 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -71,7 +71,7 @@ import { buildSettingDefinitions, buildValueDefinitions, } from './factories'; -import { EDITOR_MARKER, SINGLE_BACKTICK } from '../shared/constants'; +import { EDITOR_MARKER, SINGLE_BACKTICK, METADATA_FIELDS } from '../shared/constants'; import { getAstContext, removeMarkerArgFromArgsList } from '../shared/context'; import { buildQueryUntilPreviousCommand, @@ -91,7 +91,6 @@ type GetFieldsByTypeFn = ( type GetFieldsMapFn = () => Promise>; type GetPoliciesFn = () => Promise; type GetPolicyMetadataFn = (name: string) => Promise; -type GetMetaFieldsFn = () => Promise; function hasSameArgBothSides(assignFn: ESQLFunction) { if (assignFn.name === '=' && isColumnItem(assignFn.args[0]) && assignFn.args[1]) { @@ -200,7 +199,6 @@ export async function suggest( ); const getSources = getSourcesRetriever(resourceRetriever); const { getPolicies, getPolicyMetadata } = getPolicyRetriever(resourceRetriever); - const getMetaFields = getMetaFieldsRetriever(resourceRetriever); if (astContext.type === 'newCommand') { // propose main commands here @@ -246,8 +244,7 @@ export async function suggest( { option, ...rest }, getFieldsByType, getFieldsMap, - getPolicyMetadata, - getMetaFields + getPolicyMetadata ); } } @@ -285,13 +282,6 @@ function getFieldsByTypeRetriever(queryString: string, resourceRetriever?: ESQLC }; } -function getMetaFieldsRetriever(resourceRetriever?: ESQLCallbacks): () => Promise { - if (resourceRetriever?.getMetaFields == null) { - return async () => []; - } - return async () => resourceRetriever!.getMetaFields!(); -} - function getPolicyRetriever(resourceRetriever?: ESQLCallbacks) { const helpers = getPolicyHelper(resourceRetriever); return { @@ -1388,8 +1378,7 @@ async function getOptionArgsSuggestions( }, getFieldsByType: GetFieldsByTypeFn, getFieldsMaps: GetFieldsMapFn, - getPolicyMetadata: GetPolicyMetadataFn, - getMetaFields: GetMetaFieldsFn + getPolicyMetadata: GetPolicyMetadataFn ) { const optionDef = getCommandOption(option.name); const { nodeArg, argIndex, lastArg } = extractArgMeta(option, node); @@ -1498,8 +1487,7 @@ async function getOptionArgsSuggestions( if (option.name === 'metadata') { const existingFields = new Set(option.args.filter(isColumnItem).map(({ name }) => name)); - const metaFields = await getMetaFields(); - const filteredMetaFields = metaFields.filter((name) => !existingFields.has(name)); + const filteredMetaFields = METADATA_FIELDS.filter((name) => !existingFields.has(name)); suggestions.push(...buildFieldsDefinitions(filteredMetaFields)); } diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts index d9c53e0eb2be5..a4ff739297201 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts @@ -57,7 +57,6 @@ function getCallbackMocks() { enrichFields: ['other-field', 'yetAnotherField'], }, ]), - getMetaFields: jest.fn(async () => ['_index', '_id', '_source', '_score']), }; } @@ -420,7 +419,6 @@ describe('quick fixes logic', () => { getFieldsFor: undefined, getSources: undefined, getPolicies: undefined, - getMetaFields: undefined, }); } catch { fail('Should not throw'); @@ -446,7 +444,6 @@ describe('quick fixes logic', () => { getFieldsFor: undefined, getSources: undefined, getPolicies: undefined, - getMetaFields: undefined, } ); } catch { 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 ee14e2f1f1802..2c8620223ebb3 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; import levenshtein from 'js-levenshtein'; -import type { AstProviderFn, ESQLAst, ESQLCommand, EditorError, ESQLMessage } from '@kbn/esql-ast'; +import type { AstProviderFn, ESQLAst, EditorError, ESQLMessage } from '@kbn/esql-ast'; import { uniqBy } from 'lodash'; import { getFieldsByTypeHelper, @@ -23,7 +23,7 @@ import { } from '../shared/helpers'; import { ESQLCallbacks } from '../shared/types'; import { buildQueryForFieldsFromSource } from '../validation/helpers'; -import { DOUBLE_BACKTICK, SINGLE_TICK_REGEX } from '../shared/constants'; +import { DOUBLE_BACKTICK, SINGLE_TICK_REGEX, METADATA_FIELDS } from '../shared/constants'; import type { CodeAction, Callbacks, CodeActionOptions } from './types'; import { getAstContext } from '../shared/context'; import { wrapAsEditorMessage } from './utils'; @@ -62,19 +62,6 @@ function getSourcesRetriever(resourceRetriever?: ESQLCallbacks) { }; } -export function getMetaFieldsRetriever( - queryString: string, - commands: ESQLCommand[], - callbacks?: ESQLCallbacks -) { - return async () => { - if (!callbacks || !callbacks.getMetaFields) { - return []; - } - return await callbacks.getMetaFields(); - }; -} - export const getCompatibleFunctionDefinitions = ( command: string, option: string | undefined @@ -315,14 +302,18 @@ async function getSpellingActionForMetadata( error: EditorError, queryString: string, ast: ESQLAst, - options: CodeActionOptions, - { getMetaFields }: Partial + options: CodeActionOptions ) { - if (!getMetaFields) { - return []; - } const errorText = queryString.substring(error.startColumn - 1, error.endColumn - 1); - const possibleMetafields = await getSpellingPossibilities(getMetaFields, errorText); + const allSolutions = METADATA_FIELDS.reduce((solutions, item) => { + const distance = levenshtein(item, errorText); + if (distance < 3) { + solutions.push(item); + } + return solutions; + }, [] as string[]); + // filter duplicates + const possibleMetafields = Array.from(new Set(allSolutions)); return wrapIntoSpellingChangeAction(error, possibleMetafields); } @@ -409,14 +400,12 @@ export async function getActions( const { getFieldsByType } = getFieldsByTypeRetriever(queryForFields, resourceRetriever); const getSources = getSourcesRetriever(resourceRetriever); const { getPolicies, getPolicyFields } = getPolicyRetriever(resourceRetriever); - const getMetaFields = getMetaFieldsRetriever(innerText, ast, resourceRetriever); const callbacks = { getFieldsByType: resourceRetriever?.getFieldsFor ? getFieldsByType : undefined, getSources: resourceRetriever?.getSources ? getSources : undefined, getPolicies: resourceRetriever?.getPolicies ? getPolicies : undefined, getPolicyFields: resourceRetriever?.getPolicies ? getPolicyFields : undefined, - getMetaFields: resourceRetriever?.getMetaFields ? getMetaFields : undefined, }; // Markers are sent only on hover and are limited to the hovered area @@ -473,8 +462,7 @@ export async function getActions( error, innerText, ast, - options, - callbacks + options ); actions.push(...metadataSpellChanges); break; 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 949e734eb1794..2cd9264001f3c 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/types.ts @@ -12,14 +12,12 @@ type GetSourceFn = () => Promise; type GetFieldsByTypeFn = (type: string | string[], ignored?: string[]) => Promise; type GetPoliciesFn = () => Promise; type GetPolicyFieldsFn = (name: string) => Promise; -type GetMetaFieldsFn = () => Promise; export interface Callbacks { getSources: GetSourceFn; getFieldsByType: GetFieldsByTypeFn; getPolicies: GetPoliciesFn; getPolicyFields: GetPolicyFieldsFn; - getMetaFields: GetMetaFieldsFn; } export interface CodeAction { diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/options.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/options.ts index f8b41be1b1ae4..8e30a43db2c8f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/options.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/options.ts @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import type { ESQLCommandOption, ESQLMessage } from '@kbn/esql-ast'; -import { isColumnItem, isLiteralItem } from '../shared/helpers'; +import { isLiteralItem, isColumnItem } from '../shared/helpers'; import { getMessageFromId } from '../validation/errors'; import type { CommandOptionsDefinition } from './types'; diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts b/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts index ed4e854f95e97..dca84927cf033 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts @@ -13,3 +13,5 @@ export const DOUBLE_TICKS_REGEX = /``/g; export const SINGLE_TICK_REGEX = /`/g; export const SINGLE_BACKTICK = '`'; export const DOUBLE_BACKTICK = '``'; + +export const METADATA_FIELDS = ['_version', '_id', '_index', '_source']; diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/types.ts b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts index c64585b2bab55..758218c52062f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts @@ -13,7 +13,6 @@ type CallbackFn = (ctx?: Options) => Result[] | P export interface ESQLCallbacks { getSources?: CallbackFn<{}, { name: string; hidden: boolean }>; getFieldsFor?: CallbackFn<{ query: string }, { name: string; type: string }>; - getMetaFields?: CallbackFn; 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 9b5d3b50b0a63..14b55dee73cd7 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 @@ -113,84 +113,84 @@ { "query": "eval", "error": [ - "SyntaxError: mismatched input 'eval' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'eval' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "stats", "error": [ - "SyntaxError: mismatched input 'stats' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'stats' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "rename", "error": [ - "SyntaxError: mismatched input 'rename' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'rename' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "limit", "error": [ - "SyntaxError: mismatched input 'limit' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'limit' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "keep", "error": [ - "SyntaxError: mismatched input 'keep' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'keep' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "drop", "error": [ - "SyntaxError: mismatched input 'drop' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'drop' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "mv_expand", "error": [ - "SyntaxError: mismatched input 'mv_expand' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'mv_expand' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "dissect", "error": [ - "SyntaxError: mismatched input 'dissect' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'dissect' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "grok", "error": [ - "SyntaxError: mismatched input 'grok' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'grok' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "f", "error": [ - "SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'row', 'show'}" + "SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}" ], "warning": [] }, { "query": "from ", "error": [ - "SyntaxError: missing FROM_UNQUOTED_IDENTIFIER at ''" + "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''" ], "warning": [] }, { "query": "from index,", "error": [ - "SyntaxError: missing FROM_UNQUOTED_IDENTIFIER at ''" + "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''" ], "warning": [] }, @@ -275,7 +275,7 @@ { "query": "from index [METADATA _id, _source2]", "error": [ - "Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]" + "Metadata field [_source2] is not available. Available metadata fields are: [_version, _id, _index, _source]" ], "warning": [ "Square brackets '[]' need to be removed from FROM METADATA declaration" @@ -322,7 +322,7 @@ { "query": "from index METADATA _id, _source2", "error": [ - "Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]" + "Metadata field [_source2] is not available. Available metadata fields are: [_version, _id, _index, _source]" ], "warning": [] }, @@ -8964,6 +8964,42 @@ ], "warning": [] }, + { + "query": "from a_index | eval var = date_diff(\"year\", dateField, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(\"year\", dateField, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = date_diff(\"year\", to_datetime(stringField), to_datetime(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(numberField, stringField, stringField)", + "error": [ + "Argument of [date_diff] must be [string], found value [numberField] type [number]", + "Argument of [date_diff] must be [date], found value [stringField] type [string]", + "Argument of [date_diff] must be [date], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(\"year\", dateField, dateField, extraArg)", + "error": [ + "Error: [date_diff] function expects exactly 3 arguments, got 4." + ], + "warning": [] + }, + { + "query": "from a_index | sort date_diff(\"year\", dateField, dateField)", + "error": [], + "warning": [] + }, { "query": "row var = abs(5)", "error": [], @@ -9722,42 +9758,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval var = date_diff(\"year\", dateField, dateField)", - "error": [], - "warning": [] - }, - { - "query": "from a_index | eval date_diff(\"year\", dateField, dateField)", - "error": [], - "warning": [] - }, - { - "query": "from a_index | eval var = date_diff(\"year\", to_datetime(stringField), to_datetime(stringField))", - "error": [], - "warning": [] - }, - { - "query": "from a_index | eval date_diff(numberField, stringField, stringField)", - "error": [ - "Argument of [date_diff] must be [string], found value [numberField] type [number]", - "Argument of [date_diff] must be [date], found value [stringField] type [string]", - "Argument of [date_diff] must be [date], found value [stringField] type [string]" - ], - "warning": [] - }, - { - "query": "from a_index | eval date_diff(\"year\", dateField, dateField, extraArg)", - "error": [ - "Error: [date_diff] function expects exactly 3 arguments, got 4." - ], - "warning": [] - }, - { - "query": "from a_index | sort date_diff(\"year\", dateField, dateField)", - "error": [], - "warning": [] - }, { "query": "row var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", now())", "error": [], diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/resources.ts b/packages/kbn-esql-validation-autocomplete/src/validation/resources.ts index 4f8552db72e72..7ec5ff7fc0a2b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/resources.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/resources.ts @@ -87,20 +87,12 @@ export async function retrievePoliciesFields( return await getFieldsByTypeHelper(customQuery, callbacks).getFieldsMap(); } -export async function retrieveMetadataFields(callbacks?: ESQLCallbacks): Promise> { - if (!callbacks || !callbacks.getMetaFields) { - return new Set(); - } - const fields = await callbacks.getMetaFields(); - return new Set(fields); -} - export async function retrieveFieldsFromStringSources( queryString: string, commands: ESQLCommand[], callbacks?: ESQLCallbacks ): Promise> { - if (!callbacks || !callbacks?.getMetaFields) { + if (!callbacks) { return new Map(); } const customQuery = buildQueryForFieldsForStringSources(queryString, commands); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/types.ts b/packages/kbn-esql-validation-autocomplete/src/validation/types.ts index aaf98773eca2c..fbfb35818cac1 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/types.ts @@ -32,7 +32,6 @@ export interface ReferenceMaps { variables: Map; fields: Map; policies: Map; - metadataFields: Set; query: string; } 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 3cb8e608d8841..01d0695af4a6c 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -18,6 +18,7 @@ import capitalize from 'lodash/capitalize'; import { camelCase } from 'lodash'; import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; import { nonNullable } from '../shared/helpers'; +import { METADATA_FIELDS } from '../shared/constants'; import { FUNCTION_DESCRIBE_BLOCK_NAME } from './function_describe_block_name'; const fieldTypes = [ @@ -93,7 +94,6 @@ function getCallbackMocks() { })) ), getPolicies: jest.fn(async () => policies), - getMetaFields: jest.fn(async () => ['_id', '_source']), }; } @@ -309,18 +309,18 @@ describe('validation logic', () => { ['eval', 'stats', 'rename', 'limit', 'keep', 'drop', 'mv_expand', 'dissect', 'grok'].map( (command) => testErrorsAndWarnings(command, [ - `SyntaxError: mismatched input '${command}' expecting {'explain', 'from', 'meta', 'row', 'show'}`, + `SyntaxError: mismatched input '${command}' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}`, ]) ); }); describe('from', () => { testErrorsAndWarnings('f', [ - `SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'row', 'show'}`, + `SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}`, ]); - testErrorsAndWarnings(`from `, ["SyntaxError: missing FROM_UNQUOTED_IDENTIFIER at ''"]); + testErrorsAndWarnings(`from `, ["SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''"]); testErrorsAndWarnings(`from index,`, [ - "SyntaxError: missing FROM_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", ]); testErrorsAndWarnings(`from assignment = 1`, [ "SyntaxError: mismatched input '=' expecting ", @@ -366,7 +366,9 @@ describe('validation logic', () => { testErrorsAndWarnings( `from index ${setWrapping('METADATA _id, _source2')}`, [ - 'Metadata field [_source2] is not available. Available metadata fields are: [_id, _source]', + `Metadata field [_source2] is not available. Available metadata fields are: [${METADATA_FIELDS.join( + ', ' + )}]`, ], addBracketsWarning() ); @@ -1971,7 +1973,6 @@ describe('validation logic', () => { getFieldsFor: undefined, getSources: undefined, getPolicies: undefined, - getMetaFields: undefined, } ); } catch { @@ -6318,7 +6319,6 @@ describe('validation logic', () => { getSources: /Unknown index/, getPolicies: /Unknown policy/, getFieldsFor: /Unknown column|Argument of|it is unsupported or not indexed/, - getMetaFields: /Metadata field/, }; return excludedCallback.map((callback) => contentByCallback[callback]) || []; } @@ -6359,40 +6359,38 @@ describe('validation logic', () => { }); // test excluding one callback at the time - it.each(['getSources', 'getFieldsFor', 'getPolicies', 'getMetaFields'] as Array< - keyof typeof ignoreErrorsMap - >)(`should not error if %s is missing`, async (excludedCallback) => { - const filteredTestCases = fixtures.testCases.filter((t) => - t.error.some((message) => - excludeErrorsByContent([excludedCallback]).every((regexp) => regexp?.test(message)) - ) - ); - const allErrors = await Promise.all( - filteredTestCases.map(({ query }) => - validateQuery( - query, - getAstAndSyntaxErrors, - { ignoreOnMissingCallbacks: true }, - getPartialCallbackMocks(excludedCallback) + it.each(['getSources', 'getFieldsFor', 'getPolicies'] as Array)( + `should not error if %s is missing`, + async (excludedCallback) => { + const filteredTestCases = fixtures.testCases.filter((t) => + t.error.some((message) => + excludeErrorsByContent([excludedCallback]).every((regexp) => regexp?.test(message)) ) - ) - ); - for (const { errors } of allErrors) { - expect( - errors.every(({ code }) => - ignoreErrorsMap[excludedCallback].every((ignoredCode) => ignoredCode !== code) + ); + const allErrors = await Promise.all( + filteredTestCases.map(({ query }) => + validateQuery( + query, + getAstAndSyntaxErrors, + { ignoreOnMissingCallbacks: true }, + getPartialCallbackMocks(excludedCallback) + ) ) - ).toBe(true); + ); + for (const { errors } of allErrors) { + expect( + errors.every(({ code }) => + ignoreErrorsMap[excludedCallback].every((ignoredCode) => ignoredCode !== code) + ) + ).toBe(true); + } } - }); + ); it('should work if no callback passed', async () => { - const excludedCallbacks = [ - 'getSources', - 'getPolicies', - 'getFieldsFor', - 'getMetaFields', - ] as Array; + const excludedCallbacks = ['getSources', 'getPolicies', 'getFieldsFor'] as Array< + keyof typeof ignoreErrorsMap + >; for (const testCase of fixtures.testCases.filter((t) => t.error.some((message) => excludeErrorsByContent(excludedCallbacks).every((regexp) => regexp?.test(message)) diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts index af456e90d3f72..5bef4d5faa604 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts @@ -68,10 +68,10 @@ import { retrieveFields, retrievePolicies, retrievePoliciesFields, - retrieveMetadataFields, retrieveFieldsFromStringSources, } from './resources'; import { collapseWrongArgumentTypeMessages } from './helpers'; +import { METADATA_FIELDS } from '../shared/constants'; function validateFunctionLiteralArg( astFunction: ESQLFunction, @@ -596,7 +596,8 @@ function validateOption( } // use dedicate validate fn if provided if (optionDef.validate) { - messages.push(...optionDef.validate(option, command, referenceMaps.metadataFields)); + const fields = METADATA_FIELDS; + messages.push(...optionDef.validate(option, command, new Set(fields))); } if (!optionDef.skipCommonValidation) { option.args.forEach((arg) => { @@ -876,7 +877,6 @@ export const ignoreErrorsMap: Record = { getFieldsFor: ['unknownColumn', 'wrongArgumentType', 'unsupportedFieldType'], getSources: ['unknownIndex'], getPolicies: ['unknownPolicy'], - getMetaFields: ['unknownMetadataField'], }; /** @@ -945,15 +945,13 @@ async function validateAst( const { ast, errors } = await astProvider(queryString); - const [sources, availableFields, availablePolicies, availableMetadataFields] = await Promise.all([ + const [sources, availableFields, availablePolicies] = await Promise.all([ // retrieve the list of available sources retrieveSources(ast, callbacks), // retrieve available fields (if a source command has been defined) retrieveFields(queryString, ast, callbacks), // retrieve available policies (if an enrich command has been defined) retrievePolicies(ast, callbacks), - // retrieve available metadata fields - retrieveMetadataFields(callbacks), ]); if (availablePolicies.size) { @@ -987,7 +985,6 @@ async function validateAst( fields: availableFields, policies: availablePolicies, variables, - metadataFields: availableMetadataFields, query: queryString, }); messages.push(...commandMessages); diff --git a/packages/kbn-guided-onboarding/kibana.jsonc b/packages/kbn-guided-onboarding/kibana.jsonc index 6f9768ce87ce3..6b7815910f2f5 100644 --- a/packages/kbn-guided-onboarding/kibana.jsonc +++ b/packages/kbn-guided-onboarding/kibana.jsonc @@ -1,5 +1,5 @@ { "type": "shared-common", "id": "@kbn/guided-onboarding", - "owner": "@elastic/platform-onboarding" + "owner": "@elastic/appex-sharedux" } diff --git a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.constants.tsx b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.constants.tsx index 00d7ab56a4ec9..53b6b4bd5d9ee 100644 --- a/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.constants.tsx +++ b/packages/kbn-guided-onboarding/src/components/landing_page/guide/guide_cards.constants.tsx @@ -117,6 +117,7 @@ export const guideCards: GuideCardConstants[] = [ }), navigateTo: { appId: 'observabilityOnboarding', + path: '/?category=logs', }, telemetryId: 'onboarding--observability--logs', order: 2, @@ -147,8 +148,8 @@ export const guideCards: GuideCardConstants[] = [ defaultMessage: 'Monitor my host metrics', }), navigateTo: { - appId: 'integrations', - path: '/browse/os_system', + appId: 'observabilityOnboarding', + path: '/?category=infra', }, telemetryId: 'onboarding--observability--hosts', order: 8, diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index 4fd4015baeb2c..0602ee6390629 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -123,8 +123,8 @@ export const OBSERVABILITY_ENABLE_COMPARISON_BY_DEFAULT_ID = 'observability:enableComparisonByDefault'; export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID = 'observability:enableInfrastructureHostsView'; -export const OBSERVABILITY_ENABLE_CONTAINER_ASSET_VIEW_ID = - 'observability:enableContainerAssetView'; +export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_CONTAINER_ASSET_VIEW_ID = + 'observability:enableInfrastructureContainerAssetView'; export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_ASSET_CUSTOM_DASHBOARDS_ID = 'observability:enableInfrastructureAssetCustomDashboards'; export const OBSERVABILITY_ENABLE_INSPECT_ES_QUERIES_ID = 'observability:enableInspectEsQueries'; diff --git a/packages/kbn-monaco/src/esql/lib/hover/hover.test.ts b/packages/kbn-monaco/src/esql/lib/hover/hover.test.ts index 6e65619dc479d..cfeeae894d6ba 100644 --- a/packages/kbn-monaco/src/esql/lib/hover/hover.test.ts +++ b/packages/kbn-monaco/src/esql/lib/hover/hover.test.ts @@ -74,7 +74,6 @@ function createCustomCallbackMocks( getFieldsFor: jest.fn(async () => finalFields), getSources: jest.fn(async () => finalSources), getPolicies: jest.fn(async () => finalPolicies), - getMetaFields: jest.fn(async () => ['_index', '_score']), }; } diff --git a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap index 6caf6b33de642..fb99225cdaa1a 100644 --- a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap +++ b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap @@ -3,12 +3,7 @@ exports[`generateOpenApiDocument @kbn/config-schema generates references in the expected format 1`] = ` Object { "components": Object { - "schemas": Object { - "my.name": Object { - "minLength": 1, - "type": "string", - }, - }, + "schemas": Object {}, "securitySchemes": Object { "apiKeyAuth": Object { "in": "header", @@ -46,7 +41,7 @@ Object { }, }, Object { - "description": undefined, + "description": "test", "in": "path", "name": "id", "required": true, @@ -63,7 +58,8 @@ Object { "additionalProperties": false, "properties": Object { "name": Object { - "$ref": "#/components/schemas/my.name", + "minLength": 1, + "type": "string", }, "other": Object { "type": "string", @@ -368,6 +364,105 @@ Object { } `; +exports[`generateOpenApiDocument @kbn/config-schema handles recursive schemas 1`] = ` +Object { + "components": Object { + "schemas": Object { + "recursive": Object { + "additionalProperties": false, + "properties": Object { + "name": Object { + "type": "string", + }, + "self": Object { + "$ref": "#/components/schemas/recursive", + }, + }, + "required": Array [ + "name", + "self", + ], + "type": "object", + }, + }, + "securitySchemes": Object { + "apiKeyAuth": Object { + "in": "header", + "name": "Authorization", + "type": "apiKey", + }, + "basicAuth": Object { + "scheme": "basic", + "type": "http", + }, + }, + }, + "externalDocs": undefined, + "info": Object { + "description": undefined, + "title": "test", + "version": "99.99.99", + }, + "openapi": "3.0.0", + "paths": Object { + "/recursive": Object { + "get": Object { + "operationId": "/recursive#0", + "parameters": Array [ + Object { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": Object { + "default": "2023-10-31", + "enum": Array [ + "2023-10-31", + ], + "type": "string", + }, + }, + ], + "requestBody": Object { + "content": Object { + "application/json; Elastic-Api-Version=2023-10-31": Object { + "schema": Object { + "$ref": "#/components/schemas/recursive", + }, + }, + }, + }, + "responses": Object { + "200": Object { + "content": Object { + "application/json; Elastic-Api-Version=2023-10-31": Object { + "schema": Object { + "maxLength": 10, + "minLength": 1, + "type": "string", + }, + }, + }, + "description": "No description", + }, + }, + "summary": "", + }, + }, + }, + "security": Array [ + Object { + "basicAuth": Array [], + }, + ], + "servers": Array [ + Object { + "url": "https://test.oas", + }, + ], + "tags": undefined, +} +`; + exports[`generateOpenApiDocument unknown schema/validation produces the expected output 1`] = ` Object { "components": Object { diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts index 4ccc02f31c355..9311faf88dec9 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts @@ -7,9 +7,14 @@ */ import { generateOpenApiDocument } from './generate_oas'; -import { schema } from '@kbn/config-schema'; +import { schema, Type } from '@kbn/config-schema'; import { createTestRouters, createRouter, createVersionedRouter } from './generate_oas.test.util'; +interface RecursiveType { + name: string; + self: undefined | RecursiveType; +} + describe('generateOpenApiDocument', () => { describe('@kbn/config-schema', () => { it('generates the expected OpenAPI document', () => { @@ -30,8 +35,8 @@ describe('generateOpenApiDocument', () => { }); it('generates references in the expected format', () => { - const sharedIdSchema = schema.string({ minLength: 1, meta: { id: 'my.id' } }); - const sharedNameSchema = schema.string({ minLength: 1, meta: { id: 'my.name' } }); + const sharedIdSchema = schema.string({ minLength: 1, meta: { description: 'test' } }); + const sharedNameSchema = schema.string({ minLength: 1 }); const otherSchema = schema.object({ name: sharedNameSchema, other: schema.string() }); expect( generateOpenApiDocument( @@ -70,6 +75,52 @@ describe('generateOpenApiDocument', () => { ) ).toMatchSnapshot(); }); + + it('handles recursive schemas', () => { + const id = 'recursive'; + const recursiveSchema: Type = schema.object( + { + name: schema.string(), + self: schema.lazy(id), + }, + { meta: { id } } + ); + expect( + generateOpenApiDocument( + { + routers: [ + createRouter({ + routes: [ + { + isVersioned: false, + path: '/recursive', + method: 'get', + validationSchemas: { + request: { + body: recursiveSchema, + }, + response: { + [200]: { + body: () => schema.string({ maxLength: 10, minLength: 1 }), + }, + }, + }, + options: { tags: ['foo'] }, + handler: jest.fn(), + }, + ], + }), + ], + versionedRouters: [], + }, + { + title: 'test', + baseUrl: 'https://test.oas', + version: '99.99.99', + } + ) + ).toMatchSnapshot(); + }); }); describe('unknown schema/validation', () => { diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts index 5933605768378..9e43b45ddc64c 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts @@ -6,11 +6,8 @@ * Side Public License, v 1. */ -import { schema, metaFields } from '@kbn/config-schema'; -import { set } from '@kbn/safer-lodash-set'; -import { omit } from 'lodash'; -import { OpenAPIV3 } from 'openapi-types'; -import { is, tryConvertToRef, isNullableObjectType } from './lib'; +import { schema } from '@kbn/config-schema'; +import { is, isNullableObjectType } from './lib'; describe('is', () => { test.each([ @@ -34,27 +31,6 @@ describe('is', () => { }); }); -test('tryConvertToRef', () => { - const schemaObject: OpenAPIV3.SchemaObject = { - type: 'object', - properties: { - a: { - type: 'string', - }, - }, - }; - set(schemaObject, metaFields.META_FIELD_X_OAS_REF_ID, 'foo'); - expect(tryConvertToRef(schemaObject)).toEqual({ - idSchema: ['foo', { type: 'object', properties: { a: { type: 'string' } } }], - ref: { - $ref: '#/components/schemas/foo', - }, - }); - - const schemaObject2 = omit(schemaObject, metaFields.META_FIELD_X_OAS_REF_ID); - expect(tryConvertToRef(schemaObject2)).toBeUndefined(); -}); - test('isNullableObjectType', () => { const any = schema.any({}); expect(isNullableObjectType(any.getSchema().describe())).toBe(false); diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts index f5ab73d69dc53..4c7f8c999cbf4 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts @@ -7,7 +7,7 @@ */ import joi from 'joi'; -import { isConfigSchema, Type, metaFields } from '@kbn/config-schema'; +import { isConfigSchema, Type } from '@kbn/config-schema'; import { get } from 'lodash'; import type { OpenAPIV3 } from 'openapi-types'; import type { KnownParameters } from '../../type'; @@ -16,38 +16,6 @@ import { parse } from './parse'; import { createCtx, IContext } from './post_process_mutations'; -export const getSharedComponentId = (schema: OpenAPIV3.SchemaObject) => { - if (metaFields.META_FIELD_X_OAS_REF_ID in schema) { - return schema[metaFields.META_FIELD_X_OAS_REF_ID] as string; - } -}; - -export const removeSharedComponentId = ( - schema: OpenAPIV3.SchemaObject & { [metaFields.META_FIELD_X_OAS_REF_ID]?: string } -) => { - const { [metaFields.META_FIELD_X_OAS_REF_ID]: id, ...rest } = schema; - return rest; -}; - -export const sharedComponentIdToRef = (id: string): OpenAPIV3.ReferenceObject => { - return { - $ref: `#/components/schemas/${id}`, - }; -}; - -type IdSchemaTuple = [id: string, schema: OpenAPIV3.SchemaObject]; - -export const tryConvertToRef = (schema: OpenAPIV3.SchemaObject) => { - const sharedId = getSharedComponentId(schema); - if (sharedId) { - const idSchema: IdSchemaTuple = [sharedId, removeSharedComponentId(schema)]; - return { - idSchema, - ref: sharedComponentIdToRef(sharedId), - }; - } -}; - const isObjectType = (schema: joi.Schema | joi.Description): boolean => { return schema.type === 'object'; }; @@ -100,8 +68,8 @@ export const unwrapKbnConfigSchema = (schema: unknown): joi.Schema => { export const convert = (kbnConfigSchema: unknown) => { const schema = unwrapKbnConfigSchema(kbnConfigSchema); - const { result, shared } = parse({ schema, ctx: createCtx({ refs: true }) }); - return { schema: result, shared: Object.fromEntries(shared.entries()) }; + const { result, shared } = parse({ schema, ctx: createCtx() }); + return { schema: result, shared }; }; const convertObjectMembersToParameterObjects = ( @@ -152,11 +120,11 @@ const convertObjectMembersToParameterObjects = ( export const convertQuery = (kbnConfigSchema: unknown) => { const schema = unwrapKbnConfigSchema(kbnConfigSchema); - const ctx = createCtx({ refs: false }); // For now context is not shared between body, params and queries + const ctx = createCtx(); const result = convertObjectMembersToParameterObjects(ctx, schema, {}, false); return { query: result, - shared: Object.fromEntries(ctx.sharedSchemas.entries()), + shared: ctx.getSharedSchemas(), }; }; @@ -172,7 +140,7 @@ export const convertPathParameters = ( const result = convertObjectMembersToParameterObjects(ctx, schema, knownParameters, true); return { params: result, - shared: Object.fromEntries(ctx.sharedSchemas.entries()), + shared: ctx.getSharedSchemas(), }; }; diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.test.ts new file mode 100644 index 0000000000000..7e9e8419d2869 --- /dev/null +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.test.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema } from '@kbn/config-schema'; +import { isJoiToJsonSpecialSchemas, joi2JsonInternal } from './parse'; + +describe('isJoiToJsonSpecialSchemas', () => { + test.each([ + [joi2JsonInternal(schema.object({ foo: schema.string() }).getSchema()), false], + [ + joi2JsonInternal( + schema.object({ foo: schema.string() }, { meta: { id: 'yes' } }).getSchema() + ), + true, + ], + [{}, false], + ])('correctly detects special schemas %#', (input, output) => { + expect(isJoiToJsonSpecialSchemas(input)).toBe(output); + }); +}); diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.ts index f25cc1a4c354a..dc2349f511a05 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/parse.ts @@ -9,6 +9,7 @@ import Joi from 'joi'; import joiToJsonParse from 'joi-to-json'; import type { OpenAPIV3 } from 'openapi-types'; +import { omit } from 'lodash'; import { createCtx, postProcessMutations } from './post_process_mutations'; import type { IContext } from './post_process_mutations'; @@ -17,13 +18,34 @@ interface ParseArgs { ctx?: IContext; } +export interface JoiToJsonReferenceObject extends OpenAPIV3.BaseSchemaObject { + schemas: { [id: string]: OpenAPIV3.SchemaObject }; +} + +type ParseResult = OpenAPIV3.SchemaObject | JoiToJsonReferenceObject; + +export const isJoiToJsonSpecialSchemas = ( + parseResult: ParseResult +): parseResult is JoiToJsonReferenceObject => { + return 'schemas' in parseResult; +}; + export const joi2JsonInternal = (schema: Joi.Schema) => { return joiToJsonParse(schema, 'open-api'); }; export const parse = ({ schema, ctx = createCtx() }: ParseArgs) => { - const parsed: OpenAPIV3.SchemaObject = joi2JsonInternal(schema); - postProcessMutations({ schema: parsed, ctx }); - const result = ctx.processRef(parsed); - return { shared: ctx.sharedSchemas, result }; + const parsed: ParseResult = joi2JsonInternal(schema); + let result: OpenAPIV3.SchemaObject; + if (isJoiToJsonSpecialSchemas(parsed)) { + Object.entries(parsed.schemas).forEach(([id, s]) => { + postProcessMutations({ schema: s, ctx }); + ctx.addSharedSchema(id, s); + }); + result = omit(parsed, 'schemas'); + } else { + result = parsed; + } + postProcessMutations({ schema: result, ctx }); + return { shared: ctx.getSharedSchemas(), result }; }; diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.test.ts index 16f499f48b371..3e2a8e62516c9 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.test.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.test.ts @@ -6,41 +6,22 @@ * Side Public License, v 1. */ -import { schema, metaFields } from '@kbn/config-schema'; +import { schema } from '@kbn/config-schema'; import { joi2JsonInternal } from '../parse'; import { createCtx } from './context'; -it('does not convert and record refs by default', () => { +it('records schemas as expected', () => { const ctx = createCtx(); - const obj = schema.object({}, { meta: { id: 'foo' } }); - const parsed = joi2JsonInternal(obj.getSchema()); - const result = ctx.processRef(parsed); - expect(result).toMatchObject({ type: 'object', properties: {} }); - expect(ctx.sharedSchemas.get('foo')).toBeUndefined(); - expect(metaFields.META_FIELD_X_OAS_REF_ID in result).toBe(false); -}); - -it('can convert and record refs', () => { - const ctx = createCtx({ refs: true }); - const obj = schema.object({}, { meta: { id: 'foo' } }); - const parsed = joi2JsonInternal(obj.getSchema()); - const result = ctx.processRef(parsed); - expect(result).toEqual({ $ref: '#/components/schemas/foo' }); - expect(ctx.sharedSchemas.get('foo')).toMatchObject({ type: 'object', properties: {} }); - expect(metaFields.META_FIELD_X_OAS_REF_ID in ctx.sharedSchemas.get('foo')!).toBe(false); -}); - -it('can use provided shared schemas Map', () => { - const myMap = new Map(); - const ctx = createCtx({ refs: true, sharedSchemas: myMap }); - const obj = schema.object({}, { meta: { id: 'foo' } }); - const parsed = joi2JsonInternal(obj.getSchema()); - ctx.processRef(parsed); + const objA = schema.object({}); + const objB = schema.object({}); + const a = joi2JsonInternal(objA.getSchema()); + const b = joi2JsonInternal(objB.getSchema()); - const obj2 = schema.object({}, { meta: { id: 'bar' } }); - const parsed2 = joi2JsonInternal(obj2.getSchema()); - ctx.processRef(parsed2); + ctx.addSharedSchema('a', a); + ctx.addSharedSchema('b', b); - expect(myMap.get('foo')).toMatchObject({ type: 'object', properties: {} }); - expect(myMap.get('bar')).toMatchObject({ type: 'object', properties: {} }); + expect(ctx.getSharedSchemas()).toMatchObject({ + a: { properties: {} }, + b: { properties: {} }, + }); }); diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.ts index 0ae440edc622e..2019d7d622481 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/context.ts @@ -7,42 +7,27 @@ */ import type { OpenAPIV3 } from 'openapi-types'; -import { processRef as processRefMutation } from './mutations/ref'; -import { removeSharedComponentId } from '../lib'; export interface IContext { - sharedSchemas: Map; - /** - * Attempt to convert a schema object to ref, my perform side-effect - * - * Will return the schema sans the ref meta ID if refs are disabled - * - * @note see also {@link Options['refs']} - */ - processRef: ( - schema: OpenAPIV3.SchemaObject - ) => OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject; + addSharedSchema: (id: string, schema: OpenAPIV3.SchemaObject) => void; + getSharedSchemas: () => { [id: string]: OpenAPIV3.SchemaObject }; } interface Options { sharedSchemas?: Map; - refs?: boolean; } class Context implements IContext { - readonly sharedSchemas: Map; - readonly refs: boolean; + private readonly sharedSchemas: Map; constructor(opts: Options) { this.sharedSchemas = opts.sharedSchemas ?? new Map(); - this.refs = !!opts.refs; } - public processRef( - schema: OpenAPIV3.SchemaObject - ): OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject { - if (this.refs) { - return processRefMutation(this, schema) ?? schema; - } - return removeSharedComponentId(schema); + public addSharedSchema(id: string, schema: OpenAPIV3.SchemaObject): void { + this.sharedSchemas.set(id, schema); + } + + public getSharedSchemas() { + return Object.fromEntries(this.sharedSchemas.entries()); } } 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 b58fbdf80de63..7d693f085ef17 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 @@ -10,9 +10,12 @@ import type { OpenAPIV3 } from 'openapi-types'; import * as mutations from './mutations'; import type { IContext } from './context'; import { isAnyType } from './mutations/utils'; +import { isReferenceObject } from '../../common'; + +type Schema = OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject; interface PostProcessMutationsArgs { - schema: OpenAPIV3.SchemaObject; + schema: Schema; ctx: IContext; } @@ -23,7 +26,9 @@ export const postProcessMutations = ({ ctx, schema }: PostProcessMutationsArgs) const arrayContainers: Array = ['allOf', 'oneOf', 'anyOf']; -const walkSchema = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { +const walkSchema = (ctx: IContext, schema: Schema): void => { + if (isReferenceObject(schema)) return; + if (isAnyType(schema)) { mutations.processAnyType(schema); return; @@ -41,7 +46,7 @@ const walkSchema = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { walkSchema(ctx, value as OpenAPIV3.SchemaObject); }); } - mutations.processObject(ctx, schema); + mutations.processObject(schema); } else if (type === 'string') { mutations.processString(schema); } else if (type === 'record') { @@ -57,7 +62,6 @@ const walkSchema = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { if (schema[arrayContainer]) { schema[arrayContainer].forEach((s: OpenAPIV3.SchemaObject, idx: number) => { walkSchema(ctx, s); - schema[arrayContainer][idx] = ctx.processRef(s); }); break; } diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.test.ts index cccd06855e8c4..392bca884e38e 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.test.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.test.ts @@ -15,18 +15,23 @@ test.each([ [ 'processMap', processMap, - schema.mapOf(schema.string(), schema.object({ a: schema.string() }, { meta: { id: 'myRef' } })), + schema.mapOf( + schema.string(), + schema.object({ a: schema.string() }, { meta: { id: 'myRef1' } }) + ), + 'myRef1', ], [ 'processRecord', processRecord, schema.recordOf( schema.string(), - schema.object({ a: schema.string() }, { meta: { id: 'myRef' } }) + schema.object({ a: schema.string() }, { meta: { id: 'myRef2' } }) ), + 'myRef2', ], -])('%p parses any additional properties specified', (_, processFn, obj) => { - const ctx = createCtx({ refs: true }); +])('%p parses any additional properties specified', (_, processFn, obj, refId) => { + const ctx = createCtx(); const parsed = joi2JsonInternal(obj.getSchema()); processFn(ctx, parsed); @@ -34,17 +39,19 @@ test.each([ expect(parsed).toEqual({ type: 'object', additionalProperties: { - $ref: '#/components/schemas/myRef', + $ref: `#/components/schemas/${refId}`, }, }); - expect(ctx.sharedSchemas.get('myRef')).toEqual({ - type: 'object', - additionalProperties: false, - properties: { - a: { - type: 'string', + expect(ctx.getSharedSchemas()).toEqual({ + [refId]: { + type: 'object', + additionalProperties: false, + properties: { + a: { + type: 'string', + }, }, + required: ['a'], }, - required: ['a'], }); }); 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 02dd08b928a54..0dd6cb5dc2f84 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 @@ -48,21 +48,11 @@ const processAdditionalProperties = (ctx: IContext, schema: OpenAPIV3.SchemaObje export const processRecord = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { schema.type = 'object'; processAdditionalProperties(ctx, schema); - if (schema.additionalProperties) { - schema.additionalProperties = ctx.processRef( - schema.additionalProperties as OpenAPIV3.SchemaObject - ); - } }; export const processMap = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { schema.type = 'object'; processAdditionalProperties(ctx, schema); - if (schema.additionalProperties) { - schema.additionalProperties = ctx.processRef( - schema.additionalProperties as OpenAPIV3.SchemaObject - ); - } }; export const processAllTypes = (schema: OpenAPIV3.SchemaObject): void => { diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.test.ts index ea54a04197277..fd7b127ef8726 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.test.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.test.ts @@ -8,7 +8,6 @@ import { schema } from '@kbn/config-schema'; import { joi2JsonInternal } from '../../parse'; -import { createCtx } from '../context'; import { processObject } from './object'; test.each([ @@ -41,36 +40,6 @@ test.each([ ], ])('processObject %#', (input, result) => { const parsed = joi2JsonInternal(input.getSchema()); - processObject(createCtx(), parsed); + processObject(parsed); expect(parsed).toEqual(result); }); - -test('refs', () => { - const fooSchema = schema.object({ n: schema.number() }, { meta: { id: 'foo' } }); - const barSchema = schema.object({ foo: fooSchema, s: schema.string() }); - const parsed = joi2JsonInternal(barSchema.getSchema()); - const ctx = createCtx({ refs: true }); - - // Simulate us walking the schema - processObject(ctx, parsed.properties.foo); - - processObject(ctx, parsed); - expect(parsed).toEqual({ - type: 'object', - additionalProperties: false, - properties: { - foo: { - $ref: '#/components/schemas/foo', - }, - s: { type: 'string' }, - }, - required: ['foo', 's'], - }); - expect(ctx.sharedSchemas.size).toBe(1); - expect(ctx.sharedSchemas.get('foo')).toEqual({ - type: 'object', - additionalProperties: false, - properties: { n: { type: 'number' } }, - required: ['n'], - }); -}); diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.ts index 70b9b2574615b..ec5888f986bd6 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/object.ts @@ -9,7 +9,6 @@ import type { OpenAPIV3 } from 'openapi-types'; import { metaFields } from '@kbn/config-schema'; import { deleteField, stripBadDefault } from './utils'; -import { IContext } from '../context'; const { META_FIELD_X_OAS_OPTIONAL } = metaFields; @@ -51,17 +50,8 @@ const removeNeverType = (schema: OpenAPIV3.SchemaObject): void => { } }; -const processObjectRefs = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { - if (schema.properties) { - Object.keys(schema.properties).forEach((key) => { - schema.properties![key] = ctx.processRef(schema.properties![key] as OpenAPIV3.SchemaObject); - }); - } -}; - -export const processObject = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { +export const processObject = (schema: OpenAPIV3.SchemaObject): void => { stripBadDefault(schema); removeNeverType(schema); populateRequiredFields(schema); - processObjectRefs(ctx, schema); }; diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/ref.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/ref.test.ts deleted file mode 100644 index 539e3cd339db6..0000000000000 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/ref.test.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 { schema } from '@kbn/config-schema'; -import { createCtx } from '../context'; -import { joi2JsonInternal } from '../../parse'; -import { processRef } from './ref'; - -test('create a new ref entry', () => { - const ctx = createCtx({ refs: true }); - const obj = schema.object({ a: schema.string() }, { meta: { id: 'id' } }); - const parsed = joi2JsonInternal(obj.getSchema()); - const result = processRef(ctx, parsed); - expect(result).toEqual({ - $ref: '#/components/schemas/id', - }); - expect(ctx.sharedSchemas.get('id')).toMatchObject({ - type: 'object', - properties: { - a: { - type: 'string', - }, - }, - }); -}); diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/ref.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/ref.ts deleted file mode 100644 index 4b36a0245e96d..0000000000000 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/ref.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { OpenAPIV3 } from 'openapi-types'; -import { tryConvertToRef } from '../../lib'; -import type { IContext } from '../context'; - -export const processRef = (ctx: IContext, schema: OpenAPIV3.SchemaObject) => { - const result = tryConvertToRef(schema); - if (result) { - const [id, s] = result.idSchema; - ctx.sharedSchemas.set(id, s); - return result.ref; - } -}; diff --git a/packages/kbn-router-to-openapispec/tsconfig.json b/packages/kbn-router-to-openapispec/tsconfig.json index 7977b83701cfd..b157378320c79 100644 --- a/packages/kbn-router-to-openapispec/tsconfig.json +++ b/packages/kbn-router-to-openapispec/tsconfig.json @@ -17,6 +17,5 @@ "@kbn/core-http-router-server-internal", "@kbn/config-schema", "@kbn/core-http-server", - "@kbn/safer-lodash-set", ] } diff --git a/packages/kbn-search-errors/src/create_es_error.ts b/packages/kbn-search-errors/src/create_es_error.ts index ffde06eb728f7..b29dfc773d7a6 100644 --- a/packages/kbn-search-errors/src/create_es_error.ts +++ b/packages/kbn-search-errors/src/create_es_error.ts @@ -9,7 +9,7 @@ import { estypes } from '@elastic/elasticsearch'; import { i18n } from '@kbn/i18n'; import type { ApplicationStart, CoreStart } from '@kbn/core/public'; -import type { DataView } from '@kbn/data-views-plugin/common'; +import type { AbstractDataView } from '@kbn/data-views-plugin/common'; import { IEsError } from './types'; import { EsError } from './es_error'; import { PainlessError } from './painless_error'; @@ -34,7 +34,7 @@ export function createEsError( err: IEsError, openInInspector: () => void, services: Services, - dataView?: DataView + dataView?: AbstractDataView ) { const rootCauses = err.attributes?.error ? getNestedCauses(err.attributes?.error) : []; diff --git a/packages/kbn-search-errors/src/painless_error.tsx b/packages/kbn-search-errors/src/painless_error.tsx index 79fd737f055ab..223dd0b85c98c 100644 --- a/packages/kbn-search-errors/src/painless_error.tsx +++ b/packages/kbn-search-errors/src/painless_error.tsx @@ -11,21 +11,21 @@ import { estypes } from '@elastic/elasticsearch'; import type { ApplicationStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiSpacer, EuiText, EuiCodeBlock } from '@elastic/eui'; -import type { DataView } from '@kbn/data-views-plugin/common'; +import type { AbstractDataView } from '@kbn/data-views-plugin/common'; import type { IEsError } from './types'; import { EsError } from './es_error'; export class PainlessError extends EsError { private readonly applicationStart: ApplicationStart; private readonly painlessCause: estypes.ErrorCause; - private readonly dataView?: DataView; + private readonly dataView?: AbstractDataView; constructor( err: IEsError, openInInspector: () => void, painlessCause: estypes.ErrorCause, applicationStart: ApplicationStart, - dataView?: DataView + dataView?: AbstractDataView ) { super( err, diff --git a/packages/kbn-search-types/src/types.ts b/packages/kbn-search-types/src/types.ts index 05afdc6a06d4c..e8ac8c3bfeade 100644 --- a/packages/kbn-search-types/src/types.ts +++ b/packages/kbn-search-types/src/types.ts @@ -10,7 +10,7 @@ import { estypes } from '@elastic/elasticsearch'; import type { ConnectionRequestParams } from '@elastic/transport'; import type { TransportRequestOptions } from '@elastic/elasticsearch'; import type { KibanaExecutionContext } from '@kbn/core/public'; -import type { DataView } from '@kbn/data-views-plugin/common'; +import type { AbstractDataView } from '@kbn/data-views-plugin/common'; import { Observable } from 'rxjs'; import { IEsSearchRequest, IEsSearchResponse } from './es_search_types'; import { IKibanaSearchRequest, IKibanaSearchResponse } from './kibana_search_types'; @@ -106,7 +106,7 @@ export interface ISearchOptions { /** * Index pattern reference is used for better error messages */ - indexPattern?: DataView; + indexPattern?: AbstractDataView; /** * TransportRequestOptions, other than `signal`, to pass through to the ES client. diff --git a/packages/kbn-text-based-editor/src/helpers.ts b/packages/kbn-text-based-editor/src/helpers.ts index d8f4fac7f51a2..d2a429a6e0b1d 100644 --- a/packages/kbn-text-based-editor/src/helpers.ts +++ b/packages/kbn-text-based-editor/src/helpers.ts @@ -228,3 +228,11 @@ export const clearCacheWhenOld = (cache: MapCache, esqlQuery: string) => { } } }; + +export const getESQLSources = async (dataViews: DataViewsPublicPluginStart) => { + const [remoteIndices, localIndices] = await Promise.all([ + getRemoteIndicesList(dataViews), + getIndicesList(dataViews), + ]); + return [...localIndices, ...remoteIndices]; +}; 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 fd20d9c2b25ca..5c72ddce40555 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 @@ -50,9 +50,8 @@ import { type MonacoMessage, getWrappedInPipesCode, parseErrors, - getIndicesList, - getRemoteIndicesList, clearCacheWhenOld, + getESQLSources, } from './helpers'; import { EditorFooter } from './editor_footer'; import { ResizableButton } from './resizable_button'; @@ -183,6 +182,23 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); const [isQueryLoading, setIsQueryLoading] = useState(true); + + const editorShouldNotValidate = useMemo(() => { + return ( + isLoading || + isDisabled || + Boolean(!isCompactFocused && codeOneLiner && codeOneLiner.includes('...')) || + Boolean(!isCodeEditorExpandedFocused && queryString === '') + ); + }, [ + codeOneLiner, + isCodeEditorExpandedFocused, + isCompactFocused, + isDisabled, + isLoading, + queryString, + ]); + const [abortController, setAbortController] = useState(new AbortController()); // contains both client side validation and server messages const [editorMessages, setEditorMessages] = useState<{ @@ -359,14 +375,24 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ return { cache: fn.cache, memoizedFieldsFromESQL: fn }; }, []); + const { cache: dataSourcesCache, memoizedSources } = useMemo(() => { + const fn = memoize( + (...args: [DataViewsPublicPluginStart]) => ({ + timestamp: Date.now(), + result: getESQLSources(...args), + }), + ({ esql }) => esql + ); + + return { cache: fn.cache, memoizedSources: fn }; + }, []); + const esqlCallbacks: ESQLCallbacks = useMemo(() => { const callbacks: ESQLCallbacks = { getSources: async () => { - const [remoteIndices, localIndices] = await Promise.all([ - getRemoteIndicesList(dataViews), - getIndicesList(dataViews), - ]); - return [...localIndices, ...remoteIndices]; + clearCacheWhenOld(dataSourcesCache, queryString); + const sources = await memoizedSources(dataViews).result; + return sources; }, getFieldsFor: async ({ query: queryToExecute }: { query?: string } | undefined = {}) => { if (queryToExecute) { @@ -390,7 +416,6 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } return []; }, - getMetaFields: async () => ['_version', '_id', '_index', '_source'], getPolicies: async () => { const { data: policies, error } = (await indexManagementApiService?.getAllEnrichPolicies()) || {}; @@ -402,12 +427,15 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ }; return callbacks; }, [ + queryString, + memoizedSources, + dataSourcesCache, dataViews, - expressions, - indexManagementApiService, esqlFieldsCache, memoizedFieldsFromESQL, + expressions, abortController, + indexManagementApiService, ]); const parseMessages = useCallback(async () => { @@ -451,9 +479,16 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [clientParserMessages, isLoading, isQueryLoading, parseMessages, queryString, timeZone]); + useEffect(() => { + if (code === '') { + setEditorMessages({ errors: [], warnings: [] }); + } + }, [code]); + const queryValidation = useCallback( async ({ active }: { active: boolean }) => { - if (!editorModel.current || language !== 'esql' || editorModel.current.isDisposed()) return; + if (!editorModel.current || language !== 'esql' || editorModel.current.isDisposed() || !code) + return; monaco.editor.setModelMarkers(editorModel.current, 'Unified search', []); const { warnings: parserWarnings, errors: parserErrors } = await parseMessages(); const markers = []; @@ -467,12 +502,12 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ return; } }, - [language, parseMessages] + [code, language, parseMessages] ); useDebounceWithOptions( async () => { - if (!editorModel.current) return; + if (!editorModel.current || editorShouldNotValidate) return; const subscription = { active: true }; if (code === codeWhenSubmitted && (serverErrors || serverWarning)) { const parsedErrors = parseErrors(serverErrors || [], code); @@ -642,10 +677,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ lightbulb: { enabled: false, }, - readOnly: - isLoading || - isDisabled || - Boolean(!isCompactFocused && codeOneLiner && codeOneLiner.includes('...')), + readOnly: editorShouldNotValidate, }; if (isCompactFocused) { diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.test.ts b/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.test.ts deleted file mode 100644 index a0efbaf8de869..0000000000000 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { DataViewField, DataView } from '@kbn/data-views-plugin/public'; -import type { Action, UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { canCategorize } from './categorize_trigger_utils'; - -const textField = { - name: 'fieldName', - type: 'string', - esTypes: ['text'], - count: 1, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - visualizable: true, -} as DataViewField; - -const numberField = { - name: 'fieldName', - type: 'number', - esTypes: ['double'], - count: 1, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - visualizable: true, -} as DataViewField; - -const mockGetActions = jest.fn>>, [string, { fieldName: string }]>( - () => Promise.resolve([]) -); - -const uiActions = { - getTriggerCompatibleActions: mockGetActions, -} as unknown as UiActionsStart; - -const action: Action = { - id: 'action', - type: 'CATEGORIZE_FIELD', - getIconType: () => undefined, - getDisplayName: () => 'Action', - isCompatible: () => Promise.resolve(true), - execute: () => Promise.resolve(), -}; - -const dataViewMock = { id: '1', toSpec: () => ({}), isTimeBased: () => true } as DataView; - -describe('categorize_trigger_utils', () => { - afterEach(() => { - mockGetActions.mockReset(); - }); - - describe('getCategorizeInformation', () => { - it('should return true for a categorizable field with an action', async () => { - mockGetActions.mockResolvedValue([action]); - const resp = await canCategorize(uiActions, textField, dataViewMock); - expect(resp).toBe(true); - }); - - it('should return false for a non-categorizable field with an action', async () => { - mockGetActions.mockResolvedValue([action]); - const resp = await canCategorize(uiActions, numberField, dataViewMock); - expect(resp).toBe(false); - }); - }); -}); diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts b/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts deleted file mode 100644 index 007a88b2c7f97..0000000000000 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { CATEGORIZE_FIELD_TRIGGER, type CategorizeFieldContext } from '@kbn/ml-ui-actions'; -import type { DataViewField, DataView } from '@kbn/data-views-plugin/public'; - -async function getCompatibleActions( - uiActions: UiActionsStart, - field: DataViewField, - dataView: DataView, - trigger: typeof CATEGORIZE_FIELD_TRIGGER -) { - const compatibleActions = await uiActions.getTriggerCompatibleActions(trigger, { - dataView, - field, - }); - return compatibleActions; -} - -export function triggerCategorizeActions( - uiActions: UiActionsStart, - field: DataViewField, - originatingApp: string, - dataView?: DataView -) { - if (!dataView) return; - const triggerOptions: CategorizeFieldContext = { - dataView, - field, - originatingApp, - }; - uiActions.getTrigger(CATEGORIZE_FIELD_TRIGGER).exec(triggerOptions); -} - -export async function canCategorize( - uiActions: UiActionsStart, - field: DataViewField, - dataView: DataView | undefined -): Promise { - if ( - field.name === '_id' || - !dataView?.id || - !dataView.isTimeBased() || - !field.esTypes?.includes('text') - ) { - return false; - } - - const actions = await getCompatibleActions(uiActions, field, dataView, CATEGORIZE_FIELD_TRIGGER); - - return actions.length > 0; -} diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx b/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx deleted file mode 100644 index 45569b3443370..0000000000000 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { act } from 'react-dom/test-utils'; -import { ReactWrapper } from 'enzyme'; -import { EuiButton } from '@elastic/eui'; -import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/data_view.stub'; -import { ActionInternal } from '@kbn/ui-actions-plugin/public'; -import { uiActionsPluginMock } from '@kbn/ui-actions-plugin/public/mocks'; -import { getFieldCategorizeButton } from './field_categorize_button'; -import { - CATEGORIZE_FIELD_TRIGGER, - ACTION_CATEGORIZE_FIELD, - type CategorizeFieldContext, -} from '@kbn/ml-ui-actions'; -import { TriggerContract } from '@kbn/ui-actions-plugin/public/triggers'; - -const ORIGINATING_APP = 'test'; -const mockExecuteAction = jest.fn(); -const uiActions = uiActionsPluginMock.createStartContract(); -const categorizeAction = new ActionInternal({ - type: ACTION_CATEGORIZE_FIELD, - id: ACTION_CATEGORIZE_FIELD, - getDisplayName: () => 'test', - isCompatible: async () => true, - execute: async (context: CategorizeFieldContext) => { - mockExecuteAction(context); - }, - getHref: async () => '/app/test', -}); - -jest - .spyOn(uiActions, 'getTriggerCompatibleActions') - .mockResolvedValue([categorizeAction as ActionInternal]); -jest.spyOn(uiActions, 'getTrigger').mockReturnValue({ - id: ACTION_CATEGORIZE_FIELD, - exec: mockExecuteAction, -} as unknown as TriggerContract); - -describe('UnifiedFieldList ', () => { - it('should render correctly', async () => { - const fieldName = 'extension'; - const field = dataView.fields.find((f) => f.name === fieldName)!; - let wrapper: ReactWrapper; - - const button = await getFieldCategorizeButton({ - field, - dataView, - originatingApp: ORIGINATING_APP, - uiActions, - }); - await act(async () => { - wrapper = await mountWithIntl(button!); - }); - - await wrapper!.update(); - - expect(uiActions.getTriggerCompatibleActions).toHaveBeenCalledWith(CATEGORIZE_FIELD_TRIGGER, { - dataView, - field, - }); - - expect(wrapper!.text()).toBe('Run pattern analysis'); - wrapper!.find(`button[data-test-subj="fieldCategorize-${fieldName}"]`).simulate('click'); - - expect(mockExecuteAction).toHaveBeenCalledWith({ - dataView, - field, - originatingApp: ORIGINATING_APP, - }); - - expect(wrapper!.find(EuiButton).exists()).toBeTruthy(); - }); - - it('should not render for non text field', async () => { - const fieldName = 'phpmemory'; - const field = dataView.fields.find((f) => f.name === fieldName)!; - - const button = await getFieldCategorizeButton({ - field, - dataView, - originatingApp: ORIGINATING_APP, - uiActions, - }); - - expect(button).toBe(null); - }); -}); diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.tsx b/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.tsx deleted file mode 100644 index 5914c330f6661..0000000000000 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.tsx +++ /dev/null @@ -1,58 +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 React from 'react'; -import { EuiButtonProps } from '@elastic/eui'; -import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; -import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; -import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; -import { FieldCategorizeButtonInner } from './field_categorize_button_inner'; -import { triggerCategorizeActions, canCategorize } from './categorize_trigger_utils'; - -export interface FieldCategorizeButtonProps { - field: DataViewField; - dataView: DataView; - originatingApp: string; // plugin id - uiActions: UiActionsStart; - contextualFields?: string[]; // names of fields which were also selected (like columns in Discover grid) - trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; - buttonProps?: Partial; - closePopover?: () => void; -} - -export const FieldCategorizeButton: React.FC = React.memo( - ({ field, dataView, trackUiMetric, originatingApp, uiActions, buttonProps, closePopover }) => { - const handleVisualizeLinkClick = async ( - event: React.MouseEvent - ) => { - // regular link click. let the uiActions code handle the navigation and show popup if needed - event.preventDefault(); - const triggerVisualization = (updatedDataView: DataView) => { - trackUiMetric?.(METRIC_TYPE.CLICK, 'categorize_link_click'); - triggerCategorizeActions(uiActions, field, originatingApp, updatedDataView); - }; - triggerVisualization(dataView); - if (closePopover) { - closePopover(); - } - }; - - return ( - - ); - } -); - -export async function getFieldCategorizeButton(props: FieldCategorizeButtonProps) { - const showButton = await canCategorize(props.uiActions, props.field, props.dataView); - return showButton ? : null; -} diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button_inner.tsx b/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button_inner.tsx deleted file mode 100644 index 8571822dcd8e9..0000000000000 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button_inner.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { EuiButton, EuiButtonProps } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; - -interface FieldVisualizeButtonInnerProps { - fieldName: string; - handleVisualizeLinkClick: (event: React.MouseEvent) => void; - buttonProps?: Partial; -} - -export const FieldCategorizeButtonInner: React.FC = ({ - fieldName, - handleVisualizeLinkClick, - buttonProps, -}) => { - return ( - <> - - - - - ); -}; diff --git a/packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx b/packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx index bde3120708ef6..95378ba8b327b 100644 --- a/packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx +++ b/packages/kbn-unified-field-list/src/components/field_popover/field_popover_footer.tsx @@ -7,16 +7,14 @@ */ import React, { useEffect, useState } from 'react'; -import { EuiPopoverFooter, EuiSpacer } from '@elastic/eui'; +import { EuiPopoverFooter } from '@elastic/eui'; import { type FieldVisualizeButtonProps, getFieldVisualizeButton } from '../field_visualize_button'; -import { FieldCategorizeButtonProps, getFieldCategorizeButton } from '../field_categorize_button'; import { ErrorBoundary } from '../error_boundary'; -export type FieldPopoverFooterProps = FieldVisualizeButtonProps | FieldCategorizeButtonProps; +export type FieldPopoverFooterProps = FieldVisualizeButtonProps; const FieldPopoverFooterComponent: React.FC = (props) => { const [visualizeButton, setVisualizeButton] = useState(null); - const [categorizeButton, setCategorizeButton] = useState(null); useEffect(() => { getFieldVisualizeButton(props) @@ -25,21 +23,9 @@ const FieldPopoverFooterComponent: React.FC = (props) = // eslint-disable-next-line no-console console.error(error); }); - getFieldCategorizeButton(props) - .then(setCategorizeButton) - .catch((error) => { - // eslint-disable-next-line no-console - console.error(error); - }); }, [props]); - return visualizeButton || categorizeButton ? ( - - {visualizeButton} - {visualizeButton && categorizeButton ? : null} - {categorizeButton} - - ) : null; + return visualizeButton ? {visualizeButton} : null; }; export const FieldPopoverFooter: React.FC = (props) => { diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx index 409184c4d8e04..d9e02d423cd9e 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx @@ -309,7 +309,6 @@ function UnifiedFieldListItemComponent({ contextualFields={workspaceSelectedFieldNames} originatingApp={stateService.creationOptions.originatingApp} uiActions={services.uiActions} - closePopover={() => closePopover()} /> )} diff --git a/packages/kbn-unified-field-list/src/services/field_stats_text_based/load_field_stats_text_based.ts b/packages/kbn-unified-field-list/src/services/field_stats_text_based/load_field_stats_text_based.ts index 482bf9484b67b..a1a61d14f24c1 100644 --- a/packages/kbn-unified-field-list/src/services/field_stats_text_based/load_field_stats_text_based.ts +++ b/packages/kbn-unified-field-list/src/services/field_stats_text_based/load_field_stats_text_based.ts @@ -6,13 +6,10 @@ * Side Public License, v 1. */ -import { lastValueFrom } from 'rxjs'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; -import type { IKibanaSearchResponse, IKibanaSearchRequest } from '@kbn/search-types'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import type { ESQLSearchParams, ESQLSearchReponse } from '@kbn/es-types'; import type { AggregateQuery } from '@kbn/es-query'; -import { ESQL_LATEST_VERSION, getESQLWithSafeLimit } from '@kbn/esql-utils'; +import { getESQLWithSafeLimit, getESQLResults } from '@kbn/esql-utils'; import type { FieldStatsResponse } from '../../types'; import { buildSearchFilter, @@ -63,27 +60,15 @@ export const loadFieldStatsTextBased: LoadFieldStatsTextBasedHandler = async ({ return {}; } - const searchHandler: SearchHandlerTextBased = async (body) => { + const searchHandler: SearchHandlerTextBased = async ({ query }) => { const filter = buildSearchFilter({ timeFieldName: dataView.timeFieldName, fromDate, toDate }); - const result = await lastValueFrom( - data.search.search< - IKibanaSearchRequest, - IKibanaSearchResponse - >( - { - params: { - ...(filter ? { filter } : {}), - ...body, - version: ESQL_LATEST_VERSION, - }, - }, - { - abortSignal: abortController?.signal, - strategy: 'esql', - } - ) - ); - return result.rawResponse; + const result = await getESQLResults({ + esqlQuery: query, + filter, + search: data.search.search, + signal: abortController?.signal, + }); + return result.response; }; if (!('esql' in baseQuery)) { diff --git a/packages/kbn-unified-field-list/tsconfig.json b/packages/kbn-unified-field-list/tsconfig.json index 6dc268783d89a..acad1797d26ff 100644 --- a/packages/kbn-unified-field-list/tsconfig.json +++ b/packages/kbn-unified-field-list/tsconfig.json @@ -31,7 +31,6 @@ "@kbn/ebt-tools", "@kbn/shared-ux-button-toolbar", "@kbn/field-utils", - "@kbn/ml-ui-actions", "@kbn/visualization-utils", "@kbn/esql-utils", "@kbn/search-types" diff --git a/packages/presentation/presentation_publishing/index.ts b/packages/presentation/presentation_publishing/index.ts index 7a940bc46806f..d1c3132e86c9f 100644 --- a/packages/presentation/presentation_publishing/index.ts +++ b/packages/presentation/presentation_publishing/index.ts @@ -39,6 +39,7 @@ export { apiPublishesTimeRange, apiPublishesUnifiedSearch, apiPublishesWritableUnifiedSearch, + useSearchApi, type PublishesTimeRange, type PublishesUnifiedSearch, type PublishesWritableUnifiedSearch, diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts index 8aef4ceee6c30..5f349665fa36b 100644 --- a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts +++ b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts @@ -6,7 +6,9 @@ * Side Public License, v 1. */ +import { BehaviorSubject } from 'rxjs'; import { TimeRange, Filter, Query, AggregateQuery } from '@kbn/es-query'; +import { useEffect, useMemo } from 'react'; import { PublishingSubject } from '../../publishing_subject'; export interface PublishesTimeRange { @@ -68,3 +70,40 @@ export const apiPublishesWritableUnifiedSearch = ( typeof (unknownApi as PublishesWritableUnifiedSearch).setQuery === 'function' ); }; + +/** + * React hook that converts search props into search observable API + */ +export function useSearchApi({ + filters, + query, + timeRange, +}: { + filters?: Filter[]; + query?: Query | AggregateQuery; + timeRange?: TimeRange; +}) { + const searchApi = useMemo(() => { + return { + filters$: new BehaviorSubject(filters), + query$: new BehaviorSubject(query), + timeRange$: new BehaviorSubject(timeRange), + }; + // filters, query, timeRange only used as initial values. Changes do not effect memoized value + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + searchApi.filters$.next(filters); + }, [filters, searchApi.filters$]); + + useEffect(() => { + searchApi.query$.next(query); + }, [query, searchApi.query$]); + + useEffect(() => { + searchApi.timeRange$.next(timeRange); + }, [timeRange, searchApi.timeRange$]); + + return searchApi; +} diff --git a/packages/serverless/settings/observability_project/index.ts b/packages/serverless/settings/observability_project/index.ts index e9b5ceeee5eed..58be247f0ff8a 100644 --- a/packages/serverless/settings/observability_project/index.ts +++ b/packages/serverless/settings/observability_project/index.ts @@ -28,6 +28,7 @@ export const OBSERVABILITY_PROJECT_SETTINGS = [ settings.OBSERVABILITY_ENABLE_AWS_LAMBDA_METRICS_ID, settings.OBSERVABILITY_APM_ENABLE_CRITICAL_PATH_ID, settings.OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID, + settings.OBSERVABILITY_ENABLE_INFRASTRUCTURE_CONTAINER_ASSET_VIEW_ID, settings.OBSERVABILITY_ENABLE_INFRASTRUCTURE_ASSET_CUSTOM_DASHBOARDS_ID, settings.OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID, settings.OBSERVABILITY_APM_ENABLE_TABLE_SEARCH_BAR, diff --git a/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx index 3a9fb5177135b..36e275ced131b 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx +++ b/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx @@ -135,6 +135,40 @@ describe('builds navigation tree', () => { } }); + test('should allow custom onClick handler for links', async () => { + const navigateToUrl = jest.fn(); + const onClick = jest.fn(); + + const node: ChromeProjectNavigationNode = { + id: 'group1', + title: 'Group 1', + path: 'group1', + defaultIsCollapsed: false, + children: [ + { + id: 'item1', + title: 'Item 1', + href: 'https://foo', + path: 'group1.item1', + onClick, + }, + ], + }; + + const { findByTestId } = renderNavigation({ + navTreeDef: of({ + body: [node], + }), + services: { navigateToUrl }, + }); + + const navItem = await findByTestId(/nav-item-group1.item1\s/); + navItem.click(); + + expect(navigateToUrl).not.toHaveBeenCalled(); + expect(onClick).toHaveBeenCalledWith(expect.objectContaining({ type: 'click' })); + }); + test('should not render the group if it does not have children', async () => { const navTree: NavigationTreeDefinitionUI = { body: [ diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx index fe921f6bd0b73..1fc4601b50b91 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx @@ -33,6 +33,7 @@ type EuiCollapsibleNavSubItemPropsEnhanced = EuiCollapsibleNavSubItemProps & { p const DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS: EuiThemeSize = 'm'; const DEFAULT_IS_COLLAPSED = true; const DEFAULT_IS_COLLAPSIBLE = true; +const DEFAULT_RENDER_AS: RenderAs = 'block'; const nodeHasLink = (navNode: ChromeProjectNavigationNode) => Boolean(navNode.deepLink) || Boolean(navNode.href); @@ -62,7 +63,7 @@ const itemIsVisible = (item: ChromeProjectNavigationNode) => { const getRenderAs = (navNode: ChromeProjectNavigationNode): RenderAs => { if (navNode.renderAs) return navNode.renderAs; if (!navNode.children) return 'item'; - return 'block'; + return DEFAULT_RENDER_AS; }; const getTestSubj = (navNode: ChromeProjectNavigationNode, isActive = false): string => { @@ -155,6 +156,12 @@ const renderGroup = ( return [itemPrepend, ...groupItems]; }; +const isAccordionNode = ( + node: Pick +) => + node.renderAs === 'accordion' || + ['defaultIsCollapsed', 'isCollapsible'].some((prop) => node.hasOwnProperty(prop)); + // Generate the EuiCollapsible props for both the root component (EuiCollapsibleNavItem) and its // "items" props. Both are compatible with the exception of "renderItem" which is only used for // sub items. @@ -182,15 +189,30 @@ const nodeToEuiCollapsibleNavProps = ( isVisible: boolean; } => { const { navNode, isItem, hasChildren, hasLink } = serializeNavNode(_navNode); - const isActive = isActiveFromUrl(navNode.path, activeNodes); - - const { id, path, href, renderAs, isCollapsible = DEFAULT_IS_COLLAPSIBLE } = navNode; + const { + id, + path, + href, + renderAs, + onClick: customOnClick, + isCollapsible = DEFAULT_IS_COLLAPSIBLE, + } = navNode; + const isAccordion = isAccordionNode(navNode); + + // If the node is an accordion and it is not collapsible, we only want to mark it as active + // if it is the highest match in the URL, not if one of its children is also active. + const onlyIfHighestMatch = isAccordion && !isCollapsible; + const isActive = isActiveFromUrl(navNode.path, activeNodes, onlyIfHighestMatch); const isExternal = Boolean(href) && !navNode.isElasticInternalLink && isAbsoluteLink(href!); - - const isAccordion = hasChildren && !isItem; const isAccordionExpanded = (itemsAccordionState[path]?.isCollapsed ?? DEFAULT_IS_COLLAPSED) === false; - const isSelected = isAccordion && isAccordionExpanded ? false : isActive; + let isSelected = isActive; + + if (isAccordion && isAccordionExpanded) { + // For accordions that are collapsible, we don't want to mark the parent button as selected + // when it is expanded. If the accordion is **not** collapsible then we do. + isSelected = isCollapsible ? false : isActive; + } const dataTestSubj = getTestSubj(navNode, isSelected); @@ -221,7 +243,12 @@ const nodeToEuiCollapsibleNavProps = ( return { items, isVisible: true }; } - const onClick = (e: React.MouseEvent) => { + const onClick = (e: React.MouseEvent) => { + if (customOnClick) { + customOnClick(e); + return; + } + // Do not navigate if it is a collapsible accordion, link will be used in the breadcrumb if (isAccordion && isCollapsible) return; @@ -258,12 +285,14 @@ const nodeToEuiCollapsibleNavProps = ( ? { href, external: isExternal, - onClick: (e: React.MouseEvent) => { - // TODO: here we might want to toggle the accordion (if we "renderAs: 'accordion'") - // Will be done in following PR - e.preventDefault(); - e.stopPropagation(); + onClick: (e) => { + if (customOnClick) { + customOnClick(e); + return; + } + if (href) { + e.preventDefault(); navigateToUrl(href); } }, @@ -345,7 +374,14 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) const { activeNodes } = useNavigation(); const { navigateToUrl, isSideNavCollapsed } = useServices(); - const { navNode } = useMemo(() => serializeNavNode(_navNode), [_navNode]); + const { navNode } = useMemo( + () => + serializeNavNode({ + renderAs: 'accordion', // Top level nodes are always rendered as accordion + ..._navNode, + }), + [_navNode] + ); const { open: openPanel, close: closePanel } = usePanel(); const navNodesById = useMemo(() => { @@ -367,7 +403,7 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) const [itemsAccordionState, setItemsAccordionState] = useState(() => { return Object.entries(navNodesById).reduce((acc, [_id, node]) => { - if (node.children) { + if (isAccordionNode(node)) { let isCollapsed = DEFAULT_IS_COLLAPSED; let doCollapseFromActiveState = true; @@ -382,6 +418,7 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) doCollapseFromActiveState, }; } + return acc; }, {}); }); @@ -390,14 +427,20 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) const toggleAccordion = useCallback((id: string) => { setItemsAccordionState((prev) => { - // if (prev[id]?.isCollapsed === undefined) return prev; - const prevValue = prev[id]?.isCollapsed ?? DEFAULT_IS_COLLAPSED; + const prevState = prev[id]; + const prevValue = prevState?.isCollapsed ?? DEFAULT_IS_COLLAPSED; + const { isCollapsible } = prevState; return { ...prev, [id]: { ...prev[id], isCollapsed: !prevValue, - doCollapseFromActiveState: false, // once we manually toggle we don't want to auto-close it when URL changes + doCollapseFromActiveState: isCollapsible + ? // if the accordion is collapsible & the user has interacted with the accordion + // we don't want to auto-close it when URL changes to not interfere with the user's choice + false + : // if the accordion is **not** collapsible we do want to auto-close it when the URL changes + prevState.doCollapseFromActiveState, }, }; }); @@ -421,13 +464,16 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) 'data-test-subj': classNames(`accordionArrow`, `accordionArrow-${id}`), }; - const updated: Partial = { + const updated: Partial = { ..._accordionProps, arrowProps, + isCollapsible, forceState, - onToggle: () => { - toggleAccordion(id); - }, + onToggle: isCollapsible + ? () => { + toggleAccordion(id); + } + : undefined, }; return updated; @@ -473,8 +519,7 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) const prevState = prev[_id]; if ( - node.children && - node.renderAs !== 'item' && + isAccordionNode(node) && (!prevState || prevState.doCollapseFromActiveState === true) ) { let nextIsActive = false; @@ -523,7 +568,10 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) items: serializeAccordionItems(item.items), accordionProps: item.items !== undefined - ? getAccordionProps(item.path ?? item.id!, item.accordionProps) + ? getAccordionProps(item.path ?? item.id!, { + onClick: item.onClick, + ...item.accordionProps, + }) : undefined, }; return parsed; diff --git a/packages/shared-ux/chrome/navigation/src/utils.test.ts b/packages/shared-ux/chrome/navigation/src/utils.test.ts new file mode 100644 index 0000000000000..3f73204c5a032 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/utils.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { isActiveFromUrl } from './utils'; + +describe('isActiveFromUrl()', () => { + test('returns true if the nodePath is active', () => { + const nodePath = 'path'; + const activeNodes = [[{ id: 'path', title: '', path: 'path' }]]; + expect(isActiveFromUrl(nodePath, activeNodes)).toBe(true); + }); + + test('returns true if the nodePath is active anywhere in the full path', () => { + const activeNodes = [ + [ + { id: 'path', title: '', path: 'parent' }, + { id: 'child', title: '', path: 'child' }, + ], + ]; + expect(isActiveFromUrl('parent', activeNodes)).toBe(true); // both parent + expect(isActiveFromUrl('child', activeNodes)).toBe(true); // and child are active + }); + + test('returns true only if the nodePath is highest match', () => { + const activeNodes = [ + [ + { id: 'path', title: '', path: 'parent' }, + { id: 'child', title: '', path: 'child' }, + ], + ]; + expect(isActiveFromUrl('parent', activeNodes, true)).toBe(false); // not parent + expect(isActiveFromUrl('child', activeNodes, true)).toBe(true); // and child are active + }); +}); diff --git a/packages/shared-ux/chrome/navigation/src/utils.ts b/packages/shared-ux/chrome/navigation/src/utils.ts index aa783235a6842..5b070c55176f0 100644 --- a/packages/shared-ux/chrome/navigation/src/utils.ts +++ b/packages/shared-ux/chrome/navigation/src/utils.ts @@ -19,8 +19,23 @@ function isSamePath(pathA: string | null, pathB: string | null) { return pathA === pathB; } -export function isActiveFromUrl(nodePath: string, activeNodes: ChromeProjectNavigationNode[][]) { +/** + * Predicate to check if a nodePath is active + * + * @param nodePath The path of the node to check + * @param activeNodes The active nodes to check against + * @param onlyIfHighestMatch Flag to indicate if we should only return true if the nodePath is the highest match + * @returns Boolean indicating if the nodePath is active + */ +export function isActiveFromUrl( + nodePath: string, + activeNodes: ChromeProjectNavigationNode[][], + onlyIfHighestMatch = false +) { return activeNodes.reduce((acc, nodesBranch) => { - return acc === true ? acc : nodesBranch.some((branch) => isSamePath(branch.path, nodePath)); + if (acc === true) return true; + return onlyIfHighestMatch + ? isSamePath(nodesBranch[nodesBranch.length - 1].path, nodePath) + : nodesBranch.some((branch) => isSamePath(branch.path, nodePath)); }, false); } diff --git a/packages/solution-nav/es/README.md b/packages/solution-nav/es/README.md deleted file mode 100644 index 02c517e04ced5..0000000000000 --- a/packages/solution-nav/es/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @kbn/solution-nav-es - -## This package contains the navigation definition for the Search solution in Kibana stateful. diff --git a/packages/solution-nav/es/definition.ts b/packages/solution-nav/es/definition.ts deleted file mode 100644 index 5ab4bb39c8a12..0000000000000 --- a/packages/solution-nav/es/definition.ts +++ /dev/null @@ -1,283 +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 { i18n } from '@kbn/i18n'; -import type { - SolutionNavigationDefinition, - NavigationTreeDefinition, -} from '@kbn/core-chrome-browser'; -import { of } from 'rxjs'; - -const title = i18n.translate('navigation.searchNav.headerSolutionSwitcher.searchSolutionTitle', { - defaultMessage: 'Search', -}); -const icon = 'logoElasticsearch'; - -const navTree: NavigationTreeDefinition = { - body: [ - { type: 'recentlyAccessed' }, - { - type: 'navGroup', - id: 'search_project_nav', - title, - icon, - defaultIsCollapsed: false, - isCollapsible: false, - breadcrumbStatus: 'hidden', - children: [ - { - link: 'enterpriseSearch', - }, - { - id: 'dev_tools', - title: i18n.translate('navigation.searchNav.devTools', { - defaultMessage: 'Dev Tools', - }), - link: 'dev_tools:console', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/dev_tools')); - }, - }, - { - id: 'kibana', - title: i18n.translate('navigation.searchNav.kibana', { - defaultMessage: 'Kibana', - }), - children: [ - { - link: 'discover', - }, - { - link: 'dashboards', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/dashboards')); - }, - }, - ], - }, - { - id: 'content', - title: i18n.translate('navigation.searchNav.content', { - defaultMessage: 'Content', - }), - children: [ - { - link: 'enterpriseSearchContent:searchIndices', - // TODO: Build the children dynamically - // https://github.com/elastic/kibana/issues/179751 - // renderAs: 'accordion', - // children: [ - // { - // title: i18n.translate( - // 'navigation.searchNav.content.indices.searchGithub.overview', - // { - // defaultMessage: 'Overview', - // } - // ), - // link: 'management:index_management', - // breadcrumbStatus: - // 'hidden' /* management sub-pages set their breadcrumbs themselves */, - // }, - // { - // title: i18n.translate( - // 'navigation.searchNav.content.indices.searchGithub.documents', - // { - // defaultMessage: 'Documents', - // } - // ), - // link: 'management:index_management', - // }, - // { - // title: i18n.translate( - // 'navigation.searchNav.content.indices.searchGithub.indexMappings', - // { - // defaultMessage: 'Index Mappings', - // } - // ), - // link: 'management:index_management', - // }, - // { - // title: i18n.translate( - // 'navigation.searchNav.content.indices.searchGithub.pipelines', - // { - // defaultMessage: 'Pipelines', - // } - // ), - // link: 'management:ingest_pipelines', - // }, - // ], - }, - { link: 'enterpriseSearchContent:connectors' }, - { link: 'enterpriseSearchContent:webCrawlers' }, - ], - }, - { - id: 'build', - title: i18n.translate('navigation.searchNav.build', { - defaultMessage: 'Build', - }), - children: [ - { - link: 'enterpriseSearchApplications:playground', - }, - { - title: i18n.translate('navigation.searchNav.build.searchApplications', { - defaultMessage: 'Search applications', - }), - link: 'enterpriseSearchApplications:searchApplications', - // TODO: Build the children dynamically - // https://github.com/elastic/kibana/issues/179751 - // renderAs: 'accordion', - // children: [ - // { - // title: i18n.translate( - // 'navigation.searchNav.build.searchApplications.docsExplorer', - // { - // defaultMessage: 'Docs explorer', - // } - // ), - // link: 'home', - // }, - // { - // title: i18n.translate('navigation.searchNav.build.searchApplications.content', { - // defaultMessage: 'Content', - // }), - // link: 'home', - // }, - // { - // title: i18n.translate('navigation.searchNav.build.searchApplications.connect', { - // defaultMessage: 'Connect', - // }), - // link: 'home', - // }, - // ], - }, - { - link: 'enterpriseSearchAnalytics', - }, - ], - }, - { - id: 'entsearch', - title: i18n.translate('navigation.searchNav.entsearch', { - defaultMessage: 'Enterprise Search', - }), - children: [ - { - title: i18n.translate('navigation.searchNav.entsearch.appSearch', { - defaultMessage: 'App Search', - }), - link: 'appSearch:engines', - getIsActive: ({ pathNameSerialized, prepend }) => { - return pathNameSerialized.startsWith(prepend('/app/enterprise_search/app_search')); - }, - }, - { - link: 'workplaceSearch', - }, - ], - }, - ], - }, - ], - footer: [ - { - type: 'navGroup', - id: 'project_settings_project_nav', - title: i18n.translate('navigation.searchNav.management', { - defaultMessage: 'Management', - }), - icon: 'gear', - breadcrumbStatus: 'hidden', - children: [ - { - title: i18n.translate('navigation.searchNav.management.trainedModels', { - defaultMessage: 'Trained models', - }), - link: 'ml:modelManagement', - }, - { - link: 'management', - title: i18n.translate('navigation.searchNav.mngt', { - defaultMessage: 'Stack Management', - }), - spaceBefore: null, - renderAs: 'panelOpener', - children: [ - { - title: 'Ingest', - children: [{ link: 'management:ingest_pipelines' }, { link: 'management:pipelines' }], - }, - { - title: 'Data', - children: [ - { link: 'management:index_management' }, - { link: 'management:index_lifecycle_management' }, - { link: 'management:snapshot_restore' }, - { link: 'management:rollup_jobs' }, - { link: 'management:transform' }, - { link: 'management:cross_cluster_replication' }, - { link: 'management:remote_clusters' }, - { link: 'management:migrate_data' }, - ], - }, - { - title: 'Alerts and Insights', - children: [ - { link: 'management:triggersActions' }, - { link: 'management:cases' }, - { link: 'management:triggersActionsConnectors' }, - { link: 'management:reporting' }, - { link: 'management:jobsListLink' }, - { link: 'management:watcher' }, - { link: 'management:maintenanceWindows' }, - ], - }, - { - title: 'Security', - children: [ - { link: 'management:users' }, - { link: 'management:roles' }, - { link: 'management:api_keys' }, - { link: 'management:role_mappings' }, - ], - }, - { - title: 'Kibana', - children: [ - { link: 'management:dataViews' }, - { link: 'management:filesManagement' }, - { link: 'management:objects' }, - { link: 'management:tags' }, - { link: 'management:search_sessions' }, - { link: 'management:aiAssistantManagementSelection' }, - { link: 'management:spaces' }, - { link: 'management:settings' }, - ], - }, - { - title: 'Stack', - children: [ - { link: 'management:license_management' }, - { link: 'management:upgrade_assistant' }, - ], - }, - ], - }, - ], - }, - ], -}; - -export const definition: SolutionNavigationDefinition = { - id: 'es', - title, - icon, - homePage: 'enterpriseSearch', - navigationTree$: of(navTree), -}; diff --git a/packages/solution-nav/es/kibana.jsonc b/packages/solution-nav/es/kibana.jsonc deleted file mode 100644 index ba8bb94cc1cbd..0000000000000 --- a/packages/solution-nav/es/kibana.jsonc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "shared-common", - "id": "@kbn/solution-nav-es", - "owner": [ - "@elastic/appex-sharedux", - "@elastic/enterprise-search-frontend" - ] -} diff --git a/packages/solution-nav/es/package.json b/packages/solution-nav/es/package.json deleted file mode 100644 index a73bd66a9ddcc..0000000000000 --- a/packages/solution-nav/es/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@kbn/solution-nav-es", - "private": true, - "version": "1.0.0", - "license": "SSPL-1.0 OR Elastic License 2.0" -} \ No newline at end of file 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 7697bc0ec1858..08c1c039d5e79 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 @@ -138,7 +138,7 @@ describe('checking migration metadata changes on all registered SO types', () => "risk-engine-configuration": "aea0c371a462e6d07c3ceb3aff11891b47feb09d", "rules-settings": "892a2918ebaeba809a612b8d97cec0b07c800b5f", "sample-data-telemetry": "37441b12f5b0159c2d6d5138a494c9f440e950b5", - "search": "7598e4a701ddcaa5e3f44f22e797618a48595e6f", + "search": "4579401660a4089d5122b2fc8624825cb97b0480", "search-session": "b2fcd840e12a45039ada50b1355faeafa39876d1", "search-telemetry": "b568601618744720b5662946d3103e3fb75fe8ee", "security-rule": "07abb4d7e707d91675ec0495c73816394c7b521f", diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 6b79cae3fac7b..a69a93bb8b351 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -86,7 +86,7 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.5.1': ['Elastic License 2.0'], - '@elastic/eui@94.5.0-backport.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@94.5.1': ['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/console/public/application/containers/console_history/console_history.tsx b/src/plugins/console/public/application/containers/console_history/console_history.tsx index 6918f572ce916..3f8f071c98873 100644 --- a/src/plugins/console/public/application/containers/console_history/console_history.tsx +++ b/src/plugins/console/public/application/containers/console_history/console_history.tsx @@ -23,6 +23,7 @@ import { import { useServicesContext } from '../../contexts'; import { HistoryViewer } from './history_viewer'; +import { HistoryViewer as HistoryViewerMonaco } from './history_viewer_monaco'; import { useEditorReadContext } from '../../contexts/editor_context'; import { useRestoreRequestFromHistory } from '../../hooks'; @@ -35,6 +36,7 @@ const CHILD_ELEMENT_PREFIX = 'historyReq'; export function ConsoleHistory({ close }: Props) { const { services: { history }, + config: { isMonacoEnabled }, } = useServicesContext(); const { settings: readOnlySettings } = useEditorReadContext(); @@ -91,7 +93,7 @@ export function ConsoleHistory({ close }: Props) { initialize(); }; - const restoreRequestFromHistory = useRestoreRequestFromHistory(); + const restoreRequestFromHistory = useRestoreRequestFromHistory(isMonacoEnabled); useEffect(() => { initialize(); @@ -181,7 +183,11 @@ export function ConsoleHistory({ close }: Props) {
- + {isMonacoEnabled ? ( + + ) : ( + + )}
diff --git a/src/plugins/console/public/application/containers/console_history/history_viewer_monaco.tsx b/src/plugins/console/public/application/containers/console_history/history_viewer_monaco.tsx new file mode 100644 index 0000000000000..580dc863851f4 --- /dev/null +++ b/src/plugins/console/public/application/containers/console_history/history_viewer_monaco.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { useCallback, useRef } from 'react'; +import { css } from '@emotion/react'; +import { CONSOLE_LANG_ID, CONSOLE_THEME_ID, monaco } from '@kbn/monaco'; +import { CodeEditor } from '@kbn/code-editor'; +import { i18n } from '@kbn/i18n'; +import { formatRequestBodyDoc } from '../../../lib/utils'; +import { DevToolsSettings } from '../../../services'; +import { useResizeCheckerUtils } from '../editor/monaco/hooks'; + +export const HistoryViewer = ({ + settings, + req, +}: { + settings: DevToolsSettings; + req: { method: string; endpoint: string; data: string; time: string } | null; +}) => { + const divRef = useRef(null); + const { setupResizeChecker, destroyResizeChecker } = useResizeCheckerUtils(); + + const editorDidMountCallback = useCallback( + (editor: monaco.editor.IStandaloneCodeEditor) => { + setupResizeChecker(divRef.current!, editor); + }, + [setupResizeChecker] + ); + + const editorWillUnmountCallback = useCallback(() => { + destroyResizeChecker(); + }, [destroyResizeChecker]); + let renderedHistoryRequest: string; + if (req) { + const indent = true; + const formattedData = req.data ? formatRequestBodyDoc([req.data], indent).data : ''; + renderedHistoryRequest = req.method + ' ' + req.endpoint + '\n' + formattedData; + } else { + renderedHistoryRequest = i18n.translate('console.historyPage.noHistoryTextMessage', { + defaultMessage: 'No history available', + }); + } + return ( +
+ +
+ ); +}; diff --git a/src/plugins/console/public/application/containers/editor/monaco/hooks/use_set_initial_value.ts b/src/plugins/console/public/application/containers/editor/monaco/hooks/use_set_initial_value.ts index ccd45a3a98106..05a995e1625b0 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/hooks/use_set_initial_value.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/hooks/use_set_initial_value.ts @@ -30,6 +30,7 @@ interface SetInitialValueParams { /** * Util function for reading the load_from parameter from the current url. */ + export const readLoadFromParam = () => { const [, queryString] = (window.location.hash || window.location.search || '').split('?'); diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx index cd4ba9297f108..b54e6fa900b6e 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx @@ -12,6 +12,7 @@ import { css } from '@emotion/react'; import { CodeEditor } from '@kbn/code-editor'; import { CONSOLE_LANG_ID, CONSOLE_THEME_ID, monaco } from '@kbn/monaco'; import { i18n } from '@kbn/i18n'; +import { useSetInputEditor } from '../../../hooks'; import { ConsoleMenu } from '../../../components'; import { useServicesContext, @@ -33,17 +34,11 @@ export interface EditorProps { } export const MonacoEditor = ({ initialTextValue }: EditorProps) => { + const context = useServicesContext(); const { - services: { - notifications, - esHostService, - trackUiMetric, - http, - settings: settingsService, - autocompleteInfo, - }, + services: { notifications, esHostService, settings: settingsService, autocompleteInfo }, docLinkVersion, - } = useServicesContext(); + } = context; const { toasts } = notifications; const { settings } = useEditorReadContext(); @@ -55,6 +50,7 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => { const actionsProvider = useRef(null); const [editorActionsCss, setEditorActionsCss] = useState({}); + const setInputEditor = useSetInputEditor(); const getCurlCallback = useCallback(async (): Promise => { const curl = await actionsProvider.current?.getCurl(esHostService.getHost()); return curl ?? ''; @@ -69,12 +65,14 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => { }, []); const sendRequestsCallback = useCallback(async () => { - await actionsProvider.current?.sendRequests(toasts, dispatch, trackUiMetric, http); - }, [dispatch, http, toasts, trackUiMetric]); + await actionsProvider.current?.sendRequests(dispatch, context); + }, [dispatch, context]); const editorDidMountCallback = useCallback( (editor: monaco.editor.IStandaloneCodeEditor) => { - actionsProvider.current = new MonacoEditorActionsProvider(editor, setEditorActionsCss); + const provider = new MonacoEditorActionsProvider(editor, setEditorActionsCss); + setInputEditor(provider); + actionsProvider.current = provider; setupResizeChecker(divRef.current!, editor); registerKeyboardCommands({ editor, @@ -86,7 +84,13 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => { moveToNextRequestEdge: async () => await actionsProvider.current?.moveToNextRequestEdge(), }); }, - [getDocumenationLink, registerKeyboardCommands, sendRequestsCallback, setupResizeChecker] + [ + getDocumenationLink, + registerKeyboardCommands, + sendRequestsCallback, + setupResizeChecker, + setInputEditor, + ] ); const editorWillUnmountCallback = useCallback(() => { diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts index d2dd7a56a8ce3..b294b1d8de865 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.test.ts @@ -69,6 +69,7 @@ describe('Editor actions provider', () => { getPosition: jest.fn(), getTopForLineNumber: jest.fn(), getScrollTop: jest.fn(), + executeEdits: jest.fn(), setPosition: jest.fn(), } as unknown as jest.Mocked; @@ -401,4 +402,160 @@ describe('Editor actions provider', () => { }); }); }); + + describe('restoreRequestFromHistory', () => { + const testHistoryRequest = 'GET _alias'; + beforeEach(() => { + /* + * The editor has the text + * "POST _search" on line 1 + * { "test": "test" } on lines 2-4 + * and "GET _analyze" on line 5 + */ + mockGetParsedRequests.mockReturnValue([ + { + startOffset: 0, + method: 'POST', + url: '_search', + endOffset: 35, + data: [ + { + test: 'test', + }, + ], + }, + { + startOffset: 36, + method: 'GET', + url: '_analyze', + endOffset: 48, + }, + ]); + + editor.getModel.mockReturnValue({ + getLineMaxColumn: (lineNumber: number) => { + // mock this function for line 4 + return 2; + }, + getPositionAt: (offset: number) => { + // mock this function for start offsets of the mocked requests + if (offset === 0) { + return { lineNumber: 1, column: 1 }; + } + if (offset === 36) { + return { lineNumber: 5, column: 1 }; + } + // mock this function for end offsets of the mocked requests + if (offset === 35) { + return { lineNumber: 4, column: 2 }; + } + if (offset === 48) { + return { lineNumber: 5, column: 13 }; + } + }, + getLineContent: (lineNumber: number) => { + // mock this functions for line 1 and line 2 + if (lineNumber === 1) { + return 'POST _search'; + } + if (lineNumber === 2) { + return '{'; + } + if (lineNumber === 3) { + return ' "test": "test"'; + } + if (lineNumber === 4) { + return '}'; + } + if (lineNumber === 5) { + return 'GET _analyze'; + } + }, + } as unknown as monaco.editor.ITextModel); + }); + + it('insert the request at the beginning of the selected request', async () => { + // the position of the cursor is in the middle of line 5 + editor.getPosition.mockReturnValue({ + lineNumber: 5, + column: 4, + } as monaco.Position); + editor.getSelection.mockReturnValue({ + startLineNumber: 5, + endLineNumber: 5, + } as monaco.Selection); + + await editorActionsProvider.restoreRequestFromHistory(testHistoryRequest); + const expectedRange = { + startLineNumber: 5, + startColumn: 1, + endLineNumber: 5, + endColumn: 1, + }; + const expectedText = testHistoryRequest + '\n'; + const expectedEdit = { + range: expectedRange, + text: expectedText, + forceMoveMarkers: true, + }; + expect(editor.executeEdits).toHaveBeenCalledTimes(1); + expect(editor.executeEdits).toHaveBeenCalledWith('restoreFromHistory', [expectedEdit]); + }); + + it('insert the request at the end of the selected request', async () => { + // the position of the cursor is at the end of line 4 + editor.getPosition.mockReturnValue({ + lineNumber: 4, + column: 2, + } as monaco.Position); + editor.getSelection.mockReturnValue({ + startLineNumber: 4, + endLineNumber: 4, + } as monaco.Selection); + await editorActionsProvider.restoreRequestFromHistory(testHistoryRequest); + const expectedRange = { + startLineNumber: 4, + startColumn: 2, + endLineNumber: 4, + endColumn: 2, + }; + const expectedText = '\n' + testHistoryRequest; + const expectedEdit = { + range: expectedRange, + text: expectedText, + forceMoveMarkers: true, + }; + expect(editor.executeEdits).toHaveBeenCalledTimes(1); + expect(editor.executeEdits).toHaveBeenCalledWith('restoreFromHistory', [expectedEdit]); + }); + + it('insert at the beginning of the line, if no selected request', async () => { + // mock no parsed requests + mockGetParsedRequests.mockReturnValue([]); + // the position of the cursor is at the end of line 4 + editor.getPosition.mockReturnValue({ + lineNumber: 4, + column: 2, + } as monaco.Position); + editor.getSelection.mockReturnValue({ + startLineNumber: 4, + endLineNumber: 4, + } as monaco.Selection); + await editorActionsProvider.restoreRequestFromHistory(testHistoryRequest); + const expectedRange = { + startLineNumber: 4, + startColumn: 1, + endLineNumber: 4, + endColumn: 1, + }; + const expectedText = testHistoryRequest + '\n'; + const expectedEdit = { + range: expectedRange, + text: expectedText, + forceMoveMarkers: true, + }; + expect(editor.executeEdits).toHaveBeenCalledTimes(1); + expect(editor.executeEdits).toHaveBeenCalledWith('restoreFromHistory', [expectedEdit]); + }); + }); }); diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts index 4a13b3ef782ca..dbb6dc1845e41 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_actions_provider.ts @@ -9,13 +9,12 @@ import { CSSProperties, Dispatch } from 'react'; import { debounce } from 'lodash'; import { ConsoleParsedRequestsProvider, getParsedRequestsProvider, monaco } from '@kbn/monaco'; -import { IToasts } from '@kbn/core-notifications-browser'; import { i18n } from '@kbn/i18n'; -import type { HttpSetup } from '@kbn/core-http-browser'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import { isQuotaExceededError } from '../../../../services/history'; import { DEFAULT_VARIABLES } from '../../../../../common/constants'; import { getStorage, StorageKeys } from '../../../../services'; import { sendRequest } from '../../../hooks'; -import { MetricsTracker } from '../../../../types'; import { Actions } from '../../../stores/request'; import { @@ -38,6 +37,8 @@ import { } from './utils'; import type { AdjustedParsedRequest } from './types'; +import { StorageQuotaError } from '../../../components/storage_quota_error'; +import { ContextValue } from '../../../contexts'; const AUTO_INDENTATION_ACTION_LABEL = 'Apply indentations'; @@ -180,12 +181,12 @@ export class MonacoEditorActionsProvider { return curlRequests.join('\n'); } - public async sendRequests( - toasts: IToasts, - dispatch: Dispatch, - trackUiMetric: MetricsTracker, - http: HttpSetup - ): Promise { + public async sendRequests(dispatch: Dispatch, context: ContextValue): Promise { + const { + services: { notifications, trackUiMetric, http, settings, history, autocompleteInfo }, + startServices, + } = context; + const { toasts } = notifications; try { const requests = await this.getRequests(); if (!requests.length) { @@ -205,8 +206,63 @@ export class MonacoEditorActionsProvider { const results = await sendRequest({ http, requests }); - // TODO save to history - // TODO restart autocomplete polling + let saveToHistoryError: undefined | Error; + const isHistoryEnabled = settings.getIsHistoryEnabled(); + + if (isHistoryEnabled) { + results.forEach(({ request: { path, method, data } }) => { + try { + history.addToHistory(path, method, data); + } catch (e) { + // Grab only the first error + if (!saveToHistoryError) { + saveToHistoryError = e; + } + } + }); + + if (saveToHistoryError) { + const errorTitle = i18n.translate('console.notification.error.couldNotSaveRequestTitle', { + defaultMessage: 'Could not save request to Console history.', + }); + if (isQuotaExceededError(saveToHistoryError)) { + const toast = notifications.toasts.addWarning({ + title: i18n.translate('console.notification.error.historyQuotaReachedMessage', { + defaultMessage: + 'Request history is full. Clear the console history or disable saving new requests.', + }), + text: toMountPoint( + StorageQuotaError({ + onClearHistory: () => { + history.clearHistory(); + notifications.toasts.remove(toast); + }, + onDisableSavingToHistory: () => { + settings.setIsHistoryEnabled(false); + notifications.toasts.remove(toast); + }, + }), + startServices + ), + }); + } else { + // Best effort, but still notify the user. + notifications.toasts.addError(saveToHistoryError, { + title: errorTitle, + }); + } + } + } + + const polling = settings.getPolling(); + if (polling) { + // If the user has submitted a request against ES, something in the fields, indices, aliases, + // or templates may have changed, so we'll need to update this data. Assume that if + // the user disables polling they're trying to optimize performance or otherwise + // preserve resources, so they won't want this request sent either. + autocompleteInfo.retrieve(settings, settings.getAutocomplete()); + } + dispatch({ type: 'requestSuccess', payload: { @@ -347,6 +403,54 @@ export class MonacoEditorActionsProvider { return this.getSuggestions(model, position, context); } + /* + * This function inserts a request from the history into the editor + */ + public async restoreRequestFromHistory(request: string) { + const model = this.editor.getModel(); + if (!model) { + return; + } + let position = this.editor.getPosition() as monaco.IPosition; + const requests = await this.getSelectedParsedRequests(); + let prefix = ''; + let suffix = ''; + // if there are requests at the cursor/selection, insert either before or after + if (requests.length > 0) { + // if on the 1st line of the 1st request, insert at the beginning of that line + if (position && position.lineNumber === requests[0].startLineNumber) { + position = { column: 1, lineNumber: position.lineNumber }; + suffix = '\n'; + } else { + // otherwise insert at the end of the last line of the last request + const lastLineNumber = requests[requests.length - 1].endLineNumber; + position = { column: model.getLineMaxColumn(lastLineNumber), lineNumber: lastLineNumber }; + prefix = '\n'; + } + } else { + // if not inside a request, insert the request at the cursor line + if (position) { + // insert at the beginning of the cursor line + position = { lineNumber: position.lineNumber, column: 1 }; + } else { + // otherwise insert on line 1 + position = { lineNumber: 1, column: 1 }; + } + suffix = '\n'; + } + const edit: monaco.editor.IIdentifiedSingleEditOperation = { + range: { + startLineNumber: position.lineNumber, + startColumn: position.column, + endLineNumber: position.lineNumber, + endColumn: position.column, + }, + text: prefix + request + suffix, + forceMoveMarkers: true, + }; + this.editor.executeEdits('restoreFromHistory', [edit]); + } + /* This function returns the text in the provided range. If no range is provided, it returns all text in the editor. diff --git a/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts b/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts index 75a46590143c4..5302bf90d82c0 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/utils/autocomplete_utils.ts @@ -308,7 +308,6 @@ const getInsertText = ( } else { templateLines = JSON.stringify(template, null, 2).split(newLineRegex); } - // TODO add correct indentation insertText += ': ' + templateLines.join('\n'); } else if (value === '{') { insertText += '{}'; diff --git a/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx b/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx index db3624db41f68..7921e128721b6 100644 --- a/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx +++ b/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx @@ -107,29 +107,28 @@ interface ConsoleWrapperProps 'setDispatch' | 'alternateView' | 'setConsoleHeight' | 'getConsoleHeight' > { onKeyDown: (this: Window, ev: WindowEventMap['keydown']) => any; + isOpen: boolean; } export const ConsoleWrapper = (props: ConsoleWrapperProps) => { const [dependencies, setDependencies] = useState(null); - const { core, usageCollection, onKeyDown, isMonacoEnabled } = props; + const { core, usageCollection, onKeyDown, isMonacoEnabled, isOpen } = props; const { analytics, i18n, theme } = core; const startServices = { analytics, i18n, theme }; useEffect(() => { - if (dependencies === null) { + if (dependencies === null && isOpen) { loadDependencies(core, usageCollection).then(setDependencies); } - }, [dependencies, setDependencies, core, usageCollection]); + }, [dependencies, setDependencies, core, usageCollection, isOpen]); - useEffect(() => { - return () => { - if (dependencies) { - dependencies.autocompleteInfo.clearSubscriptions(); - } - }; - }, [dependencies]); + if (!dependencies && !isOpen) { + // Console has not been opened + return null; + } if (!dependencies) { + // Console open for the first time, wait for dependencies to load. return ; } @@ -171,10 +170,14 @@ export const ConsoleWrapper = (props: ConsoleWrapperProps) => { > -
- -
-
+ {isOpen ? ( +
+ +
+
+ ) : ( + + )}
diff --git a/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx b/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx index 42a6c4b0efb92..e8cddbf6d7364 100644 --- a/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx +++ b/src/plugins/console/public/application/containers/embeddable/embeddable_console.tsx @@ -190,8 +190,14 @@ export const EmbeddableConsole = ({ - {showConsole ? ( - + {consoleState.consoleHasBeenOpened ? ( + ) : null} {showAlternateView ? (
diff --git a/src/plugins/console/public/application/contexts/editor_context/editor_registry.ts b/src/plugins/console/public/application/contexts/editor_context/editor_registry.ts index 1b0c5a7b6bc1f..35e46a24c4821 100644 --- a/src/plugins/console/public/application/contexts/editor_context/editor_registry.ts +++ b/src/plugins/console/public/application/contexts/editor_context/editor_registry.ts @@ -6,12 +6,13 @@ * Side Public License, v 1. */ +import { MonacoEditorActionsProvider } from '../../containers/editor/monaco/monaco_editor_actions_provider'; import { SenseEditor } from '../../models/sense_editor'; export class EditorRegistry { - private inputEditor: SenseEditor | undefined; + private inputEditor: SenseEditor | MonacoEditorActionsProvider | undefined; - setInputEditor(inputEditor: SenseEditor) { + setInputEditor(inputEditor: SenseEditor | MonacoEditorActionsProvider) { this.inputEditor = inputEditor; } diff --git a/src/plugins/console/public/application/contexts/services_context.tsx b/src/plugins/console/public/application/contexts/services_context.tsx index 49bc4d4afec9b..89e7704023a09 100644 --- a/src/plugins/console/public/application/contexts/services_context.tsx +++ b/src/plugins/console/public/application/contexts/services_context.tsx @@ -30,7 +30,7 @@ export interface ContextValue { services: ContextServices; docLinkVersion: string; docLinks: DocLinksStart['links']; - config?: { + config: { isMonacoEnabled: boolean; }; startServices: ConsoleStartServices; diff --git a/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history_to_monaco.ts b/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history_to_monaco.ts new file mode 100644 index 0000000000000..67273a7b742d7 --- /dev/null +++ b/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history_to_monaco.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 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 { formatRequestBodyDoc } from '../../../lib/utils'; +import { MonacoEditorActionsProvider } from '../../containers/editor/monaco/monaco_editor_actions_provider'; +import { ESRequest } from '../../../types'; + +export async function restoreRequestFromHistoryToMonaco( + provider: MonacoEditorActionsProvider, + req: ESRequest +) { + let s = req.method + ' ' + req.endpoint; + if (req.data) { + const indent = true; + const formattedData = formatRequestBodyDoc([req.data], indent); + s += '\n' + formattedData.data; + } + await provider.restoreRequestFromHistory(s); +} diff --git a/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts b/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts index 7c140e2b18975..05f3a2b6116ce 100644 --- a/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts +++ b/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts @@ -7,13 +7,23 @@ */ import { useCallback } from 'react'; +import { SenseEditor } from '../../models'; import { instance as registry } from '../../contexts/editor_context/editor_registry'; import { ESRequest } from '../../../types'; import { restoreRequestFromHistory } from './restore_request_from_history'; +import { restoreRequestFromHistoryToMonaco } from './restore_request_from_history_to_monaco'; +import { MonacoEditorActionsProvider } from '../../containers/editor/monaco/monaco_editor_actions_provider'; -export const useRestoreRequestFromHistory = () => { - return useCallback((req: ESRequest) => { - const editor = registry.getInputEditor(); - restoreRequestFromHistory(editor, req); - }, []); +export const useRestoreRequestFromHistory = (isMonacoEnabled: boolean) => { + return useCallback( + async (req: ESRequest) => { + const editor = registry.getInputEditor(); + if (isMonacoEnabled) { + await restoreRequestFromHistoryToMonaco(editor as MonacoEditorActionsProvider, req); + } else { + restoreRequestFromHistory(editor as SenseEditor, req); + } + }, + [isMonacoEnabled] + ); }; diff --git a/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts b/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts index 69f9042edd76d..723806d5c735b 100644 --- a/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts +++ b/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts @@ -19,6 +19,7 @@ import { track } from './track'; import { replaceVariables } from '../../../lib/utils'; import { StorageKeys } from '../../../services'; import { DEFAULT_VARIABLES } from '../../../../common/constants'; +import { SenseEditor } from '../../models'; export const useSendCurrentRequest = () => { const { @@ -30,7 +31,7 @@ export const useSendCurrentRequest = () => { return useCallback(async () => { try { - const editor = registry.getInputEditor(); + const editor = registry.getInputEditor() as SenseEditor; const variables = storage.get(StorageKeys.VARIABLES, DEFAULT_VARIABLES); let requests = await editor.getRequestsInRange(); requests = replaceVariables(requests, variables); @@ -47,7 +48,7 @@ export const useSendCurrentRequest = () => { dispatch({ type: 'sendRequest', payload: undefined }); // Fire and forget - setTimeout(() => track(requests, editor, trackUiMetric), 0); + setTimeout(() => track(requests, editor as SenseEditor, trackUiMetric), 0); const results = await sendRequest({ http, requests }); diff --git a/src/plugins/console/public/application/hooks/use_set_input_editor.ts b/src/plugins/console/public/application/hooks/use_set_input_editor.ts index c01dbbb0d2798..d2ac974cb18d8 100644 --- a/src/plugins/console/public/application/hooks/use_set_input_editor.ts +++ b/src/plugins/console/public/application/hooks/use_set_input_editor.ts @@ -10,12 +10,13 @@ import { useCallback } from 'react'; import { useEditorActionContext } from '../contexts/editor_context'; import { instance as registry } from '../contexts/editor_context/editor_registry'; import { SenseEditor } from '../models'; +import { MonacoEditorActionsProvider } from '../containers/editor/monaco/monaco_editor_actions_provider'; export const useSetInputEditor = () => { const dispatch = useEditorActionContext(); return useCallback( - (editor: SenseEditor) => { + (editor: SenseEditor | MonacoEditorActionsProvider) => { dispatch({ type: 'setInputEditor', payload: editor }); registry.setInputEditor(editor); }, diff --git a/src/plugins/console/public/application/stores/editor.ts b/src/plugins/console/public/application/stores/editor.ts index 3fdb0c3fd3422..e9496401ca611 100644 --- a/src/plugins/console/public/application/stores/editor.ts +++ b/src/plugins/console/public/application/stores/editor.ts @@ -12,6 +12,7 @@ import { identity } from 'fp-ts/lib/function'; import { DevToolsSettings, DEFAULT_SETTINGS } from '../../services'; import { TextObject } from '../../../common/text_object'; import { SenseEditor } from '../models'; +import { MonacoEditorActionsProvider } from '../containers/editor/monaco/monaco_editor_actions_provider'; export interface Store { ready: boolean; @@ -29,7 +30,7 @@ export const initialValue: Store = produce( ); export type Action = - | { type: 'setInputEditor'; payload: SenseEditor } + | { type: 'setInputEditor'; payload: SenseEditor | MonacoEditorActionsProvider } | { type: 'setCurrentTextObject'; payload: TextObject } | { type: 'updateSettings'; payload: DevToolsSettings }; diff --git a/src/plugins/console/public/application/stores/embeddable_console.ts b/src/plugins/console/public/application/stores/embeddable_console.ts index 26f1f78687250..3f2cf8261382f 100644 --- a/src/plugins/console/public/application/stores/embeddable_console.ts +++ b/src/plugins/console/public/application/stores/embeddable_console.ts @@ -18,6 +18,7 @@ import { export const initialValue: EmbeddedConsoleStore = produce( { + consoleHasBeenOpened: false, view: EmbeddableConsoleView.Closed, }, identity @@ -31,6 +32,7 @@ export const reducer: Reducer = (st ? EmbeddableConsoleView.Alternate : EmbeddableConsoleView.Console; if (state.view !== newView) { + draft.consoleHasBeenOpened = true; draft.view = newView; draft.loadFromContent = action.payload?.content; return draft; diff --git a/src/plugins/console/public/types/embeddable_console.ts b/src/plugins/console/public/types/embeddable_console.ts index 9a31e0f1cf151..0c4f6844edb6e 100644 --- a/src/plugins/console/public/types/embeddable_console.ts +++ b/src/plugins/console/public/types/embeddable_console.ts @@ -31,6 +31,7 @@ export enum EmbeddableConsoleView { } export interface EmbeddedConsoleStore { + consoleHasBeenOpened: boolean; view: EmbeddableConsoleView; loadFromContent?: string; } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx index 78ca1593e7a99..ee2cc0dd961fd 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.test.tsx @@ -240,4 +240,25 @@ describe('getInheritedInput', () => { expect(embeddableInput.timeRange).toEqual(embeddableTimeRange); expect(embeddableInput.timeslice).toBeUndefined(); }); + + test('Should pass dashboard settings to inherited input', async () => { + const container = buildMockDashboard({}); + const embeddable = await container.addNewEmbeddable( + CONTACT_CARD_EMBEDDABLE, + { + firstName: 'Kibana', + } + ); + expect(embeddable).toBeDefined(); + + const embeddableInput = container + .getChild(embeddable.id) + .getInput() as ContactCardEmbeddableInput & { + timeRange: TimeRange; + timeslice: [number, number]; + }; + expect(embeddableInput.syncTooltips).toBe(false); + expect(embeddableInput.syncColors).toBe(false); + expect(embeddableInput.syncCursor).toBe(true); + }); }); diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index a0a10469483c7..258a80ed834eb 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -404,6 +404,7 @@ export class DashboardContainer timeslice, syncColors, syncTooltips, + syncCursor, hidePanelTitles, refreshInterval, executionContext, @@ -425,6 +426,7 @@ export class DashboardContainer executionContext, syncTooltips, syncColors, + syncCursor, viewMode, query, id, diff --git a/src/plugins/data_views/common/data_views/index.ts b/src/plugins/data_views/common/data_views/index.ts index f533a946e51e4..bfb5f34a1a85d 100644 --- a/src/plugins/data_views/common/data_views/index.ts +++ b/src/plugins/data_views/common/data_views/index.ts @@ -10,4 +10,5 @@ export * from './flatten_hit'; export * from './data_view'; export * from './data_views'; export * from './data_view_lazy'; +export * from './abstract_data_views'; export { DataViewPersistableStateService } from './persistable_state'; diff --git a/src/plugins/data_views/common/index.ts b/src/plugins/data_views/common/index.ts index 6a05c3e8b6bca..faf6ad490f3ac 100644 --- a/src/plugins/data_views/common/index.ts +++ b/src/plugins/data_views/common/index.ts @@ -70,7 +70,7 @@ export type { DataViewsServicePublicMethods, TimeBasedDataView, } from './data_views'; -export { DataView, DataViewLazy } from './data_views'; +export { DataView, DataViewLazy, AbstractDataView } from './data_views'; export { DuplicateDataViewError, DataViewSavedObjectConflictError, diff --git a/src/plugins/discover/common/constants.ts b/src/plugins/discover/common/constants.ts index 8ac1280592ff6..5a203cba55878 100644 --- a/src/plugins/discover/common/constants.ts +++ b/src/plugins/discover/common/constants.ts @@ -15,6 +15,7 @@ export const ROWS_PER_PAGE_OPTIONS = [10, 25, 50, DEFAULT_ROWS_PER_PAGE, 250, 50 export enum VIEW_MODE { DOCUMENT_LEVEL = 'documents', AGGREGATED_LEVEL = 'aggregated', + PATTERN_LEVEL = 'patterns', } export const getDefaultRowsPerPage = (uiSettings: IUiSettingsClient): number => { diff --git a/src/plugins/discover/kibana.jsonc b/src/plugins/discover/kibana.jsonc index c9714054ee694..b35d9aa8dd489 100644 --- a/src/plugins/discover/kibana.jsonc +++ b/src/plugins/discover/kibana.jsonc @@ -39,7 +39,8 @@ "lens", "noDataPage", "globalSearch", - "observabilityAIAssistant" + "observabilityAIAssistant", + "aiops" ], "requiredBundles": ["kibanaUtils", "kibanaReact", "unifiedSearch", "savedObjects"], "extraPublicDirs": ["common"] diff --git a/src/plugins/discover/public/__mocks__/services.ts b/src/plugins/discover/public/__mocks__/services.ts index 2a0ffa9f7cb97..e4e2b71de8e74 100644 --- a/src/plugins/discover/public/__mocks__/services.ts +++ b/src/plugins/discover/public/__mocks__/services.ts @@ -156,6 +156,10 @@ export function createDiscoverServicesMock(): DiscoverServices { dataVisualizer: { FieldStatisticsTable: jest.fn(() => createElement('div')), }, + aiops: { + getPatternAnalysisAvailable: jest.fn().mockResolvedValue(jest.fn().mockResolvedValue(true)), + PatternAnalysisComponent: jest.fn(() => createElement('div')), + }, docLinks: docLinksServiceMock.createStartContract(), capabilities: { visualize: { diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index cc141ce3fd567..d141b89e453e3 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -87,6 +87,9 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { ]); const isEsqlMode = useIsEsqlMode(); const viewMode: VIEW_MODE = useAppStateSelector((state) => { + if (state.viewMode === VIEW_MODE.DOCUMENT_LEVEL || state.viewMode === VIEW_MODE.PATTERN_LEVEL) { + return state.viewMode; + } if (uiSettings.get(SHOW_FIELD_STATISTICS) !== true || isEsqlMode) return VIEW_MODE.DOCUMENT_LEVEL; return state.viewMode ?? VIEW_MODE.DOCUMENT_LEVEL; diff --git a/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx index 2ea9825d3c5bd..343ceae3ed995 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx @@ -30,6 +30,7 @@ import { DocumentViewModeToggle } from '../../../../components/view_mode_toggle' import { searchSourceInstanceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { DiscoverDocuments } from './discover_documents'; import { FieldStatisticsTab } from '../field_stats_table'; +import { PatternAnalysisTab } from '../pattern_analysis'; import { DiscoverMainProvider } from '../../state_management/discover_state_provider'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; import { PanelsToggle } from '../../../../components/panels_toggle'; @@ -189,13 +190,22 @@ describe('Discover main content component', () => { it('should show DiscoverDocuments when VIEW_MODE is DOCUMENT_LEVEL', async () => { const component = await mountComponent(); expect(component.find(DiscoverDocuments).exists()).toBe(true); + expect(component.find(PatternAnalysisTab).exists()).toBe(false); expect(component.find(FieldStatisticsTab).exists()).toBe(false); }); - it('should show FieldStatisticsTableMemoized when VIEW_MODE is not DOCUMENT_LEVEL', async () => { + it('should show FieldStatisticsTab when VIEW_MODE is AGGREGATED_LEVEL', async () => { const component = await mountComponent({ viewMode: VIEW_MODE.AGGREGATED_LEVEL }); expect(component.find(DiscoverDocuments).exists()).toBe(false); + expect(component.find(PatternAnalysisTab).exists()).toBe(false); expect(component.find(FieldStatisticsTab).exists()).toBe(true); }); + + it('should show PatternAnalysisTab when VIEW_MODE is PATTERN_LEVEL', async () => { + const component = await mountComponent({ viewMode: VIEW_MODE.PATTERN_LEVEL }); + expect(component.find(DiscoverDocuments).exists()).toBe(false); + expect(component.find(PatternAnalysisTab).exists()).toBe(true); + expect(component.find(FieldStatisticsTab).exists()).toBe(false); + }); }); }); diff --git a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx index 23e4001a39459..7c44ed1deff83 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx @@ -22,6 +22,8 @@ import { DiscoverDocuments } from './discover_documents'; import { DOCUMENTS_VIEW_CLICK, FIELD_STATISTICS_VIEW_CLICK } from '../field_stats_table/constants'; import { useAppStateSelector } from '../../state_management/discover_app_state_container'; import type { PanelsToggleProps } from '../../../../components/panels_toggle'; +import { PatternAnalysisTab } from '../pattern_analysis/pattern_analysis_tab'; +import { PATTERN_ANALYSIS_VIEW_CLICK } from '../pattern_analysis/constants'; import { useIsEsqlMode } from '../../hooks/use_is_esql_mode'; const DROP_PROPS = { @@ -60,9 +62,8 @@ export const DiscoverMainContent = ({ panelsToggle, isChartAvailable, }: DiscoverMainContentProps) => { - const { trackUiMetric, dataVisualizer: dataVisualizerService } = useDiscoverServices(); + const { trackUiMetric } = useDiscoverServices(); const isEsqlMode = useIsEsqlMode(); - const shouldShowViewModeToggle = dataVisualizerService !== undefined; const setDiscoverViewMode = useCallback( (mode: VIEW_MODE) => { @@ -71,6 +72,8 @@ export const DiscoverMainContent = ({ if (trackUiMetric) { if (mode === VIEW_MODE.AGGREGATED_LEVEL) { trackUiMetric(METRIC_TYPE.CLICK, FIELD_STATISTICS_VIEW_CLICK); + } else if (mode === VIEW_MODE.PATTERN_LEVEL) { + trackUiMetric(METRIC_TYPE.CLICK, PATTERN_ANALYSIS_VIEW_CLICK); } else { trackUiMetric(METRIC_TYPE.CLICK, DOCUMENTS_VIEW_CLICK); } @@ -81,31 +84,36 @@ export const DiscoverMainContent = ({ const isDropAllowed = Boolean(onDropFieldToTable); - const viewModeToggle = useMemo(() => { - return shouldShowViewModeToggle ? ( - - ) : ( - - ); - }, [ - shouldShowViewModeToggle, - viewMode, - isEsqlMode, - stateContainer, - setDiscoverViewMode, - panelsToggle, - isChartAvailable, - ]); + const renderViewModeToggle = useCallback( + (patternCount?: number) => { + return ( + + ); + }, + [ + viewMode, + isEsqlMode, + stateContainer, + setDiscoverViewMode, + dataView, + panelsToggle, + isChartAvailable, + ] + ); + + const viewModeToggle = useMemo(() => renderViewModeToggle(), [renderViewModeToggle]); const showChart = useAppStateSelector((state) => !state.hideChart); @@ -133,7 +141,8 @@ export const DiscoverMainContent = ({ stateContainer={stateContainer} onFieldEdited={!isEsqlMode ? onFieldEdited : undefined} /> - ) : ( + ) : null} + {viewMode === VIEW_MODE.AGGREGATED_LEVEL ? ( <> {viewModeToggle} - )} + ) : null} + {viewMode === VIEW_MODE.PATTERN_LEVEL ? ( + setDiscoverViewMode(VIEW_MODE.DOCUMENT_LEVEL)} + trackUiMetric={trackUiMetric} + renderViewModeToggle={renderViewModeToggle} + /> + ) : null} diff --git a/packages/solution-nav/es/jest.config.js b/src/plugins/discover/public/application/main/components/pattern_analysis/constants.ts similarity index 64% rename from packages/solution-nav/es/jest.config.js rename to src/plugins/discover/public/application/main/components/pattern_analysis/constants.ts index 5c651f7bb9bbe..8441a308965e7 100644 --- a/packages/solution-nav/es/jest.config.js +++ b/src/plugins/discover/public/application/main/components/pattern_analysis/constants.ts @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -module.exports = { - preset: '@kbn/test', - rootDir: '../../..', - roots: ['/packages/solution-nav/es'], -}; +/** Telemetry related to field statistics table **/ +export const PATTERN_ANALYSIS_LOADED = 'pattern_analysis_loaded'; +export const PATTERN_ANALYSIS_VIEW_CLICK = 'pattern_analysis_view_click'; diff --git a/packages/solution-nav/es/index.ts b/src/plugins/discover/public/application/main/components/pattern_analysis/index.ts similarity index 73% rename from packages/solution-nav/es/index.ts rename to src/plugins/discover/public/application/main/components/pattern_analysis/index.ts index 8024948fb3cd1..8741f1040edb4 100644 --- a/packages/solution-nav/es/index.ts +++ b/src/plugins/discover/public/application/main/components/pattern_analysis/index.ts @@ -6,4 +6,5 @@ * Side Public License, v 1. */ -export { definition } from './definition'; +export { PatternAnalysisTable } from './pattern_analysis_table'; +export { PatternAnalysisTab } from './pattern_analysis_tab'; diff --git a/src/plugins/discover/public/application/main/components/pattern_analysis/pattern_analysis_tab.tsx b/src/plugins/discover/public/application/main/components/pattern_analysis/pattern_analysis_tab.tsx new file mode 100644 index 0000000000000..db02134e0169f --- /dev/null +++ b/src/plugins/discover/public/application/main/components/pattern_analysis/pattern_analysis_tab.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { memo, type FC } from 'react'; +import { useQuerySubscriber } from '@kbn/unified-field-list/src/hooks/use_query_subscriber'; +import { useSavedSearch } from '../../state_management/discover_state_provider'; +import { PatternAnalysisTable, type PatternAnalysisTableProps } from './pattern_analysis_table'; +import { useDiscoverServices } from '../../../../hooks/use_discover_services'; + +export const PatternAnalysisTab: FC> = memo( + (props) => { + const services = useDiscoverServices(); + const querySubscriberResult = useQuerySubscriber({ + data: services.data, + }); + const savedSearch = useSavedSearch(); + + return ( + + ); + } +); diff --git a/src/plugins/discover/public/application/main/components/pattern_analysis/pattern_analysis_table.tsx b/src/plugins/discover/public/application/main/components/pattern_analysis/pattern_analysis_table.tsx new file mode 100644 index 0000000000000..ccbb2a6e72b8c --- /dev/null +++ b/src/plugins/discover/public/application/main/components/pattern_analysis/pattern_analysis_table.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { useEffect, useState, useMemo } from 'react'; +import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; +import { type EmbeddablePatternAnalysisInput } from '@kbn/aiops-log-pattern-analysis/embeddable'; +import { pick } from 'lodash'; +import type { LogCategorizationEmbeddableProps } from '@kbn/aiops-plugin/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_embeddable'; +import { useDiscoverServices } from '../../../../hooks/use_discover_services'; +import type { DiscoverStateContainer } from '../../state_management/discover_state'; +import { PATTERN_ANALYSIS_LOADED } from './constants'; + +export type PatternAnalysisTableProps = EmbeddablePatternAnalysisInput & { + stateContainer?: DiscoverStateContainer; + trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; + renderViewModeToggle: (patternCount?: number) => React.ReactElement; +}; + +export const PatternAnalysisTable = (props: PatternAnalysisTableProps) => { + const [lastReloadRequestTime, setLastReloadRequestTime] = useState(undefined); + + const services = useDiscoverServices(); + const aiopsService = services.aiops; + const { trackUiMetric, stateContainer } = props; + + useEffect(() => { + const refetch = stateContainer?.dataState.refetch$.subscribe(() => { + setLastReloadRequestTime(Date.now()); + }); + + return () => { + refetch?.unsubscribe(); + }; + }, [stateContainer]); + + useEffect(() => { + // Track should only be called once when component is loaded + if (aiopsService) { + trackUiMetric?.(METRIC_TYPE.LOADED, PATTERN_ANALYSIS_LOADED); + } + }, [aiopsService, trackUiMetric]); + + const patternAnalysisComponentProps: LogCategorizationEmbeddableProps = useMemo( + () => ({ + input: Object.assign( + {}, + pick(props, ['dataView', 'savedSearch', 'query', 'filters', 'switchToDocumentView']), + { lastReloadRequestTime } + ), + renderViewModeToggle: props.renderViewModeToggle, + }), + [lastReloadRequestTime, props] + ); + + if (!aiopsService) { + return null; + } + + return ( + + ); +}; diff --git a/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx b/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx index 5ae16f0429288..b24bcd3eb42d5 100644 --- a/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx +++ b/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx @@ -114,6 +114,18 @@ describe('useEsqlMode', () => { viewMode: undefined, }); }); + + test('should change viewMode to undefined (default) if it was PATTERN_LEVEL', async () => { + const { replaceUrlState } = renderHookWithContext(false, { + viewMode: VIEW_MODE.PATTERN_LEVEL, + }); + + await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); + expect(replaceUrlState).toHaveBeenCalledWith({ + viewMode: undefined, + }); + }); + test('changing an ES|QL query with different result columns should change state when loading and finished', async () => { const { replaceUrlState, stateContainer } = renderHookWithContext(false); const documents$ = stateContainer.dataState.data$.documents$; diff --git a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts index ac85a24f91f34..28c562d3e7051 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/get_state_defaults.test.ts @@ -98,14 +98,23 @@ describe('getStateDefaults', () => { }); expect(actualForUndefinedViewMode.viewMode).toBeUndefined(); - const actualForEsqlWithInvalidViewMode = getStateDefaults({ + const actualForEsqlWithInvalidAggLevelViewMode = getStateDefaults({ services: discoverServiceMock, savedSearch: { ...savedSearchMockWithESQL, viewMode: VIEW_MODE.AGGREGATED_LEVEL, }, }); - expect(actualForEsqlWithInvalidViewMode.viewMode).toBe(VIEW_MODE.DOCUMENT_LEVEL); + expect(actualForEsqlWithInvalidAggLevelViewMode.viewMode).toBe(VIEW_MODE.DOCUMENT_LEVEL); + + const actualForEsqlWithInvalidPatternLevelViewMode = getStateDefaults({ + services: discoverServiceMock, + savedSearch: { + ...savedSearchMockWithESQL, + viewMode: VIEW_MODE.PATTERN_LEVEL, + }, + }); + expect(actualForEsqlWithInvalidPatternLevelViewMode.viewMode).toBe(VIEW_MODE.DOCUMENT_LEVEL); const actualForEsqlWithValidViewMode = getStateDefaults({ services: discoverServiceMock, @@ -117,15 +126,29 @@ describe('getStateDefaults', () => { expect(actualForEsqlWithValidViewMode.viewMode).toBe(VIEW_MODE.DOCUMENT_LEVEL); expect(actualForEsqlWithValidViewMode.dataSource).toEqual(createEsqlDataSource()); - const actualForWithValidViewMode = getStateDefaults({ + const actualForWithValidAggLevelViewMode = getStateDefaults({ services: discoverServiceMock, savedSearch: { ...savedSearchMock, viewMode: VIEW_MODE.AGGREGATED_LEVEL, }, }); - expect(actualForWithValidViewMode.viewMode).toBe(VIEW_MODE.AGGREGATED_LEVEL); - expect(actualForWithValidViewMode.dataSource).toEqual( + expect(actualForWithValidAggLevelViewMode.viewMode).toBe(VIEW_MODE.AGGREGATED_LEVEL); + expect(actualForWithValidAggLevelViewMode.dataSource).toEqual( + createDataViewDataSource({ + dataViewId: savedSearchMock.searchSource.getField('index')?.id!, + }) + ); + + const actualForWithValidPatternLevelViewMode = getStateDefaults({ + services: discoverServiceMock, + savedSearch: { + ...savedSearchMock, + viewMode: VIEW_MODE.PATTERN_LEVEL, + }, + }); + expect(actualForWithValidPatternLevelViewMode.viewMode).toBe(VIEW_MODE.PATTERN_LEVEL); + expect(actualForWithValidPatternLevelViewMode.dataSource).toEqual( createDataViewDataSource({ dataViewId: savedSearchMock.searchSource.getField('index')?.id!, }) diff --git a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts index 51530926defbf..ff2d4250b3da8 100644 --- a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts +++ b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.test.ts @@ -31,6 +31,13 @@ describe('getValidViewMode', () => { isEsqlMode: false, }) ).toBe(VIEW_MODE.AGGREGATED_LEVEL); + + expect( + getValidViewMode({ + viewMode: VIEW_MODE.PATTERN_LEVEL, + isEsqlMode: false, + }) + ).toBe(VIEW_MODE.PATTERN_LEVEL); }); test('should work correctly for ES|QL mode', () => { @@ -54,5 +61,12 @@ describe('getValidViewMode', () => { isEsqlMode: true, }) ).toBe(VIEW_MODE.DOCUMENT_LEVEL); + + expect( + getValidViewMode({ + viewMode: VIEW_MODE.PATTERN_LEVEL, + isEsqlMode: true, + }) + ).toBe(VIEW_MODE.DOCUMENT_LEVEL); }); }); diff --git a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts index eab9677f083b2..03c3500b7ab2d 100644 --- a/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts +++ b/src/plugins/discover/public/application/main/utils/get_valid_view_mode.ts @@ -20,8 +20,11 @@ export const getValidViewMode = ({ viewMode?: VIEW_MODE; isEsqlMode: boolean; }): VIEW_MODE | undefined => { - if (viewMode === VIEW_MODE.AGGREGATED_LEVEL && isEsqlMode) { - // only this mode is supported for ES|QL languages + if ( + (viewMode === VIEW_MODE.PATTERN_LEVEL || viewMode === VIEW_MODE.AGGREGATED_LEVEL) && + isEsqlMode + ) { + // only this mode is supported for text-based languages return VIEW_MODE.DOCUMENT_LEVEL; } diff --git a/src/plugins/discover/public/build_services.ts b/src/plugins/discover/public/build_services.ts index 91242f3b1cb93..e3524dcdf115c 100644 --- a/src/plugins/discover/public/build_services.ts +++ b/src/plugins/discover/public/build_services.ts @@ -57,6 +57,7 @@ import type { ContentClient } from '@kbn/content-management-plugin/public'; import type { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public'; import { memoize, noop } from 'lodash'; import type { NoDataPagePluginStart } from '@kbn/no-data-page-plugin/public'; +import type { AiopsPluginStart } from '@kbn/aiops-plugin/public'; import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/public'; import { DiscoverStartPlugins } from './plugin'; import { DiscoverContextAppLocator } from './application/context/services/locator'; @@ -77,6 +78,7 @@ export interface UrlTracker { } export interface DiscoverServices { + aiops?: AiopsPluginStart; application: ApplicationStart; addBasePath: (path: string) => string; analytics: AnalyticsServiceStart; @@ -157,6 +159,7 @@ export const buildServices = memoize( const storage = new Storage(localStorage); return { + aiops: plugins.aiops, application: core.application, addBasePath: core.http.basePath.prepend, analytics: core.analytics, diff --git a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx index afc59b6e7d0c6..4d266af5e7949 100644 --- a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx +++ b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx @@ -12,84 +12,153 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import React from 'react'; import { findTestSubject } from '@elastic/eui/lib/test'; +import type { DataView } from '@kbn/data-views-plugin/common'; import { DocumentViewModeToggle } from './view_mode_toggle'; import { BehaviorSubject } from 'rxjs'; import { getDiscoverStateMock } from '../../__mocks__/discover_state.mock'; import { DataTotalHits$ } from '../../application/main/state_management/discover_data_state_container'; import { FetchStatus } from '../../application/types'; +import { ES_FIELD_TYPES } from '@kbn/field-types'; import { discoverServiceMock } from '../../__mocks__/services'; +import { act } from 'react-dom/test-utils'; describe('Document view mode toggle component', () => { - const mountComponent = ({ + const mountComponent = async ({ showFieldStatistics = true, viewMode = VIEW_MODE.DOCUMENT_LEVEL, isEsqlMode = false, setDiscoverViewMode = jest.fn(), + useDataViewWithTextFields = true, } = {}) => { const services = { ...discoverServiceMock, uiSettings: { get: () => showFieldStatistics, }, + aiops: { + getPatternAnalysisAvailable: jest + .fn() + .mockResolvedValue(jest.fn().mockResolvedValue(useDataViewWithTextFields)), + }, }; + const dataViewWithTextFields = { + fields: [ + { + name: 'field1', + esTypes: [ES_FIELD_TYPES.TEXT], + }, + ], + } as unknown as DataView; + + const dataViewWithoutTextFields = { + fields: [ + { + name: 'field1', + esTypes: [ES_FIELD_TYPES.FLOAT], + }, + ], + } as unknown as DataView; + const stateContainer = getDiscoverStateMock({ isTimeBased: true }); stateContainer.dataState.data$.totalHits$ = new BehaviorSubject({ fetchStatus: FetchStatus.COMPLETE, result: 10, }) as DataTotalHits$; - return mountWithIntl( + const component = mountWithIntl( ); + + await act(async () => { + component.update(); + }); + component!.update(); + return component!; }; - it('should render if SHOW_FIELD_STATISTICS is true', () => { - const component = mountComponent(); + it('should render if SHOW_FIELD_STATISTICS is true', async () => { + const component = await mountComponent(); expect(findTestSubject(component, 'dscViewModeToggle').exists()).toBe(true); expect(findTestSubject(component, 'discoverQueryTotalHits').exists()).toBe(true); + + expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(true); + expect(findTestSubject(component, 'dscViewModePatternAnalysisButton').exists()).toBe(true); + expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(true); }); - it('should not render if SHOW_FIELD_STATISTICS is false', () => { - const component = mountComponent({ showFieldStatistics: false }); - expect(findTestSubject(component, 'dscViewModeToggle').exists()).toBe(false); + it('should not render if SHOW_FIELD_STATISTICS is false', async () => { + const component = await mountComponent({ showFieldStatistics: false }); + expect(findTestSubject(component, 'dscViewModeToggle').exists()).toBe(true); expect(findTestSubject(component, 'discoverQueryTotalHits').exists()).toBe(true); + + expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(true); + expect(findTestSubject(component, 'dscViewModePatternAnalysisButton').exists()).toBe(true); + expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(false); }); - it('should not render if ES|QL', () => { - const component = mountComponent({ isEsqlMode: true }); + it('should not render if ES|QL', async () => { + const component = await mountComponent({ isEsqlMode: true }); expect(findTestSubject(component, 'dscViewModeToggle').exists()).toBe(false); expect(findTestSubject(component, 'discoverQueryTotalHits').exists()).toBe(true); + + expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(false); + expect(findTestSubject(component, 'dscViewModePatternAnalysisButton').exists()).toBe(false); + expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(false); }); - it('should set the view mode to VIEW_MODE.DOCUMENT_LEVEL when dscViewModeDocumentButton is clicked', () => { + it('should set the view mode to VIEW_MODE.DOCUMENT_LEVEL when dscViewModeDocumentButton is clicked', async () => { const setDiscoverViewMode = jest.fn(); - const component = mountComponent({ setDiscoverViewMode }); + const component = await mountComponent({ setDiscoverViewMode }); component.find('[data-test-subj="dscViewModeDocumentButton"]').at(0).simulate('click'); expect(setDiscoverViewMode).toHaveBeenCalledWith(VIEW_MODE.DOCUMENT_LEVEL); }); - it('should set the view mode to VIEW_MODE.AGGREGATED_LEVEL when dscViewModeFieldStatsButton is clicked', () => { + it('should set the view mode to VIEW_MODE.PATTERN_LEVEL when dscViewModePatternAnalysisButton is clicked', async () => { const setDiscoverViewMode = jest.fn(); - const component = mountComponent({ setDiscoverViewMode }); + const component = await mountComponent({ setDiscoverViewMode }); + component.find('[data-test-subj="dscViewModePatternAnalysisButton"]').at(0).simulate('click'); + expect(setDiscoverViewMode).toHaveBeenCalledWith(VIEW_MODE.PATTERN_LEVEL); + }); + + it('should set the view mode to VIEW_MODE.AGGREGATED_LEVEL when dscViewModeFieldStatsButton is clicked', async () => { + const setDiscoverViewMode = jest.fn(); + const component = await mountComponent({ setDiscoverViewMode }); component.find('[data-test-subj="dscViewModeFieldStatsButton"]').at(0).simulate('click'); expect(setDiscoverViewMode).toHaveBeenCalledWith(VIEW_MODE.AGGREGATED_LEVEL); }); - it('should select the Documents tab if viewMode is VIEW_MODE.DOCUMENT_LEVEL', () => { - const component = mountComponent(); + it('should select the Documents tab if viewMode is VIEW_MODE.DOCUMENT_LEVEL', async () => { + const component = await mountComponent(); expect(component.find(EuiTab).at(0).prop('isSelected')).toBe(true); }); - it('should select the Field statistics tab if viewMode is VIEW_MODE.AGGREGATED_LEVEL', () => { - const component = mountComponent({ viewMode: VIEW_MODE.AGGREGATED_LEVEL }); + it('should select the Pattern Analysis tab if viewMode is VIEW_MODE.PATTERN_LEVEL', async () => { + const component = await mountComponent({ viewMode: VIEW_MODE.PATTERN_LEVEL }); expect(component.find(EuiTab).at(1).prop('isSelected')).toBe(true); }); + + it('should select the Field statistics tab if viewMode is VIEW_MODE.AGGREGATED_LEVEL', async () => { + const component = await mountComponent({ viewMode: VIEW_MODE.AGGREGATED_LEVEL }); + expect(component.find(EuiTab).at(2).prop('isSelected')).toBe(true); + }); + + it('should switch to document and hide pattern tab when there are no text fields', async () => { + const setDiscoverViewMode = jest.fn(); + const component = await mountComponent({ + viewMode: VIEW_MODE.PATTERN_LEVEL, + useDataViewWithTextFields: false, + setDiscoverViewMode, + }); + expect(setDiscoverViewMode).toHaveBeenCalledWith(VIEW_MODE.DOCUMENT_LEVEL); + expect(component.find(EuiTab).length).toBe(2); + }); }); diff --git a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx index b9b036e266b4e..11351893b6a26 100644 --- a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx +++ b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx @@ -6,14 +6,16 @@ * Side Public License, v 1. */ -import React, { useMemo, ReactElement } from 'react'; +import React, { useMemo, useEffect, useState, type ReactElement, useCallback } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiTab, EuiTabs, useEuiTheme } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; import { isLegacyTableEnabled, SHOW_FIELD_STATISTICS } from '@kbn/discover-utils'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import useMountedState from 'react-use/lib/useMountedState'; import { VIEW_MODE } from '../../../common/constants'; import { useDiscoverServices } from '../../hooks/use_discover_services'; -import { DiscoverStateContainer } from '../../application/main/state_management/discover_state'; +import type { DiscoverStateContainer } from '../../application/main/state_management/discover_state'; import { HitsCounter, HitsCounterMode } from '../hits_counter'; export const DocumentViewModeToggle = ({ @@ -22,20 +24,70 @@ export const DocumentViewModeToggle = ({ prepend, stateContainer, setDiscoverViewMode, + patternCount, + dataView, }: { viewMode: VIEW_MODE; isEsqlMode: boolean; prepend?: ReactElement; stateContainer: DiscoverStateContainer; setDiscoverViewMode: (viewMode: VIEW_MODE) => void; + patternCount?: number; + dataView: DataView; }) => { const { euiTheme } = useEuiTheme(); - const { uiSettings, dataVisualizer: dataVisualizerService } = useDiscoverServices(); + const { + uiSettings, + dataVisualizer: dataVisualizerService, + aiops: aiopsService, + } = useDiscoverServices(); const isLegacy = useMemo( () => isLegacyTableEnabled({ uiSettings, isEsqlMode }), [uiSettings, isEsqlMode] ); - const includesNormalTabsStyle = viewMode === VIEW_MODE.AGGREGATED_LEVEL || isLegacy; + const [showPatternAnalysisTab, setShowPatternAnalysisTab] = useState(null); + const showFieldStatisticsTab = useMemo( + () => uiSettings.get(SHOW_FIELD_STATISTICS) && dataVisualizerService !== undefined, + [dataVisualizerService, uiSettings] + ); + const isMounted = useMountedState(); + + const setShowPatternAnalysisTabWrapper = useCallback( + (value: boolean) => { + if (isMounted()) { + setShowPatternAnalysisTab(value); + } + }, + [isMounted] + ); + + useEffect( + function checkForPatternAnalysis() { + if (!aiopsService) { + setShowPatternAnalysisTab(false); + return; + } + aiopsService + .getPatternAnalysisAvailable() + .then((patternAnalysisAvailable) => { + patternAnalysisAvailable(dataView) + .then(setShowPatternAnalysisTabWrapper) + .catch(() => setShowPatternAnalysisTabWrapper(false)); + }) + .catch(() => setShowPatternAnalysisTabWrapper(false)); + }, + [aiopsService, dataView, setShowPatternAnalysisTabWrapper] + ); + + useEffect(() => { + if (showPatternAnalysisTab === false && viewMode === VIEW_MODE.PATTERN_LEVEL) { + // switch to document view if no text fields are available + setDiscoverViewMode(VIEW_MODE.DOCUMENT_LEVEL); + } + }, [showPatternAnalysisTab, viewMode, setDiscoverViewMode]); + + const includesNormalTabsStyle = + viewMode === VIEW_MODE.AGGREGATED_LEVEL || viewMode === VIEW_MODE.PATTERN_LEVEL || isLegacy; const containerPadding = includesNormalTabsStyle ? euiTheme.size.s : 0; const containerCss = css` @@ -48,9 +100,6 @@ export const DocumentViewModeToggle = ({ } `; - const showViewModeToggle = - (uiSettings.get(SHOW_FIELD_STATISTICS) && dataVisualizerService !== undefined) ?? false; - return ( )} - {isEsqlMode || !showViewModeToggle ? ( + {isEsqlMode || (showFieldStatisticsTab === false && showPatternAnalysisTab === false) ? ( ) : ( @@ -84,16 +133,33 @@ export const DocumentViewModeToggle = ({ - setDiscoverViewMode(VIEW_MODE.AGGREGATED_LEVEL)} - data-test-subj="dscViewModeFieldStatsButton" - > - - + + {showPatternAnalysisTab ? ( + setDiscoverViewMode(VIEW_MODE.PATTERN_LEVEL)} + data-test-subj="dscViewModePatternAnalysisButton" + > + + + ) : null} + + {showFieldStatisticsTab ? ( + setDiscoverViewMode(VIEW_MODE.AGGREGATED_LEVEL)} + data-test-subj="dscViewModeFieldStatsButton" + > + + + ) : null} )} diff --git a/src/plugins/discover/public/plugin.tsx b/src/plugins/discover/public/plugin.tsx index a5ab80cbf4857..2eb34b20345e4 100644 --- a/src/plugins/discover/public/plugin.tsx +++ b/src/plugins/discover/public/plugin.tsx @@ -51,6 +51,7 @@ import type { ObservabilityAIAssistantPublicSetup, ObservabilityAIAssistantPublicStart, } from '@kbn/observability-ai-assistant-plugin/public'; +import type { AiopsPluginStart } from '@kbn/aiops-plugin/public'; import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/public'; import { PLUGIN_ID } from '../common'; import { registerFeature } from './register_feature'; @@ -179,6 +180,7 @@ export interface DiscoverSetupPlugins { * @internal */ export interface DiscoverStartPlugins { + aiops?: AiopsPluginStart; dataViews: DataViewsServicePublic; dataViewEditor: DataViewEditorStart; dataVisualizer?: DataVisualizerPluginStart; diff --git a/src/plugins/discover/tsconfig.json b/src/plugins/discover/tsconfig.json index bf4c06f1c5dbe..970f8753a8cdc 100644 --- a/src/plugins/discover/tsconfig.json +++ b/src/plugins/discover/tsconfig.json @@ -84,12 +84,14 @@ "@kbn/shared-ux-markdown", "@kbn/data-view-utils", "@kbn/presentation-publishing", + "@kbn/aiops-log-pattern-analysis", + "@kbn/field-types", "@kbn/elastic-agent-utils", "@kbn/custom-icons", "@kbn/observability-ai-assistant-plugin", + "@kbn/aiops-plugin", "@kbn/data-visualizer-plugin", "@kbn/search-types", - "@kbn/custom-icons", "@kbn/observability-ai-assistant-plugin" ], "exclude": ["target/**/*"] diff --git a/src/plugins/guided_onboarding/kibana.jsonc b/src/plugins/guided_onboarding/kibana.jsonc index 6dd0d9f80a436..1bbdc9d1003c1 100644 --- a/src/plugins/guided_onboarding/kibana.jsonc +++ b/src/plugins/guided_onboarding/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/guided-onboarding-plugin", - "owner": "@elastic/platform-onboarding", + "owner": "@elastic/appex-sharedux", "description": "Guided onboarding framework", "plugin": { "id": "guidedOnboarding", diff --git a/src/plugins/input_control_vis/public/input_control_vis_renderer.tsx b/src/plugins/input_control_vis/public/input_control_vis_renderer.tsx index 4f0c5f1c2f4f4..7c86de1fe1e0b 100644 --- a/src/plugins/input_control_vis/public/input_control_vis_renderer.tsx +++ b/src/plugins/input_control_vis/public/input_control_vis_renderer.tsx @@ -19,12 +19,13 @@ export const getInputControlVisRenderer: ( name: 'input_control_vis', reuseDomNode: true, render: async (domNode, { visConfig }, handlers) => { + const [coreStart] = await deps.core.getStartServices(); let registeredController = inputControlVisRegistry.get(domNode); if (!registeredController) { const { createInputControlVisController } = await import('./vis_controller'); - registeredController = createInputControlVisController(deps, handlers, domNode); + registeredController = createInputControlVisController(coreStart, deps, handlers, domNode); inputControlVisRegistry.set(domNode, registeredController); handlers.onDestroy(() => { diff --git a/src/plugins/input_control_vis/public/vis_controller.tsx b/src/plugins/input_control_vis/public/vis_controller.tsx index 0bf6f0d0754a9..df02fca8ecf49 100644 --- a/src/plugins/input_control_vis/public/vis_controller.tsx +++ b/src/plugins/input_control_vis/public/vis_controller.tsx @@ -11,11 +11,12 @@ import { isEqual } from 'lodash'; import { render, unmountComponentAtNode } from 'react-dom'; import { Subscription } from 'rxjs'; -import { I18nStart } from '@kbn/core/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { IInterpreterRenderHandlers } from '@kbn/expressions-plugin/common'; import { Filter } from '@kbn/es-query'; import { VisualizationContainer } from '@kbn/visualizations-plugin/public'; import { FilterManager } from '@kbn/data-plugin/public'; +import { CoreStart } from '@kbn/core/public'; import { InputControlVis } from './components/vis/input_control_vis'; import { getControlFactory } from './control/control_factory'; @@ -28,11 +29,11 @@ import { InputControlVisParams } from './types'; export type InputControlVisControllerType = ReturnType; export const createInputControlVisController = ( + coreStart: CoreStart, deps: InputControlVisDependencies, handlers: IInterpreterRenderHandlers, el: Element ) => { - let I18nContext: I18nStart['Context'] | undefined; let isLoaded = false; return new (class InputControlVisController { @@ -65,10 +66,6 @@ export const createInputControlVisController = ( } async render(visParams: InputControlVisParams) { - if (!I18nContext) { - const [{ i18n }] = await deps.core.getStartServices(); - I18nContext = i18n.Context; - } if (!isLoaded || !isEqual(visParams, this.visParams)) { this.visParams = visParams; this.controls = []; @@ -86,12 +83,8 @@ export const createInputControlVisController = ( } drawVis = () => { - if (!I18nContext) { - throw new Error('no i18n context found'); - } - render( - + - , + , el ); }; diff --git a/src/plugins/input_control_vis/tsconfig.json b/src/plugins/input_control_vis/tsconfig.json index 5e6020990edd3..5b4900ad1845c 100644 --- a/src/plugins/input_control_vis/tsconfig.json +++ b/src/plugins/input_control_vis/tsconfig.json @@ -26,6 +26,7 @@ "@kbn/ui-actions-plugin", "@kbn/embeddable-plugin", "@kbn/presentation-publishing", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", diff --git a/src/plugins/navigation/public/index.ts b/src/plugins/navigation/public/index.ts index 2961c09e33da8..4a26bc6552ad3 100644 --- a/src/plugins/navigation/public/index.ts +++ b/src/plugins/navigation/public/index.ts @@ -20,6 +20,7 @@ export type { NavigationPublicSetup as NavigationPublicPluginSetup, NavigationPublicStart as NavigationPublicPluginStart, SolutionType, + AddSolutionNavigationArg, } from './types'; // Export plugin after all other imports diff --git a/src/plugins/navigation/public/plugin.test.ts b/src/plugins/navigation/public/plugin.test.ts index 07de4ff3483a5..6733a54cdc18b 100644 --- a/src/plugins/navigation/public/plugin.test.ts +++ b/src/plugins/navigation/public/plugin.test.ts @@ -139,7 +139,7 @@ describe('Navigation Plugin', () => { expect(coreStart.chrome.project.updateSolutionNavigations).toHaveBeenCalled(); const [arg] = coreStart.chrome.project.updateSolutionNavigations.mock.calls[0]; - expect(Object.keys(arg)).toEqual(['es', 'oblt']); + expect(Object.keys(arg)).toEqual(['oblt']); expect(coreStart.chrome.project.changeActiveSolutionNavigation).toHaveBeenCalledWith(null); }); diff --git a/src/plugins/navigation/public/plugin.tsx b/src/plugins/navigation/public/plugin.tsx index e62eb5c2c104f..2a36bc8e980ed 100644 --- a/src/plugins/navigation/public/plugin.tsx +++ b/src/plugins/navigation/public/plugin.tsx @@ -30,7 +30,6 @@ import type { SolutionNavigationDefinitions, } from '@kbn/core-chrome-browser'; import { InternalChromeStart } from '@kbn/core-chrome-browser-internal'; -import { definition as esDefinition } from '@kbn/solution-nav-es'; import { definition as obltDefinition } from '@kbn/solution-nav-oblt'; import type { PanelContentProvider } from '@kbn/shared-ux-chrome-navigation'; import { UserProfileData } from '@kbn/user-profile-components'; @@ -271,10 +270,6 @@ export class NavigationPublicPlugin private addDefaultSolutionNavigation({ chrome }: { chrome: InternalChromeStart }) { const solutionNavs: SolutionNavigationDefinitions = { - es: { - ...esDefinition, - sideNavComponent: this.getSideNavComponent({ dataTestSubj: 'searchSideNav' }), - }, oblt: { ...obltDefinition, sideNavComponent: this.getSideNavComponent({ dataTestSubj: 'observabilitySideNav' }), diff --git a/src/plugins/navigation/tsconfig.json b/src/plugins/navigation/tsconfig.json index 10818f045be04..8e96cf02c92ba 100644 --- a/src/plugins/navigation/tsconfig.json +++ b/src/plugins/navigation/tsconfig.json @@ -24,7 +24,6 @@ "@kbn/config-schema", "@kbn/core-plugins-server", "@kbn/i18n", - "@kbn/solution-nav-es", "@kbn/solution-nav-oblt", "@kbn/config", "@kbn/security-plugin", diff --git a/src/plugins/saved_search/common/content_management/v1/cm_services.ts b/src/plugins/saved_search/common/content_management/v1/cm_services.ts index bc9d18b21e5b7..ef9d24bb8722d 100644 --- a/src/plugins/saved_search/common/content_management/v1/cm_services.ts +++ b/src/plugins/saved_search/common/content_management/v1/cm_services.ts @@ -42,7 +42,11 @@ const savedSearchAttributesSchema = schema.object( searchSourceJSON: schema.string(), }), viewMode: schema.maybe( - schema.oneOf([schema.literal('documents'), schema.literal('aggregated')]) + schema.oneOf([ + schema.literal('documents'), + schema.literal('patterns'), + schema.literal('aggregated'), + ]) ), hideAggregatedPreview: schema.maybe(schema.boolean()), rowHeight: schema.maybe(schema.number()), diff --git a/src/plugins/saved_search/common/index.ts b/src/plugins/saved_search/common/index.ts index 0ac92232fb3b8..f0569a86ca39a 100644 --- a/src/plugins/saved_search/common/index.ts +++ b/src/plugins/saved_search/common/index.ts @@ -19,6 +19,7 @@ export type { export enum VIEW_MODE { DOCUMENT_LEVEL = 'documents', AGGREGATED_LEVEL = 'aggregated', + PATTERN_LEVEL = 'patterns', } export { diff --git a/src/plugins/saved_search/server/saved_objects/schema.ts b/src/plugins/saved_search/server/saved_objects/schema.ts index fb0308915fe72..125ddcceb320c 100644 --- a/src/plugins/saved_search/server/saved_objects/schema.ts +++ b/src/plugins/saved_search/server/saved_objects/schema.ts @@ -119,3 +119,13 @@ export const SCHEMA_SEARCH_MODEL_VERSION_3 = SCHEMA_SEARCH_MODEL_VERSION_2.exten ]) ), }); + +export const SCHEMA_SEARCH_MODEL_VERSION_4 = SCHEMA_SEARCH_MODEL_VERSION_3.extends({ + viewMode: schema.maybe( + schema.oneOf([ + schema.literal(VIEW_MODE.DOCUMENT_LEVEL), + schema.literal(VIEW_MODE.PATTERN_LEVEL), + schema.literal(VIEW_MODE.AGGREGATED_LEVEL), + ]) + ), +}); diff --git a/src/plugins/saved_search/server/saved_objects/search.ts b/src/plugins/saved_search/server/saved_objects/search.ts index 6c6a9bb81c1ed..925a4dd66b180 100644 --- a/src/plugins/saved_search/server/saved_objects/search.ts +++ b/src/plugins/saved_search/server/saved_objects/search.ts @@ -15,6 +15,7 @@ import { SCHEMA_SEARCH_MODEL_VERSION_1, SCHEMA_SEARCH_MODEL_VERSION_2, SCHEMA_SEARCH_MODEL_VERSION_3, + SCHEMA_SEARCH_MODEL_VERSION_4, } from './schema'; export function getSavedSearchObjectType( @@ -62,6 +63,13 @@ export function getSavedSearchObjectType( create: SCHEMA_SEARCH_MODEL_VERSION_3, }, }, + 4: { + changes: [], + schemas: { + forwardCompatibility: SCHEMA_SEARCH_MODEL_VERSION_4.extends({}, { unknowns: 'ignore' }), + create: SCHEMA_SEARCH_MODEL_VERSION_4, + }, + }, }, mappings: { dynamic: false, diff --git a/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx b/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx index 8df43b51a020c..d828a41d7b2ec 100644 --- a/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx +++ b/src/plugins/ui_actions/public/tests/test_samples/hello_world_action.tsx @@ -10,30 +10,37 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiBadge, EuiFlyoutBody } from '@elastic/eui'; import { CoreStart } from '@kbn/core/public'; import { toMountPoint } from '@kbn/react-kibana-mount'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { ActionDefinition } from '../../actions'; -const MenuItem: React.FC = () => { - return ( - - Hello world! - - {'secret'} - - - ); +type StartServices = Pick; + +const getMenuItem = (core: StartServices) => { + return () => { + return ( + + + Hello world! + + {'secret'} + + + + ); + }; }; export const ACTION_HELLO_WORLD = 'ACTION_HELLO_WORLD'; export function createHelloWorldAction( - coreStart: Pick + coreStart: StartServices & Pick ): ActionDefinition { const { overlays, ...startServices } = coreStart; return { id: ACTION_HELLO_WORLD, type: ACTION_HELLO_WORLD, getIconType: () => 'lock', - MenuItem, + MenuItem: getMenuItem(startServices), execute: async () => { overlays.openFlyout( toMountPoint( diff --git a/src/plugins/vis_type_markdown/public/markdown_renderer.tsx b/src/plugins/vis_type_markdown/public/markdown_renderer.tsx index 38805bd5ce697..e733290f5815f 100644 --- a/src/plugins/vis_type_markdown/public/markdown_renderer.tsx +++ b/src/plugins/vis_type_markdown/public/markdown_renderer.tsx @@ -8,27 +8,43 @@ import React, { lazy } from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; + import { VisualizationContainer } from '@kbn/visualizations-plugin/public'; import { ExpressionRenderDefinition } from '@kbn/expressions-plugin/common/expression_renderers'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import { StartServicesAccessor } from '@kbn/core-lifecycle-browser'; import { MarkdownVisRenderValue } from './markdown_fn'; +/** @internal **/ +export interface MarkdownVisRendererDependencies { + getStartDeps: StartServicesAccessor; +} + // @ts-ignore const MarkdownVisComponent = lazy(() => import('./markdown_vis_controller')); -export const markdownVisRenderer: ExpressionRenderDefinition = { +export const getMarkdownVisRenderer: ({ + getStartDeps, +}: MarkdownVisRendererDependencies) => ExpressionRenderDefinition = ({ + getStartDeps, +}) => ({ name: 'markdown_vis', displayName: 'markdown visualization', reuseDomNode: true, render: async (domNode, { visParams }, handlers) => { + const [core] = await getStartDeps(); + handlers.onDestroy(() => { unmountComponentAtNode(domNode); }); render( - - - , + + + + + , domNode ); }, -}; +}); diff --git a/src/plugins/vis_type_markdown/public/plugin.ts b/src/plugins/vis_type_markdown/public/plugin.ts index 97848aab8afc7..66f46ce3bdbc0 100644 --- a/src/plugins/vis_type_markdown/public/plugin.ts +++ b/src/plugins/vis_type_markdown/public/plugin.ts @@ -13,7 +13,7 @@ import { VisualizationsSetup } from '@kbn/visualizations-plugin/public'; import { markdownVisDefinition } from './markdown_vis'; import { createMarkdownVisFn } from './markdown_fn'; import { ConfigSchema } from '../config'; -import { markdownVisRenderer } from './markdown_renderer'; +import { getMarkdownVisRenderer } from './markdown_renderer'; /** @internal */ export interface MarkdownPluginSetupDependencies { @@ -31,7 +31,7 @@ export class MarkdownPlugin implements Plugin { public setup(core: CoreSetup, { expressions, visualizations }: MarkdownPluginSetupDependencies) { visualizations.createBaseVisualization(markdownVisDefinition); - expressions.registerRenderer(markdownVisRenderer); + expressions.registerRenderer(getMarkdownVisRenderer({ getStartDeps: core.getStartServices })); expressions.registerFunction(createMarkdownVisFn); } diff --git a/src/plugins/vis_type_markdown/tsconfig.json b/src/plugins/vis_type_markdown/tsconfig.json index 5b9639787e12c..dbe601fad3f35 100644 --- a/src/plugins/vis_type_markdown/tsconfig.json +++ b/src/plugins/vis_type_markdown/tsconfig.json @@ -17,6 +17,8 @@ "@kbn/i18n-react", "@kbn/config-schema", "@kbn/kibana-react-plugin", + "@kbn/react-kibana-context-render", + "@kbn/core-lifecycle-browser", ], "exclude": [ "target/**/*", diff --git a/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx b/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx index a6fdbd998dc80..3d44d3b77c4c7 100644 --- a/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx +++ b/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx @@ -85,12 +85,12 @@ export const getTimelionVisRenderer: ( }; render( - - + + {seriesList && ( )} - - , + + , + domNode ); }, diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx index be006bd1dd438..ad1678e4168ce 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx @@ -356,7 +356,13 @@ export class VisualizeEmbeddable } if (this.warningDomNode) { - render(, this.warningDomNode); + const { core } = this.deps.start(); + render( + + + , + this.warningDomNode + ); } } diff --git a/test/examples/config.js b/test/examples/config.js index 77d73642afd1c..dd8b49753dba5 100644 --- a/test/examples/config.js +++ b/test/examples/config.js @@ -31,6 +31,7 @@ export default async function ({ readConfigFile }) { require.resolve('./unified_field_list_examples'), require.resolve('./discover_customization_examples'), require.resolve('./error_boundary'), + require.resolve('./response_stream'), ], services: { ...functionalConfig.get('services'), diff --git a/test/examples/response_stream/index.ts b/test/examples/response_stream/index.ts index b918de669819b..2f13bf2f9f70c 100644 --- a/test/examples/response_stream/index.ts +++ b/test/examples/response_stream/index.ts @@ -10,7 +10,17 @@ import { FtrProviderContext } from '../../functional/ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { - describe('response stream', function () { + const browser = getService('browser'); + const PageObjects = getPageObjects(['common', 'header']); + + describe('response-stream', function () { + before(async () => { + await browser.setWindowSize(1300, 900); + await PageObjects.common.navigateToApp('response-stream', { insertTimestamp: false }); + }); + + loadTestFile(require.resolve('./string_stream')); loadTestFile(require.resolve('./reducer_stream')); + loadTestFile(require.resolve('./redux_stream')); }); } diff --git a/test/examples/response_stream/reducer_stream.ts b/test/examples/response_stream/reducer_stream.ts index 001fea1a144c8..4e9c0f9a7af09 100644 --- a/test/examples/response_stream/reducer_stream.ts +++ b/test/examples/response_stream/reducer_stream.ts @@ -6,84 +6,47 @@ * Side Public License, v 1. */ -import fetch from 'node-fetch'; -import { format as formatUrl } from 'url'; - import expect from '@kbn/expect'; - import { FtrProviderContext } from '../../functional/ftr_provider_context'; -import { parseStream } from './parse_stream'; - // eslint-disable-next-line import/no-default-export -export default ({ getService }: FtrProviderContext) => { - const supertest = getService('supertest'); - const config = getService('config'); - const kibanaServerUrl = formatUrl(config.get('servers.kibana')); - - describe('POST /internal/response_stream/reducer_stream', () => { - it('should return full data without streaming', async () => { - const resp = await supertest - .post('/internal/response_stream/reducer_stream') - .set('kbn-xsrf', 'kibana') - .send({ - timeout: 1, - }) - .expect(200); - - expect(Buffer.isBuffer(resp.body)).to.be(true); - - const chunks: string[] = resp.body.toString().split('\n'); - - expect(chunks.length).to.be(201); - - const lastChunk = chunks.pop(); - expect(lastChunk).to.be(''); - - let data: any[] = []; +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + + describe('useReducer stream example', () => { + it('navigates to the example', async () => { + await testSubjects.click('ndjson-usereducer-stream'); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('responseStreamPageTitle')).to.be( + 'NDJSON useReducer stream' + ); + expect(await testSubjects.getVisibleText('responseStreamProgressBadge')).to.be('0%'); + expect(await testSubjects.getVisibleText('responseStreamStatusMessage')).to.be( + 'Development did not start yet.' + ); + }); + }); - expect(() => { - data = chunks.map((c) => JSON.parse(c)); - }).not.to.throwError(); + it('starts the stream', async () => { + await testSubjects.click('responseStreamStartButton'); - data.forEach((d) => { - expect(typeof d.type).to.be('string'); + await retry.try(async () => { + expect(await testSubjects.getVisibleText('responseStreamProgressBadge')).not.to.be('0%'); + expect(await testSubjects.getVisibleText('responseStreamStatusMessage')).to.be( + 'Development is ongoing, the hype is real!' + ); }); - - const progressData = data.filter((d) => d.type === 'update_progress'); - expect(progressData.length).to.be(100); - expect(progressData[0].payload).to.be(1); - expect(progressData[progressData.length - 1].payload).to.be(100); }); - it('should return data in chunks with streaming', async () => { - const response = await fetch(`${kibanaServerUrl}/internal/response_stream/reducer_stream`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'kbn-xsrf': 'stream', - }, - body: JSON.stringify({ timeout: 1 }), + it('finishes the stream', async () => { + await retry.tryForTime(60000, async () => { + expect(await testSubjects.getVisibleText('responseStreamProgressBadge')).to.be('100%'); + expect(await testSubjects.getVisibleText('responseStreamStatusMessage')).to.be( + 'Development completed, the release got out the door!' + ); }); - - const stream = response.body; - - expect(stream).not.to.be(null); - - if (stream !== null) { - const progressData: any[] = []; - - for await (const action of parseStream(stream)) { - expect(action.type).not.to.be('error'); - if (action.type === 'update_progress') { - progressData.push(action); - } - } - - expect(progressData.length).to.be(100); - expect(progressData[0].payload).to.be(1); - expect(progressData[progressData.length - 1].payload).to.be(100); - } }); }); -}; +} diff --git a/test/examples/response_stream/redux_stream.ts b/test/examples/response_stream/redux_stream.ts new file mode 100644 index 0000000000000..6a9e73d1d35a5 --- /dev/null +++ b/test/examples/response_stream/redux_stream.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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../functional/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + + describe('redux stream example', () => { + it('navigates to the example', async () => { + await testSubjects.click('ndjson-redux-toolkit-stream'); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('responseStreamPageTitle')).to.be( + 'NDJSON Redux Toolkit stream' + ); + expect(await testSubjects.getVisibleText('responseStreamProgressBadge')).to.be('0%'); + expect(await testSubjects.getVisibleText('responseStreamStatusMessage')).to.be( + 'Development did not start yet.' + ); + }); + }); + + it('starts the stream', async () => { + await testSubjects.click('responseStreamStartButton'); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('responseStreamProgressBadge')).not.to.be('0%'); + expect(await testSubjects.getVisibleText('responseStreamStatusMessage')).to.be( + 'Development is ongoing, the hype is real!' + ); + }); + }); + + it('finishes the stream', async () => { + await retry.tryForTime(60000, async () => { + expect(await testSubjects.getVisibleText('responseStreamProgressBadge')).to.be('100%'); + expect(await testSubjects.getVisibleText('responseStreamStatusMessage')).to.be( + 'Development completed, the release got out the door!' + ); + }); + }); + }); +} diff --git a/test/examples/response_stream/string_stream.ts b/test/examples/response_stream/string_stream.ts new file mode 100644 index 0000000000000..d522b8f5f2484 --- /dev/null +++ b/test/examples/response_stream/string_stream.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. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../functional/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + + describe('string stream example', () => { + it('navigates to the example', async () => { + await testSubjects.click('simple-string-stream'); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('responseStreamPageTitle')).to.be( + 'Simple string stream' + ); + expect(await testSubjects.exists('responseStreamStartButton')).to.be(true); + expect(await testSubjects.getVisibleText('responseStreamString')).to.be(''); + }); + }); + + it('starts the stream', async () => { + await testSubjects.click('responseStreamStartButton'); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('responseStreamString')).not.to.be(''); + }); + }); + + it('finishes the stream', async () => { + await retry.tryForTime(60000, async () => { + expect(await testSubjects.getVisibleText('responseStreamString')).to.be( + 'Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents. Elasticsearch is developed in Java and is dual-licensed under the source-available Server Side Public License and the Elastic license, while other parts fall under the proprietary (source-available) Elastic License. Official clients are available in Java, .NET (C#), PHP, Python, Apache Groovy, Ruby and many other languages. According to the DB-Engines ranking, Elasticsearch is the most popular enterprise search engine.' + ); + }); + }); + }); +} diff --git a/test/functional/apps/discover/group4/_esql_view.ts b/test/functional/apps/discover/group4/_esql_view.ts index a5a626b8fe771..a1cecdbc36d4c 100644 --- a/test/functional/apps/discover/group4/_esql_view.ts +++ b/test/functional/apps/discover/group4/_esql_view.ts @@ -257,21 +257,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/183847 - describe.skip('inspector', () => { + describe('inspector', () => { beforeEach(async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); }); it('shows Discover and Lens requests in Inspector', async () => { await PageObjects.discover.selectTextBaseLang(); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await inspector.open(); - const requestNames = await inspector.getRequestNames(); - expect(requestNames).to.contain('Table'); - expect(requestNames).to.contain('Visualization'); + let retries = 0; + await retry.try(async () => { + if (retries > 0) { + await inspector.close(); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + } + await inspector.open(); + retries = retries + 1; + const requestNames = await inspector.getRequestNames(); + expect(requestNames).to.contain('Table'); + expect(requestNames).to.contain('Visualization'); + }); }); }); diff --git a/test/functional/apps/discover/group6/_view_mode_toggle.ts b/test/functional/apps/discover/group6/_view_mode_toggle.ts index eada1ec26f7aa..ba964c7532d70 100644 --- a/test/functional/apps/discover/group6/_view_mode_toggle.ts +++ b/test/functional/apps/discover/group6/_view_mode_toggle.ts @@ -88,6 +88,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.missingOrFail('discoverErrorCalloutTitle'); }); + it('should not show Patterns tab (basic license)', async () => { + await testSubjects.missingOrFail('dscViewModePatternAnalysisButton'); + await retry.try(async () => { + const documentTab = await testSubjects.find('dscViewModeDocumentButton'); + expect(await documentTab.getAttribute('aria-selected')).to.be('true'); + }); + }); + it('should show Field Statistics tab', async () => { await testSubjects.click('dscViewModeFieldStatsButton'); diff --git a/test/plugin_functional/plugins/core_app_status/public/application.tsx b/test/plugin_functional/plugins/core_app_status/public/application.tsx index 3ea989dfbf1d2..4ee336ae0aa2f 100644 --- a/test/plugin_functional/plugins/core_app_status/public/application.tsx +++ b/test/plugin_functional/plugins/core_app_status/public/application.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { EuiPage, EuiPageBody, @@ -17,7 +18,7 @@ import { EuiTitle, } from '@elastic/eui'; -import { AppMountParameters } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; const AppStatusApp = ({ appId }: { appId: string }) => ( @@ -41,8 +42,17 @@ const AppStatusApp = ({ appId }: { appId: string }) => ( ); -export const renderApp = (appId: string, { element }: AppMountParameters) => { - render(, element); +export const renderApp = async ( + appId: string, + { element }: AppMountParameters, + core: CoreStart +) => { + render( + + + , + element + ); return () => unmountComponentAtNode(element); }; diff --git a/test/plugin_functional/plugins/core_app_status/public/plugin.tsx b/test/plugin_functional/plugins/core_app_status/public/plugin.tsx index e5be727bea174..d3901e8a44632 100644 --- a/test/plugin_functional/plugins/core_app_status/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_app_status/public/plugin.tsx @@ -26,7 +26,8 @@ export class CoreAppStatusPlugin implements Plugin<{}, CoreAppStatusPluginStart> id: 'app_status_start', title: 'App Status Start Page', async mount(params: AppMountParameters) { - return renderApp('app_status_start', params); + const [coreStart] = await core.getStartServices(); + return renderApp('app_status_start', params, coreStart); }, }); @@ -36,7 +37,8 @@ export class CoreAppStatusPlugin implements Plugin<{}, CoreAppStatusPluginStart> euiIconType: 'snowflake', updater$: this.appUpdater, async mount(params: AppMountParameters) { - return renderApp('app_status', params); + const [coreStart] = await core.getStartServices(); + return renderApp('app_status', params, coreStart); }, }); diff --git a/test/plugin_functional/plugins/core_app_status/tsconfig.json b/test/plugin_functional/plugins/core_app_status/tsconfig.json index ef3b1a3322e43..75bcb3f61eba2 100644 --- a/test/plugin_functional/plugins/core_app_status/tsconfig.json +++ b/test/plugin_functional/plugins/core_app_status/tsconfig.json @@ -14,5 +14,6 @@ ], "kbn_references": [ "@kbn/core", + "@kbn/react-kibana-context-render", ], } diff --git a/test/plugin_functional/plugins/core_plugin_a/public/application.tsx b/test/plugin_functional/plugins/core_plugin_a/public/application.tsx index 6c1440c10abf2..b0b9f61da0945 100644 --- a/test/plugin_functional/plugins/core_plugin_a/public/application.tsx +++ b/test/plugin_functional/plugins/core_plugin_a/public/application.tsx @@ -10,6 +10,7 @@ import { History } from 'history'; import React from 'react'; import ReactDOM from 'react-dom'; import { withRouter, RouteComponentProps, Redirect } from 'react-router-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Router, Route } from '@kbn/shared-ux-router'; import { @@ -100,16 +101,18 @@ const Nav = withRouter(({ history, navigateToApp }: NavProps) => ( )); const FooApp = ({ history, coreStart }: { history: History; coreStart: CoreStart }) => ( - - - -
diff --git a/x-pack/plugins/ml/public/cases/register_cases_attachments.ts b/x-pack/plugins/ml/public/cases/register_cases_attachments.ts index 6b97fd84962a6..2625affdec331 100644 --- a/x-pack/plugins/ml/public/cases/register_cases_attachments.ts +++ b/x-pack/plugins/ml/public/cases/register_cases_attachments.ts @@ -8,14 +8,23 @@ import type { CasesPublicSetup } from '@kbn/cases-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import { registerAnomalyChartsCasesAttachment } from './register_anomaly_charts_attachment'; +import { registerSingleMetricViewerCasesAttachment } from './register_single_metric_viewer_attachment'; import type { MlStartDependencies } from '../plugin'; +import type { SingleMetricViewerServices } from '../embeddables/types'; import { registerAnomalySwimLaneCasesAttachment } from './register_anomaly_swim_lane_attachment'; export function registerCasesAttachments( cases: CasesPublicSetup, coreStart: CoreStart, - pluginStart: MlStartDependencies + pluginStart: MlStartDependencies, + singleMetricViewerServices: SingleMetricViewerServices ) { registerAnomalySwimLaneCasesAttachment(cases, pluginStart); registerAnomalyChartsCasesAttachment(cases, coreStart, pluginStart); + registerSingleMetricViewerCasesAttachment( + cases, + coreStart, + pluginStart, + singleMetricViewerServices + ); } diff --git a/x-pack/plugins/ml/public/cases/register_single_metric_viewer_attachment.tsx b/x-pack/plugins/ml/public/cases/register_single_metric_viewer_attachment.tsx new file mode 100644 index 0000000000000..8ef4c0bc3813c --- /dev/null +++ b/x-pack/plugins/ml/public/cases/register_single_metric_viewer_attachment.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CasesPublicSetup } from '@kbn/cases-plugin/public'; +import { i18n } from '@kbn/i18n'; +import type { CoreStart } from '@kbn/core/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { PLUGIN_ICON } from '../../common/constants/app'; +import { CASE_ATTACHMENT_TYPE_ID_SINGLE_METRIC_VIEWER } from '../../common/constants/cases'; +import type { MlStartDependencies } from '../plugin'; +import { getSingleMetricViewerComponent } from '../shared_components/single_metric_viewer'; +import type { SingleMetricViewerServices } from '../embeddables/types'; +import type { MlDependencies } from '../application/app'; + +export function registerSingleMetricViewerCasesAttachment( + cases: CasesPublicSetup, + coreStart: CoreStart, + pluginStart: MlStartDependencies, + mlServices: SingleMetricViewerServices +) { + const SingleMetricViewerComponent = getSingleMetricViewerComponent( + coreStart, + pluginStart as MlDependencies, + mlServices + ); + + cases.attachmentFramework.registerPersistableState({ + id: CASE_ATTACHMENT_TYPE_ID_SINGLE_METRIC_VIEWER, + icon: PLUGIN_ICON, + displayName: i18n.translate('xpack.ml.cases.registerSingleMetricViewer.displayName', { + defaultMessage: 'Single metric viewer', + }), + getAttachmentViewObject: () => ({ + event: ( + + ), + timelineAvatar: PLUGIN_ICON, + children: React.lazy(async () => { + const { initComponent } = await import('./single_metric_viewer_attachment'); + return { + default: initComponent(pluginStart.fieldFormats, SingleMetricViewerComponent), + }; + }), + }), + }); +} diff --git a/x-pack/plugins/ml/public/cases/single_metric_viewer_attachment.tsx b/x-pack/plugins/ml/public/cases/single_metric_viewer_attachment.tsx new file mode 100644 index 0000000000000..d3b8e82616981 --- /dev/null +++ b/x-pack/plugins/ml/public/cases/single_metric_viewer_attachment.tsx @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiDescriptionList } from '@elastic/eui'; +import type { PersistableStateAttachmentViewProps } from '@kbn/cases-plugin/public/client/attachment_framework/types'; +import moment from 'moment'; +import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; +import { FormattedMessage } from '@kbn/i18n-react'; +import deepEqual from 'fast-deep-equal'; +import { memoize } from 'lodash'; +import React from 'react'; +import type { SingleMetricViewerEmbeddableState } from '../embeddables/types'; +import type { SingleMetricViewerSharedComponent } from '../shared_components/single_metric_viewer'; + +export const initComponent = memoize( + ( + fieldFormats: FieldFormatsStart, + SingleMetricViewerComponent: SingleMetricViewerSharedComponent + ) => { + return React.memo( + (props: PersistableStateAttachmentViewProps) => { + const { persistableStateAttachmentState, caseData } = props; + + const inputProps = + persistableStateAttachmentState as unknown as SingleMetricViewerEmbeddableState; + + const dataFormatter = fieldFormats.deserialize({ + id: FIELD_FORMAT_IDS.DATE, + }); + + const listItems = [ + { + title: ( + + ), + description: inputProps.jobIds.join(', '), + }, + { + title: ( + + ), + description: `${dataFormatter.convert( + inputProps.timeRange!.from + )} - ${dataFormatter.convert(inputProps.timeRange!.to)}`, + }, + ]; + + if (typeof inputProps.query?.query === 'string' && inputProps.query?.query !== '') { + listItems.push({ + title: ( + + ), + description: inputProps.query?.query, + }); + } + + const { jobIds, timeRange, ...rest } = inputProps; + const selectedJobId = jobIds[0]; + + return ( + <> + + + + ); + }, + (prevProps, nextProps) => + deepEqual( + prevProps.persistableStateAttachmentState, + nextProps.persistableStateAttachmentState + ) + ); + } +); diff --git a/x-pack/plugins/ml/public/embeddables/constants.ts b/x-pack/plugins/ml/public/embeddables/constants.ts index 1e42301676dfc..96abeb5c8d056 100644 --- a/x-pack/plugins/ml/public/embeddables/constants.ts +++ b/x-pack/plugins/ml/public/embeddables/constants.ts @@ -14,4 +14,7 @@ export type AnomalyExplorerChartsEmbeddableType = typeof ANOMALY_EXPLORER_CHARTS export type AnomalySingleMetricViewerEmbeddableType = typeof ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE; -export type MlEmbeddableTypes = AnomalySwimLaneEmbeddableType | AnomalyExplorerChartsEmbeddableType; +export type MlEmbeddableTypes = + | AnomalySwimLaneEmbeddableType + | AnomalyExplorerChartsEmbeddableType + | AnomalySingleMetricViewerEmbeddableType; diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts index 5e8464f9f9ce5..8dab0f4b65ea0 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/get_services.ts @@ -6,20 +6,21 @@ */ import type { StartServicesAccessor } from '@kbn/core/public'; +import type { CoreStart } from '@kbn/core-lifecycle-browser'; import type { MlPluginStart, MlStartDependencies } from '../../plugin'; import type { MlDependencies } from '../../application/app'; import { HttpService } from '../../application/services/http_service'; import { AnomalyExplorerChartsService } from '../../application/services/anomaly_explorer_charts_service'; -import type { SingleMetricViewerEmbeddableServices } from '../types'; +import type { SingleMetricViewerEmbeddableServices, SingleMetricViewerServices } from '../types'; /** - * Provides the services required by the Anomaly Swimlane Embeddable. + * Provides the ML services required by the Single Metric Viewer Embeddable. */ -export const getServices = async ( - getStartServices: StartServicesAccessor -): Promise => { +export const getMlServices = async ( + coreStart: CoreStart, + pluginsStart: MlStartDependencies +): Promise => { const [ - [coreStart, pluginsStart], { AnomalyDetectorService }, { fieldFormatServiceFactory }, { indexServiceFactory }, @@ -31,7 +32,6 @@ export const getServices = async ( { timeSeriesSearchServiceFactory }, { toastNotificationServiceProvider }, ] = await Promise.all([ - await getStartServices(), await import('../../application/services/anomaly_detector_service'), await import('../../application/services/field_format_service_factory'), await import('../../application/util/index_service'), @@ -64,7 +64,6 @@ export const getServices = async ( mlApiServices, mlResultsService ); - // Note on the following services: // - `mlIndexUtils` is just instantiated here to be passed on to `mlFieldFormatService`, // but it's not being made available as part of global services. Since it's just @@ -76,21 +75,28 @@ export const getServices = async ( // way this manages its own state right now doesn't consider React component lifecycles. const mlIndexUtils = indexServiceFactory(pluginsStart.data.dataViews); const mlFieldFormatService = fieldFormatServiceFactory(mlApiServices, mlIndexUtils); + return { + anomalyDetectorService, + anomalyExplorerService, + mlApiServices, + mlCapabilities, + mlFieldFormatService, + mlJobService, + mlResultsService, + mlTimeSeriesSearchService, + mlTimeSeriesExplorerService, + toastNotificationService, + }; +}; + +/** + * Provides the services required by the Single Metric Viewer Embeddable. + */ +export const getServices = async ( + getStartServices: StartServicesAccessor +): Promise => { + const [coreStart, pluginsStart] = await getStartServices(); + const mlServices = await getMlServices(coreStart, pluginsStart); - return [ - coreStart, - pluginsStart as MlDependencies, - { - anomalyDetectorService, - anomalyExplorerService, - mlApiServices, - mlCapabilities, - mlFieldFormatService, - mlJobService, - mlResultsService, - mlTimeSeriesSearchService, - mlTimeSeriesExplorerService, - toastNotificationService, - }, - ]; + return [coreStart, pluginsStart as MlDependencies, mlServices]; }; diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_data_fetcher.ts b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_data_fetcher.ts index b3c46017e84e2..c3b43fd5dda86 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_data_fetcher.ts +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_data_fetcher.ts @@ -52,8 +52,12 @@ export const initializeSingleMetricViewerDataFetcher = ( ([singleMetricViewerData, fetchContext]) => { let bounds; let lastRefresh; - if (timefilter !== undefined && fetchContext.timeRange !== undefined) { - bounds = timefilter.calculateBounds(fetchContext.timeRange); + if (timefilter !== undefined) { + bounds = timefilter.calculateBounds( + fetchContext?.timeRange + ? fetchContext?.timeRange + : api.timeRange$?.value ?? timefilter.getTime() + ); lastRefresh = Date.now(); } singleMetricViewerData$.next({ singleMetricViewerData, bounds, lastRefresh }); diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx index 25ea1ea0f98d3..3fa630d7194e9 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable_factory.tsx @@ -6,27 +6,17 @@ */ import type { StartServicesAccessor } from '@kbn/core/public'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { pick } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; -import { EuiResizeObserver } from '@elastic/eui'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React from 'react'; import useUnmount from 'react-use/lib/useUnmount'; -import moment from 'moment'; import { apiHasExecutionContext, initializeTimeRange, initializeTitles, useStateFromPublishingSubject, } from '@kbn/presentation-publishing'; -import { DatePickerContextProvider, type DatePickerDependencies } from '@kbn/ml-date-picker'; -import { UI_SETTINGS } from '@kbn/data-plugin/common'; -import type { MlJob } from '@elastic/elasticsearch/lib/api/types'; -import usePrevious from 'react-use/lib/usePrevious'; -import { throttle } from 'lodash'; import { BehaviorSubject, Subscription } from 'rxjs'; import { ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE } from '..'; import type { MlPluginStart, MlStartDependencies } from '../../plugin'; @@ -37,23 +27,9 @@ import type { } from '../types'; import { initializeSingleMetricViewerControls } from './single_metric_viewer_controls_initializer'; import { initializeSingleMetricViewerDataFetcher } from './single_metric_viewer_data_fetcher'; -import { TimeSeriesExplorerEmbeddableChart } from '../../application/timeseriesexplorer/timeseriesexplorer_embeddable_chart'; -import { APP_STATE_ACTION } from '../../application/timeseriesexplorer/timeseriesexplorer_constants'; import { getServices } from './get_services'; import { useReactEmbeddableExecutionContext } from '../common/use_embeddable_execution_context'; -import './_index.scss'; - -const RESIZE_THROTTLE_TIME_MS = 500; -const containerPadding = 10; -const minElemAndChartDiff = 20; -interface AppStateZoom { - from?: string; - to?: string; -} - -const errorMessage = i18n.translate('xpack.ml.singleMetricViewerEmbeddable.errorMessage"', { - defaultMessage: 'Unable to load the ML single metric viewer data', -}); +import { getSingleMetricViewerComponent } from '../../shared_components/single_metric_viewer'; export const getSingleMetricViewerEmbeddableFactory = ( getStartServices: StartServicesAccessor @@ -147,31 +123,11 @@ export const getSingleMetricViewerEmbeddableFactory = ( services[1].data.query.timefilter.timefilter ); + const SingleMetricViewerComponent = getSingleMetricViewerComponent(...services); + return { api, Component: () => { - const [chartWidth, setChartWidth] = useState(0); - const [zoom, setZoom] = useState(); - const [selectedForecastId, setSelectedForecastId] = useState(); - const [selectedJob, setSelectedJob] = useState(); - const [jobsLoaded, setJobsLoaded] = useState(false); - - const isMounted = useRef(true); - - const { - mlApiServices, - mlJobService, - mlTimeSeriesExplorerService, - toastNotificationService, - } = services[2]; - const startServices = pick(services[0], 'analytics', 'i18n', 'theme'); - const datePickerDeps: DatePickerDependencies = { - ...pick(services[0], ['http', 'notifications', 'theme', 'uiSettings', 'i18n']), - data: services[1].data, - uiSettingsKeys: UI_SETTINGS, - showFrozenDataTierChoice: false, - }; - if (!apiHasExecutionContext(parentApi)) { throw new Error('Parent API does not have execution context'); } @@ -192,153 +148,27 @@ export const getSingleMetricViewerEmbeddableFactory = ( subscriptions.unsubscribe(); }); - const selectedJobId = singleMetricViewerData?.jobIds[0]; // Need to make sure we fall back to `undefined` if `functionDescription` is an empty string, // otherwise anomaly table data will not be loaded. const functionDescription = (singleMetricViewerData?.functionDescription ?? '') === '' ? undefined : singleMetricViewerData?.functionDescription; - const previousRefresh = usePrevious(lastRefresh ?? 0); - - useEffect(function setUpJobsLoaded() { - async function loadJobs() { - try { - await mlJobService.loadJobsWrapper(); - setJobsLoaded(true); - } catch (e) { - blockingError.next(new Error(errorMessage)); - } - } - if (isMounted.current === false) { - return; - } - loadJobs(); - - return () => { - isMounted.current = false; - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect( - function setUpSelectedJob() { - async function fetchSelectedJob() { - if (mlApiServices && selectedJobId !== undefined) { - try { - const { jobs } = await mlApiServices.getJobs({ jobId: selectedJobId }); - const job = jobs[0]; - setSelectedJob(job); - } catch (e) { - blockingError.next(new Error(errorMessage)); - } - } - } - if (isMounted.current === false) { - return; - } - fetchSelectedJob(); - }, - [selectedJobId, mlApiServices] - ); - - const autoZoomDuration = useMemo(() => { - if (!selectedJob) return; - return mlTimeSeriesExplorerService?.getAutoZoomDuration(selectedJob); - }, [mlTimeSeriesExplorerService, selectedJob]); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const resizeHandler = useCallback( - throttle((e: { width: number; height: number }) => { - if (Math.abs(chartWidth - e.width) > minElemAndChartDiff) { - setChartWidth(e.width); - } - }, RESIZE_THROTTLE_TIME_MS), - [chartWidth] - ); - - const appStateHandler = useCallback( - (action: string, payload?: any) => { - /** - * Empty zoom indicates that chart hasn't been rendered yet, - * hence any updates prior that should replace the URL state. - */ - switch (action) { - case APP_STATE_ACTION.SET_FORECAST_ID: - setSelectedForecastId(payload); - setZoom(undefined); - break; - - case APP_STATE_ACTION.SET_ZOOM: - setZoom(payload); - break; - - case APP_STATE_ACTION.UNSET_ZOOM: - setZoom(undefined); - break; - } - }, - - [setZoom, setSelectedForecastId] - ); return ( - - - - - {(resizeRef) => ( -
- {singleMetricViewerData !== undefined && - autoZoomDuration !== undefined && - jobsLoaded && - selectedJobId === selectedJob?.job_id && ( - - )} -
- )} -
-
-
-
+ blockingError.next(error)} + selectedDetectorIndex={singleMetricViewerData?.selectedDetectorIndex} + selectedEntities={singleMetricViewerData?.selectedEntities} + selectedJobId={singleMetricViewerData?.jobIds[0]} + uuid={api.uuid} + onRenderComplete={() => { + dataLoading.next(false); + }} + /> ); }, }; diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx index 1f54330a4829f..292ec390eb974 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx @@ -47,13 +47,13 @@ export async function resolveEmbeddableSingleMetricViewerUserInput( bounds={timefilter.getBounds()!} initialInput={input} onCreate={(explicitInput) => { - flyoutSession.close(); resolve(explicitInput); + flyoutSession.close(); overlayTracker?.clearOverlays(); }} onCancel={() => { - flyoutSession.close(); reject(); + flyoutSession.close(); overlayTracker?.clearOverlays(); }} /> @@ -65,8 +65,9 @@ export async function resolveEmbeddableSingleMetricViewerUserInput( ownFocus: true, size: 's', onClose: () => { - flyoutSession.close(); reject(); + flyoutSession.close(); + overlayTracker?.clearOverlays(); }, } ); diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index d762bb9557268..81c73c7cf9679 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -73,6 +73,7 @@ import type { ElasticModels } from './application/services/elastic_models_servic import type { MlApiServices } from './application/services/ml_api_service'; import type { MlCapabilities } from '../common/types/capabilities'; import { AnomalySwimLane } from './shared_components'; +import { getMlServices } from './embeddables/single_metric_viewer/get_services'; export interface MlStartDependencies { cases?: CasesPublicStart; @@ -272,7 +273,8 @@ export class MlPlugin implements Plugin { registerEmbeddables(pluginsSetup.embeddable, core); if (pluginsSetup.cases) { - registerCasesAttachments(pluginsSetup.cases, coreStart, pluginStart); + const mlServices = await getMlServices(coreStart, pluginStart); + registerCasesAttachments(pluginsSetup.cases, coreStart, pluginStart, mlServices); } if (pluginsSetup.maps) { diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/_index.scss b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/_index.scss similarity index 100% rename from x-pack/plugins/ml/public/embeddables/single_metric_viewer/_index.scss rename to x-pack/plugins/ml/public/shared_components/single_metric_viewer/_index.scss diff --git a/x-pack/plugins/ml/public/shared_components/single_metric_viewer/index.tsx b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/index.tsx new file mode 100644 index 0000000000000..76d55dfefb1cc --- /dev/null +++ b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/index.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { dynamic } from '@kbn/shared-ux-utility'; +import type { CoreStart } from '@kbn/core-lifecycle-browser'; +import type { SingleMetricViewerServices } from '../../embeddables/types'; +import type { MlDependencies } from '../../application/app'; +import type { SingleMetricViewerSharedComponent } from './single_metric_viewer'; + +const SingleMetricViewerLazy = dynamic(async () => import('./single_metric_viewer')); + +export const getSingleMetricViewerComponent = ( + coreStart: CoreStart, + pluginStart: MlDependencies, + mlServices: SingleMetricViewerServices +): SingleMetricViewerSharedComponent => { + return (props) => { + return ( + + ); + }; +}; + +export type { SingleMetricViewerSharedComponent } from './single_metric_viewer'; diff --git a/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx new file mode 100644 index 0000000000000..a4c6681b45ef0 --- /dev/null +++ b/x-pack/plugins/ml/public/shared_components/single_metric_viewer/single_metric_viewer.tsx @@ -0,0 +1,254 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useEffect, useMemo, useState } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; +import type { FC } from 'react'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiResizeObserver } from '@elastic/eui'; +import type { CoreStart } from '@kbn/core-lifecycle-browser'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import { UI_SETTINGS } from '@kbn/data-plugin/common'; +import type { MlJob } from '@elastic/elasticsearch/lib/api/types'; +import { DatePickerContextProvider, type DatePickerDependencies } from '@kbn/ml-date-picker'; +import type { TimeRangeBounds } from '@kbn/ml-time-buckets'; +import usePrevious from 'react-use/lib/usePrevious'; +import { tz } from 'moment'; +import { pick, throttle } from 'lodash'; +import type { MlDependencies } from '../../application/app'; +import { TimeSeriesExplorerEmbeddableChart } from '../../application/timeseriesexplorer/timeseriesexplorer_embeddable_chart'; +import { APP_STATE_ACTION } from '../../application/timeseriesexplorer/timeseriesexplorer_constants'; +import type { SingleMetricViewerServices, MlEntity } from '../../embeddables/types'; +import './_index.scss'; + +const containerPadding = 10; +const minElemAndChartDiff = 20; +const RESIZE_THROTTLE_TIME_MS = 500; +interface AppStateZoom { + from?: string; + to?: string; +} + +const errorMessage = i18n.translate('xpack.ml.singleMetricViewerEmbeddable.errorMessage"', { + defaultMessage: 'Unable to load the ML single metric viewer data', +}); + +export type SingleMetricViewerSharedComponent = FC; + +/** + * Only used to initialize internally + */ +export type SingleMetricViewerPropsWithDeps = SingleMetricViewerProps & { + coreStart: CoreStart; + pluginStart: MlDependencies; + mlServices: SingleMetricViewerServices; +}; + +export interface SingleMetricViewerProps { + bounds?: TimeRangeBounds; + selectedEntities?: MlEntity; + selectedDetectorIndex?: number; + functionDescription?: string; + selectedJobId: string | undefined; + /** + * Last reload request time, can be used for manual reload + */ + lastRefresh?: number; + onRenderComplete?: () => void; + onError?: (error: Error) => void; + uuid: string; +} + +type Zoom = AppStateZoom | undefined; +type ForecastId = string | undefined; + +const SingleMetricViewerWrapper: FC = ({ + // Component dependencies + coreStart, + pluginStart, + mlServices, + // Component props + bounds, + functionDescription, + lastRefresh, + onError, + onRenderComplete, + selectedDetectorIndex, + selectedEntities, + selectedJobId, + uuid, +}) => { + const [chartWidth, setChartWidth] = useState(0); + const [zoom, setZoom] = useState(); + const [selectedForecastId, setSelectedForecastId] = useState(); + const [selectedJob, setSelectedJob] = useState(); + const [jobsLoaded, setJobsLoaded] = useState(false); + + const isMounted = useMountedState(); + + const { mlApiServices, mlJobService, mlTimeSeriesExplorerService, toastNotificationService } = + mlServices; + const startServices = pick(coreStart, 'analytics', 'i18n', 'theme'); + const datePickerDeps: DatePickerDependencies = { + ...pick(coreStart, ['http', 'notifications', 'theme', 'uiSettings', 'i18n']), + data: pluginStart.data, + uiSettingsKeys: UI_SETTINGS, + showFrozenDataTierChoice: false, + }; + + const previousRefresh = usePrevious(lastRefresh ?? 0); + + useEffect( + function setUpJobsLoaded() { + async function loadJobs() { + try { + await mlJobService.loadJobsWrapper(); + setJobsLoaded(true); + } catch (e) { + if (onError) { + onError(new Error(errorMessage)); + } + } + } + if (isMounted() === false) { + return; + } + loadJobs(); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [isMounted] + ); + + useEffect( + function setUpSelectedJob() { + async function fetchSelectedJob() { + if (mlApiServices && selectedJobId !== undefined) { + try { + const { jobs } = await mlApiServices.getJobs({ jobId: selectedJobId }); + const job = jobs[0]; + setSelectedJob(job); + } catch (e) { + if (onError) { + onError(new Error(errorMessage)); + } + } + } + } + if (isMounted() === false) { + return; + } + fetchSelectedJob(); + }, + [selectedJobId, mlApiServices, isMounted, onError] + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + const resizeHandler = useCallback( + throttle((e: { width: number; height: number }) => { + if (Math.abs(chartWidth - e.width) > minElemAndChartDiff) { + setChartWidth(e.width); + } + }, RESIZE_THROTTLE_TIME_MS), + [chartWidth] + ); + + const autoZoomDuration = useMemo(() => { + if (!selectedJob) return; + return mlTimeSeriesExplorerService?.getAutoZoomDuration(selectedJob); + }, [mlTimeSeriesExplorerService, selectedJob]); + + const appStateHandler = useCallback( + (action: string, payload?: Zoom | ForecastId) => { + /** + * Empty zoom indicates that chart hasn't been rendered yet, + * hence any updates prior that should replace the URL state. + */ + switch (action) { + case APP_STATE_ACTION.SET_FORECAST_ID: + setSelectedForecastId(payload as ForecastId); + setZoom(undefined); + break; + + case APP_STATE_ACTION.SET_ZOOM: + setZoom(payload as Zoom); + break; + + case APP_STATE_ACTION.UNSET_ZOOM: + setZoom(undefined); + break; + } + }, + + [setZoom, setSelectedForecastId] + ); + + return ( + + {(resizeRef) => ( +
+ + + + {selectedJobId !== undefined && + autoZoomDuration !== undefined && + jobsLoaded && + selectedJobId === selectedJob?.job_id && ( + + )} + + + +
+ )} +
+ ); +}; + +// eslint-disable-next-line import/no-default-export +export default SingleMetricViewerWrapper; diff --git a/x-pack/plugins/ml/server/lib/register_cases.ts b/x-pack/plugins/ml/server/lib/register_cases.ts index 4cd629c7b1ac2..7a4925089b398 100644 --- a/x-pack/plugins/ml/server/lib/register_cases.ts +++ b/x-pack/plugins/ml/server/lib/register_cases.ts @@ -11,6 +11,7 @@ import type { MlFeatures } from '../../common/constants/app'; import { CASE_ATTACHMENT_TYPE_ID_ANOMALY_EXPLORER_CHARTS, CASE_ATTACHMENT_TYPE_ID_ANOMALY_SWIMLANE, + CASE_ATTACHMENT_TYPE_ID_SINGLE_METRIC_VIEWER, } from '../../common/constants/cases'; export function registerCasesPersistableState( @@ -37,5 +38,15 @@ export function registerCasesPersistableState( `ML failed to register cases persistable state for ${CASE_ATTACHMENT_TYPE_ID_ANOMALY_EXPLORER_CHARTS}` ); } + + try { + cases.attachmentFramework.registerPersistableState({ + id: CASE_ATTACHMENT_TYPE_ID_SINGLE_METRIC_VIEWER, + }); + } catch (error) { + logger.warn( + `ML failed to register cases persistable state for ${CASE_ATTACHMENT_TYPE_ID_SINGLE_METRIC_VIEWER}` + ); + } } } diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index 4b3ae3a3f0beb..8e7ddc53038ff 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -126,5 +126,6 @@ "@kbn/shared-ux-utility", "@kbn/react-kibana-context-render", "@kbn/esql-utils", + "@kbn/core-lifecycle-browser", ], } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts index e4d7116b95562..74c4bb7f79358 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts @@ -29,7 +29,7 @@ export async function createAndInstallIngestPipeline( { logger } ); } catch (e) { - logger.error(`Cannot create entity ingest pipeline for [${definition.id}] entity defintion`); + logger.error(`Cannot create entity ingest pipeline for [${definition.id}] entity definition`); if (e.meta?.body?.error?.type === 'security_exception') { throw new EntitySecurityException(e.meta.body.error.reason, definition); } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_entity_definition.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_entity_definition.ts index 1067f33abaca3..ff47af01f7ed2 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_entity_definition.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_entity_definition.ts @@ -24,7 +24,7 @@ export async function deleteEntityDefinition( if (response.total === 0) { logger.error(`Unable to delete entity definition [${definition.id}] because it doesn't exist.`); - throw new EntityDefinitionNotFound(`Entity defintion with [${definition.id}] not found.`); + throw new EntityDefinitionNotFound(`Entity definition with [${definition.id}] not found.`); } await soClient.delete(SO_ENTITY_DEFINITION_TYPE, response.saved_objects[0].id); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts index 7df6867115bbe..b05dee0f0f251 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts @@ -18,7 +18,7 @@ export async function deleteIndex( try { await esClient.indices.delete({ index: indexName, ignore_unavailable: true }); } catch (e) { - logger.error(`Unable to remove entity defintion index [${definition.id}}]`); + logger.error(`Unable to remove entity definition index [${definition.id}}]`); throw e; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_id_conflict_error.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_id_conflict_error.ts index 5108ca31ed548..7ec0672cd77eb 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_id_conflict_error.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_id_conflict_error.ts @@ -8,11 +8,11 @@ import { EntityDefinition } from '@kbn/entities-schema'; export class EntityIdConflict extends Error { - public defintion: EntityDefinition; + public definition: EntityDefinition; constructor(message: string, def: EntityDefinition) { super(message); this.name = 'EntityIdConflict'; - this.defintion = def; + this.definition = def; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts index 6e2f721d4de14..c7e0d114c5afb 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts @@ -8,11 +8,11 @@ import { EntityDefinition } from '@kbn/entities-schema'; export class EntitySecurityException extends Error { - public defintion: EntityDefinition; + public definition: EntityDefinition; constructor(message: string, def: EntityDefinition) { super(message); this.name = 'EntitySecurityException'; - this.defintion = def; + this.definition = def; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/read_entity_definition.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/read_entity_definition.ts index e6817ab63f2af..91194140101b7 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/read_entity_definition.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/read_entity_definition.ts @@ -22,7 +22,7 @@ export async function readEntityDefinition( filter: `${SO_ENTITY_DEFINITION_TYPE}.attributes.id:(${id})`, }); if (response.total === 0) { - const message = `Unable to find entity defintion with [${id}]`; + const message = `Unable to find entity definition with [${id}]`; logger.error(message); throw new EntityDefinitionNotFound(message); } @@ -30,7 +30,7 @@ export async function readEntityDefinition( try { return entityDefinitionSchema.parse(response.saved_objects[0].attributes); } catch (e) { - logger.error(`Unable to parse entity defintion with [${id}]`); + logger.error(`Unable to parse entity definition with [${id}]`); throw e; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/save_entity_definition.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/save_entity_definition.ts index f79f88c50ac58..d69e6c598227a 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/save_entity_definition.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/save_entity_definition.ts @@ -23,7 +23,7 @@ export async function saveEntityDefinition( if (response.total === 1) { throw new EntityIdConflict( - `Entity defintion with [${definition.id}] already exists.`, + `Entity definition with [${definition.id}] already exists.`, definition ); } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts b/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts index e696d32e0dfb2..01528453c74d4 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts @@ -25,7 +25,7 @@ export const entitiesEntityComponentTemplateConfig: ClusterPutComponentTemplateR ignore_above: 1024, type: 'keyword', }, - defintionId: { + definitionId: { ignore_above: 1024, type: 'keyword', }, diff --git a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts index 2633da58c2033..38b7e6d90061c 100644 --- a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts +++ b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts @@ -60,6 +60,7 @@ export enum AlertStates { // Types for the executor export interface CustomThresholdSearchSourceFields extends SerializedSearchSourceFields { query?: Query; + filter?: Array>; } export interface ThresholdParams { diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx index b169f83739881..41127b2880233 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx @@ -125,12 +125,18 @@ export default function Expressions(props: Props) { const createdSearchSource = await data.search.searchSource.create( initialSearchConfiguration ); - setRuleParams('searchConfiguration', { - ...initialSearchConfiguration, - ...(ruleParams.searchConfiguration?.query && { - query: ruleParams.searchConfiguration.query, - }), - }); + setRuleParams( + 'searchConfiguration', + getSearchConfiguration( + { + ...initialSearchConfiguration, + ...(ruleParams.searchConfiguration?.query && { + query: ruleParams.searchConfiguration.query, + }), + }, + setParamsWarning + ) + ); setSearchSource(createdSearchSource); setDataView(createdSearchSource.getField('index')); @@ -232,7 +238,10 @@ export default function Expressions(props: Props) { const onFilterChange = useCallback( ({ query }: { query?: Query }) => { setParamsWarning(undefined); - setRuleParams('searchConfiguration', { ...ruleParams.searchConfiguration, query }); + setRuleParams( + 'searchConfiguration', + getSearchConfiguration({ ...ruleParams.searchConfiguration, query }, setParamsWarning) + ); }, [setRuleParams, ruleParams.searchConfiguration] ); @@ -442,13 +451,16 @@ export default function Expressions(props: Props) { query={ruleParams.searchConfiguration?.query} filters={ruleParams.searchConfiguration?.filter} onFiltersUpdated={(filter) => { - // Since rule params will be sent to the API as is, and we only need meta and query parameters to be - // saved in the rule's saved object, we filter extra fields here (such as $state). - const filters = filter.map(({ meta, query }) => ({ meta, query })); - setRuleParams('searchConfiguration', { - ...ruleParams.searchConfiguration, - filter: filters, - }); + setRuleParams( + 'searchConfiguration', + getSearchConfiguration( + { + ...ruleParams.searchConfiguration, + filter, + }, + setParamsWarning + ) + ); }} /> {errors.filterQuery && ( diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts index 734a31c7b8744..243f4ce197a66 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { FilterStateStore } from '@kbn/es-query'; import { defaultQuery, getSearchConfiguration } from './get_search_configuration'; describe('getSearchConfiguration()', () => { @@ -37,4 +38,72 @@ describe('getSearchConfiguration()', () => { expect(getSearchConfiguration({ query }, onWarning)).toEqual({ query: defaultQuery }); expect(onWarning).toHaveBeenCalledTimes(1); }); + + it('should return filter without $state field WITHOUT query', () => { + const filter = [ + { + meta: { + alias: null, + disabled: false, + field: 'service.name', + index: 'dataset-logs-*-*', + key: 'service.name', + negate: false, + params: { + query: 'synth-node-0', + }, + type: 'phrase', + }, + query: { + match_phrase: { + 'service.name': 'synth-node-0', + }, + }, + $state: { + store: FilterStateStore.APP_STATE, + }, + }, + ]; + + expect(getSearchConfiguration({ filter }, onWarning)).toEqual({ + filter: filter.map((aFilter) => ({ meta: aFilter.meta, query: aFilter.query })), + }); + expect(onWarning).toHaveBeenCalledTimes(0); + }); + + it('should return filter without $state field WITH esql query', () => { + const filter = [ + { + meta: { + alias: null, + disabled: false, + field: 'service.name', + index: 'dataset-logs-*-*', + key: 'service.name', + negate: false, + params: { + query: 'synth-node-0', + }, + type: 'phrase', + }, + query: { + match_phrase: { + 'service.name': 'synth-node-0', + }, + }, + $state: { + store: FilterStateStore.APP_STATE, + }, + }, + ]; + const query = { + esql: 'random esql', + }; + + expect(getSearchConfiguration({ filter, query }, onWarning)).toEqual({ + filter: filter.map((aFilter) => ({ meta: aFilter.meta, query: aFilter.query })), + query: defaultQuery, + }); + expect(onWarning).toHaveBeenCalledTimes(1); + }); }); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts index 9bdcd74a97804..ed1b3ae4db7d9 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts @@ -29,13 +29,27 @@ export const getSearchConfiguration = ( ): CustomThresholdSearchSourceFields => { if (fields.query && !isOfQueryType(fields.query)) { onWarning(searchConfigQueryWarning); - return { + return adjustSearchConfigurationFilter({ ...fields, query: defaultQuery, - }; + }); } - return { + return adjustSearchConfigurationFilter({ ...fields, query: fields.query, + }); +}; + +const adjustSearchConfigurationFilter = ( + searchConfiguration: CustomThresholdSearchSourceFields +): CustomThresholdSearchSourceFields => { + // Only meta and query fields are saved in the rule params, so we ignore other fields such as $state + const filter = searchConfiguration.filter + ? searchConfiguration.filter.map(({ meta, query }) => ({ meta, query })) + : undefined; + + return { + ...searchConfiguration, + filter, }; }; diff --git a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts index d732e8bcda76f..30c829c999043 100644 --- a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts @@ -278,14 +278,14 @@ export const uiSettings: Record = { name: i18n.translate('xpack.observability.enableInfrastructureAssetCustomDashboards', { defaultMessage: 'Custom dashboards for asset details in Infrastructure', }), - value: true, + value: false, description: i18n.translate( 'xpack.observability.enableInfrastructureAssetCustomDashboardsDescription', { defaultMessage: - '{betaLabel} Enable option to link custom dashboards in the asset details view.', + '{technicalPreviewLabel} Enable option to link custom dashboards in the asset details view.', values: { - betaLabel: `[${betaLabel}]`, + technicalPreviewLabel: `[${technicalPreviewLabel}]`, }, } ), diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_virtual_search_results.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_virtual_search_results.ts index f8bbc0621fd34..602a2d57d8f51 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_virtual_search_results.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_virtual_search_results.ts @@ -11,10 +11,9 @@ import { CustomCard } from '../packages_list/types'; export function useVirtualSearchResults(): CustomCard[] { const { - services: { application, http }, + services: { application }, } = useKibana(); const getUrlForApp = application?.getUrlForApp; - const basePath = http?.basePath; return [ { @@ -43,30 +42,5 @@ export function useVirtualSearchResults(): CustomCard[] { integration: '', isCollectionCard: false, }, - { - id: 'aws-firehose-virtual', - type: 'virtual', - title: i18n.translate('xpack.observability_onboarding.packageList.amazonFirehoseTitle', { - defaultMessage: 'Amazon Firehose', - }), - description: i18n.translate( - 'xpack.observability_onboarding.packageList.amazonFirehoseDescription', - { - defaultMessage: 'Collect Amazon Firehose logs.', - } - ), - name: 'aws-firehose', - categories: [], - icons: [ - { - type: 'svg', - src: basePath?.prepend('/plugins/observabilityOnboarding/assets/aws_firehose.svg') ?? '', - }, - ], - url: 'https://www.elastic.co/guide/en/kinesis/current/aws-firehose-setup-guide.html', - version: '', - integration: '', - isCollectionCard: false, - }, ]; } diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/index.tsx index e66019a5732fe..b1cac260e69f9 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/index.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/index.tsx @@ -23,14 +23,7 @@ interface WizardState { logFilePaths: string[]; namespace: string; customConfigurations: string; - logsType?: - | 'system' - | 'sys' - | 'http-endpoint' - | 'opentelemetry' - | 'amazon-firehose' - | 'log-file' - | 'service'; + logsType?: 'system' | 'sys' | 'http-endpoint' | 'opentelemetry' | 'log-file' | 'service'; uploadType?: 'log-file' | 'api-key'; elasticAgentPlatform: 'linux-tar' | 'macos' | 'windows' | 'deb' | 'rpm'; autoDownloadConfig: boolean; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/aws_firehose.svg b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/aws_firehose.svg deleted file mode 100644 index 53739b79bef77..0000000000000 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/aws_firehose.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - Icon-Architecture/16/Arch_Amazon-Kinesis-Data-Firehose_16 - - - - - - - - - \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/slo/public/context/plugin_context.tsx b/x-pack/plugins/observability_solution/slo/public/context/plugin_context.tsx index 6b8a36655f70d..b61ccb8085a12 100644 --- a/x-pack/plugins/observability_solution/slo/public/context/plugin_context.tsx +++ b/x-pack/plugins/observability_solution/slo/public/context/plugin_context.tsx @@ -20,10 +20,4 @@ export interface PluginContextValue { experimentalFeatures?: ExperimentalFeatures; } -export interface OverviewEmbeddableContextValue { - observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry; -} - -export const OverviewEmbeddableContext = createContext(null); - export const PluginContext = createContext(null); diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/common/slo_embeddable_context.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/common/slo_embeddable_context.tsx new file mode 100644 index 0000000000000..acb0897b07e71 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/common/slo_embeddable_context.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { Router } from '@kbn/shared-ux-router'; +import { createBrowserHistory } from 'history'; +import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { PluginContext } from '../../../context/plugin_context'; +import { SloEmbeddableDeps } from '../overview/types'; + +const queryClient = new QueryClient(); + +export interface SloEmbeddableContextProps { + deps: SloEmbeddableDeps; + children: React.ReactNode; +} + +export function SloEmbeddableContext({ deps, children }: SloEmbeddableContextProps) { + const { observabilityRuleTypeRegistry } = deps.observability; + const { navigation } = deps.observabilityShared; + + return ( + + + + + {children} + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx index e0cf5d0b13837..33252386c0e81 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx @@ -9,7 +9,6 @@ import { i18n } from '@kbn/i18n'; import React, { useEffect } from 'react'; import styled from 'styled-components'; import { EuiFlexItem, EuiLink, EuiFlexGroup } from '@elastic/eui'; -import { Router } from '@kbn/shared-ux-router'; import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; import { initializeTitles, @@ -17,10 +16,6 @@ import { fetch$, } from '@kbn/presentation-publishing'; import { BehaviorSubject, Subject } from 'rxjs'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; -import { createBrowserHistory } from 'history'; import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; import { ActionExecutionContext } from '@kbn/ui-actions-plugin/public'; import { SLO_OVERVIEW_EMBEDDABLE_ID } from './constants'; @@ -34,9 +29,8 @@ import { GroupSloCustomInput, } from './types'; import { EDIT_SLO_OVERVIEW_ACTION } from '../../../ui_actions/edit_slo_overview_panel'; -import { OverviewEmbeddableContext } from '../../../context/plugin_context'; +import { SloEmbeddableContext } from '../common/slo_embeddable_context'; -const queryClient = new QueryClient(); export const getOverviewPanelTitle = () => i18n.translate('xpack.slo.sloEmbeddable.displayName', { defaultMessage: 'SLO Overview', @@ -123,7 +117,6 @@ export const getOverviewEmbeddableFactory = (deps: SloEmbeddableDeps) => { groupFilters$, remoteName$ ); - const { observabilityRuleTypeRegistry } = deps.observability; useEffect(() => { return () => { @@ -188,21 +181,9 @@ export const getOverviewEmbeddableFactory = (deps: SloEmbeddableDeps) => { } }; return ( - - - - - - {showAllGroupByInstances ? ( - - ) : ( - renderOverview() - )} - - - - - + + {showAllGroupByInstances ? : renderOverview()} + ); }, }; diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/types.ts b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/types.ts index f23b986c02950..8773fba3e0998 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/types.ts +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/types.ts @@ -20,6 +20,7 @@ import { } from '@kbn/core/public'; import { ObservabilityPublicStart } from '@kbn/observability-plugin/public'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; export type OverviewMode = 'single' | 'groups'; export type GroupBy = 'slo.tags' | 'status' | 'slo.indicator.type'; @@ -77,6 +78,7 @@ export interface SloEmbeddableDeps { application: ApplicationStart; notifications: NotificationsStart; observability: ObservabilityPublicStart; + observabilityShared: ObservabilitySharedPluginStart; uiActions: UiActionsStart; } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slos_overview/slos_overview.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slos_overview/slos_overview.tsx index c3c234e0f98a5..ab551637a6f25 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slos_overview/slos_overview.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/components/slos_overview/slos_overview.tsx @@ -24,13 +24,14 @@ import { OverViewItem } from './overview_item'; export function SLOsOverview() { const { state } = useUrlSearchState(); - const { kqlQuery, filters, tagsFilter, statusFilter } = state; + const { kqlQuery, filters, tagsFilter, statusFilter, lastRefresh } = state; const { data, isLoading } = useFetchSLOsOverview({ kqlQuery, filters, tagsFilter, statusFilter, + lastRefresh, }); const theme = useEuiTheme().euiTheme; diff --git a/x-pack/plugins/osquery/common/constants.ts b/x-pack/plugins/osquery/common/constants.ts index 966d00f708be1..b45c1cb082d03 100644 --- a/x-pack/plugins/osquery/common/constants.ts +++ b/x-pack/plugins/osquery/common/constants.ts @@ -15,6 +15,7 @@ export const RESULTS_INDEX = `${OSQUERY_LOGS_BASE}.results`; export const OSQUERY_ACTIONS_INDEX = `${ACTIONS_INDEX}-*`; export const ACTION_RESPONSES_INDEX = `.logs-${OSQUERY_INTEGRATION_NAME}.action.responses`; +export const ACTION_RESPONSES_DATA_STREAM_INDEX = `logs-${OSQUERY_INTEGRATION_NAME}.action.responses`; export const DEFAULT_PLATFORM = 'linux,windows,darwin'; diff --git a/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts b/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts index 74ed26732ae90..3511b4e63d66c 100644 --- a/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts +++ b/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts @@ -83,4 +83,5 @@ export interface ActionResultsStrategyResponse export interface ActionResultsRequestOptions extends RequestOptionsPaginated { actionId: string; startDate?: string; + useNewDataStream?: boolean; } diff --git a/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts index 6b847fb396967..0c423dc9cfe8c 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts @@ -103,7 +103,8 @@ describe('ALL - Add Integration', { tags: ['@ess', '@serverless'] }, () => { cy.contains(`version: ${oldVersion}`).should('not.exist'); }); }); - describe('Add integration to policy', () => { + // FLAKY: https://github.com/elastic/kibana/issues/170593 + describe.skip('Add integration to policy', () => { const [integrationName, policyName] = generateRandomStringName(2); let policyId: string; beforeEach(() => { diff --git a/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts b/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts index 41b07311cbe60..2ed9d406895a5 100644 --- a/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts +++ b/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts @@ -9,7 +9,10 @@ import type { ISearchRequestParams } from '@kbn/search-types'; import { AGENT_ACTIONS_RESULTS_INDEX } from '@kbn/fleet-plugin/common'; import { isEmpty } from 'lodash'; import moment from 'moment'; -import { ACTION_RESPONSES_INDEX } from '../../../../../../common/constants'; +import { + ACTION_RESPONSES_DATA_STREAM_INDEX, + ACTION_RESPONSES_INDEX, +} from '../../../../../../common/constants'; import type { ActionResultsRequestOptions } from '../../../../../../common/search_strategy'; import { getQueryFilter } from '../../../../../utils/build_query'; @@ -19,6 +22,7 @@ export const buildActionResultsQuery = ({ startDate, sort, componentTemplateExists, + useNewDataStream, }: ActionResultsRequestOptions): ISearchRequestParams => { let filter = `action_id: ${actionId}`; if (!isEmpty(kuery)) { @@ -41,11 +45,18 @@ export const buildActionResultsQuery = ({ const filterQuery = [...timeRangeFilter, getQueryFilter({ filter })]; + let index: string; + if (useNewDataStream) { + index = ACTION_RESPONSES_DATA_STREAM_INDEX; + } else if (componentTemplateExists) { + index = ACTION_RESPONSES_INDEX; + } else { + index = AGENT_ACTIONS_RESULTS_INDEX; + } + return { allow_no_indices: true, - index: componentTemplateExists - ? `${ACTION_RESPONSES_INDEX}-default*` - : `${AGENT_ACTIONS_RESULTS_INDEX}*`, + index, ignore_unavailable: true, body: { aggs: { diff --git a/x-pack/plugins/osquery/server/search_strategy/osquery/index.ts b/x-pack/plugins/osquery/server/search_strategy/osquery/index.ts index 898f53b17c552..3cc3f8ad6b6c1 100644 --- a/x-pack/plugins/osquery/server/search_strategy/osquery/index.ts +++ b/x-pack/plugins/osquery/server/search_strategy/osquery/index.ts @@ -5,17 +5,18 @@ * 2.0. */ -import { from, map, mergeMap } from 'rxjs'; +import { map, mergeMap, forkJoin, from, of } from 'rxjs'; import type { ISearchStrategy, PluginStart } from '@kbn/data-plugin/server'; import { shimHitsTotal } from '@kbn/data-plugin/server'; import { ENHANCED_ES_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import type { CoreStart } from '@kbn/core/server'; -import { ACTIONS_INDEX } from '../../../common/constants'; +import { ACTION_RESPONSES_DATA_STREAM_INDEX, ACTIONS_INDEX } from '../../../common/constants'; import type { FactoryQueryTypes, StrategyResponseType, StrategyRequestType, } from '../../../common/search_strategy/osquery'; +import { OsqueryQueries } from '../../../common/search_strategy/osquery'; import { osqueryFactory } from './factory'; import type { OsqueryFactory } from './factory/types'; @@ -33,12 +34,15 @@ export const osquerySearchStrategyProvider = ( const queryFactory: OsqueryFactory = osqueryFactory[request.factoryQueryType]; - return from( - esClient.asInternalUser.indices.exists({ + return forkJoin({ + actionsIndexExists: esClient.asInternalUser.indices.exists({ index: `${ACTIONS_INDEX}*`, - }) - ).pipe( - mergeMap((exists) => { + }), + newDataStreamIndexExists: esClient.asInternalUser.indices.exists({ + index: `${ACTION_RESPONSES_DATA_STREAM_INDEX}*`, + }), + }).pipe( + mergeMap(({ actionsIndexExists, newDataStreamIndexExists }) => { const strictRequest = { factoryQueryType: request.factoryQueryType, kuery: request.kuery, @@ -51,7 +55,7 @@ export const osquerySearchStrategyProvider = ( const dsl = queryFactory.buildDsl({ ...strictRequest, - componentTemplateExists: exists, + componentTemplateExists: actionsIndexExists, } as StrategyRequestType); // use internal user for searching .fleet* indices es = @@ -59,7 +63,7 @@ export const osquerySearchStrategyProvider = ( ? data.search.searchAsInternalUser : data.search.getSearchStrategy(ENHANCED_ES_SEARCH_STRATEGY); - return es.search( + const searchLegacyIndex$ = es.search( { ...strictRequest, params: dsl, @@ -67,15 +71,56 @@ export const osquerySearchStrategyProvider = ( options, deps ); - }), - map((response) => ({ - ...response, - ...{ - rawResponse: shimHitsTotal(response.rawResponse, options), - }, - total: response.rawResponse.hits.total as number, - })), - mergeMap((esSearchRes) => queryFactory.parse(request, esSearchRes)) + + // With the introduction of a new DS that sends data directly from an agent into the new index + // logs-osquery_manager.action.responses-default, instead of the old index .logs-osquery_manager.action.responses-default + // which was populated by a transform, we now need to check both places for results. + // The new index was introduced in integration package 1.12, so users running earlier versions won't have it. + + return searchLegacyIndex$.pipe( + mergeMap((legacyIndexResponse) => { + if ( + request.factoryQueryType === OsqueryQueries.actionResults && + newDataStreamIndexExists + ) { + const dataStreamDsl = queryFactory.buildDsl({ + ...strictRequest, + componentTemplateExists: actionsIndexExists, + useNewDataStream: true, + } as StrategyRequestType); + + return from( + es.search( + { + ...strictRequest, + params: dataStreamDsl, + }, + options, + deps + ) + ).pipe( + map((newDataStreamIndexResponse) => { + if (newDataStreamIndexResponse.rawResponse.hits.total) { + return newDataStreamIndexResponse; + } + + return legacyIndexResponse; + }) + ); + } + + return of(legacyIndexResponse); + }), + map((response) => ({ + ...response, + ...{ + rawResponse: shimHitsTotal(response.rawResponse, options), + }, + total: response.rawResponse.hits.total as number, + })), + mergeMap((esSearchRes) => queryFactory.parse(request, esSearchRes)) + ); + }) ); }, cancel: async (id, options, deps) => { diff --git a/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts b/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts index 8d4460f137736..8d67f6f03b8d1 100644 --- a/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts +++ b/x-pack/plugins/search_playground/server/lib/conversational_chain.test.ts @@ -9,19 +9,30 @@ import type { Client } from '@elastic/elasticsearch'; import { createAssist as Assist } from '../utils/assist'; import { ConversationalChain } from './conversational_chain'; import { FakeListChatModel } from '@langchain/core/utils/testing'; +import { FakeListLLM } from 'langchain/llms/fake'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Message } from 'ai'; describe('conversational chain', () => { - const createTestChain = async ( - responses: string[], - chat: Message[], - expectedFinalAnswer: string, - expectedDocs: any, - expectedTokens: any, - expectedSearchRequest: any, - contentField: Record = { index: 'field', website: 'body_content' } - ) => { + const createTestChain = async ({ + responses, + chat, + expectedFinalAnswer, + expectedDocs, + expectedTokens, + expectedSearchRequest, + contentField = { index: 'field', website: 'body_content' }, + isChatModel = true, + }: { + responses: string[]; + chat: Message[]; + expectedFinalAnswer: string; + expectedDocs: any; + expectedTokens: any; + expectedSearchRequest: any; + contentField?: Record; + isChatModel?: boolean; + }) => { const searchMock = jest.fn().mockImplementation(() => { return { hits: { @@ -54,9 +65,11 @@ describe('conversational chain', () => { }, }; - const llm = new FakeListChatModel({ - responses, - }); + const llm = isChatModel + ? new FakeListChatModel({ + responses, + }) + : new FakeListLLM({ responses }); const aiClient = Assist({ es_client: mockElasticsearchClient as unknown as Client, @@ -118,17 +131,17 @@ describe('conversational chain', () => { }; it('should be able to create a conversational chain', async () => { - await createTestChain( - ['the final answer'], - [ + await createTestChain({ + responses: ['the final answer'], + chat: [ { id: '1', role: 'user', content: 'what is the work from home policy?', }, ], - 'the final answer', - [ + expectedFinalAnswer: 'the final answer', + expectedDocs: [ { documents: [ { metadata: { _id: '1', _index: 'index' }, pageContent: 'value' }, @@ -137,32 +150,32 @@ describe('conversational chain', () => { type: 'retrieved_docs', }, ], - [ + expectedTokens: [ { type: 'context_token_count', count: 15 }, { type: 'prompt_token_count', count: 5 }, ], - [ + expectedSearchRequest: [ { method: 'POST', path: '/index,website/_search', body: { query: { match: { field: 'what is the work from home policy?' } }, size: 3 }, }, - ] - ); + ], + }); }); it('should be able to create a conversational chain with nested field', async () => { - await createTestChain( - ['the final answer'], - [ + await createTestChain({ + responses: ['the final answer'], + chat: [ { id: '1', role: 'user', content: 'what is the work from home policy?', }, ], - 'the final answer', - [ + expectedFinalAnswer: 'the final answer', + expectedDocs: [ { documents: [ { metadata: { _id: '1', _index: 'index' }, pageContent: 'value' }, @@ -171,25 +184,25 @@ describe('conversational chain', () => { type: 'retrieved_docs', }, ], - [ + expectedTokens: [ { type: 'context_token_count', count: 15 }, { type: 'prompt_token_count', count: 5 }, ], - [ + expectedSearchRequest: [ { method: 'POST', path: '/index,website/_search', body: { query: { match: { field: 'what is the work from home policy?' } }, size: 3 }, }, ], - { index: 'field', website: 'metadata.source' } - ); + contentField: { index: 'field', website: 'metadata.source' }, + }); }); it('asking with chat history should re-write the question', async () => { - await createTestChain( - ['rewrite the question', 'the final answer'], - [ + await createTestChain({ + responses: ['rewrite the question', 'the final answer'], + chat: [ { id: '1', role: 'user', @@ -206,8 +219,8 @@ describe('conversational chain', () => { content: 'what is the work from home policy?', }, ], - 'the final answer', - [ + expectedFinalAnswer: 'the final answer', + expectedDocs: [ { documents: [ { metadata: { _id: '1', _index: 'index' }, pageContent: 'value' }, @@ -216,24 +229,24 @@ describe('conversational chain', () => { type: 'retrieved_docs', }, ], - [ + expectedTokens: [ { type: 'context_token_count', count: 15 }, { type: 'prompt_token_count', count: 5 }, ], - [ + expectedSearchRequest: [ { method: 'POST', path: '/index,website/_search', body: { query: { match: { field: 'rewrite the question' } }, size: 3 }, }, - ] - ); + ], + }); }); it('should cope with quotes in the query', async () => { - await createTestChain( - ['rewrite "the" question', 'the final answer'], - [ + await createTestChain({ + responses: ['rewrite "the" question', 'the final answer'], + chat: [ { id: '1', role: 'user', @@ -250,8 +263,8 @@ describe('conversational chain', () => { content: 'what is the work from home policy?', }, ], - 'the final answer', - [ + expectedFinalAnswer: 'the final answer', + expectedDocs: [ { documents: [ { metadata: { _id: '1', _index: 'index' }, pageContent: 'value' }, @@ -260,17 +273,62 @@ describe('conversational chain', () => { type: 'retrieved_docs', }, ], - [ + expectedTokens: [ { type: 'context_token_count', count: 15 }, { type: 'prompt_token_count', count: 5 }, ], - [ + expectedSearchRequest: [ { method: 'POST', path: '/index,website/_search', body: { query: { match: { field: 'rewrite "the" question' } }, size: 3 }, }, - ] - ); + ], + }); + }); + + it('should work with an LLM based model', async () => { + await createTestChain({ + responses: ['rewrite "the" question', 'the final answer'], + chat: [ + { + id: '1', + role: 'user', + content: 'what is the work from home policy?', + }, + { + id: '2', + role: 'assistant', + content: 'the final answer', + }, + { + id: '3', + role: 'user', + content: 'what is the work from home policy?', + }, + ], + expectedFinalAnswer: 'the final answer', + expectedDocs: [ + { + documents: [ + { metadata: { _id: '1', _index: 'index' }, pageContent: 'value' }, + { metadata: { _id: '1', _index: 'website' }, pageContent: 'value2' }, + ], + type: 'retrieved_docs', + }, + ], + expectedTokens: [ + { type: 'context_token_count', count: 15 }, + { type: 'prompt_token_count', count: 7 }, + ], + expectedSearchRequest: [ + { + method: 'POST', + path: '/index,website/_search', + body: { query: { match: { field: 'rewrite "the" question' } }, size: 3 }, + }, + ], + isChatModel: false, + }); }); }); diff --git a/x-pack/plugins/search_playground/server/lib/conversational_chain.ts b/x-pack/plugins/search_playground/server/lib/conversational_chain.ts index 1ec7bfb20c017..6080557e4c68f 100644 --- a/x-pack/plugins/search_playground/server/lib/conversational_chain.ts +++ b/x-pack/plugins/search_playground/server/lib/conversational_chain.ts @@ -150,6 +150,7 @@ class ConversationalChainFn { { callbacks: [ { + // callback for chat based models (OpenAI) handleChatModelStart( llm, msg: BaseMessage[][], @@ -166,6 +167,15 @@ class ConversationalChainFn { }); } }, + // callback for prompt based models (Bedrock uses ActionsClientLlm) + handleLLMStart(llm, input, runId, parentRunId, extraParams, tags, metadata) { + if (metadata?.type === 'question_answer_qa') { + data.appendMessageAnnotation({ + type: 'prompt_token_count', + count: getTokenEstimate(input[0]), + }); + } + }, handleRetrieverEnd(documents) { retrievedDocs.push(...documents); data.appendMessageAnnotation({ diff --git a/x-pack/plugins/search_playground/server/lib/get_chat_params.test.ts b/x-pack/plugins/search_playground/server/lib/get_chat_params.test.ts index 624f6e0aa637f..8eb46a2cdb7e4 100644 --- a/x-pack/plugins/search_playground/server/lib/get_chat_params.test.ts +++ b/x-pack/plugins/search_playground/server/lib/get_chat_params.test.ts @@ -6,10 +6,7 @@ */ import { getChatParams } from './get_chat_params'; -import { - ActionsClientChatOpenAI, - ActionsClientLlm, -} from '@kbn/elastic-assistant-common/impl/language_models'; +import { ActionsClientChatOpenAI, ActionsClientLlm } from '@kbn/langchain/server'; import { OPENAI_CONNECTOR_ID, BEDROCK_CONNECTOR_ID, @@ -18,10 +15,14 @@ import { Prompt } from '../../common/prompt'; import { KibanaRequest, Logger } from '@kbn/core/server'; import { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; -jest.mock('@kbn/elastic-assistant-common/impl/language_models', () => ({ - ActionsClientChatOpenAI: jest.fn(), - ActionsClientLlm: jest.fn(), -})); +jest.mock('@kbn/langchain/server', () => { + const original = jest.requireActual('@kbn/langchain/server'); + return { + ...original, + ActionsClientChatOpenAI: jest.fn(), + ActionsClientLlm: jest.fn(), + }; +}); jest.mock('../../common/prompt', () => ({ Prompt: jest.fn((instructions) => instructions), diff --git a/x-pack/plugins/search_playground/server/lib/get_chat_params.ts b/x-pack/plugins/search_playground/server/lib/get_chat_params.ts index 8a5aeb68c7e76..a481309b9277d 100644 --- a/x-pack/plugins/search_playground/server/lib/get_chat_params.ts +++ b/x-pack/plugins/search_playground/server/lib/get_chat_params.ts @@ -6,17 +6,17 @@ */ import { OPENAI_CONNECTOR_ID } from '@kbn/stack-connectors-plugin/common/openai/constants'; -import { - ActionsClientChatOpenAI, - ActionsClientLlm, -} from '@kbn/elastic-assistant-common/impl/language_models'; import { v4 as uuidv4 } from 'uuid'; import { BEDROCK_CONNECTOR_ID } from '@kbn/stack-connectors-plugin/common/bedrock/constants'; import type { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; import type { KibanaRequest, Logger } from '@kbn/core/server'; import { BaseLanguageModel } from '@langchain/core/language_models/base'; import type { Connector } from '@kbn/actions-plugin/server/application/connector/types'; -import { getDefaultArguments } from '@kbn/elastic-assistant-common/impl/language_models/constants'; +import { + ActionsClientChatOpenAI, + ActionsClientLlm, + getDefaultArguments, +} from '@kbn/langchain/server'; import { Prompt } from '../../common/prompt'; export const getChatParams = async ( diff --git a/x-pack/plugins/search_playground/tsconfig.json b/x-pack/plugins/search_playground/tsconfig.json index 96c2c1681008a..c75c9213103bf 100644 --- a/x-pack/plugins/search_playground/tsconfig.json +++ b/x-pack/plugins/search_playground/tsconfig.json @@ -32,7 +32,7 @@ "@kbn/stack-connectors-plugin", "@kbn/cases-plugin", "@kbn/triggers-actions-ui-plugin", - "@kbn/elastic-assistant-common", + "@kbn/langchain", "@kbn/logging", "@kbn/react-kibana-context-render", "@kbn/doc-links", diff --git a/x-pack/plugins/security/common/model/api_key.ts b/x-pack/plugins/security/common/model/api_key.ts index 48fe1dd95e85d..91b144cdc4326 100644 --- a/x-pack/plugins/security/common/model/api_key.ts +++ b/x-pack/plugins/security/common/model/api_key.ts @@ -41,7 +41,7 @@ export interface CrossClusterApiKey extends BaseApiKey { * * TODO: Remove this type when `@elastic/elasticsearch` has been updated. */ -interface BaseApiKey extends estypes.SecurityApiKey { +export interface BaseApiKey extends estypes.SecurityApiKey { username: Required['username']; realm: Required['realm']; creation: Required['creation']; @@ -77,3 +77,41 @@ export interface ApiKeyToInvalidate { id: string; name: string; } + +export interface ApiKeyAggregations { + usernames?: estypes.AggregationsStringTermsAggregate; + types?: estypes.AggregationsStringTermsAggregate; + expired?: estypes.AggregationsFilterAggregateKeys; + managed?: { + buckets: { + metadataBased: estypes.AggregationsFilterAggregateKeys; + namePrefixBased: estypes.AggregationsFilterAggregateKeys; + }; + }; +} + +/** + * Response of Kibana Query API keys endpoint. + */ +export type QueryApiKeyResult = SuccessQueryApiKeyResult | ErrorQueryApiKeyResult; + +interface SuccessQueryApiKeyResult extends BaseQueryApiKeyResult { + apiKeys: ApiKey[]; + count: number; + total: number; + queryError: never; +} + +interface ErrorQueryApiKeyResult extends BaseQueryApiKeyResult { + queryError: { name: string; message: string }; + apiKeys: never; + total: never; +} + +interface BaseQueryApiKeyResult { + canManageCrossClusterApiKeys: boolean; + canManageApiKeys: boolean; + canManageOwnApiKeys: boolean; + aggregationTotal: number; + aggregations: Record | undefined; +} diff --git a/x-pack/plugins/security/common/model/index.ts b/x-pack/plugins/security/common/model/index.ts index b3fa7644db412..4afc921007d4b 100644 --- a/x-pack/plugins/security/common/model/index.ts +++ b/x-pack/plugins/security/common/model/index.ts @@ -8,10 +8,13 @@ export type { ApiKey, RestApiKey, + BaseApiKey, CrossClusterApiKey, ApiKeyToInvalidate, ApiKeyRoleDescriptors, CrossClusterApiKeyAccess, + ApiKeyAggregations, + QueryApiKeyResult, } from './api_key'; export type { EditUser, GetUserDisplayNameParams } from './user'; export type { GetUserProfileResponse } from './user_profile'; diff --git a/x-pack/plugins/security/public/components/token_field.tsx b/x-pack/plugins/security/public/components/token_field.tsx index 7e1308bf37d47..1992d104021be 100644 --- a/x-pack/plugins/security/public/components/token_field.tsx +++ b/x-pack/plugins/security/public/components/token_field.tsx @@ -19,7 +19,7 @@ import { EuiText, } from '@elastic/eui'; import type { FunctionComponent, ReactElement } from 'react'; -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { euiThemeVars } from '@kbn/ui-theme'; @@ -83,10 +83,15 @@ export interface SelectableTokenFieldProps extends Omit = (props) => { const { options, ...rest } = props; - const [isPopoverOpen, setIsPopoverOpen] = React.useState(false); - const [selectedOption, setSelectedOption] = React.useState( - options[0] - ); + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const [selectedOption, setSelectedOption] = useState(options[0]); + + useEffect(() => { + if (options.length > 0) { + setSelectedOption(options[0]); + } + }, [options]); + const selectedIndex = options.findIndex((c) => c.key === selectedOption.key); const closePopover = () => setIsPopoverOpen(false); diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.mock.ts b/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.mock.ts index 4270ccbc8539b..7700ec76a8462 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.mock.ts +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.mock.ts @@ -11,9 +11,9 @@ import type { APIKeysAPIClient } from './api_keys_api_client'; export const apiKeysAPIClientMock = { create: (): jest.Mocked> => ({ - getApiKeys: jest.fn(), invalidateApiKeys: jest.fn(), createApiKey: jest.fn(), updateApiKey: jest.fn(), + queryApiKeys: jest.fn(), }), }; diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.test.ts b/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.test.ts index de92fb637ddf2..edf84c8fc2418 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.test.ts +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.test.ts @@ -8,22 +8,9 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import { APIKeysAPIClient } from './api_keys_api_client'; +import type { QueryApiKeyParams } from './api_keys_api_client'; describe('APIKeysAPIClient', () => { - it('getApiKeys() queries correct endpoint', async () => { - const httpMock = httpServiceMock.createStartContract(); - - const mockResponse = Symbol('mockResponse'); - httpMock.get.mockResolvedValue(mockResponse); - - const apiClient = new APIKeysAPIClient(httpMock); - - await expect(apiClient.getApiKeys()).resolves.toBe(mockResponse); - expect(httpMock.get).toHaveBeenCalledTimes(1); - expect(httpMock.get).toHaveBeenCalledWith('/internal/security/api_key'); - httpMock.get.mockClear(); - }); - it('invalidateApiKeys() queries correct endpoint', async () => { const httpMock = httpServiceMock.createStartContract(); @@ -88,4 +75,25 @@ describe('APIKeysAPIClient', () => { body: JSON.stringify(mockApiKeyUpdate), }); }); + + it('queryApiKeys() queries correct endpoint', async () => { + const httpMock = httpServiceMock.createStartContract(); + + const mockResponse = Symbol('mockResponse'); + httpMock.post.mockResolvedValue(mockResponse); + + const apiClient = new APIKeysAPIClient(httpMock); + const mockQueryParams = { + query: {}, + from: 0, + size: 10, + sort: { field: 'creation', direction: 'asc' }, + } as QueryApiKeyParams; + + await expect(apiClient.queryApiKeys(mockQueryParams)).resolves.toBe(mockResponse); + expect(httpMock.post).toHaveBeenCalledTimes(1); + expect(httpMock.post).toHaveBeenCalledWith('/internal/security/api_key/_query', { + body: JSON.stringify(mockQueryParams), + }); + }); }); diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.ts b/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.ts index b3d1a3a3e9cbe..e9cf206ed96d9 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.ts +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_api_client.ts @@ -5,15 +5,14 @@ * 2.0. */ +import type { QueryContainer } from '@elastic/eui/src/components/search_bar/query/ast_to_es_query_dsl'; + import type { HttpStart } from '@kbn/core/public'; import type { CreateAPIKeyParams, CreateAPIKeyResult } from '@kbn/security-plugin-types-server'; -import type { ApiKeyToInvalidate } from '../../../common/model'; -import type { - GetAPIKeysResult, - UpdateAPIKeyParams, - UpdateAPIKeyResult, -} from '../../../server/routes/api_keys'; +import type { QueryFilters } from './api_keys_grid/api_keys_table'; +import type { ApiKeyToInvalidate, QueryApiKeyResult } from '../../../common/model'; +import type { UpdateAPIKeyParams, UpdateAPIKeyResult } from '../../../server/routes/api_keys'; export type { CreateAPIKeyParams, CreateAPIKeyResult, UpdateAPIKeyParams, UpdateAPIKeyResult }; @@ -22,13 +21,41 @@ export interface InvalidateApiKeysResponse { errors: any[]; } +export interface QueryApiKeySortOptions { + field: + | 'id' + | 'type' + | 'name' + | 'username' + | 'realm' + | 'creation' + | 'metadata' + | 'role_descriptors' + | 'expiration' + | 'invalidated' + | 'limited_by' + | '_sort' + | 'expired'; + direction: 'asc' | 'desc'; +} + +export interface QueryApiKeyParams { + query: QueryContainer; + from: number; + size: number; + sort: QueryApiKeySortOptions; + filters: QueryFilters; +} + const apiKeysUrl = '/internal/security/api_key'; export class APIKeysAPIClient { constructor(private readonly http: HttpStart) {} - public async getApiKeys() { - return await this.http.get(apiKeysUrl); + public async queryApiKeys(params?: QueryApiKeyParams) { + return await this.http.post(`${apiKeysUrl}/_query`, { + body: JSON.stringify(params || {}), + }); } public async invalidateApiKeys(apiKeys: ApiKeyToInvalidate[], isAdmin = false) { diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx index a7918c9dc8d58..0522a977027dc 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx @@ -41,8 +41,8 @@ import { FormattedDate, FormattedMessage } from '@kbn/i18n-react'; import { useDarkMode, useKibana } from '@kbn/kibana-react-plugin/public'; import type { KibanaServerError } from '@kbn/kibana-utils-plugin/public'; -import type { CategorizedApiKey } from './api_keys_grid_page'; -import { ApiKeyBadge, ApiKeyStatus, TimeToolTip } from './api_keys_grid_page'; +import type { CategorizedApiKey } from './api_keys_table'; +import { ApiKeyBadge, ApiKeyStatus, TimeToolTip } from './api_keys_table'; import type { ApiKeyRoleDescriptors } from '../../../../common/model'; import { DocLink } from '../../../components/doc_link'; import { FormField } from '../../../components/form_field'; diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_empty_prompt.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_empty_prompt.tsx index 84be05ea9b946..aca8df052e99c 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_empty_prompt.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_empty_prompt.tsx @@ -76,17 +76,22 @@ export const ApiKeysEmptyPrompt: FC> throw error; }; + const promptHeading = doesErrorIndicateBadQuery(error) ? ( + + ) : ( + + ); + return ( - -

- } + body={

{promptHeading}

} actions={ <> {children} @@ -177,3 +182,12 @@ function doesErrorIndicateAPIKeysAreDisabled(error: Record) { function doesErrorIndicateUserHasNoPermissionsToManageAPIKeys(error: Record) { return error.body?.statusCode === 403; } + +export function doesErrorIndicateBadQuery(error: Record) { + const message = error?.message || ''; + const errorString = error?.name || ''; + + return ( + errorString.indexOf('ResponseError') > -1 || message.indexOf('illegal_argument_exception') > -1 + ); +} diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.test.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.test.tsx index 159495b67400c..cc83ff3f27728 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.test.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.test.tsx @@ -42,7 +42,7 @@ describe('APIKeysGridPage', () => { coreStart.http.post.mockClear(); authc.getCurrentUser.mockClear(); - coreStart.http.get.mockResolvedValue({ + coreStart.http.post.mockResolvedValue({ apiKeys: [ { type: 'rest', @@ -72,6 +72,43 @@ describe('APIKeysGridPage', () => { canManageCrossClusterApiKeys: true, canManageApiKeys: true, canManageOwnApiKeys: true, + total: 2, + aggregationTotal: 2, + aggregations: { + usernames: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'elastic', + doc_count: 4256, + }, + ], + }, + types: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'rest', + doc_count: 2, + }, + ], + }, + expired: { + doc_count: 0, + }, + managed: { + buckets: { + metadataBased: { + doc_count: 0, + }, + namePrefixBased: { + doc_count: 0, + }, + }, + }, + }, }); authc.getCurrentUser.mockResolvedValue( @@ -121,7 +158,7 @@ describe('APIKeysGridPage', () => { it('displays callout when API keys are disabled', async () => { const history = createMemoryHistory({ initialEntries: ['/'] }); - coreStart.http.get.mockRejectedValueOnce({ + coreStart.http.post.mockRejectedValueOnce({ body: { message: 'disabled.feature="api_keys"' }, }); @@ -145,7 +182,7 @@ describe('APIKeysGridPage', () => { it('displays error when user does not have required permissions', async () => { const history = createMemoryHistory({ initialEntries: ['/'] }); - coreStart.http.get.mockRejectedValueOnce({ + coreStart.http.post.mockRejectedValueOnce({ body: { statusCode: 403, message: 'forbidden' }, }); @@ -167,7 +204,7 @@ describe('APIKeysGridPage', () => { }); it('displays error when fetching API keys fails', async () => { - coreStart.http.get.mockRejectedValueOnce({ + coreStart.http.post.mockRejectedValueOnce({ body: { error: 'Internal Server Error', message: 'Internal Server Error', @@ -195,11 +232,14 @@ describe('APIKeysGridPage', () => { describe('Read Only View', () => { beforeEach(() => { - coreStart.http.get.mockResolvedValue({ + coreStart.http.post.mockResolvedValue({ apiKeys: [], canManageCrossClusterApiKeys: false, canManageApiKeys: false, canManageOwnApiKeys: false, + total: 0, + aggregations: {}, + aggregationTotal: 0, }); }); diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx index 3efbc5f2efd77..a88caa3214f1c 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx @@ -5,24 +5,10 @@ * 2.0. */ -import type { EuiBasicTableColumn, Query, SearchFilterConfig } from '@elastic/eui'; -import { - EuiBadge, - EuiButton, - EuiCallOut, - EuiFilterButton, - EuiFlexGroup, - EuiFlexItem, - EuiHealth, - EuiInMemoryTable, - EuiLink, - EuiSpacer, - EuiText, - EuiToolTip, -} from '@elastic/eui'; -import moment from 'moment-timezone'; -import type { FunctionComponent, PropsWithChildren } from 'react'; -import React, { useEffect, useMemo, useState } from 'react'; +import type { Criteria, EuiSearchBarOnChangeArgs, Query } from '@elastic/eui'; +import { EuiButton, EuiCallOut, EuiSearchBar, EuiSpacer } from '@elastic/eui'; +import type { FunctionComponent } from 'react'; +import React, { useEffect, useState } from 'react'; import { useHistory } from 'react-router-dom'; import useAsyncFn from 'react-use/lib/useAsyncFn'; @@ -33,34 +19,104 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { reactRouterNavigate, useKibana } from '@kbn/kibana-react-plugin/public'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { Route } from '@kbn/shared-ux-router'; -import { UserAvatar, UserProfilesPopover } from '@kbn/user-profile-components'; import { ApiKeyFlyout } from './api_key_flyout'; import { ApiKeysEmptyPrompt } from './api_keys_empty_prompt'; +import { ApiKeysTable, MAX_PAGINATED_ITEMS } from './api_keys_table'; +import type { CategorizedApiKey, QueryFilters } from './api_keys_table'; import { InvalidateProvider } from './invalidate_provider'; -import type { ApiKey, AuthenticatedUser, RestApiKey } from '../../../../common'; import { Breadcrumb } from '../../../components/breadcrumb'; import { SelectableTokenField } from '../../../components/token_field'; import { useCapabilities } from '../../../components/use_capabilities'; import { useAuthentication } from '../../../components/use_current_user'; -import type { CreateAPIKeyResult } from '../api_keys_api_client'; +import type { CreateAPIKeyResult, QueryApiKeySortOptions } from '../api_keys_api_client'; import { APIKeysAPIClient } from '../api_keys_api_client'; +interface ApiKeysTableState { + query: Query; + from: number; + size: number; + sort: QueryApiKeySortOptions; + filters: QueryFilters; +} + +const DEFAULT_TABLE_STATE = { + query: EuiSearchBar.Query.MATCH_ALL, + sort: { + field: 'creation' as const, + direction: 'desc' as const, + }, + from: 0, + size: 25, + filters: {}, +}; + export const APIKeysGridPage: FunctionComponent = () => { const { services } = useKibana(); const history = useHistory(); const authc = useAuthentication(); - const [state, getApiKeys] = useAsyncFn( - () => Promise.all([new APIKeysAPIClient(services.http).getApiKeys(), authc.getCurrentUser()]), - [services.http] - ); const [createdApiKey, setCreatedApiKey] = useState(); const [openedApiKey, setOpenedApiKey] = useState(); const readOnly = !useCapabilities('api_keys').save; + const [tableState, setTableState] = useState(DEFAULT_TABLE_STATE); + + const [state, queryApiKeysAndAggregations] = useAsyncFn((tableStateArgs: ApiKeysTableState) => { + const queryContainer = EuiSearchBar.Query.toESQuery(tableStateArgs.query); + + const requestBody = { + ...tableStateArgs, + query: queryContainer, + }; + + return Promise.all([ + new APIKeysAPIClient(services.http).queryApiKeys(requestBody), + authc.getCurrentUser(), + ]); + }, []); + + const resetQueryOnError = () => { + setTableState(DEFAULT_TABLE_STATE); + queryApiKeysAndAggregations(DEFAULT_TABLE_STATE); + }; + + const onTableChange = ({ page, sort }: Criteria) => { + const newState = { + ...tableState, + from: page?.index! * page?.size!, + size: page?.size!, + sort: sort ?? tableState.sort, + }; + setTableState(newState); + queryApiKeysAndAggregations(newState); + }; + + const onSearchChange = (args: EuiSearchBarOnChangeArgs) => { + if (!args.error) { + const newState = { + ...tableState, + query: args.query, + }; + setTableState(newState); + queryApiKeysAndAggregations(newState); + } + }; + + const onFilterChange = (filters: QueryFilters) => { + const newState = { + ...tableState, + filters: { + ...tableState.filters, + ...filters, + }, + }; + setTableState(newState); + queryApiKeysAndAggregations(newState); + }; + useEffect(() => { - getApiKeys(); + queryApiKeysAndAggregations(DEFAULT_TABLE_STATE); }, []); // eslint-disable-line react-hooks/exhaustive-deps if (!state.value) { @@ -77,7 +133,7 @@ export const APIKeysGridPage: FunctionComponent = () => { return ( - getApiKeys()}> + queryApiKeysAndAggregations(tableState)}> { } const [ - { apiKeys, canManageCrossClusterApiKeys, canManageApiKeys, canManageOwnApiKeys }, + { + aggregations, + canManageApiKeys, + apiKeys, + canManageOwnApiKeys, + canManageCrossClusterApiKeys, + aggregationTotal: totalKeys, + total: filteredItemTotal, + queryError, + }, currentUser, ] = state.value; + const categorizedApiKeys = !queryError + ? apiKeys.map((apiKey) => apiKey as CategorizedApiKey) + : []; + + const displayedItemCount = Math.min(filteredItemTotal, totalKeys, MAX_PAGINATED_ITEMS); + + const pagination = { + pageIndex: tableState.from / tableState.size, + pageSize: tableState.size, + totalItemCount: displayedItemCount, + pageSizeOptions: [25, 50, 100], + }; + return ( <> @@ -105,7 +183,7 @@ export const APIKeysGridPage: FunctionComponent = () => { onSuccess={(createApiKeyResponse) => { history.push({ pathname: '/' }); setCreatedApiKey(createApiKeyResponse); - getApiKeys(); + queryApiKeysAndAggregations(tableState); }} onCancel={() => history.push({ pathname: '/' })} canManageCrossClusterApiKeys={canManageCrossClusterApiKeys} @@ -125,15 +203,14 @@ export const APIKeysGridPage: FunctionComponent = () => { }); setOpenedApiKey(undefined); - getApiKeys(); + queryApiKeysAndAggregations(DEFAULT_TABLE_STATE); }} onCancel={() => setOpenedApiKey(undefined)} apiKey={openedApiKey} readOnly={readOnly} /> )} - - {!apiKeys.length ? ( + {totalKeys === 0 ? ( { description={ } rightSideItems={ @@ -184,7 +261,7 @@ export const APIKeysGridPage: FunctionComponent = () => { /> - {createdApiKey && !state.loading && ( + {createdApiKey && ( <> @@ -212,12 +289,14 @@ export const APIKeysGridPage: FunctionComponent = () => { > {(invalidateApiKeyPrompt) => ( setOpenedApiKey(apiKey)} + query={tableState.query} + queryFilters={tableState.filters} onDelete={(apiKeysToDelete) => invalidateApiKeyPrompt( apiKeysToDelete.map(({ name, id }) => ({ name, id })), - getApiKeys + () => queryApiKeysAndAggregations(tableState) ) } currentUser={currentUser} @@ -227,6 +306,15 @@ export const APIKeysGridPage: FunctionComponent = () => { canManageOwnApiKeys={canManageOwnApiKeys} readOnly={readOnly} loading={state.loading} + totalItemCount={filteredItemTotal} + pagination={pagination} + onTableChange={onTableChange} + onSearchChange={onSearchChange} + onFilterChange={onFilterChange} + aggregations={aggregations} + sortingOptions={tableState.sort} + queryErrors={queryError} + resetQuery={resetQueryOnError} /> )} @@ -300,570 +388,3 @@ export const ApiKeyCreatedCallout: FunctionComponent ); }; - -export interface ApiKeysTableProps { - apiKeys: ApiKey[]; - currentUser: AuthenticatedUser; - createdApiKey?: CreateAPIKeyResult; - readOnly?: boolean; - loading?: boolean; - canManageCrossClusterApiKeys: boolean; - canManageApiKeys: boolean; - canManageOwnApiKeys: boolean; - onClick(apiKey: CategorizedApiKey): void; - onDelete(apiKeys: CategorizedApiKey[]): void; -} - -export const ApiKeysTable: FunctionComponent = ({ - apiKeys, - createdApiKey, - currentUser, - onClick, - onDelete, - canManageApiKeys = false, - canManageOwnApiKeys = false, - readOnly = false, - loading = false, -}) => { - const columns: Array> = []; - const [selectedItems, setSelectedItems] = useState([]); - - const { categorizedApiKeys, typeFilters, usernameFilters, expiredFilters } = useMemo( - () => categorizeApiKeys(apiKeys), - [apiKeys] - ); - - const deletable = (item: CategorizedApiKey) => - canManageApiKeys || (canManageOwnApiKeys && item.username === currentUser.username); - - columns.push( - { - field: 'name', - name: i18n.translate('xpack.security.management.apiKeys.table.nameColumnName', { - defaultMessage: 'Name', - }), - sortable: true, - render: (name: string, item: CategorizedApiKey) => { - return ( - onClick(item)} data-test-subj={`apiKeyRowName-${item.name}`}> - {name} - - ); - }, - }, - { - field: 'type', - name: i18n.translate('xpack.security.management.apiKeys.table.typeColumnName', { - defaultMessage: 'Type', - }), - sortable: true, - render: (type: CategorizedApiKey['type']) => , - } - ); - - if (canManageApiKeys || usernameFilters.length > 1) { - columns.push({ - field: 'username', - name: i18n.translate('xpack.security.management.apiKeys.table.ownerColumnName', { - defaultMessage: 'Owner', - }), - sortable: true, - render: (username: CategorizedApiKey['username']) => , - }); - } - - columns.push( - { - field: 'creation', - name: i18n.translate('xpack.security.management.apiKeys.table.createdColumnName', { - defaultMessage: 'Created', - }), - sortable: true, - mobileOptions: { - show: false, - }, - render: (creation: number, item: CategorizedApiKey) => ( - - {item.id === createdApiKey?.id ? ( - - - - ) : null} - - ), - }, - { - field: 'expiration', - name: i18n.translate('xpack.security.management.apiKeys.table.statusColumnName', { - defaultMessage: 'Status', - }), - sortable: true, - render: (expiration: number) => , - } - ); - - if (!readOnly) { - columns.push({ - width: `${24 + 2 * 8}px`, - actions: [ - { - name: i18n.translate('xpack.security.management.apiKeys.table.deleteAction', { - defaultMessage: 'Delete', - }), - description: i18n.translate('xpack.security.management.apiKeys.table.deleteDescription', { - defaultMessage: 'Delete this API key', - }), - icon: 'trash', - type: 'icon', - color: 'danger', - onClick: (item) => onDelete([item]), - available: deletable, - 'data-test-subj': 'apiKeysTableDeleteAction', - }, - ], - }); - } - - const filters: SearchFilterConfig[] = []; - - if (typeFilters.length > 1) { - filters.push({ - type: 'custom_component', - component: ({ query, onChange }) => ( - - ), - }); - } - - if (usernameFilters.length > 1) { - filters.push({ - type: 'custom_component', - component: ({ query, onChange }) => ( - - ), - }); - } - - if (expiredFilters.length > 1) { - filters.push({ - type: 'field_value_toggle_group', - field: 'expired', - items: [ - { - value: false, - name: i18n.translate('xpack.security.management.apiKeys.table.activeFilter', { - defaultMessage: 'Active', - }), - }, - { - value: true, - name: i18n.translate('xpack.security.management.apiKeys.table.expiredFilter', { - defaultMessage: 'Expired', - }), - }, - ], - }); - } - - return ( - 0 - ? { - toolsLeft: selectedItems.length ? ( - onDelete(selectedItems)} - color="danger" - iconType="trash" - data-test-subj="bulkInvalidateActionButton" - > - - - ) : undefined, - box: { - incremental: true, - }, - filters, - } - : undefined - } - sorting={{ - sort: { - field: 'creation', - direction: 'desc', - }, - }} - selection={ - readOnly - ? undefined - : { - selectable: deletable, - onSelectionChange: setSelectedItems, - } - } - pagination={{ - initialPageSize: 10, - pageSizeOptions: [10, 25, 50], - }} - loading={loading} - /> - ); -}; - -export interface TypesFilterButtonProps { - query: Query; - onChange?: (query: Query) => void; - types: string[]; -} - -export const TypesFilterButton: FunctionComponent = ({ - query, - onChange, - types, -}) => { - if (!onChange) { - return null; - } - - return ( - <> - {types.includes('rest') ? ( - - onChange( - query.hasSimpleFieldClause('type', 'rest') - ? query.removeSimpleFieldClauses('type') - : query.removeSimpleFieldClauses('type').addSimpleFieldValue('type', 'rest') - ) - } - withNext={types.includes('cross_cluster') || types.includes('managed')} - > - - - ) : null} - {types.includes('cross_cluster') ? ( - - onChange( - query.hasSimpleFieldClause('type', 'cross_cluster') - ? query.removeSimpleFieldClauses('type') - : query - .removeSimpleFieldClauses('type') - .addSimpleFieldValue('type', 'cross_cluster') - ) - } - withNext={types.includes('managed')} - > - - - ) : null} - {types.includes('managed') ? ( - - onChange( - query.hasSimpleFieldClause('type', 'managed') - ? query.removeSimpleFieldClauses('type') - : query.removeSimpleFieldClauses('type').addSimpleFieldValue('type', 'managed') - ) - } - > - - - ) : null} - - ); -}; - -export interface UsersFilterButtonProps { - query: Query; - onChange?: (query: Query) => void; - usernames: string[]; -} - -export const UsersFilterButton: FunctionComponent = ({ - query, - onChange, - usernames, -}) => { - const [isOpen, setIsOpen] = useState(false); - const [searchTerm, setSearchTerm] = useState(''); - - if (!onChange) { - return null; - } - - let numActiveFilters = 0; - const clause = query.getOrFieldClause('username'); - if (clause) { - if (Array.isArray(clause.value)) { - numActiveFilters = clause.value.length; - } else { - numActiveFilters = 1; - } - } - - const usernamesMatchingSearchTerm = searchTerm - ? usernames.filter((username) => username.includes(searchTerm)) - : usernames; - - return ( - setIsOpen((toggle) => !toggle)} - isSelected={isOpen} - numFilters={usernames.length} - hasActiveFilters={numActiveFilters ? true : false} - numActiveFilters={numActiveFilters} - > - - - } - isOpen={isOpen} - panelPaddingSize="none" - anchorPosition="downCenter" - panelClassName="euiFilterGroup__popoverPanel" - closePopover={() => setIsOpen(false)} - selectableProps={{ - options: usernamesMatchingSearchTerm.map((username) => ({ - uid: username, - user: { username }, - enabled: false, - data: {}, - })), - onSearchChange: setSearchTerm, - selectedOptions: usernames - .filter((username) => query.hasOrFieldClause('username', username)) - .map((username) => ({ - uid: username, - user: { username }, - enabled: false, - data: {}, - })), - onChange: (nextSelectedOptions) => { - const nextQuery = nextSelectedOptions.reduce( - (acc, option) => acc.addOrFieldValue('username', option.user.username), - query.removeOrFieldClauses('username') - ); - onChange(nextQuery); - }, - }} - /> - ); -}; - -export type UsernameWithIconProps = Pick; - -export const UsernameWithIcon: FunctionComponent = ({ username }) => ( - - - - - - - {username} - - - -); - -export interface TimeToolTipProps { - timestamp: number; -} - -export const TimeToolTip: FunctionComponent> = ({ - timestamp, - children, -}) => { - return ( - - {children ?? moment(timestamp).fromNow()} - - ); -}; - -export type ApiKeyStatusProps = Pick; - -export const ApiKeyStatus: FunctionComponent = ({ expiration }) => { - if (!expiration) { - return ( - - - - ); - } - - if (Date.now() > expiration) { - return ( - - - - ); - } - - return ( - - - - - - ); -}; - -export interface ApiKeyBadgeProps { - type: CategorizedApiKeyType; -} - -export const ApiKeyBadge: FunctionComponent = ({ type }) => { - return type === 'cross_cluster' ? ( - - } - > - - - - - ) : type === 'managed' ? ( - - } - > - - - - - ) : ( - - } - > - - - - - ); -}; - -/** - * Interface representing a REST API key that is managed by Kibana. - */ -export interface ManagedApiKey extends Omit { - type: 'managed'; -} - -/** - * Interface representing an API key the way it is presented in the Kibana UI (with Kibana system - * API keys given its own dedicated `managed` type). - */ -export type CategorizedApiKey = (ApiKey | ManagedApiKey) & { - expired: boolean; -}; - -/** - * Categorizes API keys by type (with Kibana system API keys given its own dedicated `managed` type) - * and determines applicable filter values. - */ -export function categorizeApiKeys(apiKeys: ApiKey[]) { - const categorizedApiKeys: CategorizedApiKey[] = []; - const typeFilters: Set = new Set(); - const usernameFilters: Set = new Set(); - const expiredFilters: Set = new Set(); - - apiKeys.forEach((apiKey) => { - const type = getApiKeyType(apiKey); - const expired = apiKey.expiration ? Date.now() > apiKey.expiration : false; - - typeFilters.add(type); - usernameFilters.add(apiKey.username); - expiredFilters.add(expired); - - categorizedApiKeys.push({ ...apiKey, type, expired } as CategorizedApiKey); - }); - - return { - categorizedApiKeys, - typeFilters: [...typeFilters], - usernameFilters: [...usernameFilters], - expiredFilters: [...expiredFilters], - }; -} - -export type CategorizedApiKeyType = ReturnType; - -/** - * Determines API key type the way it is presented in the UI with Kibana system API keys given its own dedicated `managed` type. - */ -export function getApiKeyType(apiKey: ApiKey) { - return apiKey.type === 'rest' && - (apiKey.metadata?.managed || apiKey.name.indexOf('Alerting: ') === 0) - ? 'managed' - : apiKey.type; -} diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx new file mode 100644 index 0000000000000..00703df03ef42 --- /dev/null +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx @@ -0,0 +1,736 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { estypes } from '@elastic/elasticsearch'; +import type { + Criteria, + EuiBasicTableColumn, + EuiSearchBarOnChangeArgs, + Query, + SearchFilterConfig, +} from '@elastic/eui'; +import { + EuiBadge, + EuiBasicTable, + EuiButton, + EuiFilterButton, + EuiFlexGroup, + EuiFlexItem, + EuiHealth, + EuiLink, + EuiSearchBar, + EuiSpacer, + EuiText, + EuiToolTip, +} from '@elastic/eui'; +import type { CustomComponentProps } from '@elastic/eui/src/components/search_bar/filters/custom_component_filter'; +import moment from 'moment-timezone'; +import type { FunctionComponent } from 'react'; +import React, { createContext, useContext, useState } from 'react'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { UserAvatar, UserProfilesPopover } from '@kbn/user-profile-components'; + +import { ApiKeysEmptyPrompt, doesErrorIndicateBadQuery } from './api_keys_empty_prompt'; +import type { AuthenticatedUser } from '../../../../common'; +import type { ApiKey, ApiKeyAggregations, BaseApiKey } from '../../../../common/model'; +import type { CreateAPIKeyResult, QueryApiKeySortOptions } from '../api_keys_api_client'; + +export interface TablePagination { + pageIndex: number; + pageSize?: number; + totalItemCount: number; + pageSizeOptions?: number[]; + showPerPageOptions?: boolean; +} + +export interface ApiKeysTableProps { + apiKeys: CategorizedApiKey[]; + queryFilters: QueryFilters; + currentUser: AuthenticatedUser; + createdApiKey?: CreateAPIKeyResult; + query: Query; + readOnly?: boolean; + loading?: boolean; + canManageCrossClusterApiKeys: boolean; + canManageApiKeys: boolean; + canManageOwnApiKeys: boolean; + onClick(apiKey: CategorizedApiKey): void; + onDelete(apiKeys: CategorizedApiKey[]): void; + totalItemCount?: number; + onTableChange: ({ page, sort }: Criteria) => void; + pagination: TablePagination; + onSearchChange: (args: EuiSearchBarOnChangeArgs) => boolean | void; + aggregations?: ApiKeyAggregations; + sortingOptions: QueryApiKeySortOptions; + queryErrors?: Error; + resetQuery: () => void; + onFilterChange: (filters: QueryFilters) => void; +} + +export interface QueryFilters { + usernames?: string[]; + type?: 'rest' | 'managed' | 'cross_cluster'; + expired?: boolean; +} + +export const MAX_PAGINATED_ITEMS = 10000; +const FiltersContext = createContext<{ + types: string[]; + usernames: string[]; + filters: QueryFilters; + onFilterChange: (filters: QueryFilters) => void; +}>({ types: [], usernames: [], filters: {}, onFilterChange: () => {} }); + +export const ApiKeysTable: FunctionComponent = ({ + apiKeys, + createdApiKey, + currentUser, + onClick, + onDelete, + canManageApiKeys = false, + canManageOwnApiKeys = false, + readOnly = false, + loading = false, + totalItemCount = 0, + onTableChange, + pagination, + onSearchChange, + aggregations, + sortingOptions, + queryErrors, + resetQuery, + query, + queryFilters, + onFilterChange, +}) => { + const columns: Array> = []; + const [selectedItems, setSelectedItems] = useState([]); + + const { typeFilters, usernameFilters, expired } = categorizeAggregations(aggregations); + + const deletable = (item: CategorizedApiKey) => + canManageApiKeys || (canManageOwnApiKeys && item.username === currentUser.username); + + const isBadRequest = queryErrors && doesErrorIndicateBadQuery(queryErrors); + + const itemsToDisplay = isBadRequest ? [] : apiKeys; + + columns.push( + { + field: 'name', + name: ( + + ), + sortable: true, + render: (name: string, item: CategorizedApiKey) => { + return ( + onClick(item)} data-test-subj={`apiKeyRowName-${item.name}`}> + {name} + + ); + }, + }, + { + field: 'type', + name: ( + + ), + sortable: true, + render: (type: CategorizedApiKey['type'], apiKeyRecord) => { + let keyType = type; + if ( + apiKeyRecord.name.indexOf('Alerting: ') === 0 || + apiKeyRecord.metadata?.managed === true + ) { + keyType = 'managed'; + } + return ; + }, + } + ); + + if (canManageApiKeys || usernameFilters.length > 1) { + columns.push({ + field: 'username', + name: ( + + ), + sortable: true, + render: (username: CategorizedApiKey['username']) => , + }); + } + + columns.push( + { + field: 'creation', + name: ( + + ), + sortable: true, + mobileOptions: { + show: false, + }, + render: (creation: number, item: CategorizedApiKey) => ( + + {item.id === createdApiKey?.id ? ( + + + + ) : null} + + ), + }, + { + field: 'expiration', + name: ( + + ), + sortable: true, + render: (expiration: number) => , + } + ); + + if (!readOnly) { + columns.push({ + width: `${24 + 2 * 8}px`, + actions: [ + { + name: ( + + ), + description: i18n.translate('xpack.security.management.apiKeys.table.deleteDescription', { + defaultMessage: 'Delete this API key', + }), + icon: 'trash', + type: 'icon', + color: 'danger', + onClick: (item) => onDelete([item]), + available: deletable, + 'data-test-subj': 'apiKeysTableDeleteAction', + }, + ], + }); + } + + const filters: SearchFilterConfig[] = []; + + if (typeFilters.length > 1) { + filters.push({ + type: 'custom_component', + component: TypesFilterButton, + }); + } + + if (expired > 0) { + filters.push({ + type: 'custom_component', + component: ExpiredFilterButton, + }); + } + + if (usernameFilters.length > 1) { + filters.push({ + type: 'custom_component', + component: UsersFilterButton, + }); + } + + const exceededResultCount = totalItemCount > MAX_PAGINATED_ITEMS; + + return ( + <> + + onDelete(selectedItems)} + color="danger" + iconType="trash" + data-test-subj="bulkInvalidateActionButton" + > + + + ) : undefined + } + /> + + + {isBadRequest ? ( + + { + resetQuery(); + }} + > + + + + ) : ( + <> + {exceededResultCount && ( + <> + + + + + + )} + + + )} + + ); +}; + +export const TypesFilterButton: FunctionComponent = ({ query, onChange }) => { + const { types, filters, onFilterChange } = useContext(FiltersContext); + + if (!onChange) { + return null; + } + + return ( + <> + {types.includes('rest') ? ( + { + onFilterChange({ ...filters, type: filters.type === 'rest' ? undefined : 'rest' }); + }} + withNext={types.includes('cross_cluster') || types.includes('managed')} + > + + + ) : null} + {types.includes('cross_cluster') ? ( + { + onFilterChange({ + ...filters, + type: filters.type === 'cross_cluster' ? undefined : 'cross_cluster', + }); + }} + withNext={types.includes('managed')} + > + + + ) : null} + {types.includes('managed') ? ( + { + onFilterChange({ + ...filters, + type: filters.type === 'managed' ? undefined : 'managed', + }); + }} + > + + + ) : null} + + ); +}; + +export const ExpiredFilterButton: FunctionComponent = ({ + query, + onChange, +}) => { + const { filters, onFilterChange } = useContext(FiltersContext); + + if (!onChange) { + return null; + } + + return ( + <> + { + if (filters.expired === false) { + onFilterChange({ ...filters, expired: undefined }); + } else { + onFilterChange({ ...filters, expired: false }); + } + }} + withNext={true} + > + + + { + if (filters.expired === true) { + onFilterChange({ ...filters, expired: undefined }); + } else { + onFilterChange({ ...filters, expired: true }); + } + }} + > + + + + ); +}; + +export const UsersFilterButton: FunctionComponent = ({ query, onChange }) => { + const { usernames, filters, onFilterChange } = useContext(FiltersContext); + + const filteredUsernames = filters.usernames || []; + + const [isOpen, setIsOpen] = useState(false); + const [searchTerm, setSearchTerm] = useState(''); + + if (!onChange) { + return null; + } + + let numActiveFilters = 0; + const clause = filters.usernames || []; + if (clause.length) { + numActiveFilters = clause.length; + } + + const usernamesMatchingSearchTerm = searchTerm + ? usernames.filter((username) => username.includes(searchTerm)) + : usernames; + + return ( + setIsOpen((toggle) => !toggle)} + isSelected={isOpen} + numFilters={usernames.length} + hasActiveFilters={numActiveFilters ? true : false} + numActiveFilters={numActiveFilters} + > + + + } + isOpen={isOpen} + panelPaddingSize="none" + anchorPosition="downCenter" + panelClassName="euiFilterGroup__popoverPanel" + closePopover={() => setIsOpen(false)} + selectableProps={{ + options: usernamesMatchingSearchTerm.map((username) => ({ + uid: username, + user: { username }, + enabled: false, + data: {}, + })), + onSearchChange: setSearchTerm, + selectedOptions: usernames + .filter((username) => filteredUsernames.includes(username)) + .map((username) => ({ + uid: username, + user: { username }, + enabled: false, + data: {}, + })), + onChange: (nextSelectedOptions) => { + const nextFilters = nextSelectedOptions.map((option) => option.user.username); + onFilterChange({ ...filters, usernames: nextFilters }); + }, + }} + /> + ); +}; + +export type UsernameWithIconProps = Pick; + +export const UsernameWithIcon: FunctionComponent = ({ username }) => ( + + + + + + + {username} + + + +); + +export interface TimeToolTipProps { + timestamp: number; +} + +export const TimeToolTip: FunctionComponent = ({ timestamp, children }) => { + return ( + + {children ?? moment(timestamp).fromNow()} + + ); +}; + +export type ApiKeyStatusProps = Pick; + +export const ApiKeyStatus: FunctionComponent = ({ expiration }) => { + if (!expiration) { + return ( + + + + ); + } + + if (Date.now() > expiration) { + return ( + + + + ); + } + + return ( + + + + + + ); +}; + +export interface ApiKeyBadgeProps { + type: 'rest' | 'cross_cluster' | 'managed'; +} + +export const ApiKeyBadge: FunctionComponent = ({ type }) => { + return type === 'cross_cluster' ? ( + + } + > + + + + + ) : type === 'managed' ? ( + + } + > + + + + + ) : ( + + } + > + + + + + ); +}; + +/** + * Interface representing a REST API key that is managed by Kibana. + */ +export interface ManagedApiKey extends BaseApiKey { + type: 'managed'; +} + +/** + * Interface representing an API key the way it is presented in the Kibana UI (with Kibana system + * API keys given its own dedicated `managed` type). + */ +export type CategorizedApiKey = (ApiKey | ManagedApiKey) & { + expired: boolean; +}; + +export const categorizeAggregations = (aggregationResponse?: ApiKeyAggregations) => { + const typeFilters: Array = []; + const usernameFilters: Array = []; + let expiredCount = 0; + + if (aggregationResponse && Object.keys(aggregationResponse).length > 0) { + const { usernames, types, expired, managed } = aggregationResponse; + const typeBuckets = types?.buckets.length + ? (types.buckets as estypes.AggregationsStringTermsBucket[]) + : []; + + const usernameBuckets = usernames?.buckets.length + ? (usernames.buckets as estypes.AggregationsStringTermsBucket[]) + : []; + + typeBuckets.forEach((type) => { + typeFilters.push(type.key); + }); + usernameBuckets.forEach((username) => { + usernameFilters.push(username.key); + }); + const { namePrefixBased, metadataBased } = managed?.buckets || {}; + if ( + (namePrefixBased?.doc_count && namePrefixBased.doc_count > 0) || + (metadataBased?.doc_count && metadataBased.doc_count > 0) + ) { + typeFilters.push('managed'); + } + expiredCount = expired?.doc_count ?? 0; + } + + return { + typeFilters, + usernameFilters, + expired: expiredCount, + }; +}; diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.test.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.test.tsx index dae1ffd5709f4..f9fa57095426f 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.test.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.test.tsx @@ -32,11 +32,13 @@ describe('apiKeysManagementApp', () => { }, }; - coreStartMock.http.get.mockResolvedValue({ + coreStartMock.http.post.mockResolvedValue({ apiKeys: [], canManageCrossClusterApiKeys: true, canManageApiKeys: true, canManageOwnApiKeys: true, + aggregations: {}, + aggregationsTotal: 0, }); authc.getCurrentUser.mockResolvedValue( diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx index 3940c25bf6c43..d841095c13fe0 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx @@ -45,7 +45,7 @@ export const apiKeysManagementApp = Object.freeze({ async mount({ element, setBreadcrumbs, history }) { const [[coreStart], { APIKeysGridPage }] = await Promise.all([ getStartServices(), - import('./api_keys_grid'), + import('./api_keys_grid/api_keys_grid_page'), ]); render( diff --git a/x-pack/plugins/security/public/plugin.tsx b/x-pack/plugins/security/public/plugin.tsx index 9077db924f87c..429437e9fa39a 100644 --- a/x-pack/plugins/security/public/plugin.tsx +++ b/x-pack/plugins/security/public/plugin.tsx @@ -191,7 +191,7 @@ export class SecurityPlugin core: CoreStart, { management, share }: PluginStartDependencies ): SecurityPluginStart { - const { application, http, notifications, docLinks } = core; + const { application, http, notifications } = core; const { anonymousPaths } = http; const logoutUrl = getLogoutUrl(http); @@ -202,7 +202,7 @@ export class SecurityPlugin this.sessionTimeout = new SessionTimeout(core, notifications, sessionExpired, http, tenant); this.sessionTimeout.start(); - this.securityCheckupService.start({ http, notifications, docLinks }); + this.securityCheckupService.start(core); this.securityApiClients.userProfiles.start(); if (management) { diff --git a/x-pack/plugins/security/public/security_checkup/components/insecure_cluster_alert.tsx b/x-pack/plugins/security/public/security_checkup/components/insecure_cluster_alert.tsx index 34710ba650f54..71e1a53e7d2fb 100644 --- a/x-pack/plugins/security/public/security_checkup/components/insecure_cluster_alert.tsx +++ b/x-pack/plugins/security/public/security_checkup/components/insecure_cluster_alert.tsx @@ -16,26 +16,38 @@ import { import React, { useState } from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import type { DocLinksStart, MountPoint } from '@kbn/core/public'; +import type { + AnalyticsServiceStart, + DocLinksStart, + I18nStart, + MountPoint, + ThemeServiceStart, +} from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, I18nProvider } from '@kbn/i18n-react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; export const insecureClusterAlertTitle = i18n.translate( 'xpack.security.checkup.insecureClusterTitle', { defaultMessage: 'Your data is not secure' } ); -export const insecureClusterAlertText = ( - docLinks: DocLinksStart, - onDismiss: (persist: boolean) => void -) => +interface Deps { + docLinks: DocLinksStart; + analytics: Pick; + i18n: I18nStart; + theme: Pick; +} + +export const insecureClusterAlertText = (deps: Deps, onDismiss: (persist: boolean) => void) => ((e) => { + const { docLinks, ...startServices } = deps; const AlertText = () => { const [persist, setPersist] = useState(false); const enableSecurityDocLink = `${docLinks.links.security.elasticsearchEnableSecurity}?blade=kibanasecuritymessage`; return ( - +
-
+ ); }; diff --git a/x-pack/plugins/security/public/security_checkup/security_checkup_service.tsx b/x-pack/plugins/security/public/security_checkup/security_checkup_service.tsx index 26cdc410825c0..4818e3721818a 100644 --- a/x-pack/plugins/security/public/security_checkup/security_checkup_service.tsx +++ b/x-pack/plugins/security/public/security_checkup/security_checkup_service.tsx @@ -8,10 +8,13 @@ import { BehaviorSubject, combineLatest, distinctUntilChanged, from, map } from 'rxjs'; import type { + AnalyticsServiceStart, DocLinksStart, HttpSetup, HttpStart, + I18nStart, NotificationsStart, + ThemeServiceStart, Toast, } from '@kbn/core/public'; @@ -27,6 +30,9 @@ interface StartDeps { http: HttpStart; notifications: NotificationsStart; docLinks: DocLinksStart; + analytics: Pick; + i18n: I18nStart; + theme: Pick; } const DEFAULT_SECURITY_CHECKUP_STATE = Object.freeze({ @@ -63,7 +69,7 @@ export class SecurityCheckupService { } } - private initializeAlert({ http, notifications, docLinks }: StartDeps) { + private initializeAlert({ http, notifications, ...startServices }: StartDeps) { const appState$ = from(this.getSecurityCheckupState(http)); // 10 days is reasonably long enough to call "forever" for a page load. @@ -81,7 +87,7 @@ export class SecurityCheckupService { this.alertToast = notifications.toasts.addWarning( { title: insecureClusterAlertTitle, - text: insecureClusterAlertText(docLinks, (persist: boolean) => + text: insecureClusterAlertText(startServices, (persist: boolean) => this.setAlertVisibility(false, persist) ), iconType: 'warning', diff --git a/x-pack/plugins/security/server/routes/api_keys/get.ts b/x-pack/plugins/security/server/routes/api_keys/get.ts deleted file mode 100644 index 4a6583d585ea0..0000000000000 --- a/x-pack/plugins/security/server/routes/api_keys/get.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { RouteDefinitionParams } from '..'; -import type { ApiKey } from '../../../common/model'; -import { wrapIntoCustomErrorResponse } from '../../errors'; -import { createLicensedRouteHandler } from '../licensed_route_handler'; - -/** - * Response of Kibana Get API keys endpoint. - */ -export interface GetAPIKeysResult { - apiKeys: ApiKey[]; - canManageCrossClusterApiKeys: boolean; - canManageApiKeys: boolean; - canManageOwnApiKeys: boolean; -} - -export function defineGetApiKeysRoutes({ - router, - getAuthenticationService, -}: RouteDefinitionParams) { - router.get( - { - path: '/internal/security/api_key', - validate: false, - options: { - access: 'internal', - }, - }, - createLicensedRouteHandler(async (context, request, response) => { - try { - const esClient = (await context.core).elasticsearch.client; - const authenticationService = getAuthenticationService(); - - const [{ cluster: clusterPrivileges }, areApiKeysEnabled, areCrossClusterApiKeysEnabled] = - await Promise.all([ - esClient.asCurrentUser.security.hasPrivileges({ - body: { - cluster: [ - 'manage_security', - 'read_security', - 'manage_api_key', - 'manage_own_api_key', - ], - }, - }), - authenticationService.apiKeys.areAPIKeysEnabled(), - authenticationService.apiKeys.areCrossClusterAPIKeysEnabled(), - ]); - - if (!areApiKeysEnabled) { - return response.notFound({ - body: { - message: - "API keys are disabled in Elasticsearch. To use API keys enable 'xpack.security.authc.api_key.enabled' setting.", - }, - }); - } - - const apiResponse = await esClient.asCurrentUser.security.getApiKey({ - owner: !clusterPrivileges.manage_api_key && !clusterPrivileges.read_security, - }); - - const validKeys = apiResponse.api_keys - .filter(({ invalidated }) => !invalidated) - .map((key) => { - if (!key.name) { - key.name = key.id; - } - return key; - }); - - return response.ok({ - body: { - // @ts-expect-error Elasticsearch client types do not know about cross-cluster API keys yet. - apiKeys: validKeys, - canManageCrossClusterApiKeys: - clusterPrivileges.manage_security && areCrossClusterApiKeysEnabled, - canManageApiKeys: clusterPrivileges.manage_api_key, - canManageOwnApiKeys: clusterPrivileges.manage_own_api_key, - }, - }); - } catch (error) { - return response.customError(wrapIntoCustomErrorResponse(error)); - } - }) - ); -} diff --git a/x-pack/plugins/security/server/routes/api_keys/index.ts b/x-pack/plugins/security/server/routes/api_keys/index.ts index 3b71eb7e1104d..542611bfd0a23 100644 --- a/x-pack/plugins/security/server/routes/api_keys/index.ts +++ b/x-pack/plugins/security/server/routes/api_keys/index.ts @@ -7,9 +7,9 @@ import { defineCreateApiKeyRoutes } from './create'; import { defineEnabledApiKeysRoutes } from './enabled'; -import { defineGetApiKeysRoutes } from './get'; import { defineHasApiKeysRoutes } from './has_active'; import { defineInvalidateApiKeysRoutes } from './invalidate'; +import { defineQueryApiKeysAndAggregationsRoute } from './query'; import { defineUpdateApiKeyRoutes } from './update'; import type { RouteDefinitionParams } from '..'; @@ -20,13 +20,12 @@ export type { UpdateCrossClusterAPIKeyParams, UpdateRestAPIKeyWithKibanaPrivilegesParams, } from './update'; -export type { GetAPIKeysResult } from './get'; export function defineApiKeysRoutes(params: RouteDefinitionParams) { defineEnabledApiKeysRoutes(params); - defineGetApiKeysRoutes(params); defineHasApiKeysRoutes(params); defineCreateApiKeyRoutes(params); defineUpdateApiKeyRoutes(params); defineInvalidateApiKeysRoutes(params); + defineQueryApiKeysAndAggregationsRoute(params); } diff --git a/x-pack/plugins/security/server/routes/api_keys/get.test.ts b/x-pack/plugins/security/server/routes/api_keys/query.test.ts similarity index 68% rename from x-pack/plugins/security/server/routes/api_keys/get.test.ts rename to x-pack/plugins/security/server/routes/api_keys/query.test.ts index 7ec120b6f9952..aa2a65876dfce 100644 --- a/x-pack/plugins/security/server/routes/api_keys/get.test.ts +++ b/x-pack/plugins/security/server/routes/api_keys/query.test.ts @@ -13,12 +13,12 @@ import { coreMock, httpServerMock } from '@kbn/core/server/mocks'; import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; -import { defineGetApiKeysRoutes } from './get'; +import { defineQueryApiKeysAndAggregationsRoute } from './query'; import type { InternalAuthenticationServiceStart } from '../../authentication'; import { authenticationServiceMock } from '../../authentication/authentication_service.mock'; import { routeDefinitionParamsMock } from '../index.mock'; -describe('Get API Keys route', () => { +describe('Query API Keys route', () => { let routeHandler: RequestHandler; let authc: DeeplyMockedKeys; let esClientMock: ScopedClusterClientMock; @@ -28,8 +28,8 @@ describe('Get API Keys route', () => { const mockRouteDefinitionParams = routeDefinitionParamsMock.create(); authc = authenticationServiceMock.createStart(); mockRouteDefinitionParams.getAuthenticationService.mockReturnValue(authc); - defineGetApiKeysRoutes(mockRouteDefinitionParams); - [[, routeHandler]] = mockRouteDefinitionParams.router.get.mock.calls; + defineQueryApiKeysAndAggregationsRoute(mockRouteDefinitionParams); + [[, routeHandler]] = mockRouteDefinitionParams.router.post.mock.calls; mockContext = coreMock.createCustomRequestHandlerContext({ core: coreMock.createRequestHandlerContext(), licensing: licensingMock.createRequestHandlerContext(), @@ -49,64 +49,17 @@ describe('Get API Keys route', () => { }, } as any); - esClientMock.asCurrentUser.security.getApiKey.mockResponse({ + esClientMock.asCurrentUser.security.queryApiKeys.mockResponse({ api_keys: [ { id: '123', invalidated: false }, { id: '456', invalidated: true }, ], } as any); - }); - it('should filter out invalidated API keys', async () => { - const response = await routeHandler( - mockContext, - httpServerMock.createKibanaRequest(), - kibanaResponseFactory - ); - - expect(response.status).toBe(200); - expect(response.payload.apiKeys).toContainEqual({ id: '123', name: '123', invalidated: false }); - expect(response.payload.apiKeys).not.toContainEqual({ - id: '456', - name: '456', - invalidated: true, - }); - }); - - it('should substitute the API key id for keys with `null` names', async () => { - esClientMock.asCurrentUser.security.getApiKey.mockRestore(); - esClientMock.asCurrentUser.security.getApiKey.mockResponse({ - api_keys: [ - { id: 'with_name', name: 'foo', invalidated: false }, - { id: 'undefined_name', invalidated: false }, - { id: 'null_name', name: null, invalidated: false }, - ], - } as any); - - const response = await routeHandler( - mockContext, - httpServerMock.createKibanaRequest(), - kibanaResponseFactory - ); - - expect(response.status).toBe(200); - expect(response.payload.apiKeys).toEqual([ - { - id: 'with_name', - name: 'foo', - invalidated: false, - }, - { - id: 'undefined_name', - name: 'undefined_name', - invalidated: false, - }, - { - id: 'null_name', - name: 'null_name', - invalidated: false, - }, - ]); + esClientMock.asCurrentUser.transport.request.mockImplementation(async (request) => ({ + aggregationsTotal: 2, + aggregations: {}, + })); }); it('should return `404` if API keys are disabled', async () => { @@ -125,9 +78,9 @@ describe('Get API Keys route', () => { }); }); - it('should forward error from Elasticsearch GET API keys endpoint', async () => { + it('should forward error from Elasticsearch Query API keys endpoint', async () => { const error = Boom.forbidden('test not acceptable message'); - esClientMock.asCurrentUser.security.getApiKey.mockResponseImplementation(() => { + esClientMock.asCurrentUser.security.queryApiKeys.mockResponseImplementation(() => { throw error; }); @@ -186,12 +139,6 @@ describe('Get API Keys route', () => { }) ); }); - - it('should request list of all Elasticsearch API keys', async () => { - await routeHandler(mockContext, httpServerMock.createKibanaRequest(), kibanaResponseFactory); - - expect(esClientMock.asCurrentUser.security.getApiKey).toHaveBeenCalledWith({ owner: false }); - }); }); describe('when user has `manage_api_key` permission', () => { @@ -221,12 +168,6 @@ describe('Get API Keys route', () => { }) ); }); - - it('should request list of all Elasticsearch API keys', async () => { - await routeHandler(mockContext, httpServerMock.createKibanaRequest(), kibanaResponseFactory); - - expect(esClientMock.asCurrentUser.security.getApiKey).toHaveBeenCalledWith({ owner: false }); - }); }); describe('when user has `read_security` permission', () => { @@ -256,12 +197,6 @@ describe('Get API Keys route', () => { }) ); }); - - it('should request list of all Elasticsearch API keys', async () => { - await routeHandler(mockContext, httpServerMock.createKibanaRequest(), kibanaResponseFactory); - - expect(esClientMock.asCurrentUser.security.getApiKey).toHaveBeenCalledWith({ owner: false }); - }); }); describe('when user has `manage_own_api_key` permission', () => { @@ -291,11 +226,5 @@ describe('Get API Keys route', () => { }) ); }); - - it('should only request list of API keys owned by the user', async () => { - await routeHandler(mockContext, httpServerMock.createKibanaRequest(), kibanaResponseFactory); - - expect(esClientMock.asCurrentUser.security.getApiKey).toHaveBeenCalledWith({ owner: true }); - }); }); }); diff --git a/x-pack/plugins/security/server/routes/api_keys/query.ts b/x-pack/plugins/security/server/routes/api_keys/query.ts new file mode 100644 index 0000000000000..9657deb3db300 --- /dev/null +++ b/x-pack/plugins/security/server/routes/api_keys/query.ts @@ -0,0 +1,228 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +import type { RouteDefinitionParams } from '..'; +import type { QueryApiKeyResult } from '../../../common/model'; +import { wrapIntoCustomErrorResponse } from '../../errors'; +import { createLicensedRouteHandler } from '../licensed_route_handler'; + +interface QueryClause { + [key: string]: any; +} + +export function defineQueryApiKeysAndAggregationsRoute({ + router, + getAuthenticationService, +}: RouteDefinitionParams) { + router.post( + // SECURITY: We don't apply any authorization tags (e.g., access:security) to this route because all actions performed + // on behalf of the user making the request and governed by the user's own cluster privileges. + { + path: '/internal/security/api_key/_query', + validate: { + body: schema.object({ + query: schema.maybe(schema.object({}, { unknowns: 'allow' })), + from: schema.maybe(schema.number()), + size: schema.maybe(schema.number()), + sort: schema.maybe( + schema.object({ + field: schema.string(), + direction: schema.oneOf([schema.literal('asc'), schema.literal('desc')]), + }) + ), + filters: schema.maybe( + schema.object({ + usernames: schema.maybe(schema.arrayOf(schema.string())), + type: schema.maybe( + schema.oneOf([ + schema.literal('rest'), + schema.literal('cross_cluster'), + schema.literal('managed'), + ]) + ), + expired: schema.maybe(schema.boolean()), + }) + ), + }), + }, + options: { + access: 'internal', + }, + }, + createLicensedRouteHandler(async (context, request, response) => { + try { + const esClient = (await context.core).elasticsearch.client; + const authenticationService = getAuthenticationService(); + + const [{ cluster: clusterPrivileges }, areApiKeysEnabled, areCrossClusterApiKeysEnabled] = + await Promise.all([ + esClient.asCurrentUser.security.hasPrivileges({ + cluster: ['manage_security', 'read_security', 'manage_api_key', 'manage_own_api_key'], + }), + authenticationService.apiKeys.areAPIKeysEnabled(), + authenticationService.apiKeys.areCrossClusterAPIKeysEnabled(), + ]); + + if (!areApiKeysEnabled) { + return response.notFound({ + body: { + message: + "API keys are disabled in Elasticsearch. To use API keys enable 'xpack.security.authc.api_key.enabled' setting.", + }, + }); + } + + const alertingPrefixFilter = { prefix: { name: { value: 'Alerting: ' } } }; + const managedMetadataFilter = { term: { 'metadata.managed': true } }; + + const { query, size, from, sort, filters } = request.body; + + const queryPayload: { + bool: { must: QueryClause[]; should: QueryClause[]; must_not: QueryClause[] }; + } = { bool: { must: [], should: [], must_not: [] } }; + + if (query) { + queryPayload.bool.must.push(query); + } + queryPayload.bool.must.push({ term: { invalidated: false } }); + + if (filters) { + const { usernames, type, expired } = filters; + + if (type === 'managed') { + queryPayload.bool.must.push({ + bool: { + should: [alertingPrefixFilter, managedMetadataFilter], + }, + }); + } else if (type === 'rest' || type === 'cross_cluster') { + queryPayload.bool.must.push({ term: { type } }); + queryPayload.bool.must_not.push(alertingPrefixFilter, managedMetadataFilter); + } + + if (expired === false) { + // Active API keys are those that have an expiration date in the future or no expiration date at all + const activeKeysDsl = { + bool: { + must: [ + { + bool: { + should: [ + { + range: { + expiration: { + gt: 'now', + }, + }, + }, + { + bool: { + must_not: { + exists: { + field: 'expiration', + }, + }, + }, + }, + ], + minimum_should_match: 1, + }, + }, + ], + }, + }; + queryPayload.bool.must.push(activeKeysDsl); + } else if (expired === true) { + queryPayload.bool.must.push({ range: { expiration: { lte: 'now' } } }); + } + + if (usernames && usernames.length > 0) { + queryPayload.bool.must.push({ terms: { username: usernames } }); + } + } + + const transformedSort = sort && [{ [sort.field]: { order: sort.direction } }]; + let queryResult: Partial; + try { + const queryResponse = await esClient.asCurrentUser.security.queryApiKeys({ + query: queryPayload, + sort: transformedSort, + size, + from, + }); + + queryResult = { + // @ts-expect-error Elasticsearch client types do not know about Cross-Cluster API keys yet. + apiKeys: queryResponse.api_keys, + total: queryResponse.total, + count: queryResponse.api_keys.length, + }; + } catch ({ name, message }) { + queryResult = { queryError: { name, message } }; + } + + const aggregationResponse = await esClient.asCurrentUser.security.queryApiKeys({ + filter_path: [ + 'total', + 'aggregations.usernames.buckets.key', + 'aggregations.types.buckets.key', + 'aggregations.invalidated.doc_count', + 'aggregations.expired.doc_count', + 'aggregations.managed.buckets.metadataBased.doc_count', + 'aggregations.managed.buckets.namePrefixBased.doc_count', + ], + size: 0, + query: { match: { invalidated: false } }, + aggs: { + usernames: { + terms: { + field: 'username', + }, + }, + types: { + terms: { + field: 'type', + }, + }, + expired: { + filter: { + range: { expiration: { lte: 'now' } }, + }, + }, + // We need this bucket to separately count API keys that were created by the Alerting plugin using only the plugin name + // From v8.14.0, the Alerting plugin will create all keys with the `metadata.managed` field set to `true` + managed: { + filters: { + filters: { + metadataBased: managedMetadataFilter, + namePrefixBased: alertingPrefixFilter, + }, + }, + }, + }, + }); + + return response.ok({ + // @ts-expect-error Elasticsearch client types do not know about Cross-Cluster API keys yet. + body: { + aggregationTotal: aggregationResponse.total, + aggregations: aggregationResponse.aggregations, + canManageCrossClusterApiKeys: + clusterPrivileges.manage_security && areCrossClusterApiKeysEnabled, + canManageApiKeys: clusterPrivileges.manage_api_key, + canManageOwnApiKeys: clusterPrivileges.manage_own_api_key, + ...queryResult, + }, + }); + } catch (error) { + return response.customError(wrapIntoCustomErrorResponse(error)); + } + }) + ); +} diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts index b5e4e874c7537..3772635ef2d33 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts @@ -155,6 +155,7 @@ describe('Endpoint Authz service', () => { ['canSuspendProcess', 'writeProcessOperations'], ['canGetRunningProcesses', 'writeProcessOperations'], ['canWriteExecuteOperations', 'writeExecuteOperations'], + ['canWriteScanOperations', 'writeScanOperations'], ['canWriteFileOperations', 'writeFileOperations'], ['canWriteTrustedApplications', 'writeTrustedApplications'], ['canReadTrustedApplications', 'readTrustedApplications'], @@ -193,6 +194,7 @@ describe('Endpoint Authz service', () => { ['canSuspendProcess', ['writeProcessOperations']], ['canGetRunningProcesses', ['writeProcessOperations']], ['canWriteExecuteOperations', ['writeExecuteOperations']], + ['canWriteScanOperations', ['writeScanOperations']], ['canWriteFileOperations', ['writeFileOperations']], ['canWriteTrustedApplications', ['writeTrustedApplications']], ['canReadTrustedApplications', ['readTrustedApplications']], @@ -242,6 +244,7 @@ describe('Endpoint Authz service', () => { ['canSuspendProcess', ['writeProcessOperations']], ['canGetRunningProcesses', ['writeProcessOperations']], ['canWriteExecuteOperations', ['writeExecuteOperations']], + ['canWriteScanOperations', ['writeScanOperations']], ['canWriteFileOperations', ['writeFileOperations']], ['canWriteTrustedApplications', ['writeTrustedApplications']], ['canReadTrustedApplications', ['readTrustedApplications']], @@ -317,6 +320,7 @@ describe('Endpoint Authz service', () => { canGetRunningProcesses: false, canAccessResponseConsole: false, canWriteExecuteOperations: false, + canWriteScanOperations: false, canWriteFileOperations: false, canWriteTrustedApplications: false, canReadTrustedApplications: false, diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts index 95430a6df82fb..7b058e543e28f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts @@ -53,6 +53,7 @@ function hasAuthFactory(fleetAuthz: FleetAuthz, productFeatureService?: ProductF * @param licenseService * @param fleetAuthz * @param userRoles + * @param productFeaturesService */ export const calculateEndpointAuthz = ( licenseService: LicenseService, @@ -90,6 +91,7 @@ export const calculateEndpointAuthz = ( const canWriteFileOperations = hasAuth('writeFileOperations'); const canWriteExecuteOperations = hasAuth('writeExecuteOperations'); + const canWriteScanOperations = hasAuth('writeScanOperations'); const canReadEndpointExceptions = hasAuth('showEndpointExceptions'); const canWriteEndpointExceptions = hasAuth('crudEndpointExceptions'); @@ -122,6 +124,7 @@ export const calculateEndpointAuthz = ( canAccessResponseConsole: false, // set further below canWriteExecuteOperations: canWriteExecuteOperations && isEnterpriseLicense, canWriteFileOperations: canWriteFileOperations && isEnterpriseLicense, + canWriteScanOperations: canWriteScanOperations && isEnterpriseLicense, // --------------------------------------------------------- // artifacts @@ -180,6 +183,7 @@ export const getEndpointAuthzInitialState = (): EndpointAuthz => { canAccessResponseConsole: false, canWriteFileOperations: false, canWriteExecuteOperations: false, + canWriteScanOperations: false, canWriteTrustedApplications: false, canReadTrustedApplications: false, canWriteHostIsolationExceptions: false, diff --git a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts index 6e6b6de839344..02716e09a882a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/response_actions/constants.ts @@ -27,6 +27,8 @@ export const RESPONSE_ACTION_API_COMMANDS_NAMES = [ 'get-file', 'execute', 'upload', + // TODO: for API changes in a subsequent PR + // 'scan', ] as const; export type ResponseActionsApiCommandNames = typeof RESPONSE_ACTION_API_COMMANDS_NAMES[number]; @@ -52,6 +54,8 @@ export const ENDPOINT_CAPABILITIES = [ 'get_file', 'execute', 'upload_file', + // TODO: for API changes in a subsequent PR + // 'scan', ] as const; export type EndpointCapabilities = typeof ENDPOINT_CAPABILITIES[number]; @@ -69,6 +73,8 @@ export const CONSOLE_RESPONSE_ACTION_COMMANDS = [ 'get-file', 'execute', 'upload', + // TODO: for API changes in a subsequent PR + // 'scan', ] as const; export type ConsoleResponseActionCommands = typeof CONSOLE_RESPONSE_ACTION_COMMANDS[number]; @@ -78,7 +84,8 @@ export type ResponseConsoleRbacControls = | 'writeHostIsolationRelease' | 'writeProcessOperations' | 'writeFileOperations' - | 'writeExecuteOperations'; + | 'writeExecuteOperations' + | 'writeScanOperations'; /** * maps the console command to the RBAC control (kibana feature control) that is required to access it via console @@ -95,6 +102,8 @@ export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_RBAC_FEATURE_CONTROL: Record< 'get-file': 'writeFileOperations', execute: 'writeExecuteOperations', upload: 'writeFileOperations', + // TODO: for API changes in a subsequent PR + // scan: 'writeScanOperations', }); export const RESPONSE_ACTION_API_COMMAND_TO_CONSOLE_COMMAND_MAP = Object.freeze< @@ -108,6 +117,8 @@ export const RESPONSE_ACTION_API_COMMAND_TO_CONSOLE_COMMAND_MAP = Object.freeze< 'kill-process': 'kill-process', 'suspend-process': 'suspend-process', upload: 'upload', + // TODO: for API changes in a subsequent PR + // scan: 'scan', }); export const RESPONSE_CONSOLE_COMMAND_TO_API_COMMAND_MAP = Object.freeze< @@ -121,6 +132,8 @@ export const RESPONSE_CONSOLE_COMMAND_TO_API_COMMAND_MAP = Object.freeze< 'kill-process': 'kill-process', 'suspend-process': 'suspend-process', upload: 'upload', + // TODO: for API changes in a subsequent PR + // scan: 'scan', }); export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_ENDPOINT_CAPABILITY = Object.freeze< @@ -134,6 +147,8 @@ export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_ENDPOINT_CAPABILITY = Object.fr 'kill-process': 'kill_process', 'suspend-process': 'suspend_process', upload: 'upload_file', + // TODO: for API changes in a subsequent PR + // scan: 'scan', }); /** @@ -150,6 +165,8 @@ export const RESPONSE_CONSOLE_ACTION_COMMANDS_TO_REQUIRED_AUTHZ = Object.freeze< processes: 'canGetRunningProcesses', 'kill-process': 'canKillProcess', 'suspend-process': 'canSuspendProcess', + // TODO: for API changes in a subsequent PR + // scan: 'canWriteScanOperations', }); // 4 hrs in seconds diff --git a/x-pack/plugins/security_solution/common/endpoint/types/authz.ts b/x-pack/plugins/security_solution/common/endpoint/types/authz.ts index 0ccefaa686f72..6a326479ce8ae 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/authz.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/authz.ts @@ -56,6 +56,8 @@ export interface EndpointAuthz { canWriteExecuteOperations: boolean; /** If the user has write permissions to use file operations */ canWriteFileOperations: boolean; + /** If user has write permission to use scan file path operations */ + canWriteScanOperations: boolean; /** If the user has write permissions for trusted applications */ canWriteTrustedApplications: boolean; /** If the user has read permissions for trusted applications */ diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 1ce693d5d4567..01f03d4ac09ea 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -102,6 +102,11 @@ export const allowedExperimentalValues = Object.freeze({ */ responseActionsCrowdstrikeManualHostIsolationEnabled: false, + /** + * Enables scan response action on Endpoint + */ + responseActionScanEnabled: false, + /** * Enables top charts on Alerts Page */ diff --git a/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts b/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts index 63fcd9c9995a9..b132a8e83770a 100644 --- a/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts +++ b/x-pack/plugins/security_solution/public/assistant/content/prompts/system/translations.ts @@ -15,13 +15,6 @@ export const YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT = i18n.translate( } ); -export const USE_THE_FOLLOWING_CONTEXT_TO_ANSWER = i18n.translate( - 'xpack.securitySolution.assistant.content.prompts.system.useTheFollowingContextToAnswer', - { - defaultMessage: 'Use the following context to answer questions:', - } -); - export const IF_YOU_DONT_KNOW_THE_ANSWER = i18n.translate( 'xpack.securitySolution.assistant.content.prompts.system.ifYouDontKnowTheAnswer', { @@ -46,8 +39,7 @@ export const FORMAT_OUTPUT_CORRECTLY = i18n.translate( ); export const DEFAULT_SYSTEM_PROMPT_NON_I18N = `${YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT} ${IF_YOU_DONT_KNOW_THE_ANSWER} -${FORMAT_OUTPUT_CORRECTLY} -${USE_THE_FOLLOWING_CONTEXT_TO_ANSWER}`; +${FORMAT_OUTPUT_CORRECTLY}`; export const DEFAULT_SYSTEM_PROMPT_NAME = i18n.translate( 'xpack.securitySolution.assistant.content.prompts.system.defaultSystemPromptName', @@ -58,8 +50,7 @@ export const DEFAULT_SYSTEM_PROMPT_NAME = i18n.translate( export const SUPERHERO_SYSTEM_PROMPT_NON_I18N = `${YOU_ARE_A_HELPFUL_EXPERT_ASSISTANT} ${IF_YOU_DONT_KNOW_THE_ANSWER} ${SUPERHERO_PERSONALITY} -${FORMAT_OUTPUT_CORRECTLY} -${USE_THE_FOLLOWING_CONTEXT_TO_ANSWER}`; +${FORMAT_OUTPUT_CORRECTLY}`; export const SUPERHERO_SYSTEM_PROMPT_NAME = i18n.translate( 'xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName', @@ -67,7 +58,3 @@ export const SUPERHERO_SYSTEM_PROMPT_NAME = i18n.translate( defaultMessage: 'Enhanced system prompt', } ); - -export const SYSTEM_PROMPT_CONTEXT_NON_I18N = (context: string) => { - return `CONTEXT:\n"""\n${context}\n"""`; -}; diff --git a/x-pack/plugins/security_solution/public/common/components/agents/agent_status/agent_status.tsx b/x-pack/plugins/security_solution/public/common/components/agents/agent_status/agent_status.tsx index 05c5941e4575f..363e233baab59 100644 --- a/x-pack/plugins/security_solution/public/common/components/agents/agent_status/agent_status.tsx +++ b/x-pack/plugins/security_solution/public/common/components/agents/agent_status/agent_status.tsx @@ -16,7 +16,6 @@ import { HOST_STATUS_TO_BADGE_COLOR } from '../../../../management/pages/endpoin import { useIsExperimentalFeatureEnabled } from '../../../hooks/use_experimental_features'; import { getAgentStatusText } from '../agent_status_text'; import { AgentResponseActionsStatus } from './agent_response_action_status'; - export enum SENTINEL_ONE_NETWORK_STATUS { CONNECTING = 'connecting', CONNECTED = 'connected', @@ -46,9 +45,12 @@ export const AgentStatus = React.memo( const sentinelOneManualHostActionsEnabled = useIsExperimentalFeatureEnabled( 'sentinelOneManualHostActionsEnabled' ); - + const responseActionsCrowdstrikeManualHostIsolationEnabled = useIsExperimentalFeatureEnabled( + 'responseActionsCrowdstrikeManualHostIsolationEnabled' + ); const { data, isLoading, isFetched } = useAgentStatus([agentId], agentType, { - enabled: sentinelOneManualHostActionsEnabled, + enabled: + sentinelOneManualHostActionsEnabled || responseActionsCrowdstrikeManualHostIsolationEnabled, }); const agentStatus = data?.[`${agentId}`]; const isCurrentlyIsolated = Boolean(agentStatus?.isolated); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx index 383f98f964242..74971bfb90162 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx @@ -5,13 +5,12 @@ * 2.0. */ -import React, { useMemo } from 'react'; +import React from 'react'; import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import type { BrowserFields } from '../../../../common/search_strategy/index_fields'; -import { getSummaryRows } from './get_alert_summary_rows'; +import { useSummaryRows } from './get_alert_summary_rows'; import { SummaryView } from './summary_view'; -import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; const AlertSummaryViewComponent: React.FC<{ browserFields: BrowserFields; @@ -34,33 +33,15 @@ const AlertSummaryViewComponent: React.FC<{ isReadOnly, investigationFields, }) => { - const sentinelOneManualHostActionsEnabled = useIsExperimentalFeatureEnabled( - 'sentinelOneManualHostActionsEnabled' - ); - - const summaryRows = useMemo( - () => - getSummaryRows({ - browserFields, - data, - eventId, - isDraggable, - scopeId, - isReadOnly, - investigationFields, - sentinelOneManualHostActionsEnabled, - }), - [ - browserFields, - data, - eventId, - isDraggable, - scopeId, - isReadOnly, - investigationFields, - sentinelOneManualHostActionsEnabled, - ] - ); + const summaryRows = useSummaryRows({ + browserFields, + data, + eventId, + isDraggable, + scopeId, + isReadOnly, + investigationFields, + }); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.test.ts b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.test.ts new file mode 100644 index 0000000000000..60bc2b7f3ce31 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.test.ts @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isAlertFromEndpointEvent } from '../../utils/endpoint_alert_check'; +import { + isAlertFromSentinelOneEvent, + SENTINEL_ONE_AGENT_ID_FIELD, +} from '../../utils/sentinelone_alert_check'; +import { + CROWDSTRIKE_AGENT_ID_FIELD, + isAlertFromCrowdstrikeEvent, +} from '../../utils/crowdstrike_alert_check'; +import { renderHook } from '@testing-library/react-hooks'; +import { useSummaryRows } from './get_alert_summary_rows'; +import type { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; +import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; + +jest.mock('../../utils/endpoint_alert_check'); +jest.mock('../../utils/sentinelone_alert_check'); +jest.mock('../../utils/crowdstrike_alert_check'); +jest.mock('../../hooks/use_experimental_features', () => ({ + useIsExperimentalFeatureEnabled: jest.fn(), +})); + +describe('useSummaryRows', () => { + const mockData: TimelineEventsDetailsItem[] = [ + { + category: 'event', + field: 'event.category', + originalValue: ['process'], + values: ['process'], + isObjectArray: false, + }, + { + category: 'kibana', + field: 'kibana.alert.rule.uuid', + originalValue: 'rule-uuid', + values: ['rule-uuid'], + isObjectArray: false, + }, + { + category: 'host', + field: 'host.name', + originalValue: 'test-host', + values: ['text-host'], + isObjectArray: false, + }, + ]; + + const mockBrowserFields = {}; + const mockScopeId = 'scope-id'; + const mockEventId = 'event-id'; + const mockInvestigationFields: string[] = []; + + beforeEach(() => { + jest.clearAllMocks(); + (isAlertFromEndpointEvent as jest.Mock).mockReturnValue(true); + (isAlertFromCrowdstrikeEvent as jest.Mock).mockReturnValue(false); + }); + + it('returns summary rows for default event categories', () => { + const { result } = renderHook(() => + useSummaryRows({ + data: mockData, + browserFields: mockBrowserFields, + scopeId: mockScopeId, + eventId: mockEventId, + investigationFields: mockInvestigationFields, + }) + ); + + expect(result.current).toEqual( + expect.arrayContaining([ + expect.objectContaining({ title: 'host.name', description: expect.anything() }), + ]) + ); + }); + + it('excludes fields not related to the event source', () => { + (isAlertFromEndpointEvent as jest.Mock).mockReturnValue(false); + + const { result } = renderHook(() => + useSummaryRows({ + data: mockData, + browserFields: mockBrowserFields, + scopeId: mockScopeId, + eventId: mockEventId, + investigationFields: mockInvestigationFields, + }) + ); + + expect(result.current).not.toEqual( + expect.arrayContaining([ + expect.objectContaining({ + title: 'agent.id', + description: expect.anything(), + }), + ]) + ); + }); + + it('includes sentinel_one agent status field', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (isAlertFromSentinelOneEvent as jest.Mock).mockReturnValue(true); + + const sentinelOneData: TimelineEventsDetailsItem[] = [ + ...mockData, + { + category: 'host', + field: SENTINEL_ONE_AGENT_ID_FIELD, + originalValue: 'sentinelone-agent-id', + values: ['sentinelone-agent-id'], + isObjectArray: false, + }, + ]; + + const { result } = renderHook(() => + useSummaryRows({ + data: sentinelOneData, + browserFields: mockBrowserFields, + scopeId: mockScopeId, + eventId: mockEventId, + investigationFields: mockInvestigationFields, + }) + ); + + expect(result.current).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + title: 'Agent status', + description: expect.objectContaining({ values: ['sentinelone-agent-id'] }), + }), + ]) + ); + }); + + it('includes crowdstrike agent status field', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (isAlertFromCrowdstrikeEvent as jest.Mock).mockReturnValue(true); + + const crowdstrikeData: TimelineEventsDetailsItem[] = [ + ...mockData, + { + category: 'host', + field: CROWDSTRIKE_AGENT_ID_FIELD, + originalValue: 'crowdstrike-agent-id', + values: ['crowdstrike-agent-id'], + isObjectArray: false, + }, + ]; + + const { result } = renderHook(() => + useSummaryRows({ + data: crowdstrikeData, + browserFields: mockBrowserFields, + scopeId: mockScopeId, + eventId: mockEventId, + investigationFields: mockInvestigationFields, + }) + ); + + expect(result.current).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + title: 'Agent status', + description: expect.objectContaining({ values: ['crowdstrike-agent-id'] }), + }), + ]) + ); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx index 76b6c355cf35c..b079d3575f7c7 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { useMemo } from 'react'; import { find, isEmpty, uniqBy } from 'lodash/fp'; import { ALERT_RULE_PARAMETERS, ALERT_RULE_TYPE } from '@kbn/rule-data-utils'; @@ -38,6 +38,11 @@ import { SENTINEL_ONE_AGENT_ID_FIELD, isAlertFromSentinelOneEvent, } from '../../utils/sentinelone_alert_check'; +import { + CROWDSTRIKE_AGENT_ID_FIELD, + isAlertFromCrowdstrikeEvent, +} from '../../utils/crowdstrike_alert_check'; +import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; const THRESHOLD_TERMS_FIELD = `${ALERT_THRESHOLD_RESULT}.terms.field`; const THRESHOLD_TERMS_VALUE = `${ALERT_THRESHOLD_RESULT}.terms.value`; @@ -55,6 +60,11 @@ const alwaysDisplayedFields: EventSummaryField[] = [ overrideField: AGENT_STATUS_FIELD_NAME, label: i18n.AGENT_STATUS, }, + { + id: CROWDSTRIKE_AGENT_ID_FIELD, + overrideField: AGENT_STATUS_FIELD_NAME, + label: i18n.AGENT_STATUS, + }, // ** // { id: 'user.name' }, { id: 'rule.name' }, @@ -297,7 +307,7 @@ export function getEventCategoriesFromData(data: TimelineEventsDetailsItem[]): E return { primaryEventCategory, allEventCategories }; } -export const getSummaryRows = ({ +export const useSummaryRows = ({ data, browserFields, scopeId, @@ -305,7 +315,6 @@ export const getSummaryRows = ({ isDraggable = false, isReadOnly = false, investigationFields, - sentinelOneManualHostActionsEnabled, }: { data: TimelineEventsDetailsItem[]; browserFields: BrowserFields; @@ -314,97 +323,122 @@ export const getSummaryRows = ({ investigationFields?: string[]; isDraggable?: boolean; isReadOnly?: boolean; - sentinelOneManualHostActionsEnabled?: boolean; }) => { - const eventCategories = getEventCategoriesFromData(data); - - const eventCodeField = find({ category: 'event', field: 'event.code' }, data); - - const eventCode = Array.isArray(eventCodeField?.originalValue) - ? eventCodeField?.originalValue?.[0] - : eventCodeField?.originalValue; - - const eventRuleTypeField = find({ category: 'kibana', field: ALERT_RULE_TYPE }, data); - const eventRuleType = Array.isArray(eventRuleTypeField?.originalValue) - ? eventRuleTypeField?.originalValue?.[0] - : eventRuleTypeField?.originalValue; - - const tableFields = getEventFieldsToDisplay({ - eventCategories, - eventCode, - eventRuleType, - highlightedFieldsOverride: investigationFields ?? [], - }); - - return data != null - ? tableFields.reduce((acc, field) => { - const item = data.find( - (d) => d.field === field.id || (field.legacyId && d.field === field.legacyId) - ); - if (!item || isEmpty(item.values)) { - return acc; - } - - // If we found the data by its legacy id we swap the ids to display the correct one - if (item.field === field.legacyId) { - field.id = field.legacyId; - } - - const linkValueField = - field.linkField != null && data.find((d) => d.field === field.linkField); - const description = { - ...getEnrichedFieldInfo({ - item, - linkValueField: linkValueField || undefined, - contextId: scopeId, - scopeId, - browserFields, - eventId, - field, - }), - isDraggable, - isReadOnly, - }; - - if (field.id === 'agent.id' && !isAlertFromEndpointEvent({ data })) { - return acc; - } - - if ( - field.id === SENTINEL_ONE_AGENT_ID_FIELD && - sentinelOneManualHostActionsEnabled && - !isAlertFromSentinelOneEvent({ data }) - ) { - return acc; - } - - if (field.id === THRESHOLD_TERMS_FIELD) { - const enrichedInfo = enrichThresholdTerms(item, data, description); - if (enrichedInfo) { - return [...acc, ...enrichedInfo]; - } else { + const sentinelOneManualHostActionsEnabled = useIsExperimentalFeatureEnabled( + 'sentinelOneManualHostActionsEnabled' + ); + const crowdstrikeManualHostActionsEnabled = useIsExperimentalFeatureEnabled( + 'responseActionsCrowdstrikeManualHostIsolationEnabled' + ); + return useMemo(() => { + const eventCategories = getEventCategoriesFromData(data); + + const eventCodeField = find({ category: 'event', field: 'event.code' }, data); + + const eventCode = Array.isArray(eventCodeField?.originalValue) + ? eventCodeField?.originalValue?.[0] + : eventCodeField?.originalValue; + + const eventRuleTypeField = find({ category: 'kibana', field: ALERT_RULE_TYPE }, data); + const eventRuleType = Array.isArray(eventRuleTypeField?.originalValue) + ? eventRuleTypeField?.originalValue?.[0] + : eventRuleTypeField?.originalValue; + + const tableFields = getEventFieldsToDisplay({ + eventCategories, + eventCode, + eventRuleType, + highlightedFieldsOverride: investigationFields ?? [], + }); + + return data != null + ? tableFields.reduce((acc, field) => { + const item = data.find( + (d) => d.field === field.id || (field.legacyId && d.field === field.legacyId) + ); + if (!item || isEmpty(item.values)) { + return acc; + } + + // If we found the data by its legacy id we swap the ids to display the correct one + if (item.field === field.legacyId) { + field.id = field.legacyId; + } + + const linkValueField = + field.linkField != null && data.find((d) => d.field === field.linkField); + const description = { + ...getEnrichedFieldInfo({ + item, + linkValueField: linkValueField || undefined, + contextId: scopeId, + scopeId, + browserFields, + eventId, + field, + }), + isDraggable, + isReadOnly, + }; + + if (field.id === 'agent.id' && !isAlertFromEndpointEvent({ data })) { + return acc; + } + + if ( + field.id === SENTINEL_ONE_AGENT_ID_FIELD && + sentinelOneManualHostActionsEnabled && + !isAlertFromSentinelOneEvent({ data }) + ) { return acc; } - } - if (field.id === THRESHOLD_CARDINALITY_FIELD) { - const enrichedInfo = enrichThresholdCardinality(item, data, description); - if (enrichedInfo) { - return [...acc, enrichedInfo]; - } else { + if ( + field.id === CROWDSTRIKE_AGENT_ID_FIELD && + crowdstrikeManualHostActionsEnabled && + !isAlertFromCrowdstrikeEvent({ data }) + ) { return acc; } - } - - return [ - ...acc, - { - title: field.label ?? field.id, - description, - }, - ]; - }, []) - : []; + + if (field.id === THRESHOLD_TERMS_FIELD) { + const enrichedInfo = enrichThresholdTerms(item, data, description); + if (enrichedInfo) { + return [...acc, ...enrichedInfo]; + } else { + return acc; + } + } + + if (field.id === THRESHOLD_CARDINALITY_FIELD) { + const enrichedInfo = enrichThresholdCardinality(item, data, description); + if (enrichedInfo) { + return [...acc, enrichedInfo]; + } else { + return acc; + } + } + + return [ + ...acc, + { + title: field.label ?? field.id, + description, + }, + ]; + }, []) + : []; + }, [ + browserFields, + data, + eventId, + isDraggable, + scopeId, + isReadOnly, + investigationFields, + sentinelOneManualHostActionsEnabled, + crowdstrikeManualHostActionsEnabled, + ]); }; /** diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx index bac8587eaf2e2..dccea29321671 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx @@ -24,6 +24,7 @@ import { QUARANTINED_PATH_FIELD_NAME, } from '../../../timelines/components/timeline/body/renderers/constants'; import { SENTINEL_ONE_AGENT_ID_FIELD } from '../../utils/sentinelone_alert_check'; +import { CROWDSTRIKE_AGENT_ID_FIELD } from '../../utils/crowdstrike_alert_check'; /** * Defines the behavior of the search input that appears above the table of data @@ -183,6 +184,7 @@ export const FIELDS_WITHOUT_ACTIONS: { [field: string]: boolean } = { [AGENT_STATUS_FIELD_NAME]: true, [QUARANTINED_PATH_FIELD_NAME]: true, [SENTINEL_ONE_AGENT_ID_FIELD]: true, + [CROWDSTRIKE_AGENT_ID_FIELD]: true, }; /** diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.test.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.test.tsx index f5bc002ac507d..45d4d9fbbbefd 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/tab_navigation.test.tsx @@ -41,14 +41,12 @@ const hostName = 'siem-window'; describe('Table Navigation', () => { const mockHasMlUserPermissions = true; - const mockRiskyHostEnabled = true; mockUseRouteSpy.mockReturnValue([{ tabName: HostsTableType.authentications }]); const mockProps: TabNavigationProps = { navTabs: navTabsHostDetails({ hostName, hasMlUserPermissions: mockHasMlUserPermissions, - isRiskyHostsEnabled: mockRiskyHostEnabled, }), }; diff --git a/x-pack/plugins/security_solution/public/common/hooks/timeline/use_init_timeline_url_param.ts b/x-pack/plugins/security_solution/public/common/hooks/timeline/use_init_timeline_url_param.ts index bb3c595ee3d9d..5f40cfd196889 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/timeline/use_init_timeline_url_param.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/timeline/use_init_timeline_url_param.ts @@ -7,11 +7,14 @@ import { useCallback, useEffect } from 'react'; import { safeDecode } from '@kbn/rison'; +import { useSelector } from 'react-redux'; -import { TimelineTabs } from '../../../../common/types'; +import type { State } from '../../store'; +import { TimelineId, TimelineTabs } from '../../../../common/types'; import { useInitializeUrlParam } from '../../utils/global_query_string'; import { useQueryTimelineById } from '../../../timelines/components/open_timeline/helpers'; -import type { TimelineUrl } from '../../../timelines/store/model'; +import type { TimelineModel, TimelineUrl } from '../../../timelines/store/model'; +import { selectTimelineById } from '../../../timelines/store/selectors'; import { URL_PARAM_KEY } from '../use_url_state'; import { useIsExperimentalFeatureEnabled } from '../use_experimental_features'; @@ -23,6 +26,9 @@ export const useInitTimelineFromUrlParam = () => { const isEsqlTabDisabled = useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled'); const queryTimelineById = useQueryTimelineById(); + const activeTimeline = useSelector((state: State) => + selectTimelineById(state, TimelineId.active) + ); const onInitialize = useCallback( (initialState: TimelineUrl | null) => { @@ -54,13 +60,30 @@ export const useInitTimelineFromUrlParam = () => { const parsedState = safeDecode(timelineState) as TimelineUrl | null; - onInitialize(parsedState); + // Make sure we only re-initialize the timeline if there are siginificant changes to the active timeline. + // Without this check, we could potentially overwrite the timeline. + if (!hasTimelineStateChanged(activeTimeline, parsedState)) { + onInitialize(parsedState); + } }; // This is needed to initialize the timeline from the URL when the user clicks the back / forward buttons window.addEventListener('popstate', listener); return () => window.removeEventListener('popstate', listener); - }, [onInitialize]); + }, [onInitialize, activeTimeline]); useInitializeUrlParam(URL_PARAM_KEY.timeline, onInitialize); }; + +function hasTimelineStateChanged( + activeTimeline: TimelineModel | null, + newState: TimelineUrl | null +) { + return ( + activeTimeline && + newState && + (activeTimeline.id !== newState.id || + activeTimeline.savedSearchId !== newState.savedSearchId || + activeTimeline.graphEventId !== newState.graphEventId) + ); +} diff --git a/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts b/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts index e0f651a383b36..3b7a73d0ee160 100644 --- a/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts @@ -119,16 +119,24 @@ interface CheckIfIndicesExistParams { signalIndexName: string | null; isDefaultDataViewSelected: boolean; } + export const checkIfIndicesExist = ({ patternList, scopeId, signalIndexName, isDefaultDataViewSelected, -}: CheckIfIndicesExistParams) => - scopeId === SourcererScopeName.detections - ? patternList.includes(`${signalIndexName}`) - : scopeId === SourcererScopeName.default - ? isDefaultDataViewSelected - ? patternList.filter((i) => i !== signalIndexName).length > 0 - : patternList.length > 0 - : patternList.length > 0; +}: CheckIfIndicesExistParams) => { + if (scopeId === SourcererScopeName.detections) { + return patternList.includes(`${signalIndexName}`); + } + + if (scopeId === SourcererScopeName.default) { + if (isDefaultDataViewSelected) { + return patternList.filter((i) => i !== signalIndexName).length > 0; + } + + return patternList.length > 0; + } + + return patternList.length > 0; +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/utils/helpers.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/utils/helpers.test.tsx index 8c2bb6bb20dcc..c3b288cb15c79 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/utils/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/utils/helpers.test.tsx @@ -1805,6 +1805,11 @@ describe('Exception helpers', () => { overrideField: 'agent.status', label: 'Agent status', }, + { + id: 'crowdstrike.event.DeviceId', + overrideField: 'agent.status', + label: 'Agent status', + }, { id: 'user.name', }, diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/responder_action_button.tsx b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/responder_action_button.tsx index 6701d6e5cb36a..cb5876f27dd67 100644 --- a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/responder_action_button.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/responder_action_button.tsx @@ -15,8 +15,9 @@ import { import { useUserPrivileges } from '../../../common/components/user_privileges'; export const ResponderActionButton = memo( - ({ endpointId, onClick }) => { + ({ agentType, endpointId, onClick }) => { const { handleResponseActionsClick, isDisabled, tooltip } = useResponderActionData({ + agentType, endpointId, onClick, }); diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts index 8842eafbb13d7..b5e068ed4dbde 100644 --- a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_data.ts @@ -29,7 +29,7 @@ import { getFieldValue } from '../host_isolation/helpers'; export interface ResponderContextMenuItemProps { endpointId: string; onClick?: () => void; - agentType?: ResponseActionAgentType; + agentType: ResponseActionAgentType; eventData?: TimelineEventsDetailsItem[] | null; } @@ -72,7 +72,7 @@ const getThirdPartyAgentInfo = ( export const useResponderActionData = ({ endpointId, onClick, - agentType = 'endpoint', + agentType, eventData, }: ResponderContextMenuItemProps): { handleResponseActionsClick: () => void; @@ -165,10 +165,10 @@ export const useResponderActionData = ({ platform: agentInfoFromAlert.host.os.family, }); } - if (hostInfo) { + if (isEndpointHost && hostInfo) { showResponseActionsConsole({ agentId: hostInfo.metadata.agent.id, - agentType: 'endpoint', + agentType, capabilities: (hostInfo.metadata.Endpoint.capabilities as EndpointCapabilities[]) ?? [], hostName: hostInfo.metadata.host.name, platform: hostInfo.metadata.host.os.name.toLowerCase() as Platform, diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.test.tsx b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.test.tsx new file mode 100644 index 0000000000000..750a627985192 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.test.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useResponderActionItem } from './use_responder_action_item'; +import { useUserPrivileges } from '../../../common/components/user_privileges'; +import { isTimelineEventItemAnAlert } from '../../../common/utils/endpoint_alert_check'; +import { getFieldValue } from '../host_isolation/helpers'; +import { isAlertFromCrowdstrikeEvent } from '../../../common/utils/crowdstrike_alert_check'; +import { isAlertFromSentinelOneEvent } from '../../../common/utils/sentinelone_alert_check'; +import { useResponderActionData } from './use_responder_action_data'; + +jest.mock('../../../common/components/user_privileges'); +jest.mock('../../../common/utils/endpoint_alert_check'); +jest.mock('../host_isolation/helpers'); +jest.mock('../../../common/utils/crowdstrike_alert_check'); +jest.mock('../../../common/utils/sentinelone_alert_check'); +jest.mock('./use_responder_action_data'); + +describe('useResponderActionItem', () => { + const mockUseUserPrivileges = useUserPrivileges as jest.Mock; + const mockIsTimelineEventItemAnAlert = isTimelineEventItemAnAlert as jest.Mock; + const mockGetFieldValue = getFieldValue as jest.Mock; + const mockIsAlertFromCrowdstrikeEvent = isAlertFromCrowdstrikeEvent as jest.Mock; + const mockIsAlertFromSentinelOneEvent = isAlertFromSentinelOneEvent as jest.Mock; + const mockUseResponderActionData = useResponderActionData as jest.Mock; + + beforeEach(() => { + jest.clearAllMocks(); + mockUseResponderActionData.mockImplementation(() => ({ + handleResponseActionsClick: jest.fn(), + isDisabled: false, + tooltip: 'Tooltip text', + })); + }); + + it('should return an empty array if user privileges are loading', () => { + mockUseUserPrivileges.mockReturnValue({ + endpointPrivileges: { + loading: true, + canAccessResponseConsole: false, + }, + }); + + const { result } = renderHook(() => useResponderActionItem(null, jest.fn())); + expect(result.current).toEqual([]); + }); + + it('should return an empty array if user cannot access response console', () => { + mockUseUserPrivileges.mockReturnValue({ + endpointPrivileges: { + loading: false, + canAccessResponseConsole: false, + }, + }); + + const { result } = renderHook(() => useResponderActionItem(null, jest.fn())); + expect(result.current).toEqual([]); + }); + + it('should return an empty array if the event is not an alert', () => { + mockUseUserPrivileges.mockReturnValue({ + endpointPrivileges: { + loading: false, + canAccessResponseConsole: true, + }, + }); + mockIsTimelineEventItemAnAlert.mockReturnValue(false); + + const { result } = renderHook(() => useResponderActionItem(null, jest.fn())); + expect(result.current).toEqual([]); + }); + + it('should return the response action item if all conditions are met for a generic endpoint', () => { + mockUseUserPrivileges.mockReturnValue({ + endpointPrivileges: { + loading: false, + canAccessResponseConsole: true, + }, + }); + mockIsTimelineEventItemAnAlert.mockReturnValue(true); + mockGetFieldValue.mockReturnValue('endpoint-id'); + mockIsAlertFromCrowdstrikeEvent.mockReturnValue(false); + mockIsAlertFromSentinelOneEvent.mockReturnValue(false); + + renderHook(() => useResponderActionItem([], jest.fn())); + + expect(mockUseResponderActionData).toHaveBeenCalledWith({ + agentType: 'endpoint', + endpointId: 'endpoint-id', + eventData: null, + onClick: expect.any(Function), + }); + }); + + it('should return the response action item if all conditions are met for a Crowdstrike event', () => { + mockUseUserPrivileges.mockReturnValue({ + endpointPrivileges: { + loading: false, + canAccessResponseConsole: true, + }, + }); + mockIsTimelineEventItemAnAlert.mockReturnValue(true); + mockGetFieldValue.mockReturnValue('crowdstrike-id'); + mockIsAlertFromCrowdstrikeEvent.mockReturnValue(true); + mockIsAlertFromSentinelOneEvent.mockReturnValue(false); + + renderHook(() => useResponderActionItem([], jest.fn())); + + expect(mockUseResponderActionData).toHaveBeenCalledWith({ + agentType: 'crowdstrike', + endpointId: 'crowdstrike-id', + eventData: [], + onClick: expect.any(Function), + }); + }); + + it('should return the response action item if all conditions are met for a SentinelOne event', () => { + mockUseUserPrivileges.mockReturnValue({ + endpointPrivileges: { + loading: false, + canAccessResponseConsole: true, + }, + }); + + mockIsTimelineEventItemAnAlert.mockReturnValue(true); + mockGetFieldValue.mockReturnValue('sentinelone-id'); + mockIsAlertFromCrowdstrikeEvent.mockReturnValue(false); + mockIsAlertFromSentinelOneEvent.mockReturnValue(true); + + renderHook(() => useResponderActionItem([], jest.fn())); + + expect(mockUseResponderActionData).toHaveBeenCalledWith({ + agentType: 'sentinel_one', + endpointId: 'sentinelone-id', + eventData: [], + onClick: expect.any(Function), + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.tsx b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.tsx index 41fad6fd2e174..57b51c23f2032 100644 --- a/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/endpoint_responder/use_responder_action_item.tsx @@ -8,6 +8,7 @@ import React, { useMemo } from 'react'; import type { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import { FormattedMessage } from '@kbn/i18n-react'; +import { isAlertFromCrowdstrikeEvent } from '../../../common/utils/crowdstrike_alert_check'; import { isAlertFromSentinelOneEvent } from '../../../common/utils/sentinelone_alert_check'; import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { useUserPrivileges } from '../../../common/components/user_privileges'; @@ -32,15 +33,20 @@ export const useResponderActionItem = ( [eventDetailsData] ); - const agentType: ResponseActionAgentType = useMemo( - () => - eventDetailsData - ? isAlertFromSentinelOneEvent({ data: eventDetailsData }) - ? 'sentinel_one' - : 'endpoint' - : 'endpoint', - [eventDetailsData] - ); + const agentType: ResponseActionAgentType = useMemo(() => { + if (!eventDetailsData) { + return 'endpoint'; + } + + if (isAlertFromSentinelOneEvent({ data: eventDetailsData })) { + return 'sentinel_one'; + } + if (isAlertFromCrowdstrikeEvent({ data: eventDetailsData })) { + return 'crowdstrike'; + } + + return 'endpoint'; + }, [eventDetailsData]); const { handleResponseActionsClick, isDisabled, tooltip } = useResponderActionData({ endpointId, diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx index cd9fcee2a353f..6804ec9fcfc93 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx @@ -33,9 +33,7 @@ export const HostIsolationPanel = React.memo( ); const sentinelOneAgentId = useMemo(() => getSentinelOneAgentId(details), [details]); - const crowdstrikeAgentId = useMemo(() => { - return getCrowdstrikeAgentId(details); - }, [details]); + const crowdstrikeAgentId = useMemo(() => getCrowdstrikeAgentId(details), [details]); const hostName = useMemo( () => getFieldValue({ category: 'host', field: 'host.name' }, details), diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.test.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.test.tsx index f263d80ea92dd..5adbbe58de167 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.test.tsx @@ -16,17 +16,16 @@ import { useGetSentinelOneAgentStatus, } from '../../../management/hooks/agents/use_get_agent_status'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; jest.mock('../../../management/hooks/agents/use_get_agent_status'); jest.mock('../../../common/hooks/use_experimental_features'); -type AgentType = 'endpoint' | 'sentinel_one' | 'crowdstrike'; const useIsExperimentalFeatureEnabledMock = useIsExperimentalFeatureEnabled as jest.Mock; const useGetSentinelOneAgentStatusMock = useGetSentinelOneAgentStatus as jest.Mock; const useGetAgentStatusMock = useGetAgentStatus as jest.Mock; const useAgentStatusHookMock = useAgentStatusHook as jest.Mock; -// TODO TC: change crowdstrike tests when the useAgentStatus is implemented for Crowdstrike - now it defaults to `sentinel_one` describe('useHostIsolationAction', () => { describe.each([ ['useGetSentinelOneAgentStatus', useGetSentinelOneAgentStatusMock], @@ -40,7 +39,7 @@ describe('useHostIsolationAction', () => { return wrapper; }; - const render = (agentTypeAlert: AgentType) => + const render = (agentTypeAlert: ResponseActionAgentType) => renderHook( () => useHostIsolationAction({ @@ -48,6 +47,13 @@ describe('useHostIsolationAction', () => { detailsData: agentTypeAlert === 'sentinel_one' ? [ + { + category: 'kibana', + field: 'kibana.alert.rule.uuid', + isObjectArray: false, + values: ['ruleId'], + originalValue: ['ruleId'], + }, { category: 'event', field: 'event.module', @@ -65,6 +71,13 @@ describe('useHostIsolationAction', () => { ] : agentTypeAlert === 'crowdstrike' ? [ + { + category: 'kibana', + field: 'kibana.alert.rule.uuid', + isObjectArray: false, + values: ['ruleId'], + originalValue: ['ruleId'], + }, { category: 'event', field: 'event.module', @@ -116,8 +129,8 @@ describe('useHostIsolationAction', () => { it(`${name} is invoked as 'enabled' when Crowdstrike alert and FF enabled`, () => { render('crowdstrike'); - expect(hook).toHaveBeenCalledWith([''], 'sentinel_one', { - enabled: false, + expect(hook).toHaveBeenCalledWith(['expectedCrowdstrikeAgentId'], 'crowdstrike', { + enabled: true, }); }); @@ -134,7 +147,7 @@ describe('useHostIsolationAction', () => { useIsExperimentalFeatureEnabledMock.mockReturnValue(false); render('crowdstrike'); - expect(hook).toHaveBeenCalledWith([''], 'sentinel_one', { + expect(hook).toHaveBeenCalledWith(['expectedCrowdstrikeAgentId'], 'crowdstrike', { enabled: false, }); }); @@ -142,7 +155,7 @@ describe('useHostIsolationAction', () => { it(`${name} is invoked as 'disabled' when endpoint alert`, () => { render('endpoint'); - expect(hook).toHaveBeenCalledWith([''], 'sentinel_one', { + expect(hook).toHaveBeenCalledWith([''], 'endpoint', { enabled: false, }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx index 8b054ec811a90..abafc59bef195 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx @@ -77,6 +77,7 @@ export const useHostIsolationAction = ({ const sentinelOneAgentId = useMemo(() => getSentinelOneAgentId(detailsData), [detailsData]); const crowdstrikeAgentId = useMemo(() => getCrowdstrikeAgentId(detailsData), [detailsData]); + const externalAgentId = sentinelOneAgentId ?? crowdstrikeAgentId ?? ''; const hostOsFamily = useMemo( () => getFieldValue({ category: 'host', field: 'host.os.name' }, detailsData), [detailsData] @@ -87,6 +88,16 @@ export const useHostIsolationAction = ({ [detailsData] ); + const agentType = useMemo(() => { + if (isSentinelOneAlert) { + return 'sentinel_one'; + } + if (isCrowdstrikeAlert) { + return 'crowdstrike'; + } + return 'endpoint'; + }, [isCrowdstrikeAlert, isSentinelOneAlert]); + const { loading: loadingHostIsolationStatus, isIsolated, @@ -94,26 +105,23 @@ export const useHostIsolationAction = ({ capabilities, } = useEndpointHostIsolationStatus({ agentId, - agentType: sentinelOneAgentId ? 'sentinel_one' : 'endpoint', + agentType, }); - const { data: sentinelOneAgentData } = useAgentStatus( - [sentinelOneAgentId || ''], - 'sentinel_one', - { - enabled: !!sentinelOneAgentId && sentinelOneManualHostActionsEnabled, - } - ); - const sentinelOneAgentStatus = sentinelOneAgentData?.[`${sentinelOneAgentId}`]; - // TODO TC: Add support for Crowdstrike agent status - ongoing work by Ash :+1: + const { data: externalAgentData } = useAgentStatus([externalAgentId], agentType, { + enabled: + (!!sentinelOneAgentId && sentinelOneManualHostActionsEnabled) || + (!!crowdstrikeAgentId && crowdstrikeManualHostActionsEnabled), + }); + + const externalAgentStatus = externalAgentData?.[externalAgentId]; const isHostIsolated = useMemo(() => { - if (sentinelOneManualHostActionsEnabled && isSentinelOneAlert) { - return sentinelOneAgentStatus?.isolated; - } - if (crowdstrikeManualHostActionsEnabled && isCrowdstrikeAlert) { - return false; - // return crowdstrikeAgentStatus?.isolated; + if ( + (sentinelOneManualHostActionsEnabled && isSentinelOneAlert) || + (crowdstrikeManualHostActionsEnabled && isCrowdstrikeAlert) + ) { + return externalAgentStatus?.isolated; } return isIsolated; @@ -121,7 +129,7 @@ export const useHostIsolationAction = ({ isIsolated, isSentinelOneAlert, isCrowdstrikeAlert, - sentinelOneAgentStatus?.isolated, + externalAgentStatus?.isolated, sentinelOneManualHostActionsEnabled, crowdstrikeManualHostActionsEnabled, ]); @@ -135,18 +143,24 @@ export const useHostIsolationAction = ({ }); } - if (sentinelOneManualHostActionsEnabled && isSentinelOneAlert && sentinelOneAgentStatus) { - return sentinelOneAgentStatus.status === 'healthy'; + if ( + (externalAgentStatus && sentinelOneManualHostActionsEnabled && isSentinelOneAlert) || + (externalAgentStatus && crowdstrikeManualHostActionsEnabled && isCrowdstrikeAlert) + ) { + return externalAgentStatus.status === 'healthy'; } + return false; }, [ - agentVersion, - capabilities, - hostOsFamily, isEndpointAlert, - isSentinelOneAlert, - sentinelOneAgentStatus, sentinelOneManualHostActionsEnabled, + isSentinelOneAlert, + externalAgentStatus, + crowdstrikeManualHostActionsEnabled, + isCrowdstrikeAlert, + hostOsFamily, + agentVersion, + capabilities, ]); const isolateHostHandler = useCallback(() => { @@ -159,34 +173,31 @@ export const useHostIsolationAction = ({ }, [closePopover, isHostIsolated, onAddIsolationStatusClick]); const isIsolationActionDisabled = useMemo(() => { - if (sentinelOneManualHostActionsEnabled && isSentinelOneAlert) { + if ( + (sentinelOneManualHostActionsEnabled && isSentinelOneAlert) || + (crowdstrikeManualHostActionsEnabled && isCrowdstrikeAlert) + ) { // 8.15 use FF for computing if action is enabled if (agentStatusClientEnabled) { - return sentinelOneAgentStatus?.status === HostStatus.UNENROLLED; + return externalAgentStatus?.status === HostStatus.UNENROLLED; } // else use the old way - if (!sentinelOneAgentStatus) { + if (!externalAgentStatus) { return true; } - const { isUninstalled, isPendingUninstall } = - sentinelOneAgentStatus as AgentStatusInfo[string]; + const { isUninstalled, isPendingUninstall } = externalAgentStatus as AgentStatusInfo[string]; return isUninstalled || isPendingUninstall; } - if (crowdstrikeManualHostActionsEnabled && isCrowdstrikeAlert) { - // TODO TC: crowdstrikeAgentStatus functionality is going to be implemented in another PR - return false; - } - return agentStatus === HostStatus.UNENROLLED; }, [ agentStatus, agentStatusClientEnabled, isSentinelOneAlert, - sentinelOneAgentStatus, + externalAgentStatus, sentinelOneManualHostActionsEnabled, crowdstrikeManualHostActionsEnabled, isCrowdstrikeAlert, @@ -214,7 +225,7 @@ export const useHostIsolationAction = ({ isSentinelOneAlert && sentinelOneManualHostActionsEnabled && sentinelOneAgentId && - sentinelOneAgentStatus && + externalAgentStatus && hasActionsAllPrivileges ) { return menuItems; @@ -224,7 +235,7 @@ export const useHostIsolationAction = ({ isCrowdstrikeAlert && crowdstrikeManualHostActionsEnabled && crowdstrikeAgentId && - // status && + externalAgentStatus && hasActionsAllPrivileges ) { return menuItems; @@ -251,7 +262,7 @@ export const useHostIsolationAction = ({ isSentinelOneAlert, loadingHostIsolationStatus, menuItems, - sentinelOneAgentStatus, + externalAgentStatus, sentinelOneAgentId, sentinelOneManualHostActionsEnabled, crowdstrikeAgentId, diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx index 2edd3211a225f..b9cfcd18b6cfd 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_details_tab_body/index.tsx @@ -9,6 +9,7 @@ import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; +import { useUpsellingComponent } from '../../../common/hooks/use_upselling'; import { RISKY_HOSTS_DASHBOARD_TITLE, RISKY_USERS_DASHBOARD_TITLE } from '../risk_score/constants'; import { EnableRiskScore } from '../enable_risk_score'; import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; @@ -130,6 +131,11 @@ const RiskDetailsTabBodyComponent: React.FC< const privileges = useMissingRiskEnginePrivileges(); + const RiskScoreUpsell = useUpsellingComponent('entity_analytics_panel'); + if (RiskScoreUpsell) { + return ; + } + if (!privileges.isLoading && !privileges.hasAllRequiredPrivileges) { return ( diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx index 3d0b6bf2e334f..de17151fb68b7 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_tab_body.tsx @@ -26,6 +26,7 @@ import { useRiskEngineStatus } from '../api/hooks/use_risk_engine_status'; import { RiskScoreUpdatePanel } from './risk_score_update_panel'; import { useMissingRiskEnginePrivileges } from '../hooks/use_missing_risk_engine_privileges'; import { RiskEnginePrivilegesCallOut } from './risk_engine_privileges_callout'; +import { useUpsellingComponent } from '../../common/hooks/use_upselling'; const UserRiskScoreTableManage = manageQuery(UserRiskScoreTable); @@ -97,6 +98,11 @@ export const UserRiskScoreQueryTabBody = ({ isDeprecated: isDeprecated && !loading, }; + const RiskScoreUpsell = useUpsellingComponent('entity_analytics_panel'); + if (RiskScoreUpsell) { + return ; + } + if (!privileges.isLoading && !privileges.hasAllRequiredPrivileges) { return ( diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx index dda6437ba783d..c5a0e84e67097 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx @@ -19,7 +19,7 @@ import { useDispatch } from 'react-redux'; import type { Filter } from '@kbn/es-query'; import { buildEsQuery } from '@kbn/es-query'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; -import { tableDefaults, dataTableSelectors, TableId } from '@kbn/securitysolution-data-table'; +import { dataTableSelectors, tableDefaults, TableId } from '@kbn/securitysolution-data-table'; import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, @@ -46,8 +46,8 @@ import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml import { scoreIntervalToDateTime } from '../../../../common/components/ml/score/score_interval_to_datetime'; import { TabNavigation } from '../../../../common/components/navigation/tab_navigation'; import { - HostOverview, HOST_OVERVIEW_RISK_SCORE_QUERY_ID, + HostOverview, } from '../../../../overview/components/host_overview'; import { SiemSearchBar } from '../../../../common/components/search_bar'; import { SecuritySolutionPageWrapper } from '../../../../common/components/page_wrapper'; @@ -78,7 +78,6 @@ import { EmptyPrompt } from '../../../../common/components/empty_prompt'; import { AlertCountByRuleByStatus } from '../../../../common/components/alert_count_by_status'; import { useLicense } from '../../../../common/hooks/use_license'; import { ResponderActionButton } from '../../../../detections/components/endpoint_responder/responder_action_button'; -import { useHasSecurityCapability } from '../../../../helper_hooks'; import { useRefetchOverviewPageRiskScore } from '../../../../entity_analytics/api/hooks/use_refetch_overview_page_risk_score'; const ES_HOST_FIELD = 'host.name'; @@ -167,8 +166,6 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta dispatch(setHostDetailsTablesActivePageToZero()); }, [dispatch, detailName]); - const hasEntityAnalyticsCapability = useHasSecurityCapability('entity-analytics'); - const { hasKibanaREAD, hasIndexRead } = useAlertsPrivileges(); const canReadAlerts = hasKibanaREAD && hasIndexRead; @@ -230,6 +227,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta hostOverview.endpoint?.hostInfo?.metadata.elastic.agent.id && ( ), ]} @@ -296,7 +294,6 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta { test('it should skip anomalies tab if without mlUserPermission', () => { const tabs = navTabsHostDetails({ hasMlUserPermissions: false, - isRiskyHostsEnabled: false, hostName: mockHostName, }); expect(tabs).toHaveProperty(HostsTableType.authentications); expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); expect(tabs).not.toHaveProperty(HostsTableType.anomalies); expect(tabs).toHaveProperty(HostsTableType.events); - expect(tabs).not.toHaveProperty(HostsTableType.risk); + expect(tabs).toHaveProperty(HostsTableType.risk); }); test('it should display anomalies tab if with mlUserPermission', () => { const tabs = navTabsHostDetails({ hasMlUserPermissions: true, - isRiskyHostsEnabled: false, hostName: mockHostName, }); @@ -35,27 +33,12 @@ describe('navTabsHostDetails', () => { expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); expect(tabs).toHaveProperty(HostsTableType.anomalies); expect(tabs).toHaveProperty(HostsTableType.events); - expect(tabs).not.toHaveProperty(HostsTableType.risk); - }); - - test('it should display risky hosts tab if when risky hosts is enabled', () => { - const tabs = navTabsHostDetails({ - hasMlUserPermissions: false, - isRiskyHostsEnabled: true, - hostName: mockHostName, - }); - - expect(tabs).toHaveProperty(HostsTableType.authentications); - expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); - expect(tabs).not.toHaveProperty(HostsTableType.anomalies); - expect(tabs).toHaveProperty(HostsTableType.events); expect(tabs).toHaveProperty(HostsTableType.risk); }); test('it should display sessions tab when users are on Enterprise and above license', () => { const tabs = navTabsHostDetails({ hasMlUserPermissions: false, - isRiskyHostsEnabled: true, hostName: mockHostName, isEnterprise: true, }); @@ -70,7 +53,6 @@ describe('navTabsHostDetails', () => { test('it should not display sessions tab when users are not on Enterprise and above license', () => { const tabs = navTabsHostDetails({ hasMlUserPermissions: false, - isRiskyHostsEnabled: true, hostName: mockHostName, isEnterprise: false, }); diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/nav_tabs.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/nav_tabs.tsx index ba48f9d3f757c..4f22bf46fa2b8 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/nav_tabs.tsx @@ -16,13 +16,11 @@ const getTabsOnHostDetailsUrl = (hostName: string, tabName: HostsTableType) => export const navTabsHostDetails = ({ hasMlUserPermissions, - isRiskyHostsEnabled, hostName, isEnterprise, }: { hostName: string; hasMlUserPermissions: boolean; - isRiskyHostsEnabled: boolean; isEnterprise?: boolean; }): HostDetailsNavTab => { const hiddenTabs = []; @@ -71,10 +69,6 @@ export const navTabsHostDetails = ({ hiddenTabs.push(HostsTableType.anomalies); } - if (!isRiskyHostsEnabled) { - hiddenTabs.push(HostsTableType.risk); - } - if (!isEnterprise) { hiddenTabs.push(HostsTableType.sessions); } diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx index 81165ddc9a545..450f2532d3244 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx @@ -53,7 +53,6 @@ import { ID } from '../containers/hosts'; import { EmptyPrompt } from '../../../common/components/empty_prompt'; import { fieldNameExistsFilter } from '../../../common/components/visualization_actions/utils'; import { useLicense } from '../../../common/hooks/use_license'; -import { useHasSecurityCapability } from '../../../helper_hooks'; /** * Need a 100% height here to account for the graph/analyze tool, which sets no explicit height parameters, but fills the available space. @@ -138,7 +137,6 @@ const HostsComponent = () => { }); const isEnterprisePlus = useLicense().isEnterprise(); - const hasEntityAnalyticsCapability = useHasSecurityCapability('entity-analytics'); const onSkipFocusBeforeEventsTable = useCallback(() => { containerElement.current @@ -190,7 +188,6 @@ const HostsComponent = () => { diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.test.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.test.tsx index c2228d3ced11b..23a5834c87188 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.test.tsx @@ -12,7 +12,6 @@ describe('navTabsHosts', () => { test('it should skip anomalies tab if without mlUserPermission', () => { const tabs = navTabsHosts({ hasMlUserPermissions: false, - isRiskyHostsEnabled: false, }); expect(tabs).toHaveProperty(HostsTableType.hosts); expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); @@ -23,7 +22,6 @@ describe('navTabsHosts', () => { test('it should display anomalies tab if with mlUserPermission', () => { const tabs = navTabsHosts({ hasMlUserPermissions: true, - isRiskyHostsEnabled: false, }); expect(tabs).toHaveProperty(HostsTableType.hosts); expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); @@ -31,21 +29,9 @@ describe('navTabsHosts', () => { expect(tabs).toHaveProperty(HostsTableType.events); }); - test('it should skip risk tab if without hostRisk', () => { + test('it should display risk tab', () => { const tabs = navTabsHosts({ hasMlUserPermissions: false, - isRiskyHostsEnabled: false, - }); - expect(tabs).toHaveProperty(HostsTableType.hosts); - expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); - expect(tabs).not.toHaveProperty(HostsTableType.risk); - expect(tabs).toHaveProperty(HostsTableType.events); - }); - - test('it should display risk tab if with hostRisk', () => { - const tabs = navTabsHosts({ - hasMlUserPermissions: false, - isRiskyHostsEnabled: true, }); expect(tabs).toHaveProperty(HostsTableType.hosts); expect(tabs).toHaveProperty(HostsTableType.uncommonProcesses); diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.tsx index 3ad471afcf85e..1695b0ff101eb 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/nav_tabs.tsx @@ -15,11 +15,9 @@ const getTabsOnHostsUrl = (tabName: HostsTableType) => `${HOSTS_PATH}/${tabName} export const navTabsHosts = ({ hasMlUserPermissions, - isRiskyHostsEnabled, isEnterprise, }: { hasMlUserPermissions: boolean; - isRiskyHostsEnabled: boolean; isEnterprise?: boolean; }): HostsNavTab => { const hiddenTabs = []; @@ -67,10 +65,6 @@ export const navTabsHosts = ({ hiddenTabs.push(HostsTableType.anomalies); } - if (!isRiskyHostsEnabled) { - hiddenTabs.push(HostsTableType.risk); - } - if (!isEnterprise) { hiddenTabs.push(HostsTableType.sessions); } diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx index 28f0a8dbed776..5e6c8d8778f80 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/navigation/host_risk_score_tab_body.tsx @@ -8,6 +8,7 @@ import React, { useEffect, useMemo, useState } from 'react'; import { EuiPanel } from '@elastic/eui'; import { noop } from 'lodash/fp'; +import { useUpsellingComponent } from '../../../../common/hooks/use_upselling'; import { RiskEnginePrivilegesCallOut } from '../../../../entity_analytics/components/risk_engine_privileges_callout'; import { useMissingRiskEnginePrivileges } from '../../../../entity_analytics/hooks/use_missing_risk_engine_privileges'; import { HostRiskScoreQueryId } from '../../../../entity_analytics/common/utils'; @@ -96,6 +97,12 @@ export const HostRiskScoreQueryTabBody = ({ isDeprecated: isDeprecated && !loading, }; + const RiskScoreUpsell = useUpsellingComponent('entity_analytics_panel'); + + if (RiskScoreUpsell) { + return ; + } + if (!privileges.isLoading && !privileges.hasAllRequiredPrivileges) { return ( diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx index 4e61c7083d038..87af28648bdd8 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx @@ -76,7 +76,6 @@ import { UsersType } from '../../store/model'; import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { EmptyPrompt } from '../../../../common/components/empty_prompt'; -import { useHasSecurityCapability } from '../../../../helper_hooks'; import { useRefetchOverviewPageRiskScore } from '../../../../entity_analytics/api/hooks/use_refetch_overview_page_risk_score'; const QUERY_ID = 'UsersDetailsQueryId'; @@ -87,7 +86,6 @@ const UsersDetailsComponent: React.FC = ({ usersDetailsPagePath, }) => { const dispatch = useDispatch(); - const hasEntityAnalyticsCapability = useHasSecurityCapability('entity-analytics'); const getTable = useMemo(() => dataTableSelectors.getTableByIdSelector(), []); const graphEventId = useShallowEqualSelector( (state) => (getTable(state, TableId.hostsPageEvents) ?? timelineDefaults).graphEventId @@ -285,11 +283,7 @@ const UsersDetailsComponent: React.FC = ({ )} { test('it should not display anomalies tab if user has no ml permission', () => { - const tabs = navTabsUsersDetails('username', false, true); + const tabs = navTabsUsersDetails('username', false); expect(tabs).not.toHaveProperty(UsersTableType.anomalies); expect(tabs).toHaveProperty(UsersTableType.risk); }); - - test('it should not display risk tab if isRiskyUserEnabled disabled', () => { - const tabs = navTabsUsersDetails('username', true, false); - // expect(tabs).toHaveProperty(UsersTableType.allUsers); - expect(tabs).toHaveProperty(UsersTableType.anomalies); - expect(tabs).not.toHaveProperty(UsersTableType.risk); - }); }); diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/details/nav_tabs.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/details/nav_tabs.tsx index e4e275fd79a9b..c05f1562975a0 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/details/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/details/nav_tabs.tsx @@ -16,8 +16,7 @@ const getTabsOnUsersDetailsUrl = (userName: string, tabName: UsersTableType) => export const navTabsUsersDetails = ( userName: string, - hasMlUserPermissions: boolean, - isRiskyUserEnabled: boolean + hasMlUserPermissions: boolean ): UsersDetailsNavTab => { const hiddenTabs = []; @@ -52,9 +51,5 @@ export const navTabsUsersDetails = ( hiddenTabs.push(UsersTableType.anomalies); } - if (!isRiskyUserEnabled) { - hiddenTabs.push(UsersTableType.risk); - } - return omit(hiddenTabs, userDetailsNavTabs); }; diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.test.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.test.tsx index 492f85ec7ec02..a5ba7b96049a3 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.test.tsx @@ -10,23 +10,16 @@ import { navTabsUsers } from './nav_tabs'; describe('navTabsUsers', () => { test('it should display all tabs', () => { - const tabs = navTabsUsers(true, true); + const tabs = navTabsUsers(true); expect(tabs).toHaveProperty(UsersTableType.allUsers); expect(tabs).toHaveProperty(UsersTableType.anomalies); expect(tabs).toHaveProperty(UsersTableType.risk); }); test('it should not display anomalies tab if user has no ml permission', () => { - const tabs = navTabsUsers(false, true); + const tabs = navTabsUsers(false); expect(tabs).toHaveProperty(UsersTableType.allUsers); expect(tabs).not.toHaveProperty(UsersTableType.anomalies); expect(tabs).toHaveProperty(UsersTableType.risk); }); - - test('it should not display risk tab if isRiskyUserEnabled disabled', () => { - const tabs = navTabsUsers(true, false); - expect(tabs).toHaveProperty(UsersTableType.allUsers); - expect(tabs).toHaveProperty(UsersTableType.anomalies); - expect(tabs).not.toHaveProperty(UsersTableType.risk); - }); }); diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.tsx index 676fc3d506e5c..d7f91cfe1c9e0 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/nav_tabs.tsx @@ -13,10 +13,7 @@ import { USERS_PATH } from '../../../../common/constants'; const getTabsOnUsersUrl = (tabName: UsersTableType) => `${USERS_PATH}/${tabName}`; -export const navTabsUsers = ( - hasMlUserPermissions: boolean, - isRiskyUserEnabled: boolean -): UsersNavTab => { +export const navTabsUsers = (hasMlUserPermissions: boolean): UsersNavTab => { const hiddenTabs = []; const userNavTabs = { @@ -56,9 +53,5 @@ export const navTabsUsers = ( hiddenTabs.push(UsersTableType.anomalies); } - if (!isRiskyUserEnabled) { - hiddenTabs.push(UsersTableType.risk); - } - return omit(hiddenTabs, userNavTabs); }; diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx index 41f974971b0e1..7f5167c29d91a 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx @@ -49,7 +49,6 @@ import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; import { EmptyPrompt } from '../../../common/components/empty_prompt'; import { userNameExistsFilter } from './details/helpers'; -import { useHasSecurityCapability } from '../../../helper_hooks'; const ID = 'UsersQueryId'; @@ -156,11 +155,7 @@ const UsersComponent = () => { ); const capabilities = useMlCapabilities(); - const hasEntityAnalyticsCapability = useHasSecurityCapability('entity-analytics'); - const navTabs = useMemo( - () => navTabsUsers(hasMlUserPermissions(capabilities), hasEntityAnalyticsCapability), - [capabilities, hasEntityAnalyticsCapability] - ); + const navTabs = useMemo(() => navTabsUsers(hasMlUserPermissions(capabilities)), [capabilities]); return ( <> diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx index b54d195abb278..46f22886c8b58 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx @@ -116,7 +116,7 @@ describe('', () => { // TODO: 8.15 simplify when `agentStatusClientEnabled` FF is enabled and removed it.each(Object.keys(hooksToMock))( - 'should render SentinelOne agent status cell if field is agent.status and `origialField` is `observer.serial_number` with %s hook', + 'should render SentinelOne agent status cell if field is agent.status and `originalField` is `observer.serial_number` with %s hook', (hookName) => { const hook = hooksToMock[hookName]; useAgentStatusHookMock.mockImplementation(() => hook); @@ -139,7 +139,30 @@ describe('', () => { expect(getByTestId(HIGHLIGHTED_FIELDS_AGENT_STATUS_CELL_TEST_ID)).toBeInTheDocument(); } ); + it.each(Object.keys(hooksToMock))( + 'should render Crowdstrike agent status cell if field is agent.status and `originalField` is `crowdstrike.event.DeviceId` with %s hook', + (hookName) => { + const hook = hooksToMock[hookName]; + useAgentStatusHookMock.mockImplementation(() => hook); + (hook as jest.Mock).mockReturnValue({ + isFetched: true, + isLoading: false, + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId(HIGHLIGHTED_FIELDS_AGENT_STATUS_CELL_TEST_ID)).toBeInTheDocument(); + } + ); it('should not render if values is null', () => { const { container } = render( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx index 11031638d67fd..be495a6b16df6 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx @@ -9,12 +9,14 @@ import type { VFC } from 'react'; import React, { memo, useCallback, useMemo } from 'react'; import { EuiFlexItem, EuiLink } from '@elastic/eui'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { SENTINEL_ONE_AGENT_ID_FIELD } from '../../../../common/utils/sentinelone_alert_check'; import { AgentStatus, EndpointAgentStatusById, } from '../../../../common/components/agents/agent_status'; +import { CROWDSTRIKE_AGENT_ID_FIELD } from '../../../../common/utils/crowdstrike_alert_check'; import { useRightPanelContext } from '../context'; import { AGENT_STATUS_FIELD_NAME, @@ -81,19 +83,13 @@ export interface HighlightedFieldsCellProps { } const FieldsAgentStatus = memo( - ({ - value, - isSentinelOneAgentIdField, - }: { - value: string | undefined; - isSentinelOneAgentIdField: boolean; - }) => { + ({ value, agentType }: { value: string | undefined; agentType: ResponseActionAgentType }) => { const agentStatusClientEnabled = useIsExperimentalFeatureEnabled('agentStatusClientEnabled'); - if (isSentinelOneAgentIdField || agentStatusClientEnabled) { + if (agentType !== 'endpoint' || agentStatusClientEnabled) { return ( ); @@ -124,6 +120,19 @@ export const HighlightedFieldsCell: VFC = ({ () => originalField === SENTINEL_ONE_AGENT_ID_FIELD, [originalField] ); + const isCrowdstrikeAgentIdField = useMemo( + () => originalField === CROWDSTRIKE_AGENT_ID_FIELD, + [originalField] + ); + const agentType: ResponseActionAgentType = useMemo(() => { + if (isSentinelOneAgentIdField) { + return 'sentinel_one'; + } + if (isCrowdstrikeAgentIdField) { + return 'crowdstrike'; + } + return 'endpoint'; + }, [isCrowdstrikeAgentIdField, isSentinelOneAgentIdField]); return ( <> @@ -138,10 +147,7 @@ export const HighlightedFieldsCell: VFC = ({ {field === HOST_NAME_FIELD_NAME || field === USER_NAME_FIELD_NAME ? ( ) : field === AGENT_STATUS_FIELD_NAME ? ( - + ) : ( {value} )} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx index cc53f8c9a1fe1..3a18b49a0fc17 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx @@ -120,6 +120,27 @@ describe('useHighlightedFields', () => { }); }); + it('should omit crowdstrike agent id field if data is not crowdstrike alert', () => { + const hookResult = renderHook(() => + useHighlightedFields({ + dataFormattedForFieldBrowser: dataFormattedForFieldBrowser.concat({ + category: 'crowdstrike', + field: 'crowdstrike.event.DeviceId', + values: ['expectedCrowdstrikeAgentId'], + originalValue: ['expectedCrowdstrikeAgentId'], + isObjectArray: false, + }), + investigationFields: ['agent.status', 'crowdstrike.event.DeviceId'], + }) + ); + + expect(hookResult.result.current).toEqual({ + 'kibana.alert.rule.type': { + values: ['query'], + }, + }); + }); + it('should return sentinelone agent id field if data is s1 alert', () => { const hookResult = renderHook(() => useHighlightedFields({ @@ -152,4 +173,37 @@ describe('useHighlightedFields', () => { }, }); }); + + it('should return crowdstrike agent id field if data is crowdstrike alert', () => { + const hookResult = renderHook(() => + useHighlightedFields({ + dataFormattedForFieldBrowser: dataFormattedForFieldBrowser.concat([ + { + category: 'event', + field: 'event.module', + values: ['crowdstrike'], + originalValue: ['crowdstrike'], + isObjectArray: false, + }, + { + category: 'crowdstrike', + field: 'crowdstrike.event.DeviceId', + values: ['expectedCrowdstrikeAgentId'], + originalValue: ['expectedCrowdstrikeAgentId'], + isObjectArray: false, + }, + ]), + investigationFields: ['agent.status', 'crowdstrike.event.DeviceId'], + }) + ); + + expect(hookResult.result.current).toEqual({ + 'kibana.alert.rule.type': { + values: ['query'], + }, + 'crowdstrike.event.DeviceId': { + values: ['expectedCrowdstrikeAgentId'], + }, + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.ts index 3950788bcec2d..c60bb96c77974 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.ts @@ -8,6 +8,10 @@ import type { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import { find, isEmpty } from 'lodash/fp'; import { ALERT_RULE_TYPE } from '@kbn/rule-data-utils'; +import { + CROWDSTRIKE_AGENT_ID_FIELD, + isAlertFromCrowdstrikeEvent, +} from '../../../../common/utils/crowdstrike_alert_check'; import { SENTINEL_ONE_AGENT_ID_FIELD, isAlertFromSentinelOneEvent, @@ -111,6 +115,14 @@ export const useHighlightedFields = ({ return acc; } + // if the field is crowdstrike.event.DeviceId and the event is not a crowdstrike event we skip it + if ( + field.id === CROWDSTRIKE_AGENT_ID_FIELD && + !isAlertFromCrowdstrikeEvent({ data: dataFormattedForFieldBrowser }) + ) { + return acc; + } + return { ...acc, [field.id]: { diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.test.tsx index c28c15c226a82..ffa739ede735b 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.test.tsx @@ -6,6 +6,7 @@ */ import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; +import { RESPONSE_ACTION_AGENT_TYPE } from '../../../../../common/endpoint/service/response_actions/constants'; import React from 'react'; import type { HostInfo } from '../../../../../common/endpoint/types'; import { HostStatus } from '../../../../../common/endpoint/types'; @@ -60,14 +61,14 @@ describe('Responder offline callout', () => { jest.clearAllMocks(); }); - it.each(['endpoint', 'sentinel_one'] as ResponseActionAgentType[])( + it.each(RESPONSE_ACTION_AGENT_TYPE)( 'should be visible when agent type is %s and host is offline', (agentType) => { if (agentType === 'endpoint') { getEndpointDetails.mockReturnValue({ data: { ...endpointDetails, host_status: HostStatus.OFFLINE }, }); - } else if (agentType === 'sentinel_one') { + } else { mockHook.mockReturnValue({ data: { '1234': { @@ -82,14 +83,14 @@ describe('Responder offline callout', () => { } ); - it.each(['endpoint', 'sentinel_one'] as ResponseActionAgentType[])( + it.each(RESPONSE_ACTION_AGENT_TYPE)( 'should not be visible when agent type is %s and host is online', (agentType) => { if (agentType === 'endpoint') { getEndpointDetails.mockReturnValue({ data: { ...endpointDetails, host_status: HostStatus.HEALTHY }, }); - } else if (agentType === 'sentinel_one') { + } else { mockHook.mockReturnValue({ data: { '1234': { diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.tsx index b630af8959328..d18a8526fb3eb 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/components/offline_callout.tsx @@ -24,7 +24,9 @@ interface OfflineCalloutProps { export const OfflineCallout = memo(({ agentType, endpointId, hostName }) => { const isEndpointAgent = agentType === 'endpoint'; const isSentinelOneAgent = agentType === 'sentinel_one'; + const isCrowdstrikeAgent = agentType === 'crowdstrike'; const getAgentStatus = useAgentStatusHook(); + const agentStatusClientEnabled = useIsExperimentalFeatureEnabled('agentStatusClientEnabled'); const isSentinelOneV1Enabled = useIsExperimentalFeatureEnabled( 'responseActionsSentinelOneV1Enabled' ); @@ -32,27 +34,40 @@ export const OfflineCallout = memo(({ agentType, endpointId const sentinelOneManualHostActionsEnabled = useIsExperimentalFeatureEnabled( 'sentinelOneManualHostActionsEnabled' ); + const crowdstrikeManualHostActionsEnabled = useIsExperimentalFeatureEnabled( + 'responseActionsCrowdstrikeManualHostIsolationEnabled' + ); const { data: endpointDetails } = useGetEndpointDetails(endpointId, { refetchInterval: 10000, - enabled: isEndpointAgent, + enabled: isEndpointAgent && !agentStatusClientEnabled, }); const { data } = getAgentStatus([endpointId], agentType, { - enabled: sentinelOneManualHostActionsEnabled && isSentinelOneAgent, + enabled: + (sentinelOneManualHostActionsEnabled && isSentinelOneAgent) || + (crowdstrikeManualHostActionsEnabled && isCrowdstrikeAgent) || + (isEndpointAgent && agentStatusClientEnabled), }); - - // TODO: simplify this to use the yet to be implemented agentStatus API hook const showOfflineCallout = useMemo( () => (isEndpointAgent && endpointDetails?.host_status === HostStatus.OFFLINE) || - (isSentinelOneAgent && data?.[endpointId].status === HostStatus.OFFLINE), - [data, endpointDetails?.host_status, endpointId, isEndpointAgent, isSentinelOneAgent] + (isSentinelOneAgent && data?.[endpointId].status === HostStatus.OFFLINE) || + (isCrowdstrikeAgent && data?.[endpointId].status === HostStatus.OFFLINE), + [ + data, + endpointDetails?.host_status, + endpointId, + isEndpointAgent, + isCrowdstrikeAgent, + isSentinelOneAgent, + ] ); if ( (isEndpointAgent && !endpointDetails) || - (isSentinelOneV1Enabled && isSentinelOneAgent && !data) + (isSentinelOneV1Enabled && isSentinelOneAgent && !data) || + (crowdstrikeManualHostActionsEnabled && isCrowdstrikeAgent && !data) ) { return null; } diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.feature_flag.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.feature_flag.cy.ts new file mode 100644 index 0000000000000..e7c98df4e735f --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_role_rbac.feature_flag.cy.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 { closeAllToasts } from '../tasks/toasts'; +import { login, ROLE } from '../tasks/login'; +import { loadPage } from '../tasks/common'; + +describe( + 'When defining a kibana role for Endpoint security access', + { + env: { + ftrConfig: { + kbnServerArgs: [ + `--xpack.securitySolution.enableExperimental=${JSON.stringify([ + 'responseActionScanEnabled', + ])}`, + ], + }, + }, + tags: '@ess', + }, + () => { + const getAllSubFeatureRows = (): Cypress.Chainable> => { + return cy + .get('#featurePrivilegeControls_siem') + .findByTestSubj('mutexSubFeaturePrivilegeControl') + .closest('.euiFlexGroup'); + }; + + beforeEach(() => { + login(ROLE.system_indices_superuser); + loadPage('/app/management/security/roles/edit'); + closeAllToasts(); + cy.getByTestSubj('addSpacePrivilegeButton').click(); + cy.getByTestSubj('featureCategoryButton_securitySolution').closest('button').click(); + cy.get('.featurePrivilegeName:contains("Security")').closest('button').click(); + }); + + it('should display RBAC entries with expected controls', () => { + getAllSubFeatureRows() + .then(($subFeatures) => { + const featureRows: string[] = []; + $subFeatures.each((_, $subFeature) => { + featureRows.push($subFeature.textContent ?? ''); + }); + + return featureRows; + }) + .should('deep.equal', [ + 'Endpoint List Displays all hosts running Elastic Defend and their relevant integration details.Endpoint List sub-feature privilegeAllReadNone', + 'Trusted Applications Helps mitigate conflicts with other software, usually other antivirus or endpoint security applications.Trusted Applications sub-feature privilegeAllReadNone', + 'Host Isolation Exceptions Add specific IP addresses that isolated hosts are still allowed to communicate with, even when isolated from the rest of the network.Host Isolation Exceptions sub-feature privilegeAllReadNone', + 'Blocklist Extend Elastic Defend’s protection against malicious processes and protect against potentially harmful applications.Blocklist sub-feature privilegeAllReadNone', + 'Event Filters Filter out endpoint events that you do not need or want stored in Elasticsearch.Event Filters sub-feature privilegeAllReadNone', + 'Elastic Defend Policy Management Access the Elastic Defend integration policy to configure protections, event collection, and advanced policy features.Elastic Defend Policy Management sub-feature privilegeAllReadNone', + 'Response Actions History Access the history of response actions performed on endpoints.Response Actions History sub-feature privilegeAllReadNone', + 'Host Isolation Perform the "isolate" and "release" response actions.Host Isolation sub-feature privilegeAllNone', + 'Process Operations Perform process-related response actions in the response console.Process Operations sub-feature privilegeAllNone', + 'File Operations Perform file-related response actions in the response console.File Operations sub-feature privilegeAllNone', + 'Execute Operations Perform script execution response actions in the response console.Execute Operations sub-feature privilegeAllNone', + 'Scan Operations Perform folder scan response actions in the response console.Scan Operations sub-feature privilegeAllNone', + ]); + }); + } +); diff --git a/x-pack/plugins/security_solution/public/management/hooks/agents/use_get_agent_status.tsx b/x-pack/plugins/security_solution/public/management/hooks/agents/use_get_agent_status.tsx index 066c9a3c53215..5aa1d6b5f6b21 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/agents/use_get_agent_status.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/agents/use_get_agent_status.tsx @@ -33,6 +33,7 @@ export const useGetSentinelOneAgentStatus = ( queryKey: ['get-agent-status', agentIds], refetchInterval: 5000, ...options, + enabled: agentType === 'sentinel_one', queryFn: () => http .get<{ data: AgentStatusInfo }>(AGENT_STATUS_ROUTE, { diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/index.ts index cdfbdff81c84b..b4f337a52a425 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/index.ts @@ -5,21 +5,18 @@ * 2.0. */ +import type { ExternalEdrServerEmulatorCoreServices } from '../../external_edr_server_emulator.types'; import type { EmulatorServerPlugin } from '../../lib/emulator_server.types'; +import { getCrowdstrikeRouteDefinitions } from './routes'; -export const getCrowdstrikeEmulator = () => { - const plugin: EmulatorServerPlugin = { - name: 'crowdstrike', - register({ router }) { - router.route({ - path: '/', - method: 'GET', - handler: () => { - return { message: `Live! But not implemented` }; - }, - }); - }, - }; +export const getCrowdstrikeEmulator = + (): EmulatorServerPlugin => { + const plugin: EmulatorServerPlugin = { + name: 'crowdstrike', + register({ router, expose, services }) { + router.route(getCrowdstrikeRouteDefinitions()); + }, + }; - return plugin; -}; + return plugin; + }; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/mocks.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/mocks.ts new file mode 100644 index 0000000000000..cab12ebaeac1a --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/mocks.ts @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { + CrowdstrikeBaseApiResponse, + CrowdstrikeGetAgentOnlineStatusResponse, + CrowdstrikeGetAgentsResponse, +} from '@kbn/stack-connectors-plugin/common/crowdstrike/types'; +import { merge } from 'lodash'; + +export const createCrowdstrikeGetAgentsApiResponseMock = ( + data: CrowdstrikeBaseApiResponse['resources'][number] +) => { + return { + meta: { + query_time: 0.001831479, + powered_by: 'device-api', + trace_id: '4567898765-432423432432-42342342', + }, + errors: null, + resources: data, + }; +}; + +export const createCrowdstrikeAgentDetailsMock = ( + overrides: Partial = {} +): CrowdstrikeGetAgentsResponse['resources'][number] => { + return merge( + { + device_id: '0eec3717b2eb472195bbb3964c05cfd3', + cid: '234567890', + agent_load_flags: '0', + agent_local_time: '2024-03-18T22:21:00.173Z', + agent_version: '7.07.16206.0', + bios_manufacturer: 'Amazon EC2', + bios_version: '1.0', + config_id_base: '65994753', + config_id_build: '16206', + config_id_platform: '8', + cpu_signature: '8392466', + cpu_vendor: '1', + external_ip: '18.157.150.216', + mac_address: '03-f4-f4-f4-f4', + instance_id: 'i-456789', + service_provider: 'AWS_EC2_V2', + service_provider_account_id: '23456789', + hostname: 'Crowdstrike-1460', + first_seen: '2024-03-15T13:18:56Z', + last_login_timestamp: '2024-03-15T22:11:47Z', + last_login_user: 'testuser', + last_login_uid: '1002', + last_seen: '2024-03-20T07:19:01Z', + local_ip: '172.31.200.45', + major_version: '5', + minor_version: '14', + os_version: 'RHEL 9.3', + platform_id: '3', + platform_name: 'Linux', + policies: [ + { + policy_type: 'prevention', + policy_id: '234234234234', + applied: true, + settings_hash: 'f0e04444', + assigned_date: '2024-03-15T13:20:02.25821602Z', + applied_date: '2024-03-15T13:20:16.804783955Z', + rule_groups: [], + }, + ], + reduced_functionality_mode: 'no', + device_policies: { + prevention: { + policy_type: 'prevention', + policy_id: '234234234234', + applied: true, + settings_hash: 'f0e04444', + assigned_date: '2024-03-15T13:20:02.25821602Z', + applied_date: '2024-03-15T13:20:16.804783955Z', + rule_groups: [], + }, + sensor_update: { + policy_type: 'sensor-update', + policy_id: '234234234234', + applied: true, + settings_hash: 'tagged|5;', + assigned_date: '2024-03-15T13:20:02.258765734Z', + applied_date: '2024-03-15T13:23:53.773752711Z', + uninstall_protection: 'UNKNOWN', + }, + global_config: { + policy_type: 'globalconfig', + policy_id: '234234234234', + applied: true, + settings_hash: 'f0e04444', + assigned_date: '2024-03-18T22:21:01.50638371Z', + applied_date: '2024-03-18T22:21:30.565040189Z', + }, + remote_response: { + policy_type: 'remote-response', + policy_id: '234234234234', + applied: true, + settings_hash: 'f0e04444', + assigned_date: '2024-03-15T13:20:02.258285018Z', + applied_date: '2024-03-15T13:20:17.016591803Z', + }, + }, + groups: [], + group_hash: '45678909876545678', + product_type_desc: 'Server', + provision_status: 'NotProvisioned', + serial_number: '345678765-35d6-e704-1723-423423432', + status: 'containment_pending', + system_manufacturer: 'Amazon EC2', + system_product_name: 't3a.medium', + tags: [], + modified_timestamp: '2024-03-20T07:19:45Z', + meta: { + version: '484', + version_string: '9:33384301139', + }, + zone_group: 'eu-central-1a', + kernel_version: '5.14.0-234234el9_3.x86_64', + chassis_type: '1', + chassis_type_desc: 'Other', + connection_ip: '172.31.200.45', + default_gateway_ip: '172.31.200.1', + connection_mac_address: '02-e8-f1-0e-b7-c4', + linux_sensor_mode: 'Kernel Mode', + deployment_type: 'Standard', + }, + overrides + ); +}; + +export const createCrowdstrikeGetAgentOnlineStatusDetailsMock: ( + overrides: Partial +) => CrowdstrikeGetAgentOnlineStatusResponse['resources'][number] = (overrides) => { + return merge( + { + state: 'online', + id: 'ae86ad7402404048ac9b8d94db8f7ba2', + }, + overrides + ); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_agent_details_route.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_agent_details_route.ts new file mode 100644 index 0000000000000..84e5f42783f3a --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_agent_details_route.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { buildCrowdstrikeRoutePath } from './utils'; +import type { ExternalEdrServerEmulatorRouteHandlerMethod } from '../../../external_edr_server_emulator.types'; +import type { EmulatorServerRouteDefinition } from '../../../lib/emulator_server.types'; +import { + createCrowdstrikeAgentDetailsMock, + createCrowdstrikeGetAgentsApiResponseMock, +} from '../mocks'; + +export const getAgentDetailsRouteDefinition = (): EmulatorServerRouteDefinition => { + return { + path: buildCrowdstrikeRoutePath('/devices/entities/devices/v2'), + method: 'GET', + handler: getAgentDetailsHandler, + }; +}; + +const getAgentDetailsHandler: ExternalEdrServerEmulatorRouteHandlerMethod<{}> = async () => { + return createCrowdstrikeGetAgentsApiResponseMock([createCrowdstrikeAgentDetailsMock({})]); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_agent_online_status_route.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_agent_online_status_route.ts new file mode 100644 index 0000000000000..59c5d9a18a1f9 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_agent_online_status_route.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { buildCrowdstrikeRoutePath } from './utils'; +import type { ExternalEdrServerEmulatorRouteHandlerMethod } from '../../../external_edr_server_emulator.types'; +import type { EmulatorServerRouteDefinition } from '../../../lib/emulator_server.types'; +import { createCrowdstrikeGetAgentOnlineStatusDetailsMock } from '../mocks'; + +export const getAgentOnlineStatusRouteDefinition = (): EmulatorServerRouteDefinition => { + return { + path: buildCrowdstrikeRoutePath('/devices/entities/online-state/v1'), + method: 'GET', + handler: getAgentOnlineStatusHandler, + }; +}; + +const getAgentOnlineStatusHandler: ExternalEdrServerEmulatorRouteHandlerMethod<{}> = async () => { + return { + resources: [createCrowdstrikeGetAgentOnlineStatusDetailsMock({})], + meta: { + query_time: 123, + powered_by: 'test', + trace_id: 'test', + }, + errors: [], + }; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_token_route.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_token_route.ts new file mode 100644 index 0000000000000..6629c33974b04 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/get_token_route.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { buildCrowdstrikeRoutePath } from './utils'; +import type { ExternalEdrServerEmulatorRouteHandlerMethod } from '../../../external_edr_server_emulator.types'; +import type { EmulatorServerRouteDefinition } from '../../../lib/emulator_server.types'; + +export const getTokenRouteDefinition = (): EmulatorServerRouteDefinition => { + return { + path: buildCrowdstrikeRoutePath('/oauth2/token'), + method: 'POST', + handler: getTokenHandler, + }; +}; + +const getTokenHandler: ExternalEdrServerEmulatorRouteHandlerMethod<{}> = async () => { + return { + access_token: 'testtoken', + expires_in: 123, + token_type: 'bearer', + id_token: 'test', + issued_token_type: 'test', + refresh_token: 'test', + scope: 'test', + }; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/host_actions_route.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/host_actions_route.ts new file mode 100644 index 0000000000000..2c648213a3f09 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/host_actions_route.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { CrowdstrikeHostActionsParams } from '@kbn/stack-connectors-plugin/common/crowdstrike/types'; +import { buildCrowdstrikeRoutePath } from './utils'; +import type { ExternalEdrServerEmulatorRouteHandlerMethod } from '../../../external_edr_server_emulator.types'; +import type { EmulatorServerRouteDefinition } from '../../../lib/emulator_server.types'; + +export const hostActionsRouteDefinition = (): EmulatorServerRouteDefinition => { + return { + path: buildCrowdstrikeRoutePath('/devices/entities/devices-actions/v2'), + method: 'POST', + handler: hostActionsHandler, + }; +}; + +const hostActionsHandler: ExternalEdrServerEmulatorRouteHandlerMethod< + {}, + CrowdstrikeHostActionsParams +> = async () => { + return { + resources: [ + { + id: 'test', + path: 'test', + }, + ], + + meta: { + query_time: 123, + powered_by: 'test', + trace_id: 'test', + }, + errors: [], + }; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/index.ts new file mode 100644 index 0000000000000..1da4f435aae4c --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getTokenRouteDefinition } from './get_token_route'; +import type { EmulatorServerRouteDefinition } from '../../../lib/emulator_server.types'; +import { hostActionsRouteDefinition } from './host_actions_route'; +import { getAgentDetailsRouteDefinition } from './get_agent_details_route'; +import { getAgentOnlineStatusRouteDefinition } from './get_agent_online_status_route'; + +export const getCrowdstrikeRouteDefinitions = (): EmulatorServerRouteDefinition[] => { + return [ + getTokenRouteDefinition(), + hostActionsRouteDefinition(), + getAgentDetailsRouteDefinition(), + getAgentOnlineStatusRouteDefinition(), + ]; +}; diff --git a/x-pack/packages/kbn-elastic-assistant-common/impl/mock/mock_action_response/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/utils.ts similarity index 58% rename from x-pack/packages/kbn-elastic-assistant-common/impl/mock/mock_action_response/index.ts rename to x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/utils.ts index dbc095a334cea..ab8ed1ecd57b6 100644 --- a/x-pack/packages/kbn-elastic-assistant-common/impl/mock/mock_action_response/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/routes/utils.ts @@ -4,8 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +export const buildCrowdstrikeRoutePath = (path: string): string => { + if (!path.startsWith('/')) { + throw new Error(`'path' must start with '/'!`); + } -export const mockActionResponse = { - message: 'Yes, your name is Andrew. How can I assist you further, Andrew?', - usage: { prompt_tokens: 4, completion_tokens: 10, total_tokens: 14 }, + return path; }; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts index 6880282f83876..a1f3585ffcdc7 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/endpoint_operations_analyst.ts @@ -71,6 +71,7 @@ export const getEndpointOperationsAnalyst: () => Omit = () => { 'actions_log_management_all', 'file_operations_all', 'execute_operations_all', + 'scan_operations_all', ], }, spaces: ['*'], diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/serverless/es_serverless_resources/roles.yml b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/serverless/es_serverless_resources/roles.yml index 8d469904160cd..3bc3320b96026 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/serverless/es_serverless_resources/roles.yml +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/serverless/es_serverless_resources/roles.yml @@ -493,6 +493,7 @@ soc_manager: - feature_siem.actions_log_management_all - feature_siem.file_operations_all - feature_siem.execute_operations_all + - feature_siem.scan_operations_all - feature_securitySolutionCases.all - feature_securitySolutionAssistant.all - feature_actions.all @@ -675,6 +676,7 @@ endpoint_operations_analyst: - feature_siem.actions_log_management_all # Response History - feature_siem.file_operations_all - feature_siem.execute_operations_all # Execute + - feature_siem.scan_operations_all - feature_securitySolutionCases.all - feature_securitySolutionAssistant.all - feature_actions.all @@ -753,4 +755,4 @@ endpoint_policy_manager: - feature_graph.all - feature_maps.all - feature_visualize.all - resources: "*" \ No newline at end of file + resources: "*" diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/with_response_actions_role.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/with_response_actions_role.ts index 0fed92037e07f..7108f0181b868 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/with_response_actions_role.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/roles_users/with_response_actions_role.ts @@ -21,6 +21,7 @@ export const getWithResponseActionsRole: () => Omit = () => { ...noResponseActionsRole.kibana[0].feature.siem, 'file_operations_all', 'execute_operations_all', + 'scan_operations_all', 'host_isolation_all', 'process_operations_all', 'actions_log_management_all', diff --git a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts index 1699d68a2f314..ed29985b48fe8 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/alert_counts/alert_counts_tool.ts @@ -6,8 +6,8 @@ */ import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; -import { DynamicTool } from '@langchain/core/tools'; - +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; import { requestHasRequiredAnonymizationParams } from '@kbn/elastic-assistant-plugin/server/lib/langchain/helpers'; import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; import { getAlertsCountQuery } from './get_alert_counts_query'; @@ -17,7 +17,7 @@ export interface AlertCountsToolParams extends AssistantToolParams { alertsIndexPattern: string; } export const ALERT_COUNTS_TOOL_DESCRIPTION = - 'Call this for the counts of last 24 hours of open and acknowledged alerts in the environment, grouped by their severity and workflow status.'; + 'Call this for the counts of last 24 hours of open and acknowledged alerts in the environment, grouped by their severity and workflow status. The response will be JSON and from it you can summarize the information to answer the question.'; export const ALERT_COUNTS_TOOL: AssistantTool = { id: 'alert-counts-tool', @@ -31,9 +31,10 @@ export const ALERT_COUNTS_TOOL: AssistantTool = { getTool(params: AssistantToolParams) { if (!this.isSupported(params)) return null; const { alertsIndexPattern, esClient } = params as AlertCountsToolParams; - return new DynamicTool({ + return new DynamicStructuredTool({ name: 'AlertCountsTool', description: ALERT_COUNTS_TOOL_DESCRIPTION, + schema: z.object({}), func: async () => { const query = getAlertsCountQuery(alertsIndexPattern); const result = await esClient.search(query); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/attack_discovery_tool.test.ts b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/attack_discovery_tool.test.ts index bd67b00257721..a608673adf661 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/attack_discovery_tool.test.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/attack_discovery/attack_discovery_tool.test.ts @@ -8,7 +8,7 @@ import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import type { KibanaRequest } from '@kbn/core-http-server'; import type { AttackDiscoveryPostRequestBody } from '@kbn/elastic-assistant-common'; -import type { ActionsClientLlm } from '@kbn/elastic-assistant-common/impl/language_models'; +import type { ActionsClientLlm } from '@kbn/langchain/server'; import type { DynamicTool } from '@langchain/core/tools'; import { ATTACK_DISCOVERY_TOOL } from './attack_discovery_tool'; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_structured_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_structured_tool.ts deleted file mode 100644 index 773528b8e785a..0000000000000 --- a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_structured_tool.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { DynamicStructuredTool } from '@langchain/core/tools'; -import { z } from 'zod'; -import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; -import { APP_UI_ID } from '../../../../common'; - -export type EsqlKnowledgeBaseToolParams = AssistantToolParams; - -const toolDetails = { - description: - 'Call this for knowledge on how to build an ESQL query, or answer questions about the ES|QL query language. Input must always be the query on a single line, with no other text. Only output valid ES|QL queries as described above. Do not add any additional text to describe your output.', - id: 'esql-knowledge-base-structured-tool', - name: 'ESQLKnowledgeBaseStructuredTool', -}; -export const ESQL_KNOWLEDGE_BASE_STRUCTURED_TOOL: AssistantTool = { - ...toolDetails, - sourceRegister: APP_UI_ID, - isSupported: (params: AssistantToolParams): params is EsqlKnowledgeBaseToolParams => { - const { chain, isEnabledKnowledgeBase, modelExists } = params; - return isEnabledKnowledgeBase && modelExists && chain != null; - }, - getTool(params: AssistantToolParams) { - if (!this.isSupported(params)) return null; - - const { chain } = params as EsqlKnowledgeBaseToolParams; - if (chain == null) return null; - - return new DynamicStructuredTool({ - name: toolDetails.name, - description: toolDetails.description, - schema: z.object({ - question: z.string().describe(`The user's exact question about ESQL`), - }), - func: async (input, _, cbManager) => { - const result = await chain.invoke( - { - query: input.question, - }, - cbManager - ); - return result.text; - }, - tags: ['esql', 'query-generation', 'knowledge-base'], - }); - }, -}; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts index 567182d042339..692753a22dea0 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/esql_language_knowledge_base/esql_language_knowledge_base_tool.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { DynamicTool } from '@langchain/core/tools'; +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; import { APP_UI_ID } from '../../../../common'; @@ -30,13 +31,16 @@ export const ESQL_KNOWLEDGE_BASE_TOOL: AssistantTool = { const { chain } = params as EsqlKnowledgeBaseToolParams; if (chain == null) return null; - return new DynamicTool({ + return new DynamicStructuredTool({ name: toolDetails.name, description: toolDetails.description, + schema: z.object({ + question: z.string().describe(`The user's exact question about ESQL`), + }), func: async (input, _, cbManager) => { const result = await chain.invoke( { - query: input, + query: input.question, }, cbManager ); diff --git a/x-pack/plugins/security_solution/server/assistant/tools/index.ts b/x-pack/plugins/security_solution/server/assistant/tools/index.ts index 66b5f458a8181..b99c1f6e0cd38 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/index.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/index.ts @@ -9,7 +9,6 @@ import type { AssistantTool } from '@kbn/elastic-assistant-plugin/server'; import { ALERT_COUNTS_TOOL } from './alert_counts/alert_counts_tool'; import { ESQL_KNOWLEDGE_BASE_TOOL } from './esql_language_knowledge_base/esql_language_knowledge_base_tool'; -import { ESQL_KNOWLEDGE_BASE_STRUCTURED_TOOL } from './esql_language_knowledge_base/esql_language_knowledge_base_structured_tool'; import { OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL } from './open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool'; import { ATTACK_DISCOVERY_TOOL } from './attack_discovery/attack_discovery_tool'; @@ -17,6 +16,5 @@ export const getAssistantTools = (): AssistantTool[] => [ ALERT_COUNTS_TOOL, ATTACK_DISCOVERY_TOOL, ESQL_KNOWLEDGE_BASE_TOOL, - ESQL_KNOWLEDGE_BASE_STRUCTURED_TOOL, OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL, ]; diff --git a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts index f77d920978756..ed6f65ffb7610 100644 --- a/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts +++ b/x-pack/plugins/security_solution/server/assistant/tools/open_and_acknowledged_alerts/open_and_acknowledged_alerts_tool.ts @@ -8,9 +8,9 @@ import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; import type { Replacements } from '@kbn/elastic-assistant-common'; import { getAnonymizedValue, transformRawData } from '@kbn/elastic-assistant-common'; -import { DynamicTool } from '@langchain/core/tools'; +import { DynamicStructuredTool } from '@langchain/core/tools'; import { requestHasRequiredAnonymizationParams } from '@kbn/elastic-assistant-plugin/server/lib/langchain/helpers'; - +import { z } from 'zod'; import type { AssistantTool, AssistantToolParams } from '@kbn/elastic-assistant-plugin/server'; import { getOpenAndAcknowledgedAlertsQuery } from './get_open_and_acknowledged_alerts_query'; import { getRawDataOrDefault, sizeIsOutOfRange } from './helpers'; @@ -22,7 +22,7 @@ export interface OpenAndAcknowledgedAlertsToolParams extends AssistantToolParams } export const OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL_DESCRIPTION = - 'Call this for knowledge about the latest n open and acknowledged alerts (sorted by `kibana.alert.risk_score`) in the environment, or when answering questions about open alerts. Input should be a string.'; + 'Call this for knowledge about the latest n open and acknowledged alerts (sorted by `kibana.alert.risk_score`) in the environment, or when answering questions about open alerts. Do not call this tool for alert count or quantity. Input should be an empty object. The output is an array of the latest n open and acknowledged alerts.'; /** * Returns a tool for querying open and acknowledged alerts, or null if the @@ -53,9 +53,10 @@ export const OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL: AssistantTool = { replacements, size, } = params as OpenAndAcknowledgedAlertsToolParams; - return new DynamicTool({ + return new DynamicStructuredTool({ name: 'OpenAndAcknowledgedAlertsTool', description: OPEN_AND_ACKNOWLEDGED_ALERTS_TOOL_DESCRIPTION, + schema: z.object({}), func: async () => { const query = getOpenAndAcknowledgedAlertsQuery({ alertsIndexPattern, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/agent/agent_status_handler.ts b/x-pack/plugins/security_solution/server/endpoint/routes/agent/agent_status_handler.ts index 231eb3cccaf05..25f281facb848 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/agent/agent_status_handler.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/agent/agent_status_handler.ts @@ -6,7 +6,7 @@ */ import type { RequestHandler } from '@kbn/core/server'; -import { getAgentStatus } from '../../services/agent/agent_status'; +import { getSentinelOneAgentStatus } from '../../services/agent/agent_status'; import { errorHandler } from '../error_handler'; import type { EndpointAgentStatusRequestQueryParams } from '../../../../common/api/endpoint/agent/get_agent_status_route'; import { EndpointAgentStatusRequestSchema } from '../../../../common/api/endpoint/agent/get_agent_status_route'; @@ -63,8 +63,10 @@ export const getAgentStatusRouteHandler = ( // `getter` function), we need to include this additional validation here, since // `agent_type` is included in the schema independent of the feature flag if ( - agentType === 'sentinel_one' && - !endpointContext.experimentalFeatures.responseActionsSentinelOneV1Enabled + (agentType === 'sentinel_one' && + !endpointContext.experimentalFeatures.responseActionsSentinelOneV1Enabled) || + (agentType === 'crowdstrike' && + !endpointContext.experimentalFeatures.responseActionsCrowdstrikeManualHostIsolationEnabled) ) { return errorHandler( logger, @@ -79,17 +81,21 @@ export const getAgentStatusRouteHandler = ( esClient, soClient, endpointService: endpointContext.service, + connectorActionsClient: + agentType === 'crowdstrike' ? (await context.actions).getActionsClient() : undefined, }); // 8.15: use the new `agentStatusClientEnabled` FF enabled - const getAgentStatusPromise = endpointContext.experimentalFeatures.agentStatusClientEnabled - ? agentStatusClient.getAgentStatuses(agentIds) - : getAgentStatus({ + const data = endpointContext.experimentalFeatures.agentStatusClientEnabled + ? await agentStatusClient.getAgentStatuses(agentIds) + : agentType === 'sentinel_one' + ? await getSentinelOneAgentStatus({ agentType, agentIds, logger, connectorActionsClient: (await context.actions).getActionsClient(), - }); + }) + : []; logger.debug( `Retrieving status for: agentType [${agentType}], agentIds: [${agentIds.join(', ')}]` @@ -98,7 +104,7 @@ export const getAgentStatusRouteHandler = ( try { return response.ok({ body: { - data: await getAgentStatusPromise, + data, }, }); } catch (e) { diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/crowdstrike/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/crowdstrike/mocks.ts index e24eedb7ddf57..8ee3dcd51aeda 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/crowdstrike/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/crowdstrike/mocks.ts @@ -5,14 +5,17 @@ * 2.0. */ -import type { CrowdstrikeGetAgentsResponse } from '@kbn/stack-connectors-plugin/common/crowdstrike/types'; import { CROWDSTRIKE_CONNECTOR_ID, SUB_ACTION, } from '@kbn/stack-connectors-plugin/common/crowdstrike/constants'; import type { ActionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; import type { ConnectorWithExtraFindData } from '@kbn/actions-plugin/server/application/connector/types'; -import { merge } from 'lodash'; +import { + createCrowdstrikeAgentDetailsMock, + createCrowdstrikeGetAgentOnlineStatusDetailsMock, + createCrowdstrikeGetAgentsApiResponseMock, +} from '../../../../../../scripts/endpoint/api_emulator/emulator_plugins/crowdstrike/mocks'; import type { ResponseActionsClientOptionsMock } from '../mocks'; import { responseActionsClientMock } from '../mocks'; import type { NormalizedExternalConnectorClient } from '../../..'; @@ -21,130 +24,6 @@ export interface CrowdstrikeActionsClientOptionsMock extends ResponseActionsClie connectorActions: NormalizedExternalConnectorClient; } -const createCrowdstrikeAgentDetailsMock = ( - overrides: Partial = {} -): CrowdstrikeGetAgentsResponse['resources'][number][number] => { - return merge( - { - device_id: '123456789', - cid: '234567890', - agent_load_flags: '0', - agent_local_time: '2024-03-18T22:21:00.173Z', - agent_version: '7.07.16206.0', - bios_manufacturer: 'Amazon EC2', - bios_version: '1.0', - config_id_base: '65994753', - config_id_build: '16206', - config_id_platform: '8', - cpu_signature: '8392466', - cpu_vendor: '1', - external_ip: '18.157.150.216', - mac_address: '03-f4-f4-f4-f4', - instance_id: 'i-456789', - service_provider: 'AWS_EC2_V2', - service_provider_account_id: '23456789', - hostname: 'Crowdstrike-1460', - first_seen: '2024-03-15T13:18:56Z', - last_login_timestamp: '2024-03-15T22:11:47Z', - last_login_user: 'testuser', - last_login_uid: '1002', - last_seen: '2024-03-20T07:19:01Z', - local_ip: '172.31.200.45', - major_version: '5', - minor_version: '14', - os_version: 'RHEL 9.3', - platform_id: '3', - platform_name: 'Linux', - policies: [ - { - policy_type: 'prevention', - policy_id: '234234234234', - applied: true, - settings_hash: 'f0e04444', - assigned_date: '2024-03-15T13:20:02.25821602Z', - applied_date: '2024-03-15T13:20:16.804783955Z', - rule_groups: [], - }, - ], - reduced_functionality_mode: 'no', - device_policies: { - prevention: { - policy_type: 'prevention', - policy_id: '234234234234', - applied: true, - settings_hash: 'f0e04444', - assigned_date: '2024-03-15T13:20:02.25821602Z', - applied_date: '2024-03-15T13:20:16.804783955Z', - rule_groups: [], - }, - sensor_update: { - policy_type: 'sensor-update', - policy_id: '234234234234', - applied: true, - settings_hash: 'tagged|5;', - assigned_date: '2024-03-15T13:20:02.258765734Z', - applied_date: '2024-03-15T13:23:53.773752711Z', - uninstall_protection: 'UNKNOWN', - }, - global_config: { - policy_type: 'globalconfig', - policy_id: '234234234234', - applied: true, - settings_hash: 'f0e04444', - assigned_date: '2024-03-18T22:21:01.50638371Z', - applied_date: '2024-03-18T22:21:30.565040189Z', - }, - remote_response: { - policy_type: 'remote-response', - policy_id: '234234234234', - applied: true, - settings_hash: 'f0e04444', - assigned_date: '2024-03-15T13:20:02.258285018Z', - applied_date: '2024-03-15T13:20:17.016591803Z', - }, - }, - groups: [], - group_hash: '45678909876545678', - product_type_desc: 'Server', - provision_status: 'NotProvisioned', - serial_number: '345678765-35d6-e704-1723-423423432', - status: 'normal', - system_manufacturer: 'Amazon EC2', - system_product_name: 't3a.medium', - tags: [], - modified_timestamp: '2024-03-20T07:19:45Z', - meta: { - version: '484', - version_string: '9:33384301139', - }, - zone_group: 'eu-central-1a', - kernel_version: '5.14.0-234234el9_3.x86_64', - chassis_type: '1', - chassis_type_desc: 'Other', - connection_ip: '172.31.200.45', - default_gateway_ip: '172.31.200.1', - connection_mac_address: '02-e8-f1-0e-b7-c4', - linux_sensor_mode: 'Kernel Mode', - deployment_type: 'Standard', - }, - overrides - ); -}; - -const createCrowdstrikeGetAgentsApiResponseMock = ( - data: CrowdstrikeGetAgentsResponse['resources'][number] = [createCrowdstrikeAgentDetailsMock()] -): CrowdstrikeGetAgentsResponse => { - return { - meta: { - query_time: 0.001831479, - powered_by: 'device-api', - trace_id: '4567898765-432423432432-42342342', - }, - errors: null, - resources: [data], - }; -}; - const createConnectorActionsClientMock = (): ActionsClientMock => { const client = responseActionsClientMock.createConnectorActionsClient(); @@ -167,7 +46,9 @@ const createConnectorActionsClientMock = (): ActionsClientMock => { switch (subAction) { case SUB_ACTION.GET_AGENT_DETAILS: return responseActionsClientMock.createConnectorActionExecuteResponse({ - data: createCrowdstrikeGetAgentsApiResponseMock(), + data: createCrowdstrikeGetAgentsApiResponseMock([ + createCrowdstrikeAgentDetailsMock({}), + ]), }); default: @@ -224,6 +105,7 @@ const createEventSearchResponseMock = (): CrowdstrikeEventSearchResponseMock => export const CrowdstrikeMock = { createGetAgentsResponse: createCrowdstrikeGetAgentsApiResponseMock, + createGetAgentOnlineStatusDetails: createCrowdstrikeGetAgentOnlineStatusDetailsMock, createCrowdstrikeAgentDetails: createCrowdstrikeAgentDetailsMock, createConnectorActionsClient: createConnectorActionsClientMock, createConstructorOptions: createConstructorOptionsMock, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.test.ts index 2f89b218f51e9..d0cbb85001637 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.test.ts @@ -6,7 +6,7 @@ */ import type { GetAgentStatusOptions } from './agent_status'; -import { getAgentStatus, SENTINEL_ONE_NETWORK_STATUS } from './agent_status'; +import { getSentinelOneAgentStatus, SENTINEL_ONE_NETWORK_STATUS } from './agent_status'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { sentinelOneMock } from '../actions/clients/sentinelone/mocks'; import { responseActionsClientMock } from '../actions/clients/mocks'; @@ -18,7 +18,7 @@ describe('Endpoint Get Agent Status service', () => { agentStatusOptions = { agentType: 'sentinel_one', agentIds: ['1', '2'], - logger: loggingSystemMock.create().get('getAgentStatus'), + logger: loggingSystemMock.create().get('getSentinelOneAgentStatus'), connectorActionsClient: sentinelOneMock.createConnectorActionsClient(), }; }); @@ -27,7 +27,7 @@ describe('Endpoint Get Agent Status service', () => { (agentStatusOptions.connectorActionsClient.getAll as jest.Mock).mockImplementation(async () => { throw new Error('boom'); }); - const getStatusResponsePromise = getAgentStatus(agentStatusOptions); + const getStatusResponsePromise = getSentinelOneAgentStatus(agentStatusOptions); await expect(getStatusResponsePromise).rejects.toHaveProperty( 'message', @@ -38,7 +38,7 @@ describe('Endpoint Get Agent Status service', () => { it('should throw error if no SentinelOne connector is registered', async () => { (agentStatusOptions.connectorActionsClient.getAll as jest.Mock).mockResolvedValue([]); - const getStatusResponsePromise = getAgentStatus(agentStatusOptions); + const getStatusResponsePromise = getSentinelOneAgentStatus(agentStatusOptions); await expect(getStatusResponsePromise).rejects.toHaveProperty( 'message', @@ -48,7 +48,7 @@ describe('Endpoint Get Agent Status service', () => { }); it('should send api request to SentinelOne', async () => { - await getAgentStatus(agentStatusOptions); + await getSentinelOneAgentStatus(agentStatusOptions); expect(agentStatusOptions.connectorActionsClient.execute).toHaveBeenCalledWith({ actionId: 's1-connector-instance-id', @@ -68,7 +68,7 @@ describe('Endpoint Get Agent Status service', () => { serviceMessage: 'boom', }) ); - const getStatusResponsePromise = getAgentStatus(agentStatusOptions); + const getStatusResponsePromise = getSentinelOneAgentStatus(agentStatusOptions); await expect(getStatusResponsePromise).rejects.toHaveProperty( 'message', @@ -98,7 +98,7 @@ describe('Endpoint Get Agent Status service', () => { }) ); - await expect(getAgentStatus(agentStatusOptions)).resolves.toEqual({ + await expect(getSentinelOneAgentStatus(agentStatusOptions)).resolves.toEqual({ aaa: { agentType: 'sentinel_one', found: true, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.ts index d7268bb494943..1f5141b2bb0f7 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/agent_status.ts @@ -28,8 +28,7 @@ export interface GetAgentStatusOptions { connectorActionsClient: ActionsClient; logger: Logger; } - -export const getAgentStatus = async ({ +export const getSentinelOneAgentStatus = async ({ agentType, agentIds, connectorActionsClient, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/crowdstrike_agent_status_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/crowdstrike_agent_status_client.test.ts new file mode 100644 index 0000000000000..cd70ac070d115 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/crowdstrike_agent_status_client.test.ts @@ -0,0 +1,300 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { estypes } from '@elastic/elasticsearch'; +import { + CrowdstrikeAgentStatusClient, + CROWDSTRIKE_NETWORK_STATUS, + CROWDSTRIKE_STATUS_RESPONSE, +} from './crowdstrike_agent_status_client'; +import { NormalizedExternalConnectorClient } from '../../..'; +import { AgentStatusClientError } from '../errors'; +import { HostStatus } from '../../../../../../common/endpoint/types'; +import { CrowdstrikeMock } from '../../../actions/clients/crowdstrike/mocks'; +import { responseActionsClientMock } from '../../../actions/clients/mocks'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { RawCrowdstrikeInfo } from './types'; + +jest.mock('../../..', () => ({ + NormalizedExternalConnectorClient: jest.fn(), + getPendingActionsSummary: jest.fn().mockResolvedValue([]), +})); + +const baseResponse = { + took: 1, + timed_out: false, + _shards: { total: 1, successful: 1, skipped: 0, failed: 0 }, +}; + +const getMockSearchResponse = ( + status: CROWDSTRIKE_NETWORK_STATUS, + agentName: string, + wrongAgentName?: boolean +) => ({ + ...baseResponse, + hits: { + hits: [ + { + _id: '1', + _index: 'index', + fields: { 'crowdstrike.host.id': [agentName] }, + inner_hits: { + most_recent: { + hits: { + hits: [ + { + _id: '1', + _index: 'index', + _source: { + crowdstrike: { + host: { + id: !wrongAgentName ? agentName : 'wrongAgentName', + last_seen: '2023-01-01', + status, + }, + }, + }, + }, + ], + }, + }, + }, + }, + ], + }, +}); +describe('CrowdstrikeAgentStatusClient', () => { + let client: CrowdstrikeAgentStatusClient; + const constructorOptions = responseActionsClientMock.createConstructorOptions(); + + beforeEach(() => { + client = new CrowdstrikeAgentStatusClient({ + esClient: constructorOptions.esClient, + soClient: savedObjectsClientMock.create(), + connectorActionsClient: CrowdstrikeMock.createConnectorActionsClient(), + endpointService: constructorOptions.endpointService, + }); + }); + + describe('getAgentStatusFromConnectorAction', () => { + it('should get agent status from connector action', async () => { + const agentIds = ['agent1', 'agent2']; + const mockExecute = jest.fn().mockResolvedValue({ + data: { + resources: [ + { id: 'agent1', state: CROWDSTRIKE_STATUS_RESPONSE.ONLINE }, + { id: 'agent2', state: CROWDSTRIKE_STATUS_RESPONSE.OFFLINE }, + ], + }, + }); + + (NormalizedExternalConnectorClient as jest.Mock).mockImplementation(() => ({ + setup: jest.fn(), + execute: mockExecute, + })); + + // @ts-expect-error private method + const result = await client.getAgentStatusFromConnectorAction(agentIds); + + expect(mockExecute).toHaveBeenCalledWith({ + params: { + subAction: 'getAgentOnlineStatus', + subActionParams: { + ids: agentIds, + }, + }, + }); + + expect(result).toEqual({ + agent1: { id: 'agent1', state: CROWDSTRIKE_STATUS_RESPONSE.ONLINE }, + agent2: { id: 'agent2', state: CROWDSTRIKE_STATUS_RESPONSE.OFFLINE }, + }); + }); + }); + + describe('getAgentStatuses', () => { + beforeEach(() => { + // @ts-expect-error private method + (client.getAgentStatusFromConnectorAction as Jest.Mock) = jest.fn(); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('should return found false when there is no agent.host.id', async () => { + const agentIds = ['agent1']; + const searchResponse: estypes.SearchResponse = getMockSearchResponse( + CROWDSTRIKE_NETWORK_STATUS.NORMAL, + 'agent1', + true + ); + + constructorOptions.esClient.search.mockResolvedValueOnce(searchResponse); + + const agentStatusResponse = { + agent1: { id: 'agent1', state: CROWDSTRIKE_STATUS_RESPONSE.ONLINE }, + }; + // @ts-expect-error private method + (client.getAgentStatusFromConnectorAction as Jest.Mock).mockResolvedValue( + agentStatusResponse + ); + + const result = await client.getAgentStatuses(agentIds); + + expect(constructorOptions.esClient.search).toHaveBeenCalled(); + expect(result).toEqual({ + agent1: { + agentId: 'agent1', + agentType: 'crowdstrike', + found: false, + isolated: false, + lastSeen: '2023-01-01', + status: HostStatus.HEALTHY, + pendingActions: {}, + }, + }); + }); + it('should accept NORMAL status', async () => { + const agentIds = ['agent1']; + const searchResponse: estypes.SearchResponse = getMockSearchResponse( + CROWDSTRIKE_NETWORK_STATUS.NORMAL, + 'agent1' + ); + + constructorOptions.esClient.search.mockResolvedValueOnce(searchResponse); + + const agentStatusResponse = { + agent1: { id: 'agent1', state: CROWDSTRIKE_STATUS_RESPONSE.ONLINE }, + }; + // @ts-expect-error private method + (client.getAgentStatusFromConnectorAction as Jest.Mock).mockResolvedValue( + agentStatusResponse + ); + + const result = await client.getAgentStatuses(agentIds); + + expect(constructorOptions.esClient.search).toHaveBeenCalled(); + expect(result).toEqual({ + agent1: { + agentId: 'agent1', + agentType: 'crowdstrike', + found: true, + isolated: false, + lastSeen: '2023-01-01', + status: HostStatus.HEALTHY, + pendingActions: {}, + }, + }); + }); + + it('should accept CONTAINED STATUS ', async () => { + const agentIds = ['agent2']; + const searchResponse: estypes.SearchResponse = getMockSearchResponse( + CROWDSTRIKE_NETWORK_STATUS.CONTAINED, + 'agent2' + ); + constructorOptions.esClient.search.mockResolvedValueOnce(searchResponse); + + const agentStatusResponse = { + agent2: { id: 'agent2', state: CROWDSTRIKE_STATUS_RESPONSE.OFFLINE }, + }; + + // @ts-expect-error private method + (client.getAgentStatusFromConnectorAction as Jest.Mock).mockResolvedValue( + agentStatusResponse + ); + + const result = await client.getAgentStatuses(agentIds); + + expect(constructorOptions.esClient.search).toHaveBeenCalled(); + expect(result).toEqual({ + agent2: { + agentId: 'agent2', + agentType: 'crowdstrike', + found: true, + isolated: true, + lastSeen: '2023-01-01', + status: HostStatus.OFFLINE, + pendingActions: {}, + }, + }); + }); + it('should set isolated to false if host is pending isolate', async () => { + const agentIds = ['agent2']; + const searchResponse: estypes.SearchResponse = getMockSearchResponse( + CROWDSTRIKE_NETWORK_STATUS.CONTAINMENT_PENDING, + 'agent2' + ); + constructorOptions.esClient.search.mockResolvedValueOnce(searchResponse); + + const agentStatusResponse = { + agent2: { id: 'agent2', state: CROWDSTRIKE_STATUS_RESPONSE.OFFLINE }, + }; + + // @ts-expect-error private method + (client.getAgentStatusFromConnectorAction as Jest.Mock).mockResolvedValue( + agentStatusResponse + ); + + const result = await client.getAgentStatuses(agentIds); + + expect(constructorOptions.esClient.search).toHaveBeenCalled(); + expect(result).toEqual({ + agent2: { + agentId: 'agent2', + agentType: 'crowdstrike', + found: true, + isolated: false, + lastSeen: '2023-01-01', + status: HostStatus.OFFLINE, + pendingActions: {}, + }, + }); + }); + it('should set isolated to true if host is pending release', async () => { + const agentIds = ['agent2']; + const searchResponse: estypes.SearchResponse = getMockSearchResponse( + CROWDSTRIKE_NETWORK_STATUS.LIFT_CONTAINMENT_PENDING, + 'agent2' + ); + constructorOptions.esClient.search.mockResolvedValueOnce(searchResponse); + + const agentStatusResponse = { + agent2: { id: 'agent2', state: CROWDSTRIKE_STATUS_RESPONSE.OFFLINE }, + }; + + // @ts-expect-error private method + (client.getAgentStatusFromConnectorAction as Jest.Mock).mockResolvedValue( + agentStatusResponse + ); + + const result = await client.getAgentStatuses(agentIds); + + expect(constructorOptions.esClient.search).toHaveBeenCalled(); + expect(result).toEqual({ + agent2: { + agentId: 'agent2', + agentType: 'crowdstrike', + found: true, + isolated: true, + lastSeen: '2023-01-01', + pendingActions: {}, + status: HostStatus.OFFLINE, + }, + }); + }); + it('should handle error and log it', async () => { + const agentIds = ['agent1', 'agent2']; + const error = new Error('ES search failed'); + constructorOptions.esClient.search.mockRejectedValue(error); + + await expect(client.getAgentStatuses(agentIds)).rejects.toThrow(AgentStatusClientError); + + // @ts-expect-error private method + expect(client.log.error).toHaveBeenCalledWith(expect.any(AgentStatusClientError)); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/crowdstrike_agent_status_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/crowdstrike_agent_status_client.ts new file mode 100644 index 0000000000000..61d0ae9a7ef5e --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/crowdstrike_agent_status_client.ts @@ -0,0 +1,177 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + CROWDSTRIKE_CONNECTOR_ID, + SUB_ACTION, +} from '@kbn/stack-connectors-plugin/common/crowdstrike/constants'; +import type { ActionTypeExecutorResult } from '@kbn/actions-plugin/common'; +import type { CrowdstrikeGetAgentOnlineStatusResponse } from '@kbn/stack-connectors-plugin/common/crowdstrike/types'; +import { keyBy } from 'lodash'; +import type { ActionsClient } from '@kbn/actions-plugin/server'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../../../common/constants'; +import type { RawCrowdstrikeInfo } from './types'; +import { catchAndWrapError } from '../../../../utils'; +import { getPendingActionsSummary, NormalizedExternalConnectorClient } from '../../..'; +import { type AgentStatusRecords, HostStatus } from '../../../../../../common/endpoint/types'; +import type { ResponseActionAgentType } from '../../../../../../common/endpoint/service/response_actions/constants'; +import { AgentStatusClient } from '../lib/base_agent_status_client'; +import { AgentStatusClientError } from '../errors'; + +const CROWDSTRIKE_AGENT_INDEX_PATTERN = `logs-crowdstrike.host-*`; + +export enum CROWDSTRIKE_NETWORK_STATUS { + NORMAL = 'normal', + CONTAINED = 'contained', + LIFT_CONTAINMENT_PENDING = 'lift_containment_pending', + CONTAINMENT_PENDING = 'containment_pending', +} + +export enum CROWDSTRIKE_STATUS_RESPONSE { + ONLINE = 'online', + OFFLINE = 'offline', + UNKNOWN = 'unknown', +} + +export class CrowdstrikeAgentStatusClient extends AgentStatusClient { + protected readonly agentType: ResponseActionAgentType = 'crowdstrike'; + + private async getAgentStatusFromConnectorAction(agentIds: string[]) { + const connectorActions = new NormalizedExternalConnectorClient( + this.options.connectorActionsClient as ActionsClient, + this.log + ); + connectorActions.setup(CROWDSTRIKE_CONNECTOR_ID); + + const agentStatusResponse = (await connectorActions.execute({ + params: { + subAction: SUB_ACTION.GET_AGENT_ONLINE_STATUS, + subActionParams: { + ids: agentIds, + }, + }, + })) as ActionTypeExecutorResult; + + return keyBy(agentStatusResponse.data?.resources, 'id'); + } + + async getAgentStatuses(agentIds: string[]): Promise { + const esClient = this.options.esClient; + const metadataService = this.options.endpointService.getEndpointMetadataService(); + const sortField = 'crowdstrike.host.last_seen'; + + const query = { + bool: { + must: [ + { + bool: { + filter: [ + { + terms: { + 'crowdstrike.host.id': agentIds, + }, + }, + ], + }, + }, + ], + }, + }; + + try { + const [searchResponse, allPendingActions] = await Promise.all([ + esClient.search( + { + index: CROWDSTRIKE_AGENT_INDEX_PATTERN, + from: 0, + size: DEFAULT_MAX_TABLE_QUERY_SIZE, + query, + collapse: { + // TODO: check if we should use crowdstrike.cid instead + field: 'crowdstrike.host.id', + inner_hits: { + name: 'most_recent', + size: 1, + sort: [ + { + [sortField]: { + order: 'desc', + }, + }, + ], + }, + }, + sort: [ + { + [sortField]: { + order: 'desc', + }, + }, + ], + _source: false, + }, + { ignore: [404] } + ), + + getPendingActionsSummary(esClient, metadataService, this.log, agentIds), + ]).catch(catchAndWrapError); + + const mostRecentAgentInfosByAgentId = searchResponse?.hits?.hits?.reduce< + Record + >((acc, hit) => { + // TODO TC: check if we should use crowdstrike.cid instead + if (hit.fields?.['crowdstrike.host.id'][0]) { + acc[hit.fields?.['crowdstrike.host.id'][0]] = + hit.inner_hits?.most_recent.hits.hits[0]._source; + } + + return acc; + }, {}); + + const agentStatuses = await this.getAgentStatusFromConnectorAction(agentIds); + + return agentIds.reduce((acc, agentId) => { + const agentInfo = mostRecentAgentInfosByAgentId[agentId].crowdstrike; + + const agentStatus = agentStatuses[agentId]; + const pendingActions = allPendingActions.find( + (agentPendingActions) => agentPendingActions.agent_id === agentId + ); + + acc[agentId] = { + agentId, + agentType: this.agentType, + // TODO: check if we should use crowdstrike.cid instead + found: agentInfo?.host.id === agentId, + isolated: + agentInfo?.host.status === CROWDSTRIKE_NETWORK_STATUS.CONTAINED || + agentInfo?.host.status === CROWDSTRIKE_NETWORK_STATUS.LIFT_CONTAINMENT_PENDING, + lastSeen: agentInfo?.host.last_seen || '', + status: + agentStatus?.state === CROWDSTRIKE_STATUS_RESPONSE.ONLINE + ? HostStatus.HEALTHY + : // TODO TC: not sure what the UNKNOWN is - still to be figured + agentStatus?.state === CROWDSTRIKE_STATUS_RESPONSE.UNKNOWN + ? HostStatus.OFFLINE + : HostStatus.OFFLINE, + + pendingActions: pendingActions?.pending_actions ?? {}, + }; + + return acc; + }, {}); + } catch (err) { + const error = new AgentStatusClientError( + `Failed to fetch crowdstrike agent status for agentIds: [${agentIds}], failed with: ${err.message}`, + 500, + err + ); + this.log.error(error); + throw error; + } + } +} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/types.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/types.ts new file mode 100644 index 0000000000000..87998a86b0c7c --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/crowdstrike/types.ts @@ -0,0 +1,268 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { CROWDSTRIKE_NETWORK_STATUS } from './crowdstrike_agent_status_client'; + +interface Agent { + name: string; + id: string; + ephemeral_id: string; + type: string; + version: string; +} + +interface ElasticAgent { + id: string; + version: string; + snapshot: boolean; +} + +interface Error { + message: string[]; +} + +interface Input { + type: string; +} + +interface Ecs { + version: string; +} + +interface Related { + hosts: string[]; + ip: string[]; + hash: string[]; +} + +interface DataStream { + namespace: string; + type: string; + dataset: string; +} + +interface Geo { + continent_name: string; + region_iso_code: string; + city_name: string; + country_iso_code: string; + country_name: string; + location: { + lon: number; + lat: number; + }; + region_name: string; +} + +interface Os { + platform: string; + full: string; +} + +interface Host { + geo: Geo; + hostname: string; + os: Os; + ip: string[]; + mac: string[]; +} + +interface Policy { + policy_type: string; + assigned_date: string; + policy_id: string; + applied: boolean; + applied_date: string; +} + +interface GlobalConfigPolicy extends Policy { + settings_hash: string; +} + +type DeviceControlPolicy = Policy; + +interface FirewallPolicy extends Policy { + rule_set_id: string; +} + +interface RemoteResponsePolicy extends Policy { + settings_hash: string; +} + +interface SensorUpdatePolicy extends Policy { + uninstall_protection: string; + settings_hash: string; +} + +interface PreventionPolicy extends Policy { + rule_groups: unknown[]; + settings_hash: string; +} + +interface DevicePolicies { + global_config: GlobalConfigPolicy; + device_control: DeviceControlPolicy; + firewall: FirewallPolicy; + remote_response: RemoteResponsePolicy; + sensor_update: SensorUpdatePolicy; + prevention: PreventionPolicy; +} + +interface Json { + connection_ip: string; + chassis_type: string; + reduced_functionality_mode: string; + first_seen: string; + system_manufacturer: string; + config_id_base: string; + last_seen: string; + chassis_type_desc: string; + policies: Array<{ + applied: boolean; + applied_date: string; + assigned_date: string; + policy_id: string; + policy_type: string; + rule_groups: unknown[]; + settings_hash: string; + }>; + cpu_signature: string; + machine_domain: string; + minor_version: string; + system_product_name: string; + hostname: string; + os_build: string; + mac_address: string; + product_type_desc: string; + platform_name: string; + external_ip: string; + agent_load_flags: string; + device_id: string; + group_hash: string; + provision_status: string; + os_version: string; + groups: string[]; + serial_number: string; + bios_version: string; + modified_timestamp: string; + tags: string[]; + local_ip: string; + site_name: string; + agent_version: string; + major_version: string; + kernel_version: string; + meta: { + version: string; + version_string: string; + }; + agent_local_time: string; + bios_manufacturer: string; + platform_id: string; + device_policies: DevicePolicies; + config_id_build: string; + config_id_platform: string; + cid: string; + status: string; +} + +interface Event { + agent_id_status: string; + ingested: string; + original: string; + kind: string; + category: string[]; + type: string[]; + dataset: string; +} + +interface CrowdstrikeHost { + connection_ip: string; + agent: { + local_time: string; + load_flags: string; + version: string; + }; + chassis_type: { + value: string; + desc: string; + }; + reduced_functionality_mode: string; + first_seen: string; + last_seen: string; + bios: { + version: string; + manufacturer: string; + }; + policies: Policy[]; + cpu_signature: string; + machine_domain: string; + platform: { + name: string; + id: string; + }; + minor_version: string; + hostname: string; + mac_address: string; + product_type_desc: string; + id: string; + external_ip: string; + os: { + build: string; + version: string; + }; + group_hash: string; + provision_status: string; + groups: string[]; + serial_number: string; + modified_timestamp: string; + tags: string[]; + local_ip: string; + site_name: string; + major_version: string; + system: { + product_name: string; + manufacturer: string; + }; + kernel_version: string; + config_id: { + build: string; + platform: string; + base: string; + }; + meta: { + version: string; + version_string: string; + }; + device_policies: DevicePolicies; + cid: string; + status: CROWDSTRIKE_NETWORK_STATUS; +} + +interface Crowdstrike { + host: CrowdstrikeHost; +} + +interface Device { + id: string; +} + +export interface RawCrowdstrikeInfo { + agent: Agent; + elastic_agent: ElasticAgent; + error: Error; + tags: string[]; + input: Input; + '@timestamp': string; + ecs: Ecs; + related: Related; + data_stream: DataStream; + host: Host; + json: Json; + event: Event; + crowdstrike: Crowdstrike; + device: Device; +} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.test.ts new file mode 100644 index 0000000000000..0290bd3e9d562 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getAgentStatusClient } from './get_agent_status_client'; +import { EndpointAgentStatusClient } from './endpoint/endpoint_agent_status_client'; +import { SentinelOneAgentStatusClient } from './sentinel_one/sentinel_one_agent_status_client'; +import { CrowdstrikeAgentStatusClient } from './crowdstrike/crowdstrike_agent_status_client'; +import { UnsupportedAgentTypeError } from './errors'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import { CrowdstrikeMock } from '../../actions/clients/crowdstrike/mocks'; +import { responseActionsClientMock } from '../../actions/clients/mocks'; + +describe('getAgentStatusClient', () => { + const mockedConstructorOptions = responseActionsClientMock.createConstructorOptions(); + const constructorOptions = { + esClient: mockedConstructorOptions.esClient, + soClient: savedObjectsClientMock.create(), + connectorActionsClient: CrowdstrikeMock.createConnectorActionsClient(), + endpointService: mockedConstructorOptions.endpointService, + }; + + it('returns an EndpointAgentStatusClient for endpoint agent type', () => { + const client = getAgentStatusClient('endpoint', constructorOptions); + expect(client).toBeInstanceOf(EndpointAgentStatusClient); + }); + + it('returns a SentinelOneAgentStatusClient for sentinel_one agent type', () => { + const client = getAgentStatusClient('sentinel_one', constructorOptions); + expect(client).toBeInstanceOf(SentinelOneAgentStatusClient); + }); + + it('returns a CrowdstrikeAgentStatusClient for crowdstrike agent type', () => { + const client = getAgentStatusClient('crowdstrike', constructorOptions); + expect(client).toBeInstanceOf(CrowdstrikeAgentStatusClient); + }); + + it('throws an UnsupportedAgentTypeError for unsupported agent type', () => { + // @ts-expect-error testing unsupported agent type + expect(() => getAgentStatusClient('unsupported_agent_type', constructorOptions)).toThrow( + UnsupportedAgentTypeError + ); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.ts index 9c337d997c49c..6adbbb05d3408 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/get_agent_status_client.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { CrowdstrikeAgentStatusClient } from './crowdstrike/crowdstrike_agent_status_client'; import { SentinelOneAgentStatusClient } from './sentinel_one/sentinel_one_agent_status_client'; import type { AgentStatusClientInterface } from './lib/types'; import type { AgentStatusClientOptions } from './lib/base_agent_status_client'; @@ -27,8 +28,8 @@ export const getAgentStatusClient = ( return new EndpointAgentStatusClient(constructorOptions); case 'sentinel_one': return new SentinelOneAgentStatusClient(constructorOptions); - // case 'crowdstrike': - // // TODO TC: Currently we do not support CrowdStrike agent status - will be done in a follow up PR + case 'crowdstrike': + return new CrowdstrikeAgentStatusClient(constructorOptions); default: throw new UnsupportedAgentTypeError( `Agent type [${agentType}] does not support agent status` diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/lib/base_agent_status_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/lib/base_agent_status_client.ts index 7722427fc18c8..19b90ff5d09ab 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/lib/base_agent_status_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/lib/base_agent_status_client.ts @@ -7,6 +7,7 @@ import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import type { Logger } from '@kbn/logging'; import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import type { ActionsClient } from '@kbn/actions-plugin/server'; import type { AgentStatusRecords } from '../../../../../../common/endpoint/types/agents'; import type { ResponseActionAgentType } from '../../../../../../common/endpoint/service/response_actions/constants'; import type { EndpointAppContextService } from '../../../../endpoint_app_context_services'; @@ -17,6 +18,7 @@ export interface AgentStatusClientOptions { endpointService: EndpointAppContextService; esClient: ElasticsearchClient; soClient: SavedObjectsClientContract; + connectorActionsClient?: ActionsClient; } export abstract class AgentStatusClient implements AgentStatusClientInterface { diff --git a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/sentinel_one/sentinel_one_agent_status_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/sentinel_one/sentinel_one_agent_status_client.ts index 2335cff5db8d3..3509cee521fc0 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/sentinel_one/sentinel_one_agent_status_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/agent/clients/sentinel_one/sentinel_one_agent_status_client.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../../../common/constants'; import { catchAndWrapError } from '../../../../utils'; import { getPendingActionsSummary } from '../../..'; import type { RawSentinelOneInfo } from './types'; @@ -54,7 +55,7 @@ export class SentinelOneAgentStatusClient extends AgentStatusClient { { index: SENTINEL_ONE_AGENT_INDEX_PATTERN, from: 0, - size: 10000, + size: DEFAULT_MAX_TABLE_QUERY_SIZE, query, collapse: { field: 'sentinel_one.agent.uuid', diff --git a/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts b/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts index b7e8b8ab87548..c367c3d1bd91a 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/feature_usage/feature_keys.ts @@ -23,6 +23,8 @@ export const FEATURE_KEYS = { GET_FILE: 'Get file', UPLOAD: 'Upload file', EXECUTE: 'Execute command', + // TODO: for API changes in a subsequent PR + // SCAN: 'Scan files', ALERTS_BY_PROCESS_ANCESTRY: 'Get related alerts by process ancestry', ENDPOINT_EXCEPTIONS: 'Endpoint exceptions', } as const; @@ -39,6 +41,8 @@ const RESPONSE_ACTIONS_FEATURE_KEY: Readonly; @@ -104,8 +103,20 @@ export const InvestigationFieldsCombined = z.union([ LegacyInvestigationFields, ]); +/** + * This is the same type as RuleSource, but with the keys in camelCase. Intended + * for internal use only (not for API responses). + */ export type RuleSourceCamelCased = z.infer; -export const RuleSourceCamelCased = RuleSource.transform(convertObjectKeysToCamelCase); +export const RuleSourceCamelCased = z.discriminatedUnion('type', [ + z.object({ + type: z.literal('external'), + isCustomized: IsExternalRuleCustomized, + }), + z.object({ + type: z.literal('internal'), + }), +]); // Conversion to an interface has to be disabled for the entire file; otherwise, // the resulting union would not be assignable to Alerting's RuleParams due to a diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts b/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts index a0f4e3ec32fee..07e098b1cc979 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts @@ -8,7 +8,7 @@ import axios from 'axios'; import * as rx from 'rxjs'; import _, { cloneDeep } from 'lodash'; -import type { Logger } from '@kbn/core/server'; +import type { Logger, LogMeta } from '@kbn/core/server'; import type { TelemetryPluginSetup, TelemetryPluginStart } from '@kbn/telemetry-plugin/server'; import { type IUsageCounter } from '@kbn/usage-collection-plugin/server/usage_counters/usage_counter'; import type { ITelemetryReceiver } from './receiver'; @@ -106,16 +106,21 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { .subscribe({ next: (result: Result) => { if (isFailure(result)) { - this.logger.l( - `Failure! unable to send ${result.events} events to channel "${result.channel}": ${result.message}` - ); + this.logger.warn('Failure! Unable to send events to channel', { + events: result.events, + channel: result.channel, + error: result.message, + } as LogMeta); this.senderUtils?.incrementCounter( TelemetryCounter.DOCS_LOST, result.events, result.channel ); } else { - this.logger.l(`Success! ${result.events} events sent to channel "${result.channel}"`); + this.logger.debug('Success! events sent to channel', { + events: result.events, + channel: result.channel, + } as LogMeta); this.senderUtils?.incrementCounter( TelemetryCounter.DOCS_SENT, result.events, @@ -124,7 +129,9 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { } }, error: (err) => { - this.logger.l(`Unexpected error: "${err}"`); + this.logger.warn('Unexpected error sending events to channel', { + error: JSON.stringify(err), + } as LogMeta); }, complete: () => { this.logger.l('Shutting down'); @@ -298,7 +305,10 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { } private async sendEvents(channel: TelemetryChannel, events: string[]): Promise { - this.logger.l(`Sending ${events.length} telemetry events to channel "${channel}"`); + this.logger.debug('Sending telemetry events to channel', { + events: events.length, + channel, + } as LogMeta); try { const senderMetadata = await this.getSenderMetadata(channel); @@ -311,22 +321,23 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { channel ); - this.logger.l(`Unable to send events to channel "${channel}": Telemetry is not opted-in.`); + this.logger.warn('Unable to send events to channel: Telemetry is not opted-in.', { + channel, + } as LogMeta); throw newFailure('Telemetry is not opted-in', channel, events.length); } const isElasticTelemetryReachable = await senderMetadata.isTelemetryServicesReachable(); if (!isElasticTelemetryReachable) { - this.logger.l('Telemetry Services are not reachable.'); + this.logger.warn('Telemetry Services are not reachable.', { + channel, + } as LogMeta); this.senderUtils?.incrementCounter( TelemetryCounter.TELEMETRY_NOT_REACHABLE, events.length, channel ); - this.logger.l( - `Unable to send events to channel "${channel}": Telemetry services are not reachable.` - ); throw newFailure('Telemetry Services are not reachable', channel, events.length); } @@ -353,7 +364,9 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { if (r.status < 400) { return { events: events.length, channel }; } else { - this.logger.l(`Unexpected response, got ${r.status}`); + this.logger.l('Unexpected response', { + status: r.status, + } as LogMeta); throw newFailure(`Got ${r.status}`, channel, events.length); } }) @@ -364,7 +377,9 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { channel ); - this.logger.l(`Runtime error: ${err.message}`); + this.logger.warn('Runtime error', { + error: err.message, + } as LogMeta); throw newFailure(`Error posting events: ${err}`, channel, events.length); }); } catch (err: unknown) { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts index f4cf62a4381b6..96734963a687c 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -10,6 +10,7 @@ import { cloneDeep } from 'lodash'; import type { Logger, + LogMeta, CoreStart, IScopedClusterClient, ElasticsearchClient, @@ -528,10 +529,10 @@ export class TelemetryReceiver implements ITelemetryReceiver { } public async *fetchDiagnosticAlertsBatch(executeFrom: string, executeTo: string) { - this.logger.l('Searching diagnostic alerts', { + this.logger.debug('Searching diagnostic alerts', { from: executeFrom, to: executeTo, - }); + } as LogMeta); let pitId = await this.openPointInTime(DEFAULT_DIAGNOSTIC_INDEX); let fetchMore = true; @@ -572,7 +573,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { fetchMore = false; } - this.logger.l('Diagnostic alerts to return', { numOfHits }); + this.logger.debug('Diagnostic alerts to return', { numOfHits } as LogMeta); fetchMore = numOfHits > 0 && numOfHits < telemetryConfiguration.telemetry_max_buffer_size; } catch (e) { this.logger.l('Error fetching alerts', { error: JSON.stringify(e) }); @@ -744,10 +745,10 @@ export class TelemetryReceiver implements ITelemetryReceiver { } public async *fetchPrebuiltRuleAlertsBatch(executeFrom: string, executeTo: string) { - this.logger.l('Searching prebuilt rule alerts from', { + this.logger.debug('Searching prebuilt rule alerts from', { executeFrom, executeTo, - }); + } as LogMeta); let pitId = await this.openPointInTime(DEFAULT_DIAGNOSTIC_INDEX); let fetchMore = true; @@ -882,7 +883,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { pitId = response?.pit_id; } - this.logger.l('Prebuilt rule alerts to return', { alerts: alerts.length }); + this.logger.debug('Prebuilt rule alerts to return', { alerts: alerts.length } as LogMeta); yield alerts; } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts index 0f21cb58824f6..25dd07d4ef986 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts @@ -9,7 +9,7 @@ import { cloneDeep } from 'lodash'; import { URL } from 'url'; import { transformDataToNdjson } from '@kbn/securitysolution-utils'; -import type { Logger } from '@kbn/core/server'; +import type { Logger, LogMeta } from '@kbn/core/server'; import type { TelemetryPluginStart, TelemetryPluginSetup } from '@kbn/telemetry-plugin/server'; import type { UsageCounter } from '@kbn/usage-collection-plugin/server'; import type { AxiosInstance } from 'axios'; @@ -22,7 +22,8 @@ import { exhaustMap, Subject, takeUntil, timer } from 'rxjs'; import type { ITelemetryReceiver } from './receiver'; import { copyAllowlistedFields, filterList } from './filterlists'; import { createTelemetryTaskConfigs } from './tasks'; -import { copyLicenseFields, createUsageCounterLabel, tlog } from './helpers'; +import { copyLicenseFields, createUsageCounterLabel, newTelemetryLogger } from './helpers'; +import { type TelemetryLogger } from './telemetry_logger'; import type { TelemetryChannel, TelemetryEvent } from './types'; import type { SecurityTelemetryTaskConfig } from './task'; import { SecurityTelemetryTask } from './task'; @@ -92,7 +93,7 @@ export interface ITelemetryEventsSender { export class TelemetryEventsSender implements ITelemetryEventsSender { private readonly initialCheckDelayMs = 10 * 1000; private readonly checkIntervalMs = 60 * 1000; - private readonly logger: Logger; + private readonly logger: TelemetryLogger; private readonly stop$ = new Subject(); private maxQueueSize = telemetryConfiguration.telemetry_max_buffer_size; private telemetryStart?: TelemetryPluginStart; @@ -111,7 +112,7 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { private asyncTelemetrySender?: IAsyncTelemetryEventsSender; constructor(logger: Logger) { - this.logger = logger.get('telemetry_events'); + this.logger = newTelemetryLogger(logger.get('telemetry_events.sender')); } public setup( @@ -158,11 +159,11 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { this.telemetryStart = telemetryStart; this.receiver = receiver; if (taskManager && this.telemetryTasks) { - tlog(this.logger, `Starting security telemetry tasks`); + this.logger.l('Starting security telemetry tasks'); this.telemetryTasks.forEach((task) => task.start(taskManager)); } - tlog(this.logger, `Starting local task`); + this.logger.l('Starting local task'); timer(this.initialCheckDelayMs, this.checkIntervalMs) .pipe( takeUntil(this.stop$), @@ -177,21 +178,25 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { public queueTelemetryEvents(events: TelemetryEvent[]) { const qlength = this.queue.length; - tlog(this.logger, `Queue length is ${qlength}`); + this.logger.debug('Enqueuing events', { + queue_length: qlength, + events: events.length, + } as LogMeta); if (events.length === 0) { - tlog(this.logger, `No events to queue`); + this.logger.l('No events to queue'); return; } - tlog(this.logger, `Queue ${events.length} events`); - if (qlength >= this.maxQueueSize) { // we're full already - tlog(this.logger, `Queue length is greater than max queue size`); + this.logger.l('Queue length is greater than max queue size'); return; } if (events.length > this.maxQueueSize - qlength) { - tlog(this.logger, `Events exceed remaining queue size ${this.maxQueueSize - qlength}`); + this.logger.l('Events exceed remaining queue size', { + max_queue_size: this.maxQueueSize, + queue_length: qlength, + }); this.telemetryUsageCounter?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix.concat(['queue_stats'])), counterType: 'docs_lost', @@ -204,7 +209,7 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { }); this.queue.push(...this.processEvents(events.slice(0, this.maxQueueSize - qlength))); } else { - tlog(this.logger, `Events fit within queue size`); + this.logger.debug('Events fit within queue size'); this.queue.push(...this.processEvents(events)); } } @@ -265,7 +270,7 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { const telemetryUrl = await this.fetchTelemetryPingUrl(); const resp = await axios.get(telemetryUrl, { timeout: 3000 }); if (resp.status === 200) { - tlog(this.logger, '[Security Telemetry] elastic telemetry services are reachable'); + this.logger.l('[Security Telemetry] elastic telemetry services are reachable'); return true; } @@ -289,7 +294,7 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { this.isOptedIn = await this.isTelemetryOptedIn(); if (!this.isOptedIn) { - tlog(this.logger, `Telemetry is not opted-in.`); + this.logger.l('Telemetry is not opted-in.'); this.queue = []; this.isSending = false; return; @@ -297,7 +302,7 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { this.isElasticTelemetryReachable = await this.isTelemetryServicesReachable(); if (!this.isElasticTelemetryReachable) { - tlog(this.logger, `Telemetry Services are not reachable.`); + this.logger.l('Telemetry Services are not reachable.'); this.queue = []; this.isSending = false; return; @@ -310,11 +315,9 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { this.receiver?.fetchLicenseInfo(), ]); - tlog(this.logger, `Telemetry URL: ${telemetryUrl}`); - tlog( - this.logger, - `cluster_uuid: ${clusterInfo?.cluster_uuid} cluster_name: ${clusterInfo?.cluster_name}` - ); + this.logger.debug('Telemetry URL', { + url: telemetryUrl, + } as LogMeta); const toSend: TelemetryEvent[] = cloneDeep(this.queue).map((event) => ({ ...event, @@ -367,11 +370,9 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { this.receiver?.fetchLicenseInfo(), ]); - tlog(this.logger, `Telemetry URL: ${telemetryUrl}`); - tlog( - this.logger, - `cluster_uuid: ${clusterInfo?.cluster_uuid} cluster_name: ${clusterInfo?.cluster_name}` - ); + this.logger.l('Telemetry URL', { + url: telemetryUrl, + }); await this.sendEvents( toSend, @@ -455,7 +456,10 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { const ndjson = transformDataToNdjson(events); try { - tlog(this.logger, `Sending ${events.length} telemetry events to ${channel}`); + this.logger.debug('Sending telemetry events', { + events: events.length, + channel, + } as LogMeta); const resp = await axiosInstance.post(telemetryUrl, ndjson, { headers: { 'Content-Type': 'application/x-ndjson', @@ -476,9 +480,9 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { counterType: 'docs_sent', incrementBy: events.length, }); - tlog(this.logger, `Events sent!. Response: ${resp.status}`); + this.logger.l('Events sent!. Response', { status: resp.status }); } catch (err) { - tlog(this.logger, `Error sending events: ${err}`); + this.logger.l('Error sending events', { error: JSON.stringify(err) }); const errorStatus = err?.response?.status; if (errorStatus !== undefined && errorStatus !== null) { this.telemetryUsageCounter?.incrementCounter({ diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index bb26581356fa1..68351d1dd48a1 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -201,6 +201,8 @@ "@kbn/deeplinks-security", "@kbn/react-kibana-context-render", "@kbn/search-types", - "@kbn/field-utils" + "@kbn/field-utils", + "@kbn/core-saved-objects-api-server-mocks", + "@kbn/langchain" ] } diff --git a/x-pack/plugins/security_solution_ess/public/upselling/lazy_upselling.tsx b/x-pack/plugins/security_solution_ess/public/upselling/lazy_upselling.tsx new file mode 100644 index 0000000000000..70f39b2ae70e6 --- /dev/null +++ b/x-pack/plugins/security_solution_ess/public/upselling/lazy_upselling.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { lazy } from 'react'; + +import { withSuspenseUpsell } from '@kbn/security-solution-upselling/helpers'; + +export const EntityAnalyticsUpsellingSectionLazy = withSuspenseUpsell( + lazy(() => + import('./sections/entity_analytics_upselling').then( + ({ EntityAnalyticsUpsellingSectionESS }) => ({ + default: EntityAnalyticsUpsellingSectionESS, + }) + ) + ) +); + +export const EntityAnalyticsUpsellingPageLazy = lazy(() => + import('./pages/entity_analytics_upselling').then(({ EntityAnalyticsUpsellingPageESS }) => ({ + default: EntityAnalyticsUpsellingPageESS, + })) +); diff --git a/x-pack/plugins/security_solution_ess/public/upselling/pages/entity_analytics_upselling.tsx b/x-pack/plugins/security_solution_ess/public/upselling/pages/entity_analytics_upselling.tsx new file mode 100644 index 0000000000000..d8d0dec0f914c --- /dev/null +++ b/x-pack/plugins/security_solution_ess/public/upselling/pages/entity_analytics_upselling.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EntityAnalyticsUpsellingPage } from '@kbn/security-solution-upselling/pages/entity_analytics'; +import { useKibana } from '../../common/services'; +import * as i18n from '../translations'; + +export const EntityAnalyticsUpsellingPageESS = () => { + const { services } = useKibana(); + const requiredLicense = 'Platinum'; + + return ( + + ); +}; diff --git a/x-pack/plugins/security_solution_ess/public/upselling/register_upsellings.tsx b/x-pack/plugins/security_solution_ess/public/upselling/register_upsellings.tsx index cb49e2f65a775..2f86c68821ef3 100644 --- a/x-pack/plugins/security_solution_ess/public/upselling/register_upsellings.tsx +++ b/x-pack/plugins/security_solution_ess/public/upselling/register_upsellings.tsx @@ -5,7 +5,14 @@ * 2.0. */ +import type { ILicense, LicenseType } from '@kbn/licensing-plugin/public'; import { SecurityPageName } from '@kbn/security-solution-plugin/common'; +import { + ALERT_SUPPRESSION_RULE_DETAILS, + ALERT_SUPPRESSION_RULE_FORM, + UPGRADE_ALERT_ASSIGNMENTS, + UPGRADE_INVESTIGATION_GUIDE, +} from '@kbn/security-solution-upselling/messages'; import type { MessageUpsellings, PageUpsellings, @@ -14,19 +21,13 @@ import type { UpsellingSectionId, UpsellingService, } from '@kbn/security-solution-upselling/service'; -import type { ILicense, LicenseType } from '@kbn/licensing-plugin/public'; -import React, { lazy } from 'react'; -import { - UPGRADE_ALERT_ASSIGNMENTS, - UPGRADE_INVESTIGATION_GUIDE, - ALERT_SUPPRESSION_RULE_FORM, - ALERT_SUPPRESSION_RULE_DETAILS, -} from '@kbn/security-solution-upselling/messages'; +import type React from 'react'; import type { Services } from '../common/services'; import { withServicesProvider } from '../common/services'; -const EntityAnalyticsUpsellingLazy = lazy( - () => import('@kbn/security-solution-upselling/pages/entity_analytics') -); +import { + EntityAnalyticsUpsellingPageLazy, + EntityAnalyticsUpsellingSectionLazy, +} from './lazy_upselling'; interface UpsellingsConfig { minimumLicenseRequired: LicenseType; @@ -48,7 +49,7 @@ export const registerUpsellings = ( license: ILicense, services: Services ) => { - const upsellingPagesToRegister = upsellingPages(services).reduce( + const upsellingPagesToRegister = upsellingPages.reduce( (pageUpsellings, { pageName, minimumLicenseRequired, component }) => { if (!license.hasAtLeast(minimumLicenseRequired)) { pageUpsellings[pageName] = withServicesProvider(component, services); @@ -61,7 +62,7 @@ export const registerUpsellings = ( const upsellingSectionsToRegister = upsellingSections.reduce( (sectionUpsellings, { id, minimumLicenseRequired, component }) => { if (!license.hasAtLeast(minimumLicenseRequired)) { - sectionUpsellings[id] = component; + sectionUpsellings[id] = withServicesProvider(component, services); } return sectionUpsellings; }, @@ -84,25 +85,23 @@ export const registerUpsellings = ( }; // Upsellings for entire pages, linked to a SecurityPageName -export const upsellingPages: (services: Services) => UpsellingPages = (services) => [ +export const upsellingPages: UpsellingPages = [ // It is highly advisable to make use of lazy loaded components to minimize bundle size. { pageName: SecurityPageName.entityAnalytics, minimumLicenseRequired: 'platinum', - component: () => ( - - ), + component: EntityAnalyticsUpsellingPageLazy, }, ]; // Upsellings for sections, linked by arbitrary ids export const upsellingSections: UpsellingSections = [ // It is highly advisable to make use of lazy loaded components to minimize bundle size. + { + id: 'entity_analytics_panel', + minimumLicenseRequired: 'platinum', + component: EntityAnalyticsUpsellingSectionLazy, + }, ]; // Upsellings for sections, linked by arbitrary ids diff --git a/x-pack/plugins/security_solution_ess/public/upselling/sections/entity_analytics_upselling.tsx b/x-pack/plugins/security_solution_ess/public/upselling/sections/entity_analytics_upselling.tsx new file mode 100644 index 0000000000000..4506999f8bd9d --- /dev/null +++ b/x-pack/plugins/security_solution_ess/public/upselling/sections/entity_analytics_upselling.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EntityAnalyticsUpsellingSection } from '@kbn/security-solution-upselling/sections/entity_analytics'; +import { useKibana } from '../../common/services'; +import * as i18n from '../translations'; + +export const EntityAnalyticsUpsellingSectionESS = () => { + const { services } = useKibana(); + const requiredLicense = 'Platinum'; + return ( + + ); +}; diff --git a/x-pack/plugins/security_solution_ess/public/upselling/translations.ts b/x-pack/plugins/security_solution_ess/public/upselling/translations.ts new file mode 100644 index 0000000000000..9af27d3ca5242 --- /dev/null +++ b/x-pack/plugins/security_solution_ess/public/upselling/translations.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 { i18n } from '@kbn/i18n'; + +export const UPGRADE_LICENSE_MESSAGE = (requiredLicense: string) => + i18n.translate('xpack.securitySolutionEss.upselling.upgradeLicenseMessage', { + defaultMessage: 'This feature is available with {requiredLicense} or higher subscription', + values: { + requiredLicense, + }, + }); diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/lazy_upselling.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/lazy_upselling.tsx index 71f787e19c3bd..b7e4640608928 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/lazy_upselling.tsx +++ b/x-pack/plugins/security_solution_serverless/public/upselling/lazy_upselling.tsx @@ -5,19 +5,9 @@ * 2.0. */ -import React, { lazy, Suspense } from 'react'; -import { EuiLoadingSpinner } from '@elastic/eui'; +import { lazy } from 'react'; -const withSuspenseUpsell = ( - Component: React.ComponentType -): React.FC => - function WithSuspenseUpsell(props) { - return ( - }> - - - ); - }; +import { withSuspenseUpsell } from '@kbn/security-solution-upselling/helpers'; export const ThreatIntelligencePaywallLazy = withSuspenseUpsell( lazy(() => import('./pages/threat_intelligence_paywall')) @@ -31,6 +21,22 @@ export const EndpointExceptionsDetailsUpsellingLazy = withSuspenseUpsell( lazy(() => import('./pages/endpoint_management/endpoint_exceptions_details')) ); -export const EntityAnalyticsUpsellingLazy = withSuspenseUpsell( - lazy(() => import('@kbn/security-solution-upselling/pages/entity_analytics')) +export const EntityAnalyticsUpsellingPageLazy = withSuspenseUpsell( + lazy(() => + import('@kbn/security-solution-upselling/pages/entity_analytics').then( + ({ EntityAnalyticsUpsellingPage }) => ({ + default: EntityAnalyticsUpsellingPage, + }) + ) + ) +); + +export const EntityAnalyticsUpsellingSectionLazy = withSuspenseUpsell( + lazy(() => + import('@kbn/security-solution-upselling/sections/entity_analytics').then( + ({ EntityAnalyticsUpsellingSection }) => ({ + default: EntityAnalyticsUpsellingSection, + }) + ) + ) ); diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx index a16bb4272f720..23c5faf1551cc 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx +++ b/x-pack/plugins/security_solution_serverless/public/upselling/register_upsellings.tsx @@ -4,7 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import type { ProductFeatureKeyType } from '@kbn/security-solution-features'; +import { ProductFeatureKey } from '@kbn/security-solution-features/keys'; import { SecurityPageName } from '@kbn/security-solution-plugin/common'; +import { + UPGRADE_INVESTIGATION_GUIDE, + UPGRADE_INVESTIGATION_GUIDE_INTERACTIONS, +} from '@kbn/security-solution-upselling/messages'; +import type { UpsellingService } from '@kbn/security-solution-upselling/service'; import type { MessageUpsellings, PageUpsellings, @@ -12,31 +19,26 @@ import type { UpsellingMessageId, UpsellingSectionId, } from '@kbn/security-solution-upselling/service/types'; -import type { UpsellingService } from '@kbn/security-solution-upselling/service'; import React from 'react'; -import { - UPGRADE_INVESTIGATION_GUIDE, - UPGRADE_INVESTIGATION_GUIDE_INTERACTIONS, -} from '@kbn/security-solution-upselling/messages'; -import { ProductFeatureKey } from '@kbn/security-solution-features/keys'; -import type { ProductFeatureKeyType } from '@kbn/security-solution-features'; -import { - EndpointAgentTamperProtectionLazy, - EndpointPolicyProtectionsLazy, - EndpointProtectionUpdatesLazy, - RuleDetailsEndpointExceptionsLazy, -} from './sections/endpoint_management'; import type { SecurityProductTypes } from '../../common/config'; import { getProductProductFeatures } from '../../common/pli/pli_features'; +import type { Services } from '../common/services'; +import { withServicesProvider } from '../common/services'; +import { getProductTypeByPLI } from './hooks/use_product_type_by_pli'; import { EndpointExceptionsDetailsUpsellingLazy, - EntityAnalyticsUpsellingLazy, + EntityAnalyticsUpsellingPageLazy, + EntityAnalyticsUpsellingSectionLazy, OsqueryResponseActionsUpsellingSectionLazy, ThreatIntelligencePaywallLazy, } from './lazy_upselling'; -import { getProductTypeByPLI } from './hooks/use_product_type_by_pli'; -import type { Services } from '../common/services'; -import { withServicesProvider } from '../common/services'; +import { + EndpointAgentTamperProtectionLazy, + EndpointPolicyProtectionsLazy, + EndpointProtectionUpdatesLazy, + RuleDetailsEndpointExceptionsLazy, +} from './sections/endpoint_management'; +import * as i18n from './translations'; interface UpsellingsConfig { pli: ProductFeatureKeyType; @@ -73,7 +75,7 @@ export const registerUpsellings = ( const upsellingSectionsToRegister = upsellingSections.reduce( (sectionUpsellings, { id, pli, component }) => { if (!enabledPLIsSet.has(pli)) { - sectionUpsellings[id] = component; + sectionUpsellings[id] = withServicesProvider(component, services); } return sectionUpsellings; }, @@ -102,8 +104,9 @@ export const upsellingPages: UpsellingPages = [ pageName: SecurityPageName.entityAnalytics, pli: ProductFeatureKey.advancedInsights, component: () => ( - ), }, @@ -123,6 +126,8 @@ export const upsellingPages: UpsellingPages = [ }, ]; +const entityAnalyticsProductType = getProductTypeByPLI(ProductFeatureKey.advancedInsights) ?? ''; + // Upselling for sections, linked by arbitrary ids export const upsellingSections: UpsellingSections = [ // It is highly advisable to make use of lazy loaded components to minimize bundle size. @@ -155,6 +160,16 @@ export const upsellingSections: UpsellingSections = [ pli: ProductFeatureKey.endpointProtectionUpdates, component: EndpointProtectionUpdatesLazy, }, + { + id: 'entity_analytics_panel', + pli: ProductFeatureKey.advancedInsights, + component: () => ( + + ), + }, ]; // Upselling for sections, linked by arbitrary ids diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/translations.ts b/x-pack/plugins/security_solution_serverless/public/upselling/translations.ts new file mode 100644 index 0000000000000..971873ca77838 --- /dev/null +++ b/x-pack/plugins/security_solution_serverless/public/upselling/translations.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const UPGRADE_PRODUCT_MESSAGE = (requiredProduct: string) => + i18n.translate( + 'xpack.securitySolutionServerless.upselling.entityAnalytics.upgradeProductMessage', + { + defaultMessage: + 'Entity risk scoring capability is available in our {requiredProduct} license tier', + values: { + requiredProduct, + }, + } + ); diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts index 714ee177212c1..aa9ae18a0a37a 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts @@ -49,7 +49,14 @@ export const getUsageRecords = ( assetCountAggregation.min_timestamp.value_as_string ).toISOString(); - const creationTimestamp = new Date().toISOString(); + const creationTimestamp = new Date(); + const minutes = creationTimestamp.getMinutes(); + if (minutes >= 30) { + creationTimestamp.setMinutes(30, 0, 0); + } else { + creationTimestamp.setMinutes(0, 0, 0); + } + const roundedCreationTimestamp = creationTimestamp.toISOString(); const subType = cloudSecuritySolution === CLOUD_DEFEND @@ -57,9 +64,9 @@ export const getUsageRecords = ( : cloudSecuritySolution; const usageRecord: UsageRecord = { - id: `${CLOUD_SECURITY_TASK_TYPE}_${cloudSecuritySolution}_${projectId}_${creationTimestamp}`, + id: `${CLOUD_SECURITY_TASK_TYPE}_${cloudSecuritySolution}_${projectId}_${roundedCreationTimestamp}`, usage_timestamp: minTimestamp, - creation_timestamp: creationTimestamp, + creation_timestamp: creationTimestamp.toISOString(), usage: { type: CLOUD_SECURITY_TASK_TYPE, sub_type: subType, @@ -258,7 +265,8 @@ export const getCloudSecurityUsageRecord = async ({ if (!(await indexHasDataInDateRange(esClient, cloudSecuritySolution, searchFrom))) return; - const periodSeconds = Math.floor((new Date().getTime() - searchFrom.getTime()) / 1000); + // const periodSeconds = Math.floor((new Date().getTime() - searchFrom.getTime()) / 1000); + const periodSeconds = 1800; // Workaround to prevent overbilling by charging for a constant time window. The issue should be resolved in https://github.com/elastic/security-team/issues/9424. const assetCountAggregations = await getAssetAggByCloudSecuritySolution( esClient, diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connection_details_panel.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connection_details_panel.tsx index db4af56993d76..20a48b3e3076d 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connection_details_panel.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connection_details_panel.tsx @@ -13,9 +13,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiText, - EuiCallOut, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { ConnectorStatus } from '@kbn/search-connectors'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -77,18 +75,6 @@ export const ConnectionDetails: React.FC = ({ {elasticsearchUrl} - {status === ConnectorStatus.CREATED && ( - <> - - - - )} ); }; diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx index b0d1b412526ca..29bbc55d4cd71 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx @@ -5,7 +5,15 @@ * 2.0. */ -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; +import { + EuiButton, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ConnectorStatus } from '@kbn/search-connectors'; import React from 'react'; @@ -82,6 +90,18 @@ export const ConnectorLinkElasticsearch: React.FC + + {status === ConnectorStatus.CREATED ? ( + + + + ) : null} ); diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx index 5efbb9dfb5b9c..6f8dbd0edb4bc 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connectors_table.tsx @@ -38,7 +38,6 @@ import React, { useEffect, useState } from 'react'; import { generatePath } from 'react-router-dom'; import { CONNECTORS_LABEL, - CONNECTOR_LABEL, COPY_CONNECTOR_ID_LABEL, DELETE_CONNECTOR_LABEL, } from '../../../../common/i18n_string'; @@ -256,8 +255,8 @@ export const ConnectorsTable: React.FC = () => { connectors: {CONNECTORS_LABEL}, items: ( - - - + - + ), count: , @@ -297,7 +296,7 @@ const DeleteConnectorModalAction: React.FC<{ connector: Connector }> = ({ connec setModalIsOpen(false)} connectorId={connector.id} - connectorName={connector.name || CONNECTOR_LABEL} + connectorName={connector.name} /> )} diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx index a6ce7b225e6f0..cab4ffabdf9cf 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx @@ -19,6 +19,10 @@ interface DeleteConnectorModalProps { onSuccess?: () => void; } +const DELETE_LABEL = i18n.translate('xpack.serverlessSearch.connectors.deleteModal.deleteLabel', { + defaultMessage: 'DELETE', +}); + export const DeleteConnectorModal: React.FC = ({ connectorId, connectorName, @@ -50,7 +54,7 @@ export const DeleteConnectorModal: React.FC = ({ { closeDeleteModal(); @@ -70,12 +74,12 @@ export const DeleteConnectorModal: React.FC = ({ confirmButtonText={i18n.translate( 'xpack.serverlessSearch.connectors.deleteModal.confirmButton.title', { - defaultMessage: 'Delete index', + defaultMessage: 'Delete connector', } )} defaultFocusedButton="confirm" buttonColor="danger" - confirmButtonDisabled={inputConnectorName.trim() !== connectorName} + confirmButtonDisabled={inputConnectorName.trim() !== (connectorName || DELETE_LABEL)} isLoading={isLoading} >

@@ -83,7 +87,7 @@ export const DeleteConnectorModal: React.FC = ({ 'xpack.serverlessSearch.connectors.deleteModal.syncsWarning.connectorNameDescription', { defaultMessage: 'This action cannot be undone. Please type {connectorName} to confirm.', - values: { connectorName }, + values: { connectorName: connectorName || DELETE_LABEL }, } )}

diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx index 927d3d795aaed..fcd67f30c4b59 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx @@ -103,7 +103,7 @@ export const EditConnector: React.FC = () => { setDeleteModalIsOpen(false)} connectorId={connector.id} - connectorName={connector.name || CONNECTOR_LABEL} + connectorName={connector.name} onSuccess={() => navigateToUrl('./')} /> )} diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx index 85f7a097cb089..b81fc51b07bcf 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx @@ -48,7 +48,7 @@ export const EditName: React.FC = ({ connector }) => { }, onSuccess: (successData) => { queryClient.setQueryData(queryKey, { - connector: { ...connector, service_type: successData }, + connector: { ...connector, name: successData }, }); queryClient.invalidateQueries(queryKey); setIsEditing(false); diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx index 0c7cfab2eca42..fe4b6bd7e9768 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_service_type.tsx @@ -76,6 +76,8 @@ export const EditServiceType: React.FC = ({ connector }) = })} mutate(event)} diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx index ed347e36e7738..26f7a85716a2d 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx @@ -44,7 +44,7 @@ export const ConnectorsOverview = () => { data-test-subj="serverlessSearchConnectorsTitle" restrictWidth rightSideItems={[ - + { +export const useConnectors = () => { const { http } = useKibanaServices(); return useQuery({ - queryKey: ['fetchConnectors', from, size], + queryKey: ['fetchConnectors'], queryFn: () => - http.fetch<{ connectors: Connector[] }>('/internal/serverless_search/connectors', { - query: { from, size }, - }), + http.fetch<{ connectors: Connector[] }>('/internal/serverless_search/connectors'), }); }; diff --git a/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts b/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts index 3b547dba35926..c221d74c3b8a0 100644 --- a/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts +++ b/x-pack/plugins/stack_connectors/common/crowdstrike/constants.ts @@ -12,4 +12,5 @@ export const API_MAX_RESULTS = 1000; export enum SUB_ACTION { GET_AGENT_DETAILS = 'getAgentDetails', HOST_ACTIONS = 'hostActions', + GET_AGENT_ONLINE_STATUS = 'getAgentOnlineStatus', } diff --git a/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts b/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts index 559aebfc7fa39..d19deabd6aeda 100644 --- a/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts +++ b/x-pack/plugins/stack_connectors/common/crowdstrike/schema.ts @@ -17,6 +17,7 @@ export const CrowdstrikeSecretsSchema = schema.object({ clientSecret: schema.string(), }); +export const RelaxedCrowdstrikeBaseApiResponseSchema = schema.object({}, { unknowns: 'allow' }); export const CrowdstrikeBaseApiResponseSchema = schema.object( { resources: schema.arrayOf(schema.any()), @@ -33,44 +34,85 @@ export const CrowdstrikeBaseApiResponseSchema = schema.object( { unknowns: 'allow' } ); +export const CrowdstrikeGetAgentOnlineStatusResponseSchema = schema.object( + { + resources: schema.arrayOf( + schema.object( + { + state: schema.maybe(schema.string()), + id: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ) + ), + errors: schema.nullable(schema.arrayOf(schema.any())), + meta: schema.object( + { + query_time: schema.maybe(schema.number()), + powered_by: schema.maybe(schema.string()), + trace_id: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ), + }, + { unknowns: 'allow' } +); + export const CrowdstrikeGetAgentsResponseSchema = schema.object( { resources: schema.arrayOf( - schema.arrayOf( - schema.object( - { - device_id: schema.maybe(schema.string()), - cid: schema.maybe(schema.string()), - agent_load_flags: schema.maybe(schema.string()), - agent_local_time: schema.maybe(schema.string()), - agent_version: schema.maybe(schema.string()), - bios_manufacturer: schema.maybe(schema.string()), - bios_version: schema.maybe(schema.string()), - config_id_base: schema.maybe(schema.string()), - config_id_build: schema.maybe(schema.string()), - config_id_platform: schema.maybe(schema.string()), - cpu_signature: schema.maybe(schema.string()), - cpu_vendor: schema.maybe(schema.string()), - external_ip: schema.maybe(schema.string()), - mac_address: schema.maybe(schema.string()), - instance_id: schema.maybe(schema.string()), - service_provider: schema.maybe(schema.string()), - service_provider_account_id: schema.maybe(schema.string()), - hostname: schema.maybe(schema.string()), - first_seen: schema.maybe(schema.string()), - last_login_timestamp: schema.maybe(schema.string()), - last_login_user: schema.maybe(schema.string()), - last_login_uid: schema.maybe(schema.string()), - last_seen: schema.maybe(schema.string()), - local_ip: schema.maybe(schema.string()), - major_version: schema.maybe(schema.string()), - minor_version: schema.maybe(schema.string()), - os_version: schema.maybe(schema.string()), - platform_id: schema.maybe(schema.string()), - platform_name: schema.maybe(schema.string()), - policies: schema.maybe( - schema.arrayOf( - schema.object( + schema.object( + { + device_id: schema.maybe(schema.string()), + cid: schema.maybe(schema.string()), + agent_load_flags: schema.maybe(schema.string()), + agent_local_time: schema.maybe(schema.string()), + agent_version: schema.maybe(schema.string()), + bios_manufacturer: schema.maybe(schema.string()), + bios_version: schema.maybe(schema.string()), + config_id_base: schema.maybe(schema.string()), + config_id_build: schema.maybe(schema.string()), + config_id_platform: schema.maybe(schema.string()), + cpu_signature: schema.maybe(schema.string()), + cpu_vendor: schema.maybe(schema.string()), + external_ip: schema.maybe(schema.string()), + mac_address: schema.maybe(schema.string()), + instance_id: schema.maybe(schema.string()), + service_provider: schema.maybe(schema.string()), + service_provider_account_id: schema.maybe(schema.string()), + hostname: schema.maybe(schema.string()), + first_seen: schema.maybe(schema.string()), + last_login_timestamp: schema.maybe(schema.string()), + last_login_user: schema.maybe(schema.string()), + last_login_uid: schema.maybe(schema.string()), + last_seen: schema.maybe(schema.string()), + local_ip: schema.maybe(schema.string()), + major_version: schema.maybe(schema.string()), + minor_version: schema.maybe(schema.string()), + os_version: schema.maybe(schema.string()), + platform_id: schema.maybe(schema.string()), + platform_name: schema.maybe(schema.string()), + policies: schema.maybe( + schema.arrayOf( + schema.object( + { + policy_type: schema.maybe(schema.string()), + policy_id: schema.maybe(schema.string()), + applied: schema.maybe(schema.boolean()), + settings_hash: schema.maybe(schema.string()), + assigned_date: schema.maybe(schema.string()), + applied_date: schema.maybe(schema.string()), + rule_groups: schema.maybe(schema.any()), + }, + { unknowns: 'allow' } + ) + ) + ), + reduced_functionality_mode: schema.maybe(schema.string()), + device_policies: schema.maybe( + schema.object( + { + prevention: schema.object( { policy_type: schema.maybe(schema.string()), policy_id: schema.maybe(schema.string()), @@ -81,94 +123,75 @@ export const CrowdstrikeGetAgentsResponseSchema = schema.object( rule_groups: schema.maybe(schema.any()), }, { unknowns: 'allow' } - ) - ) - ), - reduced_functionality_mode: schema.maybe(schema.string()), - device_policies: schema.maybe( - schema.object( - { - prevention: schema.object( - { - policy_type: schema.maybe(schema.string()), - policy_id: schema.maybe(schema.string()), - applied: schema.maybe(schema.boolean()), - settings_hash: schema.maybe(schema.string()), - assigned_date: schema.maybe(schema.string()), - applied_date: schema.maybe(schema.string()), - rule_groups: schema.any(), - }, - { unknowns: 'allow' } - ), - sensor_update: schema.object( - { - policy_type: schema.maybe(schema.string()), - policy_id: schema.maybe(schema.string()), - applied: schema.maybe(schema.boolean()), - settings_hash: schema.maybe(schema.string()), - assigned_date: schema.maybe(schema.string()), - applied_date: schema.maybe(schema.string()), - uninstall_protection: schema.maybe(schema.string()), - }, - { unknowns: 'allow' } - ), - global_config: schema.object( - { - policy_type: schema.maybe(schema.string()), - policy_id: schema.maybe(schema.string()), - applied: schema.maybe(schema.boolean()), - settings_hash: schema.maybe(schema.string()), - assigned_date: schema.maybe(schema.string()), - applied_date: schema.maybe(schema.string()), - }, - { unknowns: 'allow' } - ), - remote_response: schema.object( - { - policy_type: schema.maybe(schema.string()), - policy_id: schema.maybe(schema.string()), - applied: schema.maybe(schema.boolean()), - settings_hash: schema.maybe(schema.string()), - assigned_date: schema.maybe(schema.string()), - applied_date: schema.maybe(schema.string()), - }, - { unknowns: 'allow' } - ), - }, - { unknowns: 'allow' } - ) - ), - groups: schema.maybe(schema.arrayOf(schema.any())), - group_hash: schema.maybe(schema.string()), - product_type_desc: schema.maybe(schema.string()), - provision_status: schema.maybe(schema.string()), - serial_number: schema.maybe(schema.string()), - status: schema.maybe(schema.string()), - system_manufacturer: schema.maybe(schema.string()), - system_product_name: schema.maybe(schema.string()), - tags: schema.maybe(schema.arrayOf(schema.any())), - modified_timestamp: schema.any(), - meta: schema.maybe( - schema.object( - { - version: schema.maybe(schema.string()), - version_string: schema.maybe(schema.string()), - }, - { unknowns: 'allow' } - ) - ), - zone_group: schema.maybe(schema.string()), - kernel_version: schema.maybe(schema.string()), - chassis_type: schema.maybe(schema.string()), - chassis_type_desc: schema.maybe(schema.string()), - connection_ip: schema.maybe(schema.string()), - default_gateway_ip: schema.maybe(schema.string()), - connection_mac_address: schema.maybe(schema.string()), - linux_sensor_mode: schema.maybe(schema.string()), - deployment_type: schema.maybe(schema.string()), - }, - { unknowns: 'allow' } - ) + ), + sensor_update: schema.object( + { + policy_type: schema.maybe(schema.string()), + policy_id: schema.maybe(schema.string()), + applied: schema.maybe(schema.boolean()), + settings_hash: schema.maybe(schema.string()), + assigned_date: schema.maybe(schema.string()), + applied_date: schema.maybe(schema.string()), + uninstall_protection: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ), + global_config: schema.object( + { + policy_type: schema.maybe(schema.string()), + policy_id: schema.maybe(schema.string()), + applied: schema.maybe(schema.boolean()), + settings_hash: schema.maybe(schema.string()), + assigned_date: schema.maybe(schema.string()), + applied_date: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ), + remote_response: schema.object( + { + policy_type: schema.maybe(schema.string()), + policy_id: schema.maybe(schema.string()), + applied: schema.maybe(schema.boolean()), + settings_hash: schema.maybe(schema.string()), + assigned_date: schema.maybe(schema.string()), + applied_date: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ), + }, + { unknowns: 'allow' } + ) + ), + groups: schema.maybe(schema.arrayOf(schema.any())), + group_hash: schema.maybe(schema.string()), + product_type_desc: schema.maybe(schema.string()), + provision_status: schema.maybe(schema.string()), + serial_number: schema.maybe(schema.string()), + status: schema.maybe(schema.string()), + system_manufacturer: schema.maybe(schema.string()), + system_product_name: schema.maybe(schema.string()), + tags: schema.maybe(schema.arrayOf(schema.any())), + modified_timestamp: schema.any(), + meta: schema.maybe( + schema.object( + { + version: schema.maybe(schema.string()), + version_string: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } + ) + ), + zone_group: schema.maybe(schema.string()), + kernel_version: schema.maybe(schema.string()), + chassis_type: schema.maybe(schema.string()), + chassis_type_desc: schema.maybe(schema.string()), + connection_ip: schema.maybe(schema.string()), + default_gateway_ip: schema.maybe(schema.string()), + connection_mac_address: schema.maybe(schema.string()), + linux_sensor_mode: schema.maybe(schema.string()), + deployment_type: schema.maybe(schema.string()), + }, + { unknowns: 'allow' } ) ), errors: schema.nullable(schema.arrayOf(schema.any())), diff --git a/x-pack/plugins/stack_connectors/common/crowdstrike/types.ts b/x-pack/plugins/stack_connectors/common/crowdstrike/types.ts index e9d6448db9231..c0f98ee1b90a1 100644 --- a/x-pack/plugins/stack_connectors/common/crowdstrike/types.ts +++ b/x-pack/plugins/stack_connectors/common/crowdstrike/types.ts @@ -10,20 +10,28 @@ import { CrowdstrikeBaseApiResponseSchema, CrowdstrikeConfigSchema, CrowdstrikeGetAgentsParamsSchema, - CrowdstrikeGetAgentsResponseSchema, + CrowdstrikeGetAgentOnlineStatusResponseSchema, CrowdstrikeHostActionsParamsSchema, CrowdstrikeSecretsSchema, CrowdstrikeActionParamsSchema, CrowdstrikeGetTokenResponseSchema, + CrowdstrikeGetAgentsResponseSchema, + RelaxedCrowdstrikeBaseApiResponseSchema, } from './schema'; export type CrowdstrikeConfig = TypeOf; export type CrowdstrikeSecrets = TypeOf; export type CrowdstrikeBaseApiResponse = TypeOf; +export type RelaxedCrowdstrikeBaseApiResponse = TypeOf< + typeof RelaxedCrowdstrikeBaseApiResponseSchema +>; export type CrowdstrikeGetAgentsParams = Partial>; export type CrowdstrikeGetAgentsResponse = TypeOf; +export type CrowdstrikeGetAgentOnlineStatusResponse = TypeOf< + typeof CrowdstrikeGetAgentOnlineStatusResponseSchema +>; export type CrowdstrikeGetTokenResponse = TypeOf; export type CrowdstrikeHostActionsParams = TypeOf; diff --git a/x-pack/plugins/stack_connectors/common/openai/schema.ts b/x-pack/plugins/stack_connectors/common/openai/schema.ts index 9c64a4a7514c4..f62ee1f35174c 100644 --- a/x-pack/plugins/stack_connectors/common/openai/schema.ts +++ b/x-pack/plugins/stack_connectors/common/openai/schema.ts @@ -148,7 +148,8 @@ export const RunActionResponseSchema = schema.object( message: schema.object( { role: schema.string(), - content: schema.maybe(schema.string()), + // nullable because message can contain function calls instead of final response when used with RAG + content: schema.maybe(schema.nullable(schema.string())), }, { unknowns: 'ignore' } ), diff --git a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts index b89c486d0a4a0..9eb1444c9bc0d 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.test.ts @@ -13,6 +13,7 @@ import { CROWDSTRIKE_CONNECTOR_ID } from '../../../public/common'; const tokenPath = 'https://api.crowdstrike.com/oauth2/token'; const hostPath = 'https://api.crowdstrike.com/devices/entities/devices/v2'; +const onlineStatusPath = 'https://api.crowdstrike.com/devices/entities/online-state/v1'; const actionsPath = 'https://api.crowdstrike.com/devices/entities/devices-actions/v2'; describe('CrowdstrikeConnector', () => { const connector = new CrowdstrikeConnector({ @@ -113,6 +114,45 @@ describe('CrowdstrikeConnector', () => { }); }); + describe('getAgentOnlineStatus', () => { + it('should make a GET request to the correct URL with correct params', async () => { + const mockResponse = { data: { resources: [{}] } }; + + mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); + mockedRequest.mockResolvedValueOnce(mockResponse); + + const result = await connector.getAgentOnlineStatus({ ids: ['id1', 'id2'] }); + + expect(mockedRequest).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + headers: { + accept: 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', + authorization: expect.any(String), + }, + method: 'post', + responseSchema: expect.any(Object), + url: tokenPath, + }) + ); + expect(mockedRequest).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + headers: expect.objectContaining({ + Authorization: 'Bearer testToken', + }), + method: 'GET', + params: { ids: ['id1', 'id2'] }, + paramsSerializer: expect.any(Function), + responseSchema: expect.any(Object), + url: onlineStatusPath, + }) + ); + expect(result).toEqual({ resources: [{}] }); + }); + }); + describe('getTokenRequest', () => { it('should make a POST request to the correct URL with correct headers', async () => { const mockResponse = { data: { access_token: 'testToken' } }; @@ -191,7 +231,6 @@ describe('CrowdstrikeConnector', () => { mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); mockedRequest.mockRejectedValueOnce(mockResponse); - // expect(mockedRequest).toThrowError('access denied, invalid bearer token'); await expect(() => connector.getAgentDetails({ ids: ['id1', 'id2'] })).rejects.toThrowError( 'something goes wrong' ); @@ -203,7 +242,6 @@ describe('CrowdstrikeConnector', () => { mockedRequest.mockResolvedValueOnce({ data: { access_token: 'testToken' } }); mockedRequest.mockRejectedValueOnce(mockResponse); - // expect(mockedRequest).toThrowError('access denied, invalid bearer token'); await expect(() => connector.getAgentDetails({ ids: ['id1', 'id2'] })).rejects.toThrowError(); expect(mockedRequest).toHaveBeenCalledTimes(3); }); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts index 583aa68ddb4be..6a758a9d33117 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/crowdstrike/crowdstrike.ts @@ -6,6 +6,7 @@ */ import { ServiceParams, SubActionConnector } from '@kbn/actions-plugin/server'; + import type { AxiosError } from 'axios'; import { SubActionRequestParams } from '@kbn/actions-plugin/server/sub_action_framework/types'; import type { @@ -13,16 +14,17 @@ import type { CrowdstrikeSecrets, CrowdstrikeGetAgentsResponse, CrowdstrikeGetAgentsParams, - CrowdstrikeBaseApiResponse, CrowdstrikeHostActionsParams, CrowdstrikeGetTokenResponse, + CrowdstrikeGetAgentOnlineStatusResponse, + RelaxedCrowdstrikeBaseApiResponse, } from '../../../common/crowdstrike/types'; import { - CrowdstrikeGetAgentsResponseSchema, CrowdstrikeHostActionsParamsSchema, CrowdstrikeGetAgentsParamsSchema, CrowdstrikeGetTokenResponseSchema, CrowdstrikeHostActionsResponseSchema, + RelaxedCrowdstrikeBaseApiResponseSchema, } from '../../../common/crowdstrike/schema'; import { SUB_ACTION } from '../../../common/crowdstrike/constants'; import { CrowdstrikeError } from './error'; @@ -52,6 +54,7 @@ export class CrowdstrikeConnector extends SubActionConnector< getToken: string; agents: string; hostAction: string; + agentStatus: string; }; constructor(params: ServiceParams) { @@ -60,6 +63,7 @@ export class CrowdstrikeConnector extends SubActionConnector< getToken: `${this.config.url}/oauth2/token`, hostAction: `${this.config.url}/devices/entities/devices-actions/v2`, agents: `${this.config.url}/devices/entities/devices/v2`, + agentStatus: `${this.config.url}/devices/entities/online-state/v1`, }; if (!CrowdstrikeConnector.base64encodedToken) { @@ -83,6 +87,12 @@ export class CrowdstrikeConnector extends SubActionConnector< method: 'executeHostActions', schema: CrowdstrikeHostActionsParamsSchema, }); + + this.registerSubAction({ + name: SUB_ACTION.GET_AGENT_ONLINE_STATUS, + method: 'getAgentOnlineStatus', + schema: CrowdstrikeGetAgentsParamsSchema, + }); } public async executeHostActions({ alertIds, ...payload }: CrowdstrikeHostActionsParams) { @@ -118,8 +128,22 @@ export class CrowdstrikeConnector extends SubActionConnector< ids: payload.ids, }, paramsSerializer, - responseSchema: CrowdstrikeGetAgentsResponseSchema, - }); + responseSchema: RelaxedCrowdstrikeBaseApiResponseSchema, + }) as Promise; + } + + public async getAgentOnlineStatus( + payload: CrowdstrikeGetAgentsParams + ): Promise { + return this.crowdstrikeApiRequest({ + url: this.urls.agentStatus, + method: 'GET', + params: { + ids: payload.ids, + }, + paramsSerializer, + responseSchema: RelaxedCrowdstrikeBaseApiResponseSchema, + }) as Promise; } private async getTokenRequest() { @@ -146,7 +170,7 @@ export class CrowdstrikeConnector extends SubActionConnector< return token; } - private async crowdstrikeApiRequest( + private async crowdstrikeApiRequest( req: SubActionRequestParams, retried?: boolean ): Promise { diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts index bab615cbf7e58..544b6bf7092c2 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts @@ -319,6 +319,7 @@ export class OpenAIConnector extends SubActionConnector { * Non-streamed security solution AI Assistant requests * Responsible for invoking the runApi method with the provided body. * It then formats the response into a string + * To use function calling, call the run subaction directly * @param body - the OpenAI chat completion request body * @returns an object with the response string and the usage object */ diff --git a/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts b/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts index 9edc6ef1b61b7..309617a8e4cc3 100644 --- a/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts +++ b/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts @@ -8,6 +8,7 @@ import sinon from 'sinon'; import { Subject } from 'rxjs'; import { take, bufferCount, skip } from 'rxjs'; +import { loggingSystemMock } from '@kbn/core/server/mocks'; import { isTaskManagerMetricEvent, isTaskManagerStatEvent, @@ -31,6 +32,7 @@ import { metricsAggregatorMock } from './metrics_aggregator.mock'; import { getTaskManagerMetricEvent } from './task_overdue_metrics_aggregator.test'; import { TaskOverdueMetric, TaskOverdueMetricsAggregator } from './task_overdue_metrics_aggregator'; +const logger = loggingSystemMock.createLogger(); const mockMetricsAggregator = metricsAggregatorMock.create(); const config: TaskManagerConfig = { allow_reading_invalid_state: false, @@ -788,7 +790,7 @@ describe('createAggregator', () => { reset$: new Subject(), eventFilter: (event: TaskLifecycleEvent) => isTaskRunEvent(event) || isTaskManagerStatEvent(event), - metricsAggregator: new TaskRunMetricsAggregator(), + metricsAggregator: new TaskRunMetricsAggregator(logger), }); return new Promise((resolve) => { @@ -1816,7 +1818,7 @@ describe('createAggregator', () => { reset$, eventFilter: (event: TaskLifecycleEvent) => isTaskRunEvent(event) || isTaskManagerStatEvent(event), - metricsAggregator: new TaskRunMetricsAggregator(), + metricsAggregator: new TaskRunMetricsAggregator(logger), }); return new Promise((resolve) => { @@ -2781,7 +2783,7 @@ describe('createAggregator', () => { reset$: new Subject(), eventFilter: (event: TaskLifecycleEvent) => isTaskRunEvent(event) || isTaskManagerStatEvent(event), - metricsAggregator: new TaskRunMetricsAggregator(), + metricsAggregator: new TaskRunMetricsAggregator(logger), }); return new Promise((resolve) => { diff --git a/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts b/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts index c1c4c6517e1ea..a06278dd12ef7 100644 --- a/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts +++ b/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts @@ -7,6 +7,7 @@ import { combineLatest, filter, interval, map, merge, Observable, startWith } from 'rxjs'; import { JsonValue } from '@kbn/utility-types'; +import { Logger } from '@kbn/core/server'; import { AggregatedStat, AggregatedStatProvider } from '../lib/runtime_statistics_aggregator'; import { TaskManagerConfig } from '../config'; import { ITaskMetricsAggregator } from './types'; @@ -15,6 +16,7 @@ import { TaskLifecycleEvent } from '../polling_lifecycle'; export interface CreateMetricsAggregatorOpts { key: string; config: TaskManagerConfig; + logger?: Logger; reset$?: Observable; events$: Observable; eventFilter: (event: TaskLifecycleEvent) => boolean; @@ -25,6 +27,7 @@ export function createAggregator({ key, config, reset$, + logger, events$, eventFilter, metricsAggregator, @@ -38,6 +41,11 @@ export function createAggregator({ map(() => { if (intervalHasPassedSince(lastResetTime, config.metrics_reset_interval)) { lastResetTime = new Date(); + if (logger) { + logger.debug( + `Resetting metrics due to reset interval expiration - ${lastResetTime.toISOString()}` + ); + } return true; } @@ -48,6 +56,9 @@ export function createAggregator({ map((value: boolean) => { // keep track of the last time we reset due to collection lastResetTime = new Date(); + if (logger) { + logger.debug(`Resetting metrics due to collection - ${lastResetTime.toISOString()}`); + } return true; }) ) diff --git a/x-pack/plugins/task_manager/server/metrics/index.ts b/x-pack/plugins/task_manager/server/metrics/index.ts index 36878d3dbd8ee..f93a5f71758b3 100644 --- a/x-pack/plugins/task_manager/server/metrics/index.ts +++ b/x-pack/plugins/task_manager/server/metrics/index.ts @@ -6,6 +6,7 @@ */ import { Observable } from 'rxjs'; +import { Logger } from '@kbn/core/server'; import { TaskManagerConfig } from '../config'; import { Metrics, createMetricsAggregators, createMetricsStream } from './metrics_stream'; import { TaskPollingLifecycle } from '../polling_lifecycle'; @@ -14,6 +15,7 @@ export type { Metrics } from './metrics_stream'; interface MetricsStreamOpts { config: TaskManagerConfig; + logger: Logger; reset$: Observable; // emits when counter metrics should be reset taskPollingLifecycle?: TaskPollingLifecycle; // subscribe to task lifecycle events taskManagerMetricsCollector?: TaskManagerMetricsCollector; // subscribe to collected task manager metrics @@ -22,12 +24,14 @@ interface MetricsStreamOpts { export function metricsStream({ config, reset$, + logger, taskPollingLifecycle, taskManagerMetricsCollector, }: MetricsStreamOpts): Observable { return createMetricsStream( createMetricsAggregators({ config, + logger, reset$, taskPollingLifecycle, taskManagerMetricsCollector, diff --git a/x-pack/plugins/task_manager/server/metrics/metrics_stream.ts b/x-pack/plugins/task_manager/server/metrics/metrics_stream.ts index ba57153ed9a0a..2c56e84104b1d 100644 --- a/x-pack/plugins/task_manager/server/metrics/metrics_stream.ts +++ b/x-pack/plugins/task_manager/server/metrics/metrics_stream.ts @@ -8,6 +8,7 @@ import { merge, of, Observable } from 'rxjs'; import { map, scan } from 'rxjs'; import { set } from '@kbn/safer-lodash-set'; +import { Logger } from '@kbn/core/server'; import { TaskLifecycleEvent, TaskPollingLifecycle } from '../polling_lifecycle'; import { TaskManagerConfig } from '../config'; import { AggregatedStatProvider } from '../lib/runtime_statistics_aggregator'; @@ -38,6 +39,7 @@ export interface Metric { interface CreateMetricsAggregatorsOpts { config: TaskManagerConfig; + logger: Logger; reset$: Observable; taskPollingLifecycle?: TaskPollingLifecycle; taskManagerMetricsCollector?: TaskManagerMetricsCollector; @@ -45,10 +47,12 @@ interface CreateMetricsAggregatorsOpts { export function createMetricsAggregators({ config, reset$, + logger, taskPollingLifecycle, taskManagerMetricsCollector, }: CreateMetricsAggregatorsOpts): AggregatedStatProvider { const aggregators: AggregatedStatProvider[] = []; + const debugLogger = logger.get('metrics-debugger'); if (taskPollingLifecycle) { aggregators.push( createAggregator({ @@ -63,10 +67,11 @@ export function createMetricsAggregators({ key: 'task_run', events$: taskPollingLifecycle.events, config, + logger: debugLogger, reset$, eventFilter: (event: TaskLifecycleEvent) => isTaskRunEvent(event) || isTaskManagerStatEvent(event), - metricsAggregator: new TaskRunMetricsAggregator(), + metricsAggregator: new TaskRunMetricsAggregator(debugLogger), }) ); } diff --git a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts index d156685885191..8a74ed90938fe 100644 --- a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts +++ b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.test.ts @@ -6,6 +6,7 @@ */ import * as uuid from 'uuid'; +import { loggingSystemMock } from '@kbn/core/server/mocks'; import { asOk, asErr } from '../lib/result_type'; import { TaskStatus } from '../task'; import { @@ -17,6 +18,8 @@ import { import { TaskRunResult } from '../task_running'; import { TaskRunMetricsAggregator } from './task_run_metrics_aggregator'; +const logger = loggingSystemMock.createLogger(); + export const getTaskRunSuccessEvent = (type: string, isExpired: boolean = false) => { const id = uuid.v4(); return asTaskRunEvent( @@ -81,7 +84,7 @@ export const getTaskManagerStatEvent = (value: number, id: TaskManagerStats = 'r describe('TaskRunMetricsAggregator', () => { let taskRunMetricsAggregator: TaskRunMetricsAggregator; beforeEach(() => { - taskRunMetricsAggregator = new TaskRunMetricsAggregator(); + taskRunMetricsAggregator = new TaskRunMetricsAggregator(logger); }); test('should correctly initialize', () => { diff --git a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts index c0c80e4021498..1cd9fdf09cfd5 100644 --- a/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts +++ b/x-pack/plugins/task_manager/server/metrics/task_run_metrics_aggregator.ts @@ -7,6 +7,7 @@ import { JsonObject } from '@kbn/utility-types'; import { merge } from 'lodash'; +import { Logger } from '@kbn/core/server'; import { isUserError } from '../task_running'; import { isOk, Ok, unwrap } from '../lib/result_type'; import { TaskLifecycleEvent } from '../polling_lifecycle'; @@ -63,12 +64,16 @@ export interface TaskRunMetric extends JsonObject { } export class TaskRunMetricsAggregator implements ITaskMetricsAggregator { + private logger: Logger; private counter: MetricCounterService = new MetricCounterService( Object.values(TaskRunKeys), TaskRunMetricKeys.OVERALL ); private delayHistogram = new SimpleHistogram(HDR_HISTOGRAM_MAX, HDR_HISTOGRAM_BUCKET_SIZE); + constructor(logger: Logger) { + this.logger = logger; + } public initialMetric(): TaskRunMetric { return merge(this.counter.initialMetrics(), { by_type: {}, @@ -96,6 +101,9 @@ export class TaskRunMetricsAggregator implements ITaskMetricsAggregator { + let logger: Logger; beforeEach(() => { jest.resetAllMocks(); + logger = loggingSystemMock.createLogger(); }); it('registers route', async () => { const router = httpServiceMock.createRouter(); metricsRoute({ router, + logger, metrics$: of(), resetMetrics$: new Subject(), taskManagerId: uuidv4(), @@ -41,6 +45,7 @@ describe('metricsRoute', () => { const router = httpServiceMock.createRouter(); metricsRoute({ router, + logger, metrics$: of(), resetMetrics$, taskManagerId: uuidv4(), @@ -66,6 +71,7 @@ describe('metricsRoute', () => { const router = httpServiceMock.createRouter(); metricsRoute({ router, + logger, metrics$: of(), resetMetrics$, taskManagerId: uuidv4(), diff --git a/x-pack/plugins/task_manager/server/routes/metrics.ts b/x-pack/plugins/task_manager/server/routes/metrics.ts index 692227899979b..4172e3deb1155 100644 --- a/x-pack/plugins/task_manager/server/routes/metrics.ts +++ b/x-pack/plugins/task_manager/server/routes/metrics.ts @@ -7,6 +7,7 @@ import { IRouter, + Logger, RequestHandlerContext, KibanaRequest, IKibanaResponse, @@ -25,6 +26,7 @@ export interface NodeMetrics { export interface MetricsRouteParams { router: IRouter; + logger: Logger; metrics$: Observable; resetMetrics$: Subject; taskManagerId: string; @@ -35,12 +37,15 @@ const QuerySchema = schema.object({ }); export function metricsRoute(params: MetricsRouteParams) { - const { router, metrics$, resetMetrics$, taskManagerId } = params; + const { router, logger, metrics$, resetMetrics$, taskManagerId } = params; + const debugLogger = logger.get(`metrics-debugger`); + const additionalDebugLogger = logger.get(`metrics-subscribe-debugger`); let lastMetrics: NodeMetrics | null = null; metrics$.subscribe((metrics) => { lastMetrics = { process_uuid: taskManagerId, timestamp: new Date().toISOString(), ...metrics }; + additionalDebugLogger.debug(`subscribed metrics ${JSON.stringify(metrics)}`); }); router.get( @@ -63,6 +68,11 @@ export function metricsRoute(params: MetricsRouteParams) { req: KibanaRequest, unknown>, res: KibanaResponseFactory ): Promise { + debugLogger.debug( + `/api/task_manager/metrics route accessed with reset=${req.query.reset} - metrics ${ + lastMetrics ? JSON.stringify(lastMetrics) : 'not available' + }` + ); if (req.query.reset) { resetMetrics$.next(true); } diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts index e942269a54ab8..c68a06af0b1f0 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts @@ -2086,11 +2086,11 @@ describe('TaskManagerRunner', () => { }); await runner.run(); - expect(logger.debug).toHaveBeenCalledTimes(2); + expect(logger.debug).toHaveBeenCalledTimes(3); expect(logger.debug).toHaveBeenNthCalledWith(1, 'Running task bar "foo"', { tags: ['task:start', 'foo', 'bar'], }); - expect(logger.debug).toHaveBeenNthCalledWith(2, 'Task bar "foo" ended', { + expect(logger.debug).toHaveBeenNthCalledWith(3, 'Task bar "foo" ended', { tags: ['task:end', 'foo', 'bar'], }); }); diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.ts index 048174bcea89b..0e0c1e1dfded0 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.ts @@ -693,6 +693,8 @@ export class TaskManagerRunner implements TaskRunner { ): Promise> { const { task } = this.instance; + const debugLogger = this.logger.get(`metrics-debugger`); + const taskHasExpired = this.isExpired; await eitherAsync( @@ -711,8 +713,10 @@ export class TaskManagerRunner implements TaskRunner { // when the alerting task fails, so we check for this condition in order // to emit the correct task run event for metrics collection // taskRunError contains the "source" (TaskErrorSource) data - const taskRunEvent = !!taskRunError - ? asTaskRunEvent( + if (!!taskRunError) { + debugLogger.debug(`Emitting task run failed event for task ${this.taskType}`); + this.onTaskEvent( + asTaskRunEvent( this.id, asErr({ ...processedResult, @@ -721,14 +725,19 @@ export class TaskManagerRunner implements TaskRunner { }), taskTiming ) - : asTaskRunEvent( + ); + } else { + this.onTaskEvent( + asTaskRunEvent( this.id, asOk({ ...processedResult, isExpired: taskHasExpired }), taskTiming - ); - this.onTaskEvent(taskRunEvent); + ) + ); + } }, async ({ error }: FailedRunResult) => { + debugLogger.debug(`Emitting task run failed event for task ${this.taskType}`); this.onTaskEvent( asTaskRunEvent( this.id, diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 7fbce312fde18..90aab7f2552fb 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -9782,6 +9782,18 @@ "description": "The total number of enrolled Fleet Server agents currently offline" } }, + "inactive": { + "type": "long", + "_meta": { + "description": "The total number of enrolled Fleet Server agents currently inactive" + } + }, + "unenrolled": { + "type": "long", + "_meta": { + "description": "The total number of unenrolled Fleet Server agents" + } + }, "num_host_urls": { "type": "long", "_meta": { diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 094c1f15bb567..a194bc656b28b 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5879,8 +5879,6 @@ "securitySolutionPackages.ecsDataQualityDashboard.unmanagedPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {n'est pas géré} other {ne sont pas gérés}} par la gestion du cycle de vie des index (ILM)", "securitySolutionPackages.ecsDataQualityDashboard.warmPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"warm\". Les index \"warm\" ne sont plus mis à jour, mais ils sont toujours interrogés.", "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "Passer à {requiredLicenseOrProduct}", - "securitySolutionPackages.entityAnalytics.paywall.upgradeLicenseMessage": "Cette fonctionnalité est disponible avec l'abonnement {requiredLicense} ou supérieur", - "securitySolutionPackages.entityAnalytics.paywall.upgradeProductMessage": "La capacité d'évaluation du risque des entités est disponible dans notre niveau de licence {requiredProduct}", "securitySolutionPackages.markdown.insight.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les informations des guides d'investigation", "securitySolutionPackages.alertSuppressionRuleDetails.upsell": "La suppression d'alertes est configurée mais elle ne sera pas appliquée en raison d'une licence insuffisante", "securitySolutionPackages.beta.label": "Bêta", @@ -6792,7 +6790,6 @@ "unifiedFieldList.fieldStats.filterOutValueButtonAriaLabel": "Exclure le {field} : \"{value}\"", "unifiedFieldList.fieldStats.filterValueButtonAriaLabel": "Filtrer sur le {field} : \"{value}\"", "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "Aucune donnée de champ pour {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", - "unifiedFieldList.fieldCategorizeButton.label": "Exécuter l'analyse du modèle", "unifiedFieldList.fieldItemButton.mappingConflictDescription": "Ce champ est défini avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pouvez toujours utiliser ce champ conflictuel, mais il sera indisponible pour les fonctions qui nécessitent que Kibana en connaisse le type. Pour corriger ce problème, vous devrez réindexer vos données.", "unifiedFieldList.fieldItemButton.mappingConflictTitle": "Conflit de mapping", "unifiedFieldList.fieldList.noFieldsCallout.noDataLabel": "Aucun champ.", @@ -12929,20 +12926,6 @@ "xpack.csp.findings.findingsFlyout.ruleTab.tagsTitle": "Balises", "xpack.csp.findings.findingsFlyout.ruleTabTitle": "Règle", "xpack.csp.findings.findingsFlyout.tableTabTitle": "Tableau", - "xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel": "Dernière vérification", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel": "Version du correctif", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel": "Pack", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel": "Version", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel": "ID ressource", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel": "Nom de ressource", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel": "Type de ressource", - "xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel": "Résultat", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel": "Nom de règle", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel": "Numéro de règle", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel": "Section CIS", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel": "Vulnérabilité", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel": "CVSS", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel": "Sévérité", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialFileText": "Chemin vers le fichier JSON qui contient les informations d'identification et la clé utilisés pour souscrire", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText": "Blob JSON qui contient les informations d'identification et la clé utilisées pour souscrire", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialSelectBoxTitle": "Informations d'identification", @@ -13594,7 +13577,6 @@ "xpack.elasticAssistant.assistant.content.prompts.system.ifYouDontKnowTheAnswer": "Ne répondez pas aux questions qui ne sont pas liées à Elastic Security.", "xpack.elasticAssistant.assistant.content.prompts.system.superheroPersonality": "Donnez la réponse la plus pertinente et détaillée possible, comme si vous deviez communiquer ces informations à un expert en cybersécurité.", "xpack.elasticAssistant.assistant.content.prompts.system.superheroSystemPromptName": "Invite système améliorée", - "xpack.elasticAssistant.assistant.content.prompts.system.useTheFollowingContextToAnswer": "Utilisez le contexte suivant pour répondre aux questions :", "xpack.elasticAssistant.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "Vous êtes un assistant expert et serviable qui répond à des questions au sujet d’Elastic Security.", "xpack.elasticAssistant.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "Ajoutez votre description, les actions que vous recommandez ainsi que les étapes de triage à puces. Utilisez les données \"MITRE ATT&CK\" fournies pour ajouter du contexte et des recommandations de MITRE ainsi que des liens hypertexte vers les pages pertinentes sur le site web de MITRE. Assurez-vous d’inclure les scores de risque de l’utilisateur et de l’hôte du contexte. Votre réponse doit inclure des étapes qui pointent vers les fonctionnalités spécifiques d’Elastic Security, y compris les actions de réponse du terminal, l’intégration OSQuery Manager d’Elastic Agent (avec des exemples de requêtes OSQuery), des analyses de timeline et d’entités, ainsi qu’un lien pour toute la documentation Elastic Security pertinente.", "xpack.elasticAssistant.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "Évaluer l’événement depuis le contexte ci-dessus et formater soigneusement la sortie en syntaxe Markdown pour mon cas Elastic Security.", @@ -13888,7 +13870,6 @@ "xpack.enterpriseSearch.content.indices.configurationConnector.apiKey.description": "D'abord, générez une clé d'API Elasticsearch. Cette clé {apiKeyName} permet d'activer les autorisations de lecture et d'écriture du connecteur pour qu'il puisse indexer les documents dans l'index {indexName} créé. Enregistrez cette clé en lieu sûr, car vous en aurez besoin pour configurer votre connecteur.", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.apiKey.description": "La clé d'API de ce connecteur natif {apiKeyName} est gérée en interne par Elasticsearch. Ce connecteur utilise cette clé d'API pour indexer les documents dans l'index {indexName}. Pour substituer votre clé d'API, cliquez sur \"Generate API key\" (Générer une clé d'API).", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.config.sourceSecurityDocumentationLinkLabel": "Authentification {name}", - "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.connectorConnected": "Votre connecteur {name} s'est bien connecté à Search.", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.description": "Vous souhaitez héberger vous-même ce connecteur natif ? Convertissez-le en {link} afin qu'il soit autogéré sur votre propre infrastructure. Vous devez convertir ce connecteur si vous souhaitez personnaliser le code à l'aide de notre cadre Python.", "xpack.enterpriseSearch.content.indices.configurationConnector.researchConfiguration.serviceDocumentationLinkLabel": "Documentation sur {name}", "xpack.enterpriseSearch.content.indices.connectorScheduling.page.description": "Votre connecteur est désormais déployé. Vous pouvez planifier du contenu récurrent et accéder aux synchronisations de contrôle ici. Si vous souhaitez exécuter un test rapide, lancez une synchronisation unique à l'aide du bouton {sync}.", @@ -33588,7 +33569,6 @@ "xpack.securitySolution.assistant.content.prompts.system.outputFormatting": "Si vous répondez à une question liée à KQL, à EQL, ou à ES|QL, la réponse doit être immédiatement utilisable dans une chronologie d'Elastic Security ; veuillez toujours formater correctement la sortie avec des accents graves. Toute réponse à une requête DSL doit aussi être utilisable dans une chronologie de sécurité. Cela signifie que vous ne devez inclure que la portion \"filtre\" de la requête.", "xpack.securitySolution.assistant.content.prompts.system.superheroPersonality": "Donnez la réponse la plus pertinente et détaillée possible, comme si vous deviez communiquer ces informations à un expert en cybersécurité.", "xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName": "Invite système améliorée", - "xpack.securitySolution.assistant.content.prompts.system.useTheFollowingContextToAnswer": "Utilisez le contexte suivant pour répondre aux questions :", "xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "Vous êtes un assistant expert et serviable qui répond à des questions au sujet d’Elastic Security.", "xpack.securitySolution.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "Ajoutez votre description, les actions que vous recommandez ainsi que les étapes de triage à puces. Utilisez les données \"MITRE ATT&CK\" fournies pour ajouter du contexte et des recommandations de MITRE ainsi que des liens hypertexte vers les pages pertinentes sur le site web de MITRE. Assurez-vous d’inclure les scores de risque de l’utilisateur et de l’hôte du contexte. Votre réponse doit inclure des étapes qui pointent vers les fonctionnalités spécifiques d’Elastic Security, y compris les actions de réponse du terminal, l’intégration OSQuery Manager d’Elastic Agent (avec des exemples de requêtes OSQuery), des analyses de timeline et d’entités, ainsi qu’un lien pour toute la documentation Elastic Security pertinente.", "xpack.securitySolution.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "Évaluer l’événement depuis le contexte ci-dessus et formater soigneusement la sortie en syntaxe Markdown pour mon cas Elastic Security.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 7afc75d976687..252712bbd8b0e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5870,8 +5870,6 @@ "securitySolutionPackages.ecsDataQualityDashboard.unmanagedPatternTooltip": "{pattern}パターンと一致する{indices} {indices, plural, other {インデックス}}{indices, plural, other {は}}インデックスライフサイクル管理(ILM)によって管理されていません", "securitySolutionPackages.ecsDataQualityDashboard.warmPatternTooltip": "{pattern}パターンと一致する{indices} {indices, plural, other {インデックス}}{indices, plural, other {は}}ウォームです。ウォームインデックスは更新されませんが、まだ照会されています。", "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "{requiredLicenseOrProduct}にアップグレード", - "securitySolutionPackages.entityAnalytics.paywall.upgradeLicenseMessage": "この機能は、{requiredLicense}以上のサブスクリプションでご利用いただけます", - "securitySolutionPackages.entityAnalytics.paywall.upgradeProductMessage": "エンティティリスクスコアリング機能は、{requiredProduct}ライセンスティアで利用可能です", "securitySolutionPackages.alertSuppressionRuleDetails.upsell": "アラート非表示が構成されていますが、ライセンス不足のため適用されません", "securitySolutionPackages.beta.label": "ベータ", "securitySolutionPackages.dataTable.ariaLabel": "アラート", @@ -6781,7 +6779,6 @@ "unifiedFieldList.fieldStats.filterOutValueButtonAriaLabel": "{field}を除外:\"{value}\"", "unifiedFieldList.fieldStats.filterValueButtonAriaLabel": "{field}を除外:\"{value}\"", "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "{sampledDocumentsFormatted}サンプル{sampledDocuments, plural, other {レコード}}のフィールドデータがありません。", - "unifiedFieldList.fieldCategorizeButton.label": "パターン分析を実行", "unifiedFieldList.fieldItemButton.mappingConflictDescription": "このフィールドは、このパターンと一致するインデックス全体に対して複数の型(文字列、整数など)として定義されています。この競合フィールドを使用することはできますが、Kibana で型を認識する必要がある関数では使用できません。この問題を修正するにはデータのレンダリングが必要です。", "unifiedFieldList.fieldItemButton.mappingConflictTitle": "マッピングの矛盾", "unifiedFieldList.fieldList.noFieldsCallout.noDataLabel": "フィールドがありません。", @@ -12909,20 +12906,6 @@ "xpack.csp.findings.findingsFlyout.ruleTab.tagsTitle": "タグ", "xpack.csp.findings.findingsFlyout.ruleTabTitle": "ルール", "xpack.csp.findings.findingsFlyout.tableTabTitle": "表", - "xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel": "最終確認", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel": "修正バージョン", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel": "パッケージ", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel": "バージョン", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel": "リソースID", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel": "リソース名", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel": "リソースタイプ", - "xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel": "結果", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel": "ルール名", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel": "ルール番号", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel": "CISセクション", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel": "脆弱性", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel": "CVSS", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel": "深刻度", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialFileText": "サブスクライブに使用される資格情報とキーを含むJSONファイルへのパス", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText": "サブスクライブに使用される資格情報とキーを含むJSON blob", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialSelectBoxTitle": "資格情報", @@ -13573,7 +13556,6 @@ "xpack.elasticAssistant.assistant.content.prompts.system.ifYouDontKnowTheAnswer": "Elasticセキュリティに関連していない質問には回答しないでください。", "xpack.elasticAssistant.assistant.content.prompts.system.superheroPersonality": "サイバーセキュリティの専門家に情報を伝えるつもりで、できるだけ詳細で関連性のある回答を入力してください。", "xpack.elasticAssistant.assistant.content.prompts.system.superheroSystemPromptName": "拡張システムプロンプト", - "xpack.elasticAssistant.assistant.content.prompts.system.useTheFollowingContextToAnswer": "次のコンテキストを使用して、質問に回答します。", "xpack.elasticAssistant.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "あなたはElasticセキュリティに関する質問に答える、親切で専門的なアシスタントです。", "xpack.elasticAssistant.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "説明、推奨されるアクション、箇条書きのトリアージステップを追加します。提供された MITRE ATT&CKデータを使用して、MITREからのコンテキストや推奨事項を追加し、MITREのWebサイトの関連ページにハイパーリンクを貼ります。コンテキストのユーザーとホストのリスクスコアデータを必ず含めてください。回答には、エンドポイント対応アクション、ElasticエージェントOSQueryマネージャー統合(osqueryクエリの例を付けて)、タイムライン、エンティティ分析など、Elasticセキュリティ固有の機能を指す手順を含め、関連するElasticセキュリティのドキュメントすべてにリンクしてください。", "xpack.elasticAssistant.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "上記のコンテキストからイベントを評価し、Elasticセキュリティのケース用に、出力をマークダウン構文で正しく書式設定してください。", @@ -13867,7 +13849,6 @@ "xpack.enterpriseSearch.content.indices.configurationConnector.apiKey.description": "まず、Elasticsearch APIキーを生成します。この{apiKeyName}は、コネクターがドキュメントを作成された{indexName}インデックスにインデックスするための読み書き権限を有効にします。キーは安全な場所に保管してください。コネクターを構成するときに必要になります。", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.apiKey.description": "このネイティブコネクターのAPIキー{apiKeyName}は、Elasticsearchによって内部的に管理されています。コネクターは、このAPIキーを使用して、ドキュメントを\"{indexName}\"インデックスにインデックス化します。APIキーを展開するには、\"APIキーを生成\"をクリックしてください。", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.config.sourceSecurityDocumentationLinkLabel": "{name}認証", - "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.connectorConnected": "コネクター{name}は、正常にSearchに接続されました。", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.description": "このセルフホスティングコネクターをカスタマイズしますか?独自のインフラで自己管理される{link}に変換します。Pythonフレームワークを使用してコードをカスタマイズしたい場合は、このコネクターを変換する必要があります。", "xpack.enterpriseSearch.content.indices.configurationConnector.researchConfiguration.serviceDocumentationLinkLabel": "{name}ドキュメンテーション", "xpack.enterpriseSearch.content.indices.connectorScheduling.page.description": "コネクターがデプロイされました。ここで、繰り返しコンテンツとアクセス制御同期をスケジュールします。簡易テストを実行する場合は、{sync}ボタンを使用してワンタイム同期を実行します。", @@ -33557,7 +33538,6 @@ "xpack.securitySolution.assistant.content.prompts.system.outputFormatting": "KQL、EQL、ES|QLに関連する質問に回答した場合、Elastic Securityのタイムライン内ですぐに使用できるようにする必要があります。出力は常にバックティックで正しい形式にしてください。クエリDSLで提供されるすべての回答は、セキュリティタイムラインでも使用可能でなければなりません。つまり、クエリの\"フィルター\"部分のみを含める必要があります。", "xpack.securitySolution.assistant.content.prompts.system.superheroPersonality": "サイバーセキュリティの専門家に情報を伝えるつもりで、できるだけ詳細で関連性のある回答を入力してください。", "xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName": "拡張システムプロンプト", - "xpack.securitySolution.assistant.content.prompts.system.useTheFollowingContextToAnswer": "次のコンテキストを使用して、質問に回答します。", "xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "あなたはElasticセキュリティに関する質問に答える、親切で専門的なアシスタントです。", "xpack.securitySolution.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "説明、推奨されるアクション、箇条書きのトリアージステップを追加します。提供された MITRE ATT&CKデータを使用して、MITREからのコンテキストや推奨事項を追加し、MITREのWebサイトの関連ページにハイパーリンクを貼ります。コンテキストのユーザーとホストのリスクスコアデータを必ず含めてください。回答には、エンドポイント対応アクション、ElasticエージェントOSQueryマネージャー統合(osqueryクエリの例を付けて)、タイムライン、エンティティ分析など、Elasticセキュリティ固有の機能を指す手順を含め、関連するElasticセキュリティのドキュメントすべてにリンクしてください。", "xpack.securitySolution.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "上記のコンテキストからイベントを評価し、Elasticセキュリティのケース用に、出力をマークダウン構文で正しく書式設定してください。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 95da09f4c580b..117cbce80da6c 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5883,7 +5883,6 @@ "securitySolutionPackages.ecsDataQualityDashboard.unmanagedPatternTooltip": "与 {pattern} 模式匹配的 {indices} 个{indices, plural, other {索引}}{indices, plural, other {}}不通过索引生命周期管理 (ILM) 进行管理", "securitySolutionPackages.ecsDataQualityDashboard.warmPatternTooltip": "{indices} 个匹配 {pattern} 模式的{indices, plural, other {索引}}{indices, plural, other {为}}温索引。不再更新但仍会查询温索引。", "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "升级到 {requiredLicenseOrProduct}", - "securitySolutionPackages.entityAnalytics.paywall.upgradeLicenseMessage": "{requiredLicense}或更高级订阅可以使用此功能", "securitySolutionPackages.markdown.insight.upsell": "升级到{requiredLicense}以利用调查指南中的洞见", "securitySolutionPackages.alertSuppressionRuleDetails.upsell": "已配置告警阻止,但由于许可不足而无法应用", "securitySolutionPackages.beta.label": "公测版", @@ -6795,7 +6794,6 @@ "unifiedFieldList.fieldStats.filterOutValueButtonAriaLabel": "筛除 {field}:“{value}”", "unifiedFieldList.fieldStats.filterValueButtonAriaLabel": "筛留 {field}:“{value}”", "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "{sampledDocumentsFormatted} 个样例{sampledDocuments, plural, other {记录}}无字段数据。", - "unifiedFieldList.fieldCategorizeButton.label": "运行模式分析", "unifiedFieldList.fieldItemButton.mappingConflictDescription": "此字段在匹配此模式的各个索引中已定义为若干类型(字符串、整数等)。您可能仍可以使用此冲突字段,但它无法用于需要 Kibana 知道其类型的函数。要解决此问题,需要重新索引您的数据。", "unifiedFieldList.fieldItemButton.mappingConflictTitle": "映射冲突", "unifiedFieldList.fieldList.noFieldsCallout.noDataLabel": "无字段。", @@ -12934,20 +12932,6 @@ "xpack.csp.findings.findingsFlyout.ruleTab.tagsTitle": "标签", "xpack.csp.findings.findingsFlyout.ruleTabTitle": "规则", "xpack.csp.findings.findingsFlyout.tableTabTitle": "表", - "xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel": "上次检查时间", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageFixedVersionColumnLabel": "修复版本", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageNameColumnLabel": "软件包", - "xpack.csp.findings.findingsTable.findingsTableColumn.packageVersionColumnLabel": "版本", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel": "资源 ID", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel": "资源名称", - "xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel": "资源类型", - "xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel": "结果", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleNameColumnLabel": "规则名称", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleNumberColumnLabel": "规则编号", - "xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel": "CIS 部分", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityIdColumnLabel": "漏洞", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilityScoreColumnLabel": "CVSS", - "xpack.csp.findings.findingsTable.findingsTableColumn.vulnerabilitySeverityColumnLabel": "严重性", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialFileText": "包含用于订阅的凭据和密钥的 JSON 文件的路径", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText": "包含用于订阅的凭据和密钥的 JSON Blob", "xpack.csp.findings.gcpIntegration.gcpInputText.credentialSelectBoxTitle": "凭据", @@ -13599,7 +13583,6 @@ "xpack.elasticAssistant.assistant.content.prompts.system.ifYouDontKnowTheAnswer": "不回答与 Elastic Security 无关的问题。", "xpack.elasticAssistant.assistant.content.prompts.system.superheroPersonality": "提供可能的最详细、最相关的答案,就好像您正将此信息转发给网络安全专家一样。", "xpack.elasticAssistant.assistant.content.prompts.system.superheroSystemPromptName": "已增强系统提示", - "xpack.elasticAssistant.assistant.content.prompts.system.useTheFollowingContextToAnswer": "使用以下上下文回答问题:", "xpack.elasticAssistant.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "您是一位可帮助回答 Elastic Security 相关问题的专家助手。", "xpack.elasticAssistant.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "添加描述、建议操作和带项目符号的分类步骤。使用提供的 MITRE ATT&CK 数据以从 MITRE 添加更多上下文和建议,以及指向 MITRE 网站上的相关页面的超链接。确保包括上下文中的用户和主机风险分数数据。您的响应应包含指向 Elastic Security 特定功能的步骤,包括终端响应操作、Elastic 代理 OSQuery 管理器集成(带示例 osquery 查询)、时间线和实体分析,以及所有相关 Elastic Security 文档的链接。", "xpack.elasticAssistant.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "评估来自上述上下文的事件,并以用于我的 Elastic Security 案例的 Markdown 语法对您的输出进行全面格式化。", @@ -13893,7 +13876,6 @@ "xpack.enterpriseSearch.content.indices.configurationConnector.apiKey.description": "首先,生成一个 Elasticsearch API 密钥。此 {apiKeyName} 密钥将为连接器启用读取和写入权限,以便将文档索引到已创建的 {indexName} 索引。请将该密钥保存到安全位置,因为您需要它来配置连接器。", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.apiKey.description": "此本机连接器的 API 密钥 {apiKeyName} 由 Elasticsearch 内部托管。该连接器使用此 API 密钥将文档索引到 {indexName} 索引。要滚动更新 API 密钥,请单击“生成 API 密钥”。", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.config.sourceSecurityDocumentationLinkLabel": "{name} 身份验证", - "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.connectorConnected": "您的连接器 {name} 已成功连接到 Search。", "xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.description": "是否要自我托管此本机连接器?将其转换为将在您自己的基础设施上进行自我管理的 {link}。如果希望使用我们的 Python 框架定制代码,您需要转换此连接器。", "xpack.enterpriseSearch.content.indices.configurationConnector.researchConfiguration.serviceDocumentationLinkLabel": "{name} 文档", "xpack.enterpriseSearch.content.indices.connectorScheduling.page.description": "现已部署您的连接器。在此处计划重复内容和访问控制同步。如果要运行快速测试,请使用 {sync} 按钮启动一次性同步。", @@ -33600,7 +33582,6 @@ "xpack.securitySolution.assistant.content.prompts.system.outputFormatting": "如果您回答与 KQL、EQL 或 ES|QL 相关的问题,它应在 Elastic Security 时间线中立即可用;请始终用反勾号对输出进行正确格式化。为查询 DSL 提供的任何答案也应在安全时间线中可用。这意味着您只应包括查询的“筛选”部分。", "xpack.securitySolution.assistant.content.prompts.system.superheroPersonality": "提供可能的最详细、最相关的答案,就好像您正将此信息转发给网络安全专家一样。", "xpack.securitySolution.assistant.content.prompts.system.superheroSystemPromptName": "已增强系统提示", - "xpack.securitySolution.assistant.content.prompts.system.useTheFollowingContextToAnswer": "使用以下上下文回答问题:", "xpack.securitySolution.assistant.content.prompts.system.youAreAHelpfulExpertAssistant": "您是一位可帮助回答 Elastic Security 相关问题的专家助手。", "xpack.securitySolution.assistant.content.prompts.user.finallySuggestInvestigationGuideAndFormatAsMarkdown": "添加描述、建议操作和带项目符号的分类步骤。使用提供的 MITRE ATT&CK 数据以从 MITRE 添加更多上下文和建议,以及指向 MITRE 网站上的相关页面的超链接。确保包括上下文中的用户和主机风险分数数据。您的响应应包含指向 Elastic Security 特定功能的步骤,包括终端响应操作、Elastic 代理 OSQuery 管理器集成(带示例 osquery 查询)、时间线和实体分析,以及所有相关 Elastic Security 文档的链接。", "xpack.securitySolution.assistant.content.prompts.user.thenSummarizeSuggestedKqlAndEqlQueries": "评估来自上述上下文的事件,并以用于我的 Elastic Security 案例的 Markdown 语法对您的输出进行全面格式化。", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx index 116c97ef905d7..e195b12eea9e6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details_route.tsx @@ -130,20 +130,22 @@ export const RuleDetailsRoute: React.FunctionComponent = return null; }; - return rule && ruleType && actionTypes ? ( - <> - {getLegacyUrlConflictCallout()} - - - ) : ( - - ); + if (rule && ruleType && actionTypes) { + return ( + <> + {getLegacyUrlConflictCallout()} + + + ); + } + + return ; }; export async function getRuleData( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx index f1df6af277549..2c7c5a7ac9267 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_route.tsx @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { ToastsApi } from '@kbn/core/public'; -import React, { useState, useEffect, useRef, useCallback } from 'react'; +import React, { useState, useEffect, useRef, useCallback, Suspense } from 'react'; import { Rule, RuleSummary, RuleType } from '../../../../types'; import { ComponentOpts as RuleApis, @@ -76,17 +76,19 @@ export const RuleRoute: React.FunctionComponent = ({ ); return ruleSummary ? ( - + }> + + ) : ( ); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts index afe7275e808b1..000ff81d2d2dc 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/telemetry/alerting_and_actions_telemetry.ts @@ -7,6 +7,7 @@ import expect from '@kbn/expect'; import { ESTestIndexTool } from '@kbn/alerting-api-integration-helpers'; +import { OpenAISimulator } from '@kbn/actions-simulators-plugin/server/openai_simulation'; import { Spaces, Superuser } from '../../../scenarios'; import { getUrlPrefix, @@ -25,24 +26,43 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F const retry = getService('retry'); const esTestIndexTool = new ESTestIndexTool(es, retry); const supertestWithoutAuth = getService('supertestWithoutAuth'); + const configService = getService('config'); describe('test telemetry', () => { const objectRemover = new ObjectRemover(supertest); const esQueryRuleId: { [key: string]: string } = {}; + const simulator = new OpenAISimulator({ + returnError: false, + proxy: { + config: configService.get('kbnTestServer.serverArgs'), + }, + }); + let apiUrl: string; beforeEach(async () => { await esTestIndexTool.destroy(); await esTestIndexTool.setup(); }); + before(async () => { + apiUrl = await simulator.start(); + }); + afterEach(() => objectRemover.removeAll()); after(async () => { + simulator.close(); await esTestIndexTool.destroy(); }); - async function createConnector(opts: { name: string; space: string; connectorTypeId: string }) { - const { name, space, connectorTypeId } = opts; + async function createConnector(opts: { + name: string; + space: string; + connectorTypeId: string; + secrets?: { apiKey: string }; + config?: { apiProvider: string; apiUrl: string }; + }) { + const { name, space, connectorTypeId, secrets, config } = opts; const { body: createdConnector } = await supertestWithoutAuth .post(`${getUrlPrefix(space)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -50,8 +70,8 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F .send({ name, connector_type_id: connectorTypeId, - config: {}, - secrets: {}, + config: config || {}, + secrets: secrets || {}, }) .expect(200); objectRemover.add(space, createdConnector.id, 'connector', 'actions'); @@ -89,7 +109,18 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F space: space.id, connectorTypeId: 'test.excluded', }); - + const genAiConnectorId = await createConnector({ + name: 'gen ai connector', + space: space.id, + connectorTypeId: '.gen-ai', + secrets: { + apiKey: 'genAiApiKey', + }, + config: { + apiProvider: 'OpenAI', + apiUrl, + }, + }); await createRule({ space: space.id, ruleOverwrites: { @@ -115,6 +146,11 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F group: 'default', params: {}, }, + { + id: genAiConnectorId, + group: 'default', + params: {}, + }, ], }, }); @@ -186,7 +222,7 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F function verifyActionsTelemetry(telemetry: any) { logger.info(`actions telemetry - ${JSON.stringify(telemetry)}`); // total number of active connectors (used by a rule) - expect(telemetry.count_active_total).to.equal(7); + expect(telemetry.count_active_total).to.equal(10); // total number of connectors broken down by connector type expect(telemetry.count_by_type['test.throw']).to.equal(3); @@ -198,6 +234,8 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F expect(telemetry.count_by_type.__index).to.equal(1); expect(telemetry.count_by_type['test.index-record']).to.equal(1); expect(telemetry.count_by_type.__webhook).to.equal(4); + expect(telemetry.count_by_type['__gen-ai']).to.equal(3); + expect(telemetry.count_gen_ai_provider_types.OpenAI).to.equal(3); // total number of active connectors broken down by connector type expect(telemetry.count_active_by_type['test.throw']).to.equal(3); @@ -284,8 +322,8 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F // attached connectors stats expect(telemetry.connectors_per_alert.min).to.equal(0); - expect(telemetry.connectors_per_alert.avg).to.equal(0.8); - expect(telemetry.connectors_per_alert.max).to.equal(3); + expect(telemetry.connectors_per_alert.avg).to.equal(1); + expect(telemetry.connectors_per_alert.max).to.equal(4); // number of spaces with rules expect(telemetry.count_rules_namespaces).to.equal(3); @@ -497,7 +535,7 @@ export default function createAlertingAndActionsTelemetryTests({ getService }: F expect(taskState).not.to.be(undefined); actionsTelemetry = JSON.parse(taskState!); expect(actionsTelemetry.runs > 0).to.be(true); - expect(actionsTelemetry.count_total).to.equal(21); + expect(actionsTelemetry.count_total).to.equal(24); }); verifyActionsTelemetry(actionsTelemetry); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/user_managed_api_key.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/user_managed_api_key.ts index 0ebd0726e5f8e..772ba62cac9a1 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/user_managed_api_key.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/user_managed_api_key.ts @@ -632,7 +632,8 @@ export default function userManagedApiKeyTest({ getService }: FtrProviderContext const generatedApiKeyName = generateAPIKeyName(ruleTypeId, ruleName); const { body: allApiKeys } = await supertest - .get(`/internal/security/api_key?isAdmin=true`) + .post(`/internal/security/api_key/_query`) + .send({ query: { match: { name: generatedApiKeyName } } }) .set('kbn-xsrf', 'foo') .expect(200); diff --git a/x-pack/test/api_integration/apis/management/rollup/index_patterns_extensions.js b/x-pack/test/api_integration/apis/management/rollup/index_patterns_extensions.js index 1caf5078afd4b..2a101609ebe51 100644 --- a/x-pack/test/api_integration/apis/management/rollup/index_patterns_extensions.js +++ b/x-pack/test/api_integration/apis/management/rollup/index_patterns_extensions.js @@ -21,7 +21,8 @@ export default function ({ getService }) { registerHelpers(getService); describe('index patterns extension', () => { - describe('Fields for wildcards', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/184081 + describe.skip('Fields for wildcards', () => { describe('query params validation', () => { let uri; let body; diff --git a/x-pack/test/api_integration/apis/management/rollup/rollup.js b/x-pack/test/api_integration/apis/management/rollup/rollup.js index 699592fd99920..a44da818a94e4 100644 --- a/x-pack/test/api_integration/apis/management/rollup/rollup.js +++ b/x-pack/test/api_integration/apis/management/rollup/rollup.js @@ -24,7 +24,8 @@ export default function ({ getService }) { cleanUp, } = registerHelpers(getService); - describe('jobs', () => { + // Failing: See https://github.com/elastic/kibana/issues/184073 + describe.skip('jobs', () => { after(() => cleanUp()); describe('indices', () => { @@ -92,7 +93,8 @@ export default function ({ getService }) { }); }); - describe('create', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/183928 + describe.skip('create', () => { let indexName; beforeEach(async () => { diff --git a/x-pack/test/api_integration/apis/management/rollup/rollup_search.js b/x-pack/test/api_integration/apis/management/rollup/rollup_search.js index 1e1738d60e9db..8d2fb780c9ff3 100644 --- a/x-pack/test/api_integration/apis/management/rollup/rollup_search.js +++ b/x-pack/test/api_integration/apis/management/rollup/rollup_search.js @@ -17,7 +17,8 @@ export default function ({ getService }) { const { createIndexWithMappings, getJobPayload, createJob, cleanUp } = registerHelpers(getService); - describe('search', () => { + // Failing: See https://github.com/elastic/kibana/issues/184128 + describe.skip('search', () => { const URI = `${API_BASE_PATH}/search`; it('return a 404 if the rollup index does not exist', async () => { diff --git a/x-pack/test/api_integration/apis/metrics_ui/services.ts b/x-pack/test/api_integration/apis/metrics_ui/services.ts index 959e6f1109e74..d8bc483b6ce6a 100644 --- a/x-pack/test/api_integration/apis/metrics_ui/services.ts +++ b/x-pack/test/api_integration/apis/metrics_ui/services.ts @@ -20,7 +20,8 @@ export default function ({ getService }: FtrProviderContext) { const apmSynthtraceKibanaClient = getService('apmSynthtraceKibanaClient'); const esClient = getService('es'); - describe('GET /infra/services', () => { + // Failing: See https://github.com/elastic/kibana/issues/176967 + describe.skip('GET /infra/services', () => { let synthtraceApmClient: ApmSynthtraceEsClient; const from = new Date(Date.now() - 1000 * 60 * 2).toISOString(); const to = new Date().toISOString(); diff --git a/x-pack/test/api_integration/apis/security/api_keys.ts b/x-pack/test/api_integration/apis/security/api_keys.ts index f92d427f0160d..011b049145ad3 100644 --- a/x-pack/test/api_integration/apis/security/api_keys.ts +++ b/x-pack/test/api_integration/apis/security/api_keys.ts @@ -180,13 +180,14 @@ export default function ({ getService }: FtrProviderContext) { expect(updated).to.eql(true); }); - const getResult = await supertest - .get('/internal/security/api_key') + const queryResult = await supertest + .post('/internal/security/api_key/_query') + .send({}) .set('kbn-xsrf', 'xxx') - .send(); + .expect(200); - expect(getResult.body.apiKeys).to.not.be(undefined); - const updatedKey = getResult.body.apiKeys.find( + expect(queryResult.body.apiKeys).to.not.be(undefined); + const updatedKey = queryResult.body.apiKeys.find( (apiKey: { id: string }) => apiKey.id === id ); expect(updatedKey).to.not.be(undefined); @@ -257,13 +258,14 @@ export default function ({ getService }: FtrProviderContext) { if (!basic) { expect(updateResult.body.updated).to.be(true); - const getResult = await supertest - .get('/internal/security/api_key') + const queryResult = await supertest + .post('/internal/security/api_key/_query') + .send({}) .set('kbn-xsrf', 'xxx') - .send(); + .expect(200); - expect(getResult.body.apiKeys).to.not.be(undefined); - const updatedKey = getResult.body.apiKeys.find( + expect(queryResult.body.apiKeys).to.not.be(undefined); + const updatedKey = queryResult.body.apiKeys.find( (apiKey: { id: string }) => apiKey.id === id ); expect(updatedKey).to.not.be(undefined); diff --git a/x-pack/test/api_integration/apis/security/index.ts b/x-pack/test/api_integration/apis/security/index.ts index b595894f157fc..0e3f85d22a4ad 100644 --- a/x-pack/test/api_integration/apis/security/index.ts +++ b/x-pack/test/api_integration/apis/security/index.ts @@ -17,6 +17,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./builtin_es_privileges')); loadTestFile(require.resolve('./change_password')); loadTestFile(require.resolve('./index_fields')); + loadTestFile(require.resolve('./query_api_keys')); loadTestFile(require.resolve('./roles')); loadTestFile(require.resolve('./users')); loadTestFile(require.resolve('./privileges')); diff --git a/x-pack/test/api_integration/apis/security/query_api_keys.ts b/x-pack/test/api_integration/apis/security/query_api_keys.ts new file mode 100644 index 0000000000000..551b28ed8ebc0 --- /dev/null +++ b/x-pack/test/api_integration/apis/security/query_api_keys.ts @@ -0,0 +1,300 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { setTimeout as setTimeoutAsync } from 'timers/promises'; + +import type { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const config = getService('config'); + const isBasicLicense = config.get('esTestCluster.license') === 'basic'; + + const createKey = async (name: string, type: string, managed: boolean, expiry?: string) => { + const access = + type === 'cross_cluster' + ? { + search: [ + { + names: ['*'], + }, + ], + replication: [ + { + names: ['*'], + }, + ], + } + : undefined; + const metadata = managed ? { managed: true } : {}; + + const { body: apiKey } = await supertest + .post('/internal/security/api_key') + .set('kbn-xsrf', 'xxx') + .send({ + name, + type, + metadata, + ...(access ? { access } : {}), + ...(expiry ? { expiration: expiry } : {}), + }) + .expect(200); + expect(apiKey.name).to.eql(name); + return apiKey; + }; + + const createCrossClusterKeys = async () => { + // Create 10 'cross_cluster' keys + return Array.from({ length: 10 }, (_, i) => i).map( + async (i) => await createKey(`cross_cluster_key_${i}`, 'cross_cluster', false) + ); + }; + + const createExpiredKeys = async () => { + const restKeys = Array.from({ length: 10 }, (_, i) => i).map( + async (i) => await createKey(`rest_key_${i}`, 'rest', false) + ); + const expiredKeys = Array.from({ length: 5 }, (_, i) => i).map( + async (i) => await createKey(`rest_key_${i}`, 'rest', false, '1s') + ); + await Promise.all([...restKeys, ...expiredKeys]); + }; + + const createMultipleKeys = async () => { + const restKeys = Array.from({ length: 5 }, (_, i) => i).map( + async (i) => await createKey(`rest_key_${i}`, 'rest', false) + ); + + const alertingKeys = Array.from({ length: 5 }, (_, i) => i).map(async (i) => { + const randomString = Math.random().toString(36).substring(7); // Generate a random string + return await createKey(`Alerting: ${randomString}`, 'rest', false); + }); + + const metadataManagedKeys = Array.from({ length: 5 }, (_, i) => i).map(async (i) => { + const randomString = Math.random().toString(36).substring(7); // Generate a random string + await createKey(`Managed_metadata_${randomString}`, 'rest', true); + }); + + const crossClusterKeys = isBasicLicense ? [] : await createCrossClusterKeys(); + + await Promise.all([...crossClusterKeys, ...restKeys, ...alertingKeys, ...metadataManagedKeys]); + }; + + const cleanup = async () => { + await getService('es').deleteByQuery({ + index: '.security-7', + body: { query: { match: { doc_type: 'api_key' } } }, + refresh: true, + }); + }; + + describe('Has queryable API Keys', () => { + beforeEach(cleanup); + afterEach(cleanup); + + it('should return all the keys', async () => { + await createMultipleKeys(); + + const { body: keys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + from: 0, + size: 100, + }) + .expect(200); + if (!isBasicLicense) { + expect(keys.apiKeys.length).to.be(25); + } else { + expect(keys.apiKeys.length).to.be(15); + } + }); + + it('should paginate keys', async () => { + await createKey('first-api-key', 'rest', false); + await createKey('second-api-key', 'rest', false); + const { body: keys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + from: 0, + size: 1, + }) + .expect(200); + expect(keys.apiKeys.length).to.be(1); + expect(keys.total).to.be(2); + expect(keys.apiKeys[0].name).to.be('first-api-key'); + + const { body: paginatedKeys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + from: 1, + size: 1, + }) + .expect(200); + expect(keys.apiKeys.length).to.be(1); + expect(keys.total).to.be(2); + expect(paginatedKeys.apiKeys[0].name).to.be('second-api-key'); + }); + + it('should return the correct aggregations', async () => { + await createMultipleKeys(); + + const { body: aggregationResponse } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { match: { invalidated: false } }, + }) + .expect(200); + + expect(aggregationResponse.aggregations).to.have.property('usernames'); + expect(aggregationResponse.aggregations.usernames.buckets.length).to.be(1); + + expect(aggregationResponse.aggregations).to.have.property('managed'); + expect(aggregationResponse.aggregations.managed.buckets.metadataBased.doc_count).to.eql(5); + + if (!isBasicLicense) { + expect(aggregationResponse.total).to.be(25); + expect(aggregationResponse.aggregations).to.have.property('types'); + expect(aggregationResponse.aggregations.types.buckets.length).to.be(2); + } else { + expect(aggregationResponse.total).to.be(15); + + expect(aggregationResponse.aggregations).to.have.property('types'); + expect(aggregationResponse.aggregations.types.buckets.length).to.be(1); + } + }); + + it('should query API keys with custom queries', async () => { + await createMultipleKeys(); + + const { body: keys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { + bool: { + filter: [ + { + term: { + type: 'rest', + }, + }, + ], + }, + }, + }) + .expect(200); + + expect(keys.apiKeys.length).to.be(10); + keys.apiKeys.forEach((key: any) => { + expect(key.type).to.be('rest'); + }); + }); + + it('should query API keys with filters', async () => { + await createMultipleKeys(); + + const { body: restKeys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { + match_all: {}, + }, + filters: { + type: 'rest', + }, + }) + .expect(200); + + expect(restKeys.apiKeys.length).to.be(5); + restKeys.apiKeys.forEach((key: any) => { + expect(key.type).to.be('rest'); + }); + + const { body: managedKeys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { + match_all: {}, + }, + filters: { + type: 'managed', + }, + }) + .expect(200); + + expect(managedKeys.apiKeys.length).to.be(10); + const alertingNameKeys = managedKeys.apiKeys.filter((key: any) => + key.name.startsWith('Alerting:') + ); + + expect(alertingNameKeys.length).to.be(5); + }); + + it('should correctly filter active and expired keys', async () => { + await createExpiredKeys(); + + const { body: activeKeys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { + match_all: {}, + }, + filters: { + expired: false, + }, + }) + .expect(200); + + expect(activeKeys.apiKeys.length).to.be(10); + + await setTimeoutAsync(2500); + + const { body: expiredKeys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { + match_all: {}, + }, + filters: { + expired: true, + }, + }) + .expect(200); + expect(expiredKeys.apiKeys.length).to.be(5); + }); + + it('should correctly filter keys with combined filters', async () => { + await createExpiredKeys(); + await setTimeoutAsync(2500); + + const { body: expiredRestKeys } = await supertest + .post('/internal/security/api_key/_query') + .set('kbn-xsrf', 'xxx') + .send({ + query: { + match_all: {}, + }, + filters: { + type: 'rest', + expired: true, + }, + }) + .expect(200); + + expect(expiredRestKeys.apiKeys.length).to.be(5); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/security/security_basic.ts b/x-pack/test/api_integration/apis/security/security_basic.ts index 1e7d8ed1ad4b2..709f738b4e9bb 100644 --- a/x-pack/test/api_integration/apis/security/security_basic.ts +++ b/x-pack/test/api_integration/apis/security/security_basic.ts @@ -17,6 +17,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./builtin_es_privileges')); loadTestFile(require.resolve('./change_password')); loadTestFile(require.resolve('./index_fields')); + loadTestFile(require.resolve('./query_api_keys')); loadTestFile(require.resolve('./roles')); loadTestFile(require.resolve('./users')); loadTestFile(require.resolve('./privileges_basic')); diff --git a/x-pack/test/apm_api_integration/tests/index.ts b/x-pack/test/apm_api_integration/tests/index.ts index c8eec324f4bd7..ae5b30b175825 100644 --- a/x-pack/test/apm_api_integration/tests/index.ts +++ b/x-pack/test/apm_api_integration/tests/index.ts @@ -29,7 +29,8 @@ export default function apmApiIntegrationTests({ getService, loadTestFile }: Ftr // DO NOT SKIP // Skipping here will skip the entire apm api test suite // Instead skip (flaky) tests individually - describe('APM API tests', function () { + // Failing: See https://github.com/elastic/kibana/issues/176948 + describe.skip('APM API tests', function () { const filePattern = getGlobPattern(); const tests = globby.sync(filePattern, { cwd }); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/attachments_framework/registered_persistable_state_trial.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/attachments_framework/registered_persistable_state_trial.ts index 3b2b536b3c88d..c5e5a23032f66 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/attachments_framework/registered_persistable_state_trial.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/trial/attachments_framework/registered_persistable_state_trial.ts @@ -38,6 +38,7 @@ export default ({ getService }: FtrProviderContext): void => { aiopsChangePointChart: 'a1212d71947ec34487b374cecc47ab9941b5d91c', ml_anomaly_charts: '23e92e824af9db6e8b8bb1d63c222e04f57d2147', ml_anomaly_swimlane: 'a3517f3e53fb041e9cbb150477fb6ef0f731bd5f', + ml_single_metric_viewer: '8b9532b0a40dfdfa282e262949b82cc1a643147c', }); }); }); diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts b/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts index 09f200913773e..a7f36230bb1a5 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts @@ -403,7 +403,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await groupSelector.setValue('Resource'); // Filter bar uses the field's customLabel in the DataView - await filterBar.addFilter({ field: 'Rule Name', operation: 'is', value: ruleName1 }); + await filterBar.addFilter({ field: 'rule.name', operation: 'is', value: ruleName1 }); expect(await filterBar.hasFilter('rule.name', ruleName1)).to.be(true); const grouping = await findings.findingsGrouping(); diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/__snapshots__/agent_policy.snap b/x-pack/test/fleet_api_integration/apis/agent_policy/__snapshots__/agent_policy.snap index b8e043638fdee..9112ad20ad860 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/__snapshots__/agent_policy.snap +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/__snapshots__/agent_policy.snap @@ -32,6 +32,7 @@ Object { "namespace": "default", "package": Object { "name": "system", + "requires_root": true, "title": "System", }, "revision": 1, diff --git a/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts b/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts index 831659929d86d..03ae82d06f6b7 100644 --- a/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts +++ b/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts @@ -191,6 +191,8 @@ export default function (providerContext: FtrProviderContext) { unhealthy: 1, offline: 0, updating: 0, + unenrolled: 0, + inactive: 0, num_host_urls: 2, }); }); diff --git a/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts b/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts index 197b5b5338a17..01d2452121cb8 100644 --- a/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts +++ b/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts @@ -14,7 +14,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const retry = getService('retry'); const ml = getService('ml'); const PageObjects = getPageObjects(['common', 'timePicker', 'discover']); - const selectedField = '@message'; const totalDocCount = 14005; async function retrySwitchTab(tabIndex: number, seconds: number) { @@ -55,15 +54,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.discover.selectIndexPattern('logstash-*'); await aiops.logPatternAnalysisPage.assertDiscoverDocCount(totalDocCount); - await aiops.logPatternAnalysisPage.clickDiscoverField(selectedField); - await aiops.logPatternAnalysisPage.clickDiscoverMenuAnalyzeButton(selectedField); + await aiops.logPatternAnalysisPage.clickPatternsTab(); + await aiops.logPatternAnalysisPage.assertLogPatternAnalysisTabContentsExists(); - await aiops.logPatternAnalysisPage.assertLogPatternAnalysisFlyoutExists(); - await aiops.logPatternAnalysisPage.assertLogPatternAnalysisFlyoutTitle(selectedField); - - await aiops.logPatternAnalysisPage.setRandomSamplingOption('aiopsRandomSamplerOptionOff'); + await aiops.logPatternAnalysisPage.setRandomSamplingOptionDiscover( + 'aiopsRandomSamplerOptionOff' + ); - await aiops.logPatternAnalysisPage.assertTotalCategoriesFound(3); + await aiops.logPatternAnalysisPage.assertTotalCategoriesFoundDiscover(3); await aiops.logPatternAnalysisPage.assertCategoryTableRows(3); // get category count from the first row @@ -87,15 +85,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); await aiops.logPatternAnalysisPage.assertDiscoverDocCount(totalDocCount); - await aiops.logPatternAnalysisPage.clickDiscoverField(selectedField); - await aiops.logPatternAnalysisPage.clickDiscoverMenuAnalyzeButton(selectedField); + await aiops.logPatternAnalysisPage.clickPatternsTab(); + await aiops.logPatternAnalysisPage.assertLogPatternAnalysisTabContentsExists(); - await aiops.logPatternAnalysisPage.assertLogPatternAnalysisFlyoutExists(); - await aiops.logPatternAnalysisPage.assertLogPatternAnalysisFlyoutTitle(selectedField); - - await aiops.logPatternAnalysisPage.setRandomSamplingOption('aiopsRandomSamplerOptionOff'); + await aiops.logPatternAnalysisPage.setRandomSamplingOptionDiscover( + 'aiopsRandomSamplerOptionOff' + ); - await aiops.logPatternAnalysisPage.assertTotalCategoriesFound(3); + await aiops.logPatternAnalysisPage.assertTotalCategoriesFoundDiscover(3); await aiops.logPatternAnalysisPage.assertCategoryTableRows(3); // get category count from the first row diff --git a/x-pack/test/functional/apps/dashboard/group3/reporting/screenshots.ts b/x-pack/test/functional/apps/dashboard/group3/reporting/screenshots.ts index d7bd90c5e74d6..0a09c785d64a4 100644 --- a/x-pack/test/functional/apps/dashboard/group3/reporting/screenshots.ts +++ b/x-pack/test/functional/apps/dashboard/group3/reporting/screenshots.ts @@ -155,7 +155,6 @@ export default function ({ }); }); - // FLAKY: https://github.com/elastic/kibana/issues/183566 describe.skip('Preserve Layout', () => { before(async () => { await loadEcommerce(); @@ -172,10 +171,10 @@ export default function ({ await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); await PageObjects.reporting.openExportTab(); await PageObjects.reporting.clickGenerateReportButton(); - await PageObjects.share.closeShareModal(); const url = await PageObjects.reporting.getReportURL(60000); const res = await PageObjects.reporting.getResponse(url ?? ''); + await PageObjects.share.closeShareModal(); expect(res.status).to.equal(200); expect(res.get('content-type')).to.equal('application/pdf'); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index.ts b/x-pack/test/functional/apps/ml/data_visualizer/index.ts index e5b1cbab24809..bddbcdfb95370 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index.ts @@ -35,6 +35,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./index_data_visualizer_random_sampler')); loadTestFile(require.resolve('./index_data_visualizer_filters')); loadTestFile(require.resolve('./index_data_visualizer_grid_in_discover')); + loadTestFile(require.resolve('./index_data_visualizer_grid_in_discover_trial')); loadTestFile(require.resolve('./index_data_visualizer_grid_in_dashboard')); loadTestFile(require.resolve('./index_data_visualizer_actions_panel')); loadTestFile(require.resolve('./index_data_visualizer_data_view_management')); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts index 7c1e2a1a8f946..14e16d5929779 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts @@ -28,24 +28,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const startTime = 'Jan 1, 2016 @ 00:00:00.000'; const endTime = 'Nov 1, 2020 @ 00:00:00.000'; - function runTestsWhenDisabled(testData: TestData) { - it('should not show view mode toggle or Field stats table', async function () { - await PageObjects.common.navigateToApp('discover'); - if (testData.isSavedSearch) { - await retry.tryForTime(2 * 1000, async () => { - await PageObjects.discover.loadSavedSearch(testData.sourceIndexOrSavedSearch); - }); - } else { - await dataViews.switchToAndValidate(testData.sourceIndexOrSavedSearch); - } - - await PageObjects.timePicker.setAbsoluteRange(startTime, endTime); - - await PageObjects.discover.assertViewModeToggleNotExists(); - await PageObjects.discover.assertFieldStatsTableNotExists(); - }); - } - function runTests(testData: TestData) { describe(`with ${testData.suiteTitle}`, function () { it(`displays the 'Field statistics' table content correctly`, async function () { @@ -128,14 +110,5 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { runTests(farequoteLuceneFiltersSearchTestData); runTests(sampleLogTestData); }); - - describe('when disabled', function () { - before(async function () { - // Ensure that the setting is set to default state which is false - await ml.testResources.setAdvancedSettingProperty(SHOW_FIELD_STATISTICS, false); - }); - - runTestsWhenDisabled(farequoteDataViewTestData); - }); }); } diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_basic.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_basic.ts new file mode 100644 index 0000000000000..7d7e5dfe0760f --- /dev/null +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_basic.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { TestData } from './types'; + +const SHOW_FIELD_STATISTICS = 'discover:showFieldStatistics'; +import { farequoteDataViewTestData } from './index_test_data'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'settings']); + const ml = getService('ml'); + const retry = getService('retry'); + const dataViews = getService('dataViews'); + + const startTime = 'Jan 1, 2016 @ 00:00:00.000'; + const endTime = 'Nov 1, 2020 @ 00:00:00.000'; + + function runTestsWhenDisabled(testData: TestData) { + it('should not show view mode toggle or Field stats table', async function () { + await PageObjects.common.navigateToApp('discover'); + if (testData.isSavedSearch) { + await retry.tryForTime(2 * 1000, async () => { + await PageObjects.discover.loadSavedSearch(testData.sourceIndexOrSavedSearch); + }); + } else { + await dataViews.switchToAndValidate(testData.sourceIndexOrSavedSearch); + } + + await PageObjects.timePicker.setAbsoluteRange(startTime, endTime); + + await PageObjects.discover.assertViewModeToggleNotExists(); + await PageObjects.discover.assertFieldStatsTableNotExists(); + }); + } + + describe('field statistics in Discover (basic license)', function () { + before(async function () { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_module_sample_logs', '@timestamp'); + await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); + await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded(); + await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded(); + await ml.testResources.createSavedSearchFarequoteFilterAndKueryIfNeeded(); + + await ml.securityUI.loginAsMlPowerUser(); + }); + + after(async function () { + await ml.testResources.clearAdvancedSettingProperty(SHOW_FIELD_STATISTICS); + await ml.testResources.deleteSavedSearches(); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + }); + + describe('when disabled', function () { + before(async function () { + // Ensure that the setting is set to default state which is false + await ml.testResources.setAdvancedSettingProperty(SHOW_FIELD_STATISTICS, false); + }); + + runTestsWhenDisabled(farequoteDataViewTestData); + }); + }); +} diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_trial.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_trial.ts new file mode 100644 index 0000000000000..9a1429805a18f --- /dev/null +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_trial.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { TestData } from './types'; + +const SHOW_FIELD_STATISTICS = 'discover:showFieldStatistics'; +import { farequoteDataViewTestData } from './index_test_data'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'settings']); + const ml = getService('ml'); + const retry = getService('retry'); + const dataViews = getService('dataViews'); + + const startTime = 'Jan 1, 2016 @ 00:00:00.000'; + const endTime = 'Nov 1, 2020 @ 00:00:00.000'; + + function runTestsWhenDisabled(testData: TestData) { + it('should show view mode toggle but not Field stats tab', async function () { + await PageObjects.common.navigateToApp('discover'); + if (testData.isSavedSearch) { + await retry.tryForTime(2 * 1000, async () => { + await PageObjects.discover.loadSavedSearch(testData.sourceIndexOrSavedSearch); + }); + } else { + await dataViews.switchToAndValidate(testData.sourceIndexOrSavedSearch); + } + + await PageObjects.timePicker.setAbsoluteRange(startTime, endTime); + + await PageObjects.discover.assertViewModeToggleExists(); + await PageObjects.discover.assertFieldStatsTableNotExists(); + }); + } + + describe('field statistics in Discover (trial license)', function () { + before(async function () { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_module_sample_logs', '@timestamp'); + await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); + await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded(); + await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded(); + await ml.testResources.createSavedSearchFarequoteFilterAndKueryIfNeeded(); + + await ml.securityUI.loginAsMlPowerUser(); + }); + + after(async function () { + await ml.testResources.clearAdvancedSettingProperty(SHOW_FIELD_STATISTICS); + await ml.testResources.deleteSavedSearches(); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + }); + + describe('when disabled', function () { + before(async function () { + // Ensure that the setting is set to default state which is false + await ml.testResources.setAdvancedSettingProperty(SHOW_FIELD_STATISTICS, false); + }); + + runTestsWhenDisabled(farequoteDataViewTestData); + }); + }); +} diff --git a/x-pack/test/functional/apps/rollup_job/hybrid_index_pattern.js b/x-pack/test/functional/apps/rollup_job/hybrid_index_pattern.js index a42fc0fde8cbe..799274968167c 100644 --- a/x-pack/test/functional/apps/rollup_job/hybrid_index_pattern.js +++ b/x-pack/test/functional/apps/rollup_job/hybrid_index_pattern.js @@ -17,7 +17,9 @@ export default function ({ getService, getPageObjects }) { const PageObjects = getPageObjects(['common', 'settings']); const esDeleteAllIndices = getService('esDeleteAllIndices'); - describe('hybrid index pattern', function () { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/183975 + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/183976 + describe.skip('hybrid index pattern', function () { //Since rollups can only be created once with the same name (even if you delete it), //we add the Date.now() to avoid name collision if you run the tests locally back to back. const rollupJobName = `hybrid-index-pattern-test-rollup-job-${Date.now()}`; diff --git a/x-pack/test/functional/apps/rollup_job/tsvb.js b/x-pack/test/functional/apps/rollup_job/tsvb.js index 957b33618d9cf..e7ad485224389 100644 --- a/x-pack/test/functional/apps/rollup_job/tsvb.js +++ b/x-pack/test/functional/apps/rollup_job/tsvb.js @@ -24,7 +24,9 @@ export default function ({ getService, getPageObjects }) { const fromTime = 'Oct 15, 2019 @ 00:00:01.000'; const toTime = 'Oct 15, 2019 @ 19:31:44.000'; - describe('tsvb integration', function () { + // FLAKY: https://github.com/elastic/kibana/issues/56816 + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/168267 + describe.skip('tsvb integration', function () { //Since rollups can only be created once with the same name (even if you delete it), //we add the Date.now() to avoid name collision if you run the tests locally back to back. const rollupJobName = `tsvb-test-rollup-job-${Date.now()}`; diff --git a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts index bf763457a5490..bbdf53b3eda5c 100644 --- a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts +++ b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts @@ -251,8 +251,7 @@ export default function ({ getService }: FtrProviderContext) { ]; for (const testData of testDataList) { - // FLAKY: https://github.com/elastic/kibana/issues/183339 - describe.skip(`${testData.suiteTitle}`, function () { + describe(`${testData.suiteTitle}`, function () { after(async () => { await transform.api.deleteIndices(testData.destinationIndex); await transform.testResources.deleteDataViewByTitle(testData.destinationIndex); diff --git a/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts b/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts index 76ca855b4c8ca..b7ab5951af64f 100644 --- a/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts +++ b/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts @@ -76,6 +76,17 @@ export function LogPatternAnalysisPageProvider({ getService, getPageObject }: Ft }); }, + async assertTotalCategoriesFoundDiscover(expectedMinimumCategoryCount: number) { + await retry.tryForTime(5000, async () => { + const actualText = await testSubjects.getVisibleText('dscViewModePatternAnalysisButton'); + const actualCount = Number(actualText.match(/Patterns \((.+)\)/)![1]); + expect(actualCount + 1).to.greaterThan( + expectedMinimumCategoryCount, + `Expected patterns found count to be >= '${expectedMinimumCategoryCount}' (got '${actualCount}')` + ); + }); + }, + async assertCategoryTableRows(expectedMinimumCategoryCount: number) { await retry.tryForTime(5000, async () => { const tableListContainer = await testSubjects.find('aiopsLogPatternsTable'); @@ -170,12 +181,22 @@ export function LogPatternAnalysisPageProvider({ getService, getPageObject }: Ft }); }, + async clickPatternsTab() { + await testSubjects.click('dscViewModePatternAnalysisButton'); + }, + async assertLogPatternAnalysisFlyoutExists() { await retry.tryForTime(30 * 1000, async () => { await testSubjects.existOrFail('mlJobSelectorFlyoutBody'); }); }, + async assertLogPatternAnalysisTabContentsExists() { + await retry.tryForTime(30 * 1000, async () => { + await testSubjects.existOrFail('aiopsLogPatternsTable'); + }); + }, + async assertLogPatternAnalysisFlyoutDoesNotExist() { await retry.tryForTime(30 * 1000, async () => { await testSubjects.missingOrFail('mlJobSelectorFlyoutBody'); @@ -210,5 +231,23 @@ export function LogPatternAnalysisPageProvider({ getService, getPageObject }: Ft await testSubjects.missingOrFail('aiopsRandomSamplerOptionsFormRow', { timeout: 1000 }); }); }, + + async setRandomSamplingOptionDiscover(option: RandomSamplerOption) { + await retry.tryForTime(20000, async () => { + await testSubjects.existOrFail('aiopsEmbeddableMenuOptionsButton'); + await testSubjects.clickWhenNotDisabled('aiopsEmbeddableMenuOptionsButton'); + + await testSubjects.clickWhenNotDisabled('aiopsRandomSamplerOptionsSelect'); + + await testSubjects.existOrFail('aiopsRandomSamplerOptionOff', { timeout: 1000 }); + await testSubjects.existOrFail('aiopsRandomSamplerOptionOnManual', { timeout: 1000 }); + await testSubjects.existOrFail('aiopsRandomSamplerOptionOnAutomatic', { timeout: 1000 }); + + await testSubjects.click(option); + + await testSubjects.clickWhenNotDisabled('aiopsEmbeddableMenuOptionsButton'); + await testSubjects.missingOrFail('aiopsRandomSamplerOptionsFormRow', { timeout: 1000 }); + }); + }, }; } diff --git a/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts b/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts index d2e77f9522854..3388181aea589 100644 --- a/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts +++ b/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts @@ -41,6 +41,11 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { '../../../../../functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover' ) ); + loadTestFile( + require.resolve( + '../../../../../functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover_basic' + ) + ); loadTestFile(require.resolve('./index_data_visualizer_actions_panel')); }); } diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts index b71f659b10baa..546ee11fd4ea8 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts @@ -319,9 +319,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/172941 - // FLAKY: https://github.com/elastic/kibana/issues/173008 - describe.skip('Edit rule button', function () { + describe('Edit rule button', function () { const ruleName = uuidv4(); const updatedRuleName = `Changed Rule Name ${ruleName}`; diff --git a/x-pack/test/functional_with_es_ssl/plugins/alerts/public/application.tsx b/x-pack/test/functional_with_es_ssl/plugins/alerts/public/application.tsx index 62528a84d6918..e9ea670dd9c85 100644 --- a/x-pack/test/functional_with_es_ssl/plugins/alerts/public/application.tsx +++ b/x-pack/test/functional_with_es_ssl/plugins/alerts/public/application.tsx @@ -8,6 +8,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { BrowserRouter as Router } from 'react-router-dom'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Route } from '@kbn/shared-ux-router'; import { EuiPage, EuiText } from '@elastic/eui'; @@ -42,7 +43,12 @@ export const renderApp = ( deps: any, { appBasePath, element }: AppMountParameters ) => { - ReactDOM.render(, element); + ReactDOM.render( + + + , + element + ); return () => ReactDOM.unmountComponentAtNode(element); }; diff --git a/x-pack/test/functional_with_es_ssl/plugins/alerts/tsconfig.json b/x-pack/test/functional_with_es_ssl/plugins/alerts/tsconfig.json index 1fe0f19638722..e42ac17f305f3 100644 --- a/x-pack/test/functional_with_es_ssl/plugins/alerts/tsconfig.json +++ b/x-pack/test/functional_with_es_ssl/plugins/alerts/tsconfig.json @@ -16,5 +16,6 @@ "@kbn/alerting-plugin", "@kbn/triggers-actions-ui-plugin", "@kbn/shared-ux-router", + "@kbn/react-kibana-context-render", ] } diff --git a/x-pack/test/monitoring_api_integration/apis/beats/index.ts b/x-pack/test/monitoring_api_integration/apis/beats/index.ts index 79d051835ec3a..3530529676905 100644 --- a/x-pack/test/monitoring_api_integration/apis/beats/index.ts +++ b/x-pack/test/monitoring_api_integration/apis/beats/index.ts @@ -9,7 +9,8 @@ import { FtrProviderContext } from '../../../api_integration/ftr_provider_contex import { installPackage } from '../../packages'; export default function ({ loadTestFile, getService }: FtrProviderContext) { - describe('Beats', () => { + // Failing: See https://github.com/elastic/kibana/issues/182783 + describe.skip('Beats', () => { before(() => installPackage(getService('supertest'), 'beat')); loadTestFile(require.resolve('./overview')); diff --git a/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts b/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts index eb1056bbcd04b..4a6992b6362e6 100644 --- a/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts +++ b/x-pack/test/observability_ai_assistant_functional/tests/contextual_insights/index.spec.ts @@ -113,14 +113,16 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte ]); }); - describe('when there are no connectors', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/184029 + describe.skip('when there are no connectors', () => { it('should not show the contextual insight component', async () => { await navigateToError(); await testSubjects.missingOrFail(ui.pages.contextualInsights.button); }); }); - describe('when there are connectors', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/184071 + describe.skip('when there are connectors', () => { let proxy: LlmProxy; before(async () => { diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/es_query_rule.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/es_query_rule.ts index 2fa64a1d1bfff..3e1bf9093d924 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/es_query_rule.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/es_query_rule.ts @@ -130,6 +130,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 1400, 1024 ); + + /* Add a cases action */ + await testSubjects.click('.cases-alerting-ActionTypeSelectOption'); + await testSubjects.scrollIntoView('addAlertActionButton'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await commonScreenshots.takeScreenshot('cases-action', screenshotDirectories, 1400, 1024); + const cancelEditButton = await testSubjects.find('cancelSaveEditedRuleButton'); await cancelEditButton.click(); const confirmCancelButton = await testSubjects.find('confirmModalConfirmButton'); diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts index 728c978ab76bf..9f156ecd07c78 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/list_view.ts @@ -16,7 +16,7 @@ export default function ({ getService }: FtrProviderContext) { describe('list view', function () { it('cases list screenshot', async () => { await cases.navigation.navigateToApp(); - await commonScreenshots.takeScreenshot('cases', screenshotDirectories, 1500, 1080); + await commonScreenshots.takeScreenshot('cases-list', screenshotDirectories, 1500, 1080); }); }); } diff --git a/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts b/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts index 11b118abb1d67..6b14df9ad489e 100644 --- a/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts +++ b/x-pack/test/security_api_integration/tests/api_keys/has_active_key.ts @@ -6,7 +6,6 @@ */ import expect from '@kbn/expect'; -import type { ApiKey } from '@kbn/security-plugin/common/model'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -23,17 +22,11 @@ export default function ({ getService }: FtrProviderContext) { }; const cleanup = async () => { - // get existing keys which would affect test results - const { body: getResponseBody } = await supertest.get('/internal/security/api_key').expect(200); - const apiKeys: ApiKey[] = getResponseBody.apiKeys; - const existing = apiKeys.map(({ id, name }) => ({ id, name })); - - // invalidate the keys - await supertest - .post(`/internal/security/api_key/invalidate`) - .set('kbn-xsrf', 'xxx') - .send({ apiKeys: existing, isAdmin: false }) - .expect(200, { itemsInvalidated: existing, errors: [] }); + await getService('es').deleteByQuery({ + index: '.security-7', + body: { query: { match: { doc_type: 'api_key' } } }, + refresh: true, + }); }; describe('Has Active API Keys: _has_active', () => { diff --git a/x-pack/test/security_solution_api_integration/package.json b/x-pack/test/security_solution_api_integration/package.json index 0bc8eadbb5fe5..a9ab693b974ac 100644 --- a/x-pack/test/security_solution_api_integration/package.json +++ b/x-pack/test/security_solution_api_integration/package.json @@ -38,262 +38,262 @@ "genai:server:serverless": "npm run initialize-server:genai:trial_complete invoke_ai serverless", "genai:runner:serverless": "npm run run-tests:genai:trial_complete invoke_ai serverless serverlessEnv", "genai:qa:serverless": "npm run run-tests:genai:trial_complete invoke_ai serverless qaPeriodicEnv", - "genai:qa:serverless:release": "npm run run-tests:genai:trial_complete invoke_ai serverlessQA qaEnv", + "genai:qa:serverless:release": "npm run run-tests:genai:trial_complete invoke_ai serverless qaEnv", "genai:server:ess": "npm run initialize-server:genai:trial_complete invoke_ai ess", "genai:runner:ess": "npm run run-tests:genai:trial_complete invoke_ai ess essEnv", "nlp_cleanup_task:complete:server:serverless": "npm run initialize-server:genai:trial_complete nlp_cleanup_task serverless", "nlp_cleanup_task:complete:runner:serverless": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverless serverlessEnv", "nlp_cleanup_task:complete:qa:serverless": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverless qaPeriodicEnv", - "nlp_cleanup_task:complete:qa:serverless:release": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverlessQA qaEnv", + "nlp_cleanup_task:complete:qa:serverless:release": "npm run run-tests:genai:trial_complete nlp_cleanup_task serverless qaEnv", "nlp_cleanup_task:essentials:server:serverless": "npm run initialize-server:genai:basic_essentials nlp_cleanup_task serverless", "nlp_cleanup_task:essentials:runner:serverless": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverless serverlessEnv", "nlp_cleanup_task:essentials:qa:serverless": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverless qaPeriodicEnv", - "nlp_cleanup_task:essentials:qa:serverless:release": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverlessQA qaEnv", + "nlp_cleanup_task:essentials:qa:serverless:release": "npm run run-tests:genai:basic_essentials nlp_cleanup_task serverless qaEnv", "entity_analytics:server:serverless": "npm run initialize-server:ea:trial_complete risk_engine serverless", "entity_analytics:runner:serverless": "npm run run-tests:ea:trial_complete risk_engine serverless serverlessEnv", "entity_analytics:qa:serverless": "npm run run-tests:ea:trial_complete risk_engine serverless qaPeriodicEnv", - "entity_analytics:qa:serverless:release": "npm run run-tests:ea:trial_complete risk_engine serverlessQA qaEnv", + "entity_analytics:qa:serverless:release": "npm run run-tests:ea:trial_complete risk_engine serverless qaEnv", "entity_analytics:server:ess": "npm run initialize-server:ea:trial_complete risk_engine ess", "entity_analytics:runner:ess": "npm run run-tests:ea:trial_complete risk_engine ess essEnv", "entity_analytics:essentials:server:serverless": "npm run initialize-server:ea:basic_essentials risk_engine serverless", "entity_analytics:essentials:runner:serverless": "npm run run-tests:ea:basic_essentials risk_engine serverless serverlessEnv", "entity_analytics:essentials:qa:serverless": "npm run run-tests:ea:basic_essentials risk_engine serverless qaPeriodicEnv", - "entity_analytics:essentials:qa:serverless:release": "npm run run-tests:ea:basic_essentials risk_engine serverlessQA qaEnv", + "entity_analytics:essentials:qa:serverless:release": "npm run run-tests:ea:basic_essentials risk_engine serverless qaEnv", "entity_analytics:essentials:server:ess": "npm run initialize-server:ea:basic_essentials risk_engine ess", "entity_analytics:essentials:runner:ess": "npm run run-tests:ea:basic_essentials risk_engine ess essEnv", "exception_lists_items:server:serverless": "npm run initialize-server:lists:complete exception_lists_items serverless", "exception_lists_items:runner:serverless": "npm run run-tests:lists:complete exception_lists_items serverless serverlessEnv", "exception_lists_items:qa:serverless": "npm run run-tests:lists:complete exception_lists_items serverless qaPeriodicEnv", - "exception_lists_items:qa:serverless:release": "npm run run-tests:lists:complete exception_lists_items serverlessQA qaEnv", + "exception_lists_items:qa:serverless:release": "npm run run-tests:lists:complete exception_lists_items serverless qaEnv", "exception_lists_items:server:ess": "npm run initialize-server:lists:complete exception_lists_items ess", "exception_lists_items:runner:ess": "npm run run-tests:lists:complete exception_lists_items ess essEnv", "lists_items:server:serverless": "npm run initialize-server:lists:complete lists_items serverless", "lists_items:runner:serverless": "npm run run-tests:lists:complete lists_items serverless serverlessEnv", "lists_items:qa:serverless": "npm run run-tests:lists:complete lists_items serverless qaPeriodicEnv", - "lists_items:qa:serverless:release": "npm run run-tests:lists:complete lists_items serverlessQA qaEnv", + "lists_items:qa:serverless:release": "npm run run-tests:lists:complete lists_items serverless qaEnv", "lists_items:server:ess": "npm run initialize-server:lists:complete lists_items ess", "lists_items:runner:ess": "npm run run-tests:lists:complete lists_items ess essEnv", "user_roles:server:serverless": "npm run initialize-server:dr user_roles serverless", "user_roles:runner:serverless": "npm run run-tests:dr user_roles serverless serverlessEnv", "user_roles:qa:serverless": "npm run run-tests:dr user_roles serverless qaPeriodicEnv", - "user_roles:qa:serverless:release": "npm run run-tests:dr user_roles serverlessQA qaEnv", + "user_roles:qa:serverless:release": "npm run run-tests:dr user_roles serverless qaEnv", "user_roles:server:ess": "npm run initialize-server:dr user_roles ess", "user_roles:runner:ess": "npm run run-tests:dr user_roles ess essEnv", "telemetry:server:serverless": "npm run initialize-server:dr telemetry serverless", "telemetry:runner:serverless": "npm run run-tests:dr telemetry serverless serverlessEnv", "telemetry:qa:serverless": "npm run run-tests:dr telemetry serverless qaPeriodicEnv", - "telemetry:qa:serverless:release": "npm run run-tests:dr telemetry serverlessQA qaEnv", + "telemetry:qa:serverless:release": "npm run run-tests:dr telemetry serverless qaEnv", "telemetry:server:ess": "npm run initialize-server:dr telemetry ess", "telemetry:runner:ess": "npm run run-tests:dr telemetry ess essEnv", "exception_workflows:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/workflows serverless", "exception_workflows:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/workflows serverless serverlessEnv", "exception_workflows:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/workflows serverless qaPeriodicEnv", - "exception_workflows:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/workflows serverlessQA qaEnv", + "exception_workflows:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/workflows serverless qaEnv", "exception_workflows:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/workflows ess", "exception_workflows:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/workflows ess essEnv", "exception_operators_date_numeric_types:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless", "exception_operators_date_numeric_types:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless serverlessEnv", "exception_operators_date_numeric_types:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless qaPeriodicEnv", - "exception_operators_date_numeric_types:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverlessQA qaEnv", + "exception_operators_date_numeric_types:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types serverless qaEnv", "exception_operators_date_numeric_types:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/date_numeric_types ess", "exception_operators_date_numeric_types:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/date_numeric_types ess essEnv", "exception_operators_keyword:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/keyword serverless", "exception_operators_keyword:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverless serverlessEnv", "exception_operators_keyword:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverless qaPeriodicEnv", - "exception_operators_keyword:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverlessQA qaEnv", + "exception_operators_keyword:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword serverless qaEnv", "exception_operators_keyword:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/keyword ess", "exception_operators_keyword:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/keyword ess essEnv", "exception_operators_ips:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/ips serverless", "exception_operators_ips:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverless serverlessEnv", "exception_operators_ips:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverless qaPeriodicEnv", - "exception_operators_ips:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverlessQA qaEnv", + "exception_operators_ips:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips serverless qaEnv", "exception_operators_ips:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/ips ess", "exception_operators_ips:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/ips ess essEnv", "exception_operators_long:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/long serverless", "exception_operators_long:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverless serverlessEnv", "exception_operators_long:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverless qaPeriodicEnv", - "exception_operators_long:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverlessQA qaEnv", + "exception_operators_long:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long serverless qaEnv", "exception_operators_long:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/long ess", "exception_operators_long:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/long ess essEnv", "exception_operators_text:essentials:server:serverless": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/text serverless", "exception_operators_text:essentials:runner:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverless serverlessEnv", "exception_operators_text:essentials:qa:serverless": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverless qaPeriodicEnv", - "exception_operators_text:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverlessQA qaEnv", + "exception_operators_text:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text serverless qaEnv", "exception_operators_text:basic:server:ess": "npm run initialize-server:de:basic_essentials exceptions/operators_data_types/text ess", "exception_operators_text:basic:runner:ess": "npm run run-tests:de:basic_essentials exceptions/operators_data_types/text ess essEnv", "actions:server:serverless": "npm run initialize-server:de actions serverless", "actions:runner:serverless": "npm run run-tests:de actions serverless serverlessEnv", "actions:qa:serverless": "npm run run-tests:de actions serverless qaPeriodicEnv", - "actions:qa:serverless:release": "npm run run-tests:de actions serverlessQA qaEnv", + "actions:qa:serverless:release": "npm run run-tests:de actions serverless qaEnv", "actions:server:ess": "npm run initialize-server:de actions ess", "actions:runner:ess": "npm run run-tests:de actions ess essEnv", "alerts:server:serverless": "npm run initialize-server:de alerts serverless", "alerts:runner:serverless": "npm run run-tests:de alerts serverless serverlessEnv", "alerts:qa:serverless": "npm run run-tests:de alerts serverless qaPeriodicEnv", - "alerts:qa:serverless:release": "npm run run-tests:de alerts serverlessQA qaEnv", + "alerts:qa:serverless:release": "npm run run-tests:de alerts serverless qaEnv", "alerts:server:ess": "npm run initialize-server:de alerts ess", "alerts:runner:ess": "npm run run-tests:de alerts ess essEnv", "alerts:essentials:server:serverless": "npm run initialize-server:de:basic_essentials alerts serverless", "alerts:essentials:runner:serverless": "npm run run-tests:de:basic_essentials alerts serverless serverlessEnv", "alerts:essentials:qa:serverless": "npm run run-tests:de:basic_essentials alerts serverless qaPeriodicEnv", - "alerts:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials alerts serverlessQA qaEnv", + "alerts:essentials:qa:serverless:release": "npm run run-tests:de:basic_essentials alerts serverless qaEnv", "alerts:basic:server:ess": "npm run initialize-server:de:basic_essentials alerts ess", "alerts:basic:runner:ess": "npm run run-tests:de:basic_essentials alerts ess essEnv", "rule_execution_logic:server:serverless": "npm run initialize-server:de rule_execution_logic serverless", "rule_execution_logic:runner:serverless": "npm run run-tests:de rule_execution_logic serverless serverlessEnv", "rule_execution_logic:qa:serverless": "npm run run-tests:de rule_execution_logic serverless qaPeriodicEnv", - "rule_execution_logic:qa:serverless:release": "npm run run-tests:de rule_execution_logic serverlessQA qaEnv", + "rule_execution_logic:qa:serverless:release": "npm run run-tests:de rule_execution_logic serverless qaEnv", "rule_execution_logic:server:ess": "npm run initialize-server:de rule_execution_logic ess", "rule_execution_logic:runner:ess": "npm run run-tests:de rule_execution_logic ess essEnv", "rule_creation:server:serverless": "npm run initialize-server:rm rule_creation serverless", "rule_creation:runner:serverless": "npm run run-tests:rm rule_creation serverless serverlessEnv", "rule_creation:qa:serverless": "npm run run-tests:rm rule_creation serverless qaPeriodicEnv", - "rule_creation:qa:serverless:release": "npm run run-tests:rm rule_creation serverlessQA qaEnv", + "rule_creation:qa:serverless:release": "npm run run-tests:rm rule_creation serverless qaEnv", "rule_creation:server:ess": "npm run initialize-server:rm rule_creation ess", "rule_creation:runner:ess": "npm run run-tests:rm rule_creation ess essEnv", "rule_creation:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_creation serverless", "rule_creation:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_creation serverless serverlessEnv", "rule_creation:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_creation serverless qaPeriodicEnv", - "rule_creation:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_creation serverlessQA qaEnv", + "rule_creation:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_creation serverless qaEnv", "rule_creation:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_creation ess", "rule_creation:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_creation ess essEnv", "rule_update:server:serverless": "npm run initialize-server:rm rule_update serverless", "rule_update:runner:serverless": "npm run run-tests:rm rule_update serverless serverlessEnv", "rule_update:qa:serverless": "npm run run-tests:rm rule_update serverless qaPeriodicEnv", - "rule_update:qa:serverless:release": "npm run run-tests:rm rule_update serverlessQA qaEnv", + "rule_update:qa:serverless:release": "npm run run-tests:rm rule_update serverless qaEnv", "rule_update:server:ess": "npm run initialize-server:rm rule_update ess", "rule_update:runner:ess": "npm run run-tests:rm rule_update ess essEnv", "rule_update:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_update serverless", "rule_update:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_update serverless serverlessEnv", "rule_update:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_update serverless qaPeriodicEnv", - "rule_update:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_update serverlessQA qaEnv", + "rule_update:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_update serverless qaEnv", "rule_update:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_update ess", "rule_update:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_update ess essEnv", "rule_patch:server:serverless": "npm run initialize-server:rm rule_patch serverless", "rule_patch:runner:serverless": "npm run run-tests:rm rule_patch serverless serverlessEnv", "rule_patch:qa:serverless": "npm run run-tests:rm rule_patch serverless qaPeriodicEnv", - "rule_patch:qa:serverless:release": "npm run run-tests:rm rule_patch serverlessQA qaEnv", + "rule_patch:qa:serverless:release": "npm run run-tests:rm rule_patch serverless qaEnv", "rule_patch:server:ess": "npm run initialize-server:rm rule_patch ess", "rule_patch:runner:ess": "npm run run-tests:rm rule_patch ess essEnv", "rule_patch:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_patch serverless", "rule_patch:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_patch serverless serverlessEnv", "rule_patch:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_patch serverless qaPeriodicEnv", - "rule_patch:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_patch serverlessQA qaEnv", + "rule_patch:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_patch serverless qaEnv", "rule_patch:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_patch ess", "rule_patch:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_patch ess essEnv", "prebuilt_rules_management:server:serverless": "npm run initialize-server:rm prebuilt_rules/management serverless", "prebuilt_rules_management:runner:serverless": "npm run run-tests:rm prebuilt_rules/management serverless serverlessEnv", "prebuilt_rules_management:qa:serverless": "npm run run-tests:rm prebuilt_rules/management serverless qaPeriodicEnv", - "prebuilt_rules_management:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/management serverlessQA qaEnv", + "prebuilt_rules_management:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/management serverless qaEnv", "prebuilt_rules_management:server:ess": "npm run initialize-server:rm prebuilt_rules/management ess", "prebuilt_rules_management:runner:ess": "npm run run-tests:rm prebuilt_rules/management ess essEnv", "prebuilt_rules_bundled_prebuilt_rules_package:server:serverless": "npm run initialize-server:rm prebuilt_rules/bundled_prebuilt_rules_package serverless", "prebuilt_rules_bundled_prebuilt_rules_package:runner:serverless": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverless serverlessEnv", "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverless qaPeriodicEnv", - "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverlessQA qaEnv", + "prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package serverless qaEnv", "prebuilt_rules_bundled_prebuilt_rules_package:server:ess": "npm run initialize-server:rm prebuilt_rules/bundled_prebuilt_rules_package ess", "prebuilt_rules_bundled_prebuilt_rules_package:runner:ess": "npm run run-tests:rm prebuilt_rules/bundled_prebuilt_rules_package ess essEnv", "prebuilt_rules_large_prebuilt_rules_package:server:serverless": "npm run initialize-server:rm prebuilt_rules/large_prebuilt_rules_package serverless", "prebuilt_rules_large_prebuilt_rules_package:runner:serverless": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverless serverlessEnv", "prebuilt_rules_large_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverless qaPeriodicEnv", - "prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverlessQA qaEnv", + "prebuilt_rules_large_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package serverless qaEnv", "prebuilt_rules_large_prebuilt_rules_package:server:ess": "npm run initialize-server:rm prebuilt_rules/large_prebuilt_rules_package ess", "prebuilt_rules_large_prebuilt_rules_package:runner:ess": "npm run run-tests:rm prebuilt_rules/large_prebuilt_rules_package ess essEnv", "prebuilt_rules_update_prebuilt_rules_package:server:serverless": "npm run initialize-server:rm prebuilt_rules/update_prebuilt_rules_package serverless", "prebuilt_rules_update_prebuilt_rules_package:runner:serverless": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverless serverlessEnv", "prebuilt_rules_update_prebuilt_rules_package:qa:serverless": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverless qaPeriodicEnv", - "prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverlessQA qaEnv", + "prebuilt_rules_update_prebuilt_rules_package:qa:serverless:release": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package serverless qaEnv", "prebuilt_rules_update_prebuilt_rules_package:server:ess": "npm run initialize-server:rm prebuilt_rules/update_prebuilt_rules_package ess", "prebuilt_rules_update_prebuilt_rules_package:runner:ess": "npm run run-tests:rm prebuilt_rules/update_prebuilt_rules_package ess essEnv", "rule_delete:server:serverless": "npm run initialize-server:rm rule_delete serverless", "rule_delete:runner:serverless": "npm run run-tests:rm rule_delete serverless serverlessEnv", "rule_delete:qa:serverless": "npm run run-tests:rm rule_delete serverless qaPeriodicEnv", - "rule_delete:qa:serverless:release": "npm run run-tests:rm rule_delete serverlessQA qaEnv", + "rule_delete:qa:serverless:release": "npm run run-tests:rm rule_delete serverless qaEnv", "rule_delete:server:ess": "npm run initialize-server:rm rule_delete ess", "rule_delete:runner:ess": "npm run run-tests:rm rule_delete ess essEnv", "rule_delete:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_delete serverless", "rule_delete:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_delete serverless serverlessEnv", "rule_delete:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_delete serverless qaPeriodicEnv", - "rule_delete:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_delete serverlessQA qaEnv", + "rule_delete:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_delete serverless qaEnv", "rule_delete:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_delete ess", "rule_delete:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_delete ess essEnv", "rule_import_export:server:serverless": "npm run initialize-server:rm rule_import_export serverless", "rule_import_export:runner:serverless": "npm run run-tests:rm rule_import_export serverless serverlessEnv", "rule_import_export:qa:serverless": "npm run run-tests:rm rule_import_export serverless qaPeriodicEnv", - "rule_import_export:qa:serverless:release": "npm run run-tests:rm rule_import_export serverlessQA qaEnv", + "rule_import_export:qa:serverless:release": "npm run run-tests:rm rule_import_export serverless qaEnv", "rule_import_export:server:ess": "npm run initialize-server:rm rule_import_export ess", "rule_import_export:runner:ess": "npm run run-tests:rm rule_import_export ess essEnv", "rule_import_export:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_import_export serverless", "rule_import_export:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_import_export serverless serverlessEnv", "rule_import_export:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_import_export serverless qaPeriodicEnv", - "rule_import_export:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_import_export serverlessQA qaEnv", + "rule_import_export:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_import_export serverless qaEnv", "rule_import_export:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_import_export ess", "rule_import_export:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_import_export ess essEnv", "rule_management:server:serverless": "npm run initialize-server:rm rule_management serverless", "rule_management:runner:serverless": "npm run run-tests:rm rule_management serverless serverlessEnv", "rule_management:qa:serverless": "npm run run-tests:rm rule_management serverless qaPeriodicEnv", - "rule_management:qa:serverless:release": "npm run run-tests:rm rule_management serverlessQA qaEnv", + "rule_management:qa:serverless:release": "npm run run-tests:rm rule_management serverless qaEnv", "rule_management:server:ess": "npm run initialize-server:rm rule_management ess", "rule_management:runner:ess": "npm run run-tests:rm rule_management ess essEnv", "rule_bulk_actions:server:serverless": "npm run initialize-server:rm rule_bulk_actions serverless", "rule_bulk_actions:runner:serverless": "npm run run-tests:rm rule_bulk_actions serverless serverlessEnv", "rule_bulk_actions:qa:serverless": "npm run run-tests:rm rule_bulk_actions serverless qaPeriodicEnv", - "rule_bulk_actions:qa:serverless:release": "npm run run-tests:rm rule_bulk_actions serverlessQA qaEnv", + "rule_bulk_actions:qa:serverless:release": "npm run run-tests:rm rule_bulk_actions serverless qaEnv", "rule_bulk_actions:server:ess": "npm run initialize-server:rm rule_bulk_actions ess", "rule_bulk_actions:runner:ess": "npm run run-tests:rm rule_bulk_actions ess essEnv", "rule_read:server:serverless": "npm run initialize-server:rm rule_read serverless", "rule_read:runner:serverless": "npm run run-tests:rm rule_read serverless serverlessEnv", "rule_read:qa:serverless": "npm run run-tests:rm rule_read serverless qaPeriodicEnv", - "rule_read:qa:serverless:release": "npm run run-tests:rm rule_read serverlessQA qaEnv", + "rule_read:qa:serverless:release": "npm run run-tests:rm rule_read serverless qaEnv", "rule_read:server:ess": "npm run initialize-server:rm rule_read ess", "rule_read:runner:ess": "npm run run-tests:rm rule_read ess essEnv", "rule_read:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_read serverless", "rule_read:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_read serverless serverlessEnv", "rule_read:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_read serverless qaPeriodicEnv", - "rule_read:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_read serverlessQA qaEnv", + "rule_read:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_read serverless qaEnv", "rule_read:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_read ess", "rule_read:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_read ess essEnv", "rules_management:essentials:server:serverless": "npm run initialize-server:rm:basic_essentials rule_management serverless", "rules_management:essentials:runner:serverless": "npm run run-tests:rm:basic_essentials rule_management serverless serverlessEnv", "rules_management:essentials:qa:serverless": "npm run run-tests:rm:basic_essentials rule_management serverless qaPeriodicEnv", - "rules_management:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_management serverlessQA qaEnv", + "rules_management:essentials:qa:serverless:release": "npm run run-tests:rm:basic_essentials rule_management serverless qaEnv", "rules_management:basic:server:ess": "npm run initialize-server:rm:basic_essentials rule_management ess", "rules_management:basic:runner:ess": "npm run run-tests:rm:basic_essentials rule_management ess essEnv" } diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts index 1c3b1349a6289..3eca71c37dab5 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts @@ -16,6 +16,7 @@ import { riskEngineRouteHelpersFactory, cleanRiskEngine, getRiskEngineStats, + areRiskScoreIndicesEmpty, } from '../../utils'; import { FtrProviderContext } from '../../../../ftr_provider_context'; @@ -25,7 +26,6 @@ export default ({ getService }: FtrProviderContext) => { const log = getService('log'); const retry = getService('retry'); const es = getService('es'); - const createAndSyncRuleAndAlerts = createAndSyncRuleAndAlertsFactory({ supertest, log }); const riskEngineRoutes = riskEngineRouteHelpersFactory(supertest); @@ -43,6 +43,9 @@ export default ({ getService }: FtrProviderContext) => { after(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/security_solution/ecs_compliant'); + await cleanRiskEngine({ kibanaServer, es, log }); + await deleteAllAlerts(supertest, log, es); + await deleteAllRules(supertest, log); }); beforeEach(async () => { @@ -51,79 +54,62 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllRules(supertest, log); }); - describe('Risk engine not enabled', () => { - it('should has empty riskEngineMetrics', async () => { - await retry.try(async () => { - const stats = await getRiskEngineStats(supertest, log); - const expected = {}; - expect(stats).to.eql(expected); - }); + it('should return empty metrics when the risk engine is disabled', async () => { + await retry.try(async () => { + const stats = await getRiskEngineStats(supertest, log); + expect(stats).to.eql({}); }); }); - describe('Risk engine enabled', () => { - let hostId: string; - let userId: string; + // https://github.com/elastic/kibana/issues/183246 + it('@skipInServerlessMKI should return metrics with expected values when risk engine is enabled', async () => { + expect(await areRiskScoreIndicesEmpty({ log, es })).to.be(true); - beforeEach(async () => { - hostId = uuidv4(); - const hostEvent = buildDocument({ host: { name: 'host-1' } }, hostId); - await indexListOfDocuments( - Array(10) - .fill(hostEvent) - .map((event, index) => ({ - ...event, - 'host.name': `host-${index}`, - })) - ); + const hostId = uuidv4(); + const hostDocs = Array(10) + .fill(buildDocument({}, hostId)) + .map((event, index) => ({ + ...event, + 'host.name': `host-${index}`, + })); - userId = uuidv4(); - const userEvent = buildDocument({ user: { name: 'user-1' } }, userId); - await indexListOfDocuments( - Array(10) - .fill(userEvent) - .map((event, index) => ({ - ...event, - 'user.name': `user-${index}`, - })) - ); + const userId = uuidv4(); + const userDocs = Array(10) + .fill(buildDocument({}, userId)) + .map((event, index) => ({ + ...event, + 'user.name': `user-${index}`, + })); - await createAndSyncRuleAndAlerts({ - query: `id: ${userId} or id: ${hostId}`, - alerts: 20, - riskScore: 40, - }); + await indexListOfDocuments([...hostDocs, ...userDocs]); - await riskEngineRoutes.init(); + await createAndSyncRuleAndAlerts({ + query: `id: ${userId} or id: ${hostId}`, + alerts: 20, + riskScore: 40, }); - afterEach(async () => { - await cleanRiskEngine({ kibanaServer, es, log }); - await deleteAllAlerts(supertest, log, es); - await deleteAllRules(supertest, log); - }); + await riskEngineRoutes.init(); + + await waitForRiskScoresToBePresent({ es, log, scoreCount: 20 }); - // https://github.com/elastic/kibana/issues/183246 - it('@skipInServerlessMKI should return riskEngineMetrics with expected values', async () => { - await waitForRiskScoresToBePresent({ es, log, scoreCount: 20 }); - await retry.try(async () => { - const { - all_risk_scores_index_size: allRiskScoreIndexSize, - unique_risk_scores_index_size: uniqueRiskScoreIndexSize, - ...otherStats - } = await getRiskEngineStats(supertest, log); - const expected = { - unique_host_risk_score_total: 0, - unique_user_risk_score_total: 0, - unique_user_risk_score_day: 0, - unique_host_risk_score_day: 0, - all_user_risk_scores_total: 10, - all_host_risk_scores_total: 10, - all_user_risk_scores_total_day: 10, - all_host_risk_scores_total_day: 10, - }; - expect(otherStats).to.eql(expected); - }); + await retry.try(async () => { + const { + all_risk_scores_index_size: allRiskScoreIndexSize, + unique_risk_scores_index_size: uniqueRiskScoreIndexSize, + ...otherStats + } = await getRiskEngineStats(supertest, log); + const expected = { + unique_host_risk_score_total: 0, + unique_user_risk_score_total: 0, + unique_user_risk_score_day: 0, + unique_host_risk_score_day: 0, + all_user_risk_scores_total: 10, + all_host_risk_scores_total: 10, + all_user_risk_scores_total_day: 10, + all_host_risk_scores_total_day: 10, + }; + expect(otherStats).to.eql(expected); }); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts index dbd4ed78c1896..4c39cdce1a48a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/risk_engine.ts @@ -148,6 +148,52 @@ export const deleteRiskScoreIndices = async ({ } }; +export const areRiskScoreIndicesEmpty = async ({ + es, + namespace = 'default', + log, +}: { + es: Client; + namespace?: string; + log: ToolingLog; +}): Promise => { + const riskScoreIndex = `risk-score.risk-score-${namespace}`; + const riskScoreLatestIndex = `risk-score.risk-score-latest-${namespace}`; + let riskScoreCount = 0; + let riskScoreLatestCount = 0; + + try { + const [riskScoreCountRes, riskScoreLatestCountRes] = await Promise.all([ + es.count({ index: riskScoreIndex }), + es.count({ index: riskScoreLatestIndex }), + ]); + riskScoreCount = riskScoreCountRes.count; + riskScoreLatestCount = riskScoreLatestCountRes.count; + } catch (e) { + if (e.meta.statusCode === 404) { + return true; + } + throw e; + } + + const isEmpty = riskScoreCount === 0 && riskScoreLatestCount === 0; + + if (!isEmpty) { + log.warning( + `Risk score indices are not empty. Risk score index count: ${riskScoreCount}, Risk score latest index count: ${riskScoreLatestCount}` + ); + const [riskScoreDocs, riskScoreLatestDocs] = await Promise.all([ + es.search({ index: riskScoreIndex, size: 25 }), + es.search({ index: riskScoreLatestIndex, size: 25 }), + ]); + + log.info(`Risk score index documents: ${JSON.stringify(riskScoreDocs.hits.hits)}`); + log.info(`Risk score latest index documents: ${JSON.stringify(riskScoreLatestDocs.hits.hits)}`); + } + + return isEmpty; +}; + /** * Deletes all risk scores from a given index or indices, defaults to `risk-score.risk-score-*` * For use inside of afterEach blocks of tests diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts index 5b2326ec617a6..2a98a12cba7e5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts @@ -41,7 +41,8 @@ const getExceptionList1 = () => ({ const EXCEPTION_LIST_NAME = 'Newly created list'; -describe('Exception list detail page', { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/180740 +describe.skip('Exception list detail page', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts index f23480e52d0d1..fae26fec77fa2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/entity_analytics_management_page.cy.ts @@ -63,7 +63,8 @@ describe( cy.get(PAGE_TITLE).should('have.text', 'Entity Risk Score'); }); - describe('Risk preview', () => { + // FLAKY: https://github.com/elastic/kibana/issues/184133 + describe.skip('Risk preview', () => { it('risk scores reacts on change in datepicker', () => { const START_DATE = 'Jan 18, 2019 @ 20:33:29.186'; const END_DATE = 'Jan 19, 2019 @ 20:33:29.186'; diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts index 6786f82a6fabe..58e1eec24b423 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts @@ -16,7 +16,8 @@ import { export default function (providerContext: FtrProviderContext) { const { loadTestFile, getService, getPageObjects } = providerContext; - describe('endpoint', function () { + // FLAKY: https://github.com/elastic/kibana/issues/180401 + describe.skip('endpoint', function () { const ingestManager = getService('ingestManager'); const log = getService('log'); const endpointTestResources = getService('endpointTestResources'); diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts index e1d77eb293896..26a1d95f4efbb 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts @@ -16,7 +16,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; import { targetTags } from '../../target_tags'; export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'header']); + const pageObjects = getPageObjects(['common', 'header', 'timePicker']); const queryBar = getService('queryBar'); const testSubjects = getService('testSubjects'); const endpointTestResources = getService('endpointTestResources'); @@ -29,11 +29,12 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const comboBox = getService('comboBox'); const toasts = getService('toasts'); - // Failing: See https://github.com/elastic/kibana/issues/176009 - describe.skip('Endpoint Exceptions', function () { + const MINUTES = 60_000; + + describe('Endpoint Exceptions', function () { targetTags(this, ['@ess', '@serverless']); - this.timeout(10 * 60_000); + this.timeout(10 * MINUTES); const clearPrefilledEntries = async () => { const entriesContainer = await testSubjects.find('exceptionEntriesContainer'); @@ -50,6 +51,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; const openNewEndpointExceptionFlyout = async () => { + await testSubjects.scrollIntoView('timeline-context-menu-button'); await testSubjects.click('timeline-context-menu-button'); await testSubjects.click('add-endpoint-exception-menu-item'); await testSubjects.existOrFail('addExceptionFlyout'); @@ -102,7 +104,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; const checkArtifact = (expectedArtifact: object) => { - return retry.tryForTime(120_000, async () => { + return retry.tryForTime(2 * MINUTES, async () => { const artifacts = await endpointArtifactTestResources.getArtifacts(); const manifestArtifact = artifacts.find((artifact) => @@ -133,7 +135,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const waitForAlertsToAppear = async () => { await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); await pageObjects.header.waitUntilLoadingHasFinished(); - await retry.waitForWithTimeout('alerts to appear', 10 * 60_000, async () => { + await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); + await retry.waitForWithTimeout('alerts to appear', 10 * MINUTES, async () => { await queryBar.clickQuerySubmitButton(); return testSubjects.exists('timeline-context-menu-button'); }); @@ -164,6 +167,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should add `event.module=endpoint` to entry if only wildcard operator is present', async () => { await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); + await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); await openNewEndpointExceptionFlyout(); await clearPrefilledEntries(); @@ -208,6 +212,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should NOT add `event.module=endpoint` to entry if there is another operator', async () => { await pageObjects.common.navigateToUrlWithBrowserHistory('security', `/alerts`); + await pageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); await openNewEndpointExceptionFlyout(); await clearPrefilledEntries(); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/main.ts index c68f5bba43355..6fef99e59a9ef 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/main.ts @@ -8,20 +8,32 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + describe('main', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('can create an index_pattern with just a title', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -33,10 +45,10 @@ export default function ({ getService }: FtrProviderContext) { it('returns back the created index_pattern object', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -52,10 +64,10 @@ export default function ({ getService }: FtrProviderContext) { it('can specify primitive optional attributes when creating an index pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; const id = `test-id-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -74,10 +86,10 @@ export default function ({ getService }: FtrProviderContext) { it('can specify optional sourceFilters attribute when creating an index pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -109,10 +121,10 @@ export default function ({ getService }: FtrProviderContext) { it('can specify optional fields attribute when creating an index pattern', async () => { const title = `basic_index*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -140,10 +152,10 @@ export default function ({ getService }: FtrProviderContext) { // TODO: Scripted fields code dropped since they are not supported in Serverless it('can add fields created from es index', async () => { const title = `basic_index*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -172,10 +184,10 @@ export default function ({ getService }: FtrProviderContext) { it('can add runtime fields', async () => { const title = `basic_index*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -205,10 +217,10 @@ export default function ({ getService }: FtrProviderContext) { it('can specify optional typeMeta attribute when creating an index pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -221,10 +233,10 @@ export default function ({ getService }: FtrProviderContext) { it('can specify optional fieldFormats attribute when creating an index pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -244,10 +256,10 @@ export default function ({ getService }: FtrProviderContext) { it('can specify optional fieldFormats attribute when creating an index pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -268,19 +280,19 @@ export default function ({ getService }: FtrProviderContext) { describe('when creating index pattern with existing name', () => { it('returns error, by default', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -293,20 +305,20 @@ export default function ({ getService }: FtrProviderContext) { it('succeeds, override flag is set', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, timeFieldName: 'foo', }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/validation.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/validation.ts index f4fc964092f65..eca1e01ac2b4e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/validation.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/create_data_view/validation.ts @@ -8,19 +8,30 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('validation', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns error when index_pattern object is not provided', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.statusCode).to.be(400); @@ -30,10 +41,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns error on empty index_pattern object', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: {}, }); @@ -46,10 +57,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns error when "override" parameter is not a boolean', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: 123, [config.serviceKey]: { @@ -65,10 +76,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns error when "refresh_fields" parameter is not a boolean', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ refresh_fields: 123, [config.serviceKey]: { @@ -85,10 +96,10 @@ export default function ({ getService }: FtrProviderContext) { it('returns an error when unknown runtime field type', async () => { const title = `basic_index*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/errors.ts index 16681d19c3e45..c4881e5be3b4b 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/errors.ts @@ -8,30 +8,41 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .delete(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(404); }); it('returns error when ID is too long', async () => { const id = `xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx`; - const response = await supertest + const response = await supertestWithoutAuth .delete(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.message).to.be( diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/main.ts index e0fea14780885..ea568a157779c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/delete_data_view/main.ts @@ -8,50 +8,61 @@ import expect from '@kbn/expect'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('deletes an index_pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response2.status).to.be(200); - const response3 = await supertest + const response3 = await supertestWithoutAuth .delete(`${config.path}/${response1.body[config.serviceKey].id}`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); - const response4 = await supertest + const response4 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response4.status).to.be(404); }); @@ -59,27 +70,27 @@ export default function ({ getService }: FtrProviderContext) { it('returns nothing', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); - await supertest + await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); - const response2 = await supertest + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); + const response2 = await supertestWithoutAuth .delete(`${config.path}/${response1.body[config.serviceKey].id}`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); // verify empty response expect(Object.keys(response2.body).length).to.be(0); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/errors.ts index fd69fbaa7e46e..08cc5879b88fc 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/errors.ts @@ -8,30 +8,41 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(404); }); it('returns error when ID is too long', async () => { const id = `xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx`; - const response = await supertest + const response = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.message).to.be( diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/main.ts index d7f3d3b735746..8717717b63f7c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_view/main.ts @@ -8,29 +8,40 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('can retrieve an index_pattern', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response2.body[config.serviceKey].title).to.be(title); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_views/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_views/main.ts index 6b716616de8d7..9c4e6baff31b9 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_views/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/get_data_views/main.ts @@ -8,18 +8,29 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { dataViewConfig } from '../../constants'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); describe('get data views api', () => { it('returns list of data views', async () => { - const response = await supertest + const response = await supertestWithoutAuth .get(dataViewConfig.basePath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(200); expect(response.body).to.have.property(dataViewConfig.serviceKey); expect(response.body[dataViewConfig.serviceKey]).to.be.an('array'); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/errors.ts index 3bbe13af43896..fa488544147d6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/errors.ts @@ -6,21 +6,32 @@ */ import expect from '@kbn/expect'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns error when index_pattern object is not provided', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(`${config.path}/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.statusCode).to.be(400); @@ -30,10 +41,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns error on non-existing index_pattern', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(`${config.path}/non-existing-index-pattern`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: {}, }); @@ -46,10 +57,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns error when "refresh_fields" parameter is not a boolean', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post(`${config.path}/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ refresh_fields: 123, [config.serviceKey]: { @@ -66,20 +77,20 @@ export default function ({ getService }: FtrProviderContext) { it('returns success when update patch is empty', async () => { const title1 = `foo-${Date.now()}-${Math.random()}*`; - const response = await supertest + const response = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title: title1, }, }); const id = response.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: {}, }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/main.ts index 15e22957a2ca5..c407a8fb349c0 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/data_views_crud/update_data_view/main.ts @@ -6,23 +6,34 @@ */ import expect from '@kbn/expect'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('can update data view title', async () => { const title1 = `foo-${Date.now()}-${Math.random()}*`; const title2 = `bar-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title: title1, @@ -32,10 +43,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].title).to.be(title1); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title: title2, @@ -44,10 +55,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].title).to.be(title2); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].title).to.be(title2); }); @@ -56,10 +67,10 @@ export default function ({ getService }: FtrProviderContext) { const title = `foo-${Date.now()}-${Math.random()}*`; const name1 = 'good data view name'; const name2 = 'better data view name'; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -70,10 +81,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].name).to.be(name1); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { name: name2, @@ -82,20 +93,20 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].name).to.be(name2); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].name).to.be(name2); }); it('can update data view timeFieldName', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -106,10 +117,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].timeFieldName).to.be('timeFieldName1'); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { timeFieldName: 'timeFieldName2', @@ -118,20 +129,20 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].timeFieldName).to.be('timeFieldName2'); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].timeFieldName).to.be('timeFieldName2'); }); it('can update data view sourceFilters', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -150,10 +161,10 @@ export default function ({ getService }: FtrProviderContext) { ]); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { sourceFilters: [ @@ -176,10 +187,10 @@ export default function ({ getService }: FtrProviderContext) { }, ]); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].sourceFilters).to.eql([ { @@ -193,10 +204,10 @@ export default function ({ getService }: FtrProviderContext) { it('can update data view fieldFormats', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -221,10 +232,10 @@ export default function ({ getService }: FtrProviderContext) { }); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { fieldFormats: { @@ -247,10 +258,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].fieldFormats).to.eql({ a: { @@ -264,10 +275,10 @@ export default function ({ getService }: FtrProviderContext) { it('can update data view type', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -278,10 +289,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].type).to.be('foo'); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { type: 'bar', @@ -290,20 +301,20 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].type).to.be('bar'); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].type).to.be('bar'); }); it('can update data view typeMeta', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -314,10 +325,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].typeMeta).to.eql({ foo: 'bar' }); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { typeMeta: { foo: 'baz' }, @@ -326,20 +337,20 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].typeMeta).to.eql({ foo: 'baz' }); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].typeMeta).to.eql({ foo: 'baz' }); }); it('can update multiple data view fields at once', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -352,10 +363,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].typeMeta.foo).to.be('bar'); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { timeFieldName: 'timeFieldName2', @@ -366,10 +377,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].timeFieldName).to.be('timeFieldName2'); expect(response2.body[config.serviceKey].typeMeta.baz).to.be('qux'); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].timeFieldName).to.be('timeFieldName2'); expect(response3.body[config.serviceKey].typeMeta.baz).to.be('qux'); @@ -377,10 +388,10 @@ export default function ({ getService }: FtrProviderContext) { it('can update runtime fields', async () => { const title = `basic_index*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -407,10 +418,10 @@ export default function ({ getService }: FtrProviderContext) { ); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { runtimeFieldMap: { @@ -429,10 +440,10 @@ export default function ({ getService }: FtrProviderContext) { ); expect(response2.body[config.serviceKey].runtimeFieldMap.runtimeFoo).to.be(undefined); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.body[config.serviceKey].runtimeFieldMap.runtimeBar.type).to.be( 'keyword' diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/default_index_pattern/default_index_pattern.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/default_index_pattern/default_index_pattern.ts index 067c24d605e6c..67696a35641f9 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/default_index_pattern/default_index_pattern.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/default_index_pattern/default_index_pattern.ts @@ -8,12 +8,23 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; import { configArray } from '../constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('default index pattern api', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { const newId = () => `default-id-${Date.now()}-${Math.random()}`; @@ -21,10 +32,10 @@ export default function ({ getService }: FtrProviderContext) { const defaultId = newId(); const defaultPath = `${config.basePath}/default`; const serviceKeyId = `${config.serviceKey}_id`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(defaultPath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [serviceKeyId]: defaultId, force: true, @@ -32,43 +43,43 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body.acknowledged).to.be(true); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(defaultPath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response2.status).to.be(200); expect(response2.body[serviceKeyId]).to.be(defaultId); - const response3 = await supertest + const response3 = await supertestWithoutAuth .post(defaultPath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [serviceKeyId]: newId(), // no force this time, so this new default shouldn't be set }); expect(response3.status).to.be(200); - const response4 = await supertest + const response4 = await supertestWithoutAuth .get(defaultPath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response4.body[serviceKeyId]).to.be(defaultId); // original default id is used - const response5 = await supertest + const response5 = await supertestWithoutAuth .post(defaultPath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [serviceKeyId]: null, force: true, }); expect(response5.status).to.be(200); - const response6 = await supertest + const response6 = await supertestWithoutAuth .get(defaultPath) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); // TODO: The response comes back undefined in Serverless const body = response6.body[serviceKeyId]; const expected = body === undefined ? null : body; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/params.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/params.ts index 60ca17d70cee0..a71796d1d948a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/params.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/params.ts @@ -9,80 +9,89 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { EXISTING_INDICES_PATH } from '@kbn/data-views-plugin/common/constants'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); const randomness = getService('randomness'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('_existing_indices params', () => { - before(() => - esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); - after(() => - esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); + }); + after(async () => { + await esArchiver.unload( + 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' + ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('requires a query param', () => - supertest + supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({}) .expect(400)); it('accepts indices param as single index string', () => - supertest + supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ indices: 'filebeat-*', }) .expect(200)); it('accepts indices param as single index array', () => - supertest + supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ indices: ['filebeat-*'], }) .expect(200)); it('accepts indices param', () => - supertest + supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ indices: ['filebeat-*', 'packetbeat-*'], }) .expect(200)); it('rejects unexpected query params', () => - supertest + supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ [randomness.word()]: randomness.word(), }) .expect(400)); it('rejects a comma-separated list of indices', () => - supertest + supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ indices: 'filebeat-*,packetbeat-*', }) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/response.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/response.ts index 8cea2292402c2..3ac93af8212a4 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/response.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/existing_indices_route/response.ts @@ -9,26 +9,33 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { EXISTING_INDICES_PATH } from '@kbn/data-views-plugin/common/constants'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('_existing_indices response', () => { - before(() => - esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); - after(() => - esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); + }); + after(async () => { + esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('returns an array of existing indices', async () => { - await supertest + await supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ indices: ['basic_index', 'bad_index'], }) @@ -36,11 +43,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns an empty array when no indices exist', async () => { - await supertest + await supertestWithoutAuth .get(EXISTING_INDICES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ indices: ['bad_index'], }) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/errors.ts index 2e8e8556b17e9..b7f4c9fd4520c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/errors.ts @@ -6,22 +6,33 @@ */ import expect from '@kbn/expect'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .post(`${config.path}/${id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: {}, @@ -33,19 +44,19 @@ export default function ({ getService }: FtrProviderContext) { it('returns error when "fields" payload attribute is invalid', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: 123, }); @@ -59,20 +70,20 @@ export default function ({ getService }: FtrProviderContext) { it('returns error if not changes are specified', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: {}, diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/main.ts index 2e72648900747..ce2948193f744 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_api/update_fields/main.ts @@ -6,18 +6,29 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); - + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { const basicIndex = 'ba*ic_index'; let indexPattern: any; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); + configArray.forEach((config) => { describe(config.name, () => { before(async () => { @@ -26,10 +37,10 @@ export default function ({ getService }: FtrProviderContext) { ); indexPattern = ( - await supertest + await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -45,19 +56,19 @@ export default function ({ getService }: FtrProviderContext) { ); if (indexPattern) { - await supertest + await supertestWithoutAuth .delete(`${config.path}/${indexPattern.id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); } }); it('can update multiple fields', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -68,10 +79,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.body[config.serviceKey].fieldAttrs.foo).to.be(undefined); expect(response1.body[config.serviceKey].fieldAttrs.bar).to.be(undefined); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -89,10 +100,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('test'); expect(response2.body[config.serviceKey].fieldAttrs.bar.count).to.be(456); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.count).to.be(123); @@ -103,10 +114,10 @@ export default function ({ getService }: FtrProviderContext) { describe('count', () => { it('can set field "count" attribute on non-existing field', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -116,10 +127,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldAttrs.foo).to.be(undefined); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -131,10 +142,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldAttrs.foo.count).to.be(123); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.count).to.be(123); @@ -142,10 +153,10 @@ export default function ({ getService }: FtrProviderContext) { it('can update "count" attribute in index_pattern attribute map', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -160,10 +171,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldAttrs.foo.count).to.be(1); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -175,10 +186,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldAttrs.foo.count).to.be(2); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.count).to.be(2); @@ -186,10 +197,10 @@ export default function ({ getService }: FtrProviderContext) { it('can delete "count" attribute from index_pattern attribute map', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -204,10 +215,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldAttrs.foo.count).to.be(1); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -219,10 +230,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldAttrs.foo.count).to.be(undefined); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.count).to.be(undefined); @@ -232,10 +243,10 @@ export default function ({ getService }: FtrProviderContext) { describe('customLabel', () => { it('can set field "customLabel" attribute on non-existing field', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -245,10 +256,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldAttrs.foo).to.be(undefined); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -260,10 +271,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('foo'); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('foo'); @@ -271,10 +282,10 @@ export default function ({ getService }: FtrProviderContext) { it('can update "customLabel" attribute in index_pattern attribute map', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -289,10 +300,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('foo'); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -304,10 +315,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('bar'); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('bar'); @@ -315,10 +326,10 @@ export default function ({ getService }: FtrProviderContext) { it('can delete "customLabel" attribute from index_pattern attribute map', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -333,10 +344,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be('foo'); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -348,20 +359,20 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be(undefined); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldAttrs.foo.customLabel).to.be(undefined); }); it('can set field "customLabel" attribute on an existing field', async () => { - await supertest + await supertestWithoutAuth .post(`${config.path}/${indexPattern.id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -370,10 +381,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response1 = await supertest + const response1 = await supertestWithoutAuth .get(`${config.path}/${indexPattern.id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fields.foo.customLabel).to.be('baz'); @@ -383,10 +394,10 @@ export default function ({ getService }: FtrProviderContext) { describe('format', () => { it('can set field "format" attribute on non-existing field', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -396,10 +407,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); expect(response1.body[config.serviceKey].fieldFormats.foo).to.be(undefined); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -417,10 +428,10 @@ export default function ({ getService }: FtrProviderContext) { params: { baz: 'qux' }, }); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldFormats.foo).to.eql({ @@ -431,10 +442,10 @@ export default function ({ getService }: FtrProviderContext) { it('can update "format" attribute in index_pattern format map', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, @@ -457,10 +468,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -478,10 +489,10 @@ export default function ({ getService }: FtrProviderContext) { params: { baz: 'qux-2' }, }); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldFormats.foo).to.eql({ @@ -491,10 +502,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('can remove "format" attribute from index_pattern format map', async () => { - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${indexPattern.id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { foo: { @@ -506,10 +517,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey].fieldFormats.foo).to.be(undefined); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${indexPattern.id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); expect(response3.body[config.serviceKey].fieldFormats.foo).to.be(undefined); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/conflicts.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/conflicts.ts index 915cce91ca0ee..9fc8c3bef2468 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/conflicts.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/conflicts.ts @@ -9,27 +9,34 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('conflicts', function () { - before(() => - esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/conflicts') - ); - after(() => - esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/conflicts') - ); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/conflicts'); + }); + after(async () => { + await esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/conflicts'); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('flags fields with mismatched types as conflicting', () => - supertest + supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'logs-2017.01.*' }) .expect(200) .then((resp) => { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/filter.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/filter.ts index ff2ad5e5d00a1..66330938532d4 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/filter.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/filter.ts @@ -10,14 +10,20 @@ import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/con import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const es = getService('es'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('filter fields', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await es.index({ index: 'helloworld1', refresh: true, @@ -32,13 +38,16 @@ export default function ({ getService }: FtrProviderContext) { body: { bye: 'world' }, }); }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('can filter', async () => { - const a = await supertest + const a = await supertestWithoutAuth .put(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'helloworld*' }) .send({ index_filter: { exists: { field: 'bye' } } }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/params.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/params.ts index 035ca1af4b5a8..63d5af2f940b0 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/params.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/params.ts @@ -8,165 +8,186 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/constants'; import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); const randomness = getService('randomness'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('params', () => { - before(() => - esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); - after(() => - esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); + }); + after(async () => { + await esArchiver.unload( + 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' + ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); - it('requires a pattern query param', () => - supertest + it('requires a pattern query param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({}) - .expect(400)); + .expect(400); + }); - it('accepts include_unmapped param', () => - supertest + it('accepts include_unmapped param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', include_unmapped: true, }) - .expect(200)); + .expect(200); + }); - it('rejects unexpected query params', () => - supertest + it('rejects unexpected query params', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: randomness.word(), [randomness.word()]: randomness.word(), }) - .expect(400)); + .expect(400); + }); describe('fields', () => { - it('accepts a JSON formatted fields query param', () => - supertest + it('accepts a JSON formatted fields query param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', fields: JSON.stringify(['baz']), }) - .expect(200)); + .expect(200); + }); - it('accepts meta_fields query param in string array', () => - supertest + it('accepts meta_fields query param in string array', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', fields: ['baz', 'foo'], }) - .expect(200)); + .expect(200); + }); - it('accepts single array fields query param', () => - supertest + it('accepts single array fields query param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', fields: ['baz'], }) - .expect(200)); + .expect(200); + }); - it('accepts single fields query param', () => - supertest + it('accepts single fields query param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', fields: 'baz', }) - .expect(200)); + .expect(200); + }); - it('rejects a comma-separated list of fields', () => - supertest + it('rejects a comma-separated list of fields', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', fields: 'foo,bar', }) - .expect(400)); + .expect(400); + }); }); describe('meta_fields', () => { - it('accepts a JSON formatted meta_fields query param', () => - supertest + it('accepts a JSON formatted meta_fields query param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', meta_fields: JSON.stringify(['meta']), }) - .expect(200)); + .expect(200); + }); - it('accepts meta_fields query param in string array', () => - supertest + it('accepts meta_fields query param in string array', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', meta_fields: ['_id', 'meta'], }) - .expect(200)); + .expect(200); + }); - it('accepts single meta_fields query param', () => - supertest + it('accepts single meta_fields query param', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', meta_fields: ['_id'], }) - .expect(200)); + .expect(200); + }); - it('rejects a comma-separated list of meta_fields', () => - supertest + it('rejects a comma-separated list of meta_fields', async () => { + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: '*', meta_fields: 'foo,bar', }) - .expect(400)); + .expect(400); + }); }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/response.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/response.ts index a073dac456b7f..bb87fe8109d18 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/response.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/fields_for_wildcard_route/response.ts @@ -10,12 +10,16 @@ import { INITIAL_REST_VERSION_INTERNAL } from '@kbn/data-views-plugin/server/con import { FIELDS_FOR_WILDCARD_PATH } from '@kbn/data-views-plugin/common/constants'; import expect from '@kbn/expect'; import { sortBy } from 'lodash'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; const ensureFieldsAreSorted = (resp: { body: { fields: { name: string } } }) => { expect(resp.body.fields).to.eql(sortBy(resp.body.fields, 'name')); @@ -76,19 +80,24 @@ export default function ({ getService }: FtrProviderContext) { ]; describe('fields_for_wildcard_route response', () => { - before(() => - esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); - after(() => - esArchiver.unload('test/api_integration/fixtures/es_archiver/index_patterns/basic_index') - ); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); + }); + after(async () => { + await esArchiver.unload( + 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' + ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('returns a flattened version of the fields in es', async () => { - await supertest + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'basic_index' }) .expect(200, { fields: testFields, @@ -98,11 +107,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns a single field as requested', async () => { - await supertest + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'basic_index', fields: JSON.stringify(['bar']) }) .expect(200, { fields: [testFields[0]], @@ -111,11 +120,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('always returns a field for all passed meta fields', async () => { - await supertest + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'basic_index', meta_fields: JSON.stringify(['_id', '_source', 'crazy_meta_field']), @@ -206,11 +215,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns fields when one pattern exists and the other does not', async () => { - await supertest + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'bad_index,basic_index' }) .expect(200, { fields: testFields, @@ -219,21 +228,21 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns 404 when neither exists', async () => { - await supertest + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'bad_index,bad_index_2' }) .expect(404); }); it('returns 404 when no patterns exist', async () => { - await supertest + await supertestWithoutAuth .get(FIELDS_FOR_WILDCARD_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .query({ pattern: 'bad_index', }) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/has_user_index_pattern/has_user_index_pattern.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/has_user_index_pattern/has_user_index_pattern.ts index 19f4d82d79a8e..d57b6f0e0ba1e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/has_user_index_pattern/has_user_index_pattern.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/has_user_index_pattern/has_user_index_pattern.ts @@ -13,15 +13,26 @@ import { import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; import { configArray } from '../constants'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const es = getService('es'); - const svlCommonApi = getService('svlCommonApi'); const kibanaServer = getService('kibanaServer'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('has user index pattern API', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { beforeEach(async () => { @@ -46,11 +57,11 @@ export default function ({ getService }: FtrProviderContext) { // "index_not_found_exception: no such index [.kibana_ingest]", // so it was switched to `savedObjects.cleanStandardList()` await kibanaServer.savedObjects.cleanStandardList(); - const response = await supertest + const response = await supertestWithoutAuth .get(servicePath) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(200); expect(response.body.result).to.be(false); }); @@ -59,11 +70,11 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.load( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); - await supertest + await supertestWithoutAuth .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -71,11 +82,11 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response = await supertest + const response = await supertestWithoutAuth .get(servicePath) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(200); expect(response.body.result).to.be(true); @@ -85,11 +96,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('should return true if has user index pattern without data', async () => { - await supertest + await supertestWithoutAuth .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -98,11 +109,11 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response = await supertest + const response = await supertestWithoutAuth .get(servicePath) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION_INTERNAL) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(200); expect(response.body.result).to.be(true); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/integration/integration.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/integration/integration.ts index 8b9c215754f12..d9d1ef5a8aa5e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/integration/integration.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/integration/integration.ts @@ -7,18 +7,24 @@ import expect from '@kbn/expect'; import _ from 'lodash'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; /** * Test usage of different index patterns APIs in combination */ export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('integration', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -26,14 +32,15 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); it('create an index pattern, add a runtime field, add a field formatter, then re-create the same index pattern', async () => { const title = `basic_index*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post('/api/index_patterns/index_pattern') - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, index_pattern: { @@ -41,10 +48,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); const id = response1.body.index_pattern.id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`/api/index_patterns/index_pattern/${id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -57,10 +64,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); - const response3 = await supertest + const response3 = await supertestWithoutAuth .post(`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { runtimeBar: { @@ -72,10 +79,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response3.status).to.be(200); - const response4 = await supertest + const response4 = await supertestWithoutAuth .post(`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/fields`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fields: { runtimeBar: { @@ -89,10 +96,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response4.status).to.be(200); - const response5 = await supertest + const response5 = await supertestWithoutAuth .get('/api/index_patterns/index_pattern/' + response1.body.index_pattern.id) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response5.status).to.be(200); @@ -114,10 +121,10 @@ export default function ({ getService }: FtrProviderContext) { expect(resultIndexPattern.fieldAttrs.runtimeBar.customLabel).to.be('test'); // check that retrieved object is transient and a clone can be created - const response6 = await supertest + const response6 = await supertestWithoutAuth .post('/api/index_patterns/index_pattern') - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, index_pattern: resultIndexPattern, diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/errors.ts index 6fa86503eb75a..a619b3f71bcb8 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/errors.ts @@ -6,32 +6,43 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns an error field object is not provided', async () => { const title = `foo-${Date.now()}-${Math.random()}*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title, }, }); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({}); expect(response2.status).to.be(400); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/main.ts index 9b01977f2fdc5..4f36bd548456f 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/create_runtime_field/main.ts @@ -6,16 +6,22 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -23,16 +29,17 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); configArray.forEach((config) => { describe(config.name, () => { it('can create a new runtime field', async () => { const title = `basic_index*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -40,10 +47,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); const id = response1.body[config.serviceKey].id; - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -68,10 +75,10 @@ export default function ({ getService }: FtrProviderContext) { it('newly created runtime field is available in the index_pattern object', async () => { const title = `basic_index`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -79,10 +86,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - await supertest + await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -93,10 +100,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response2.status).to.be(200); expect(response2.body[config.serviceKey]).to.not.be.empty(); @@ -108,10 +115,10 @@ export default function ({ getService }: FtrProviderContext) { expect(field.runtimeField.script.source).to.be("emit(doc['field_name'].value)"); expect(field.scripted).to.be(false); - const response3 = await supertest + const response3 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -124,18 +131,18 @@ export default function ({ getService }: FtrProviderContext) { expect(response3.status).to.be(400); - await supertest + await supertestWithoutAuth .delete(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); }); it('prevents field name collisions', async () => { const title = `basic*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -143,10 +150,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -159,10 +166,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); - const response3 = await supertest + const response3 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -175,10 +182,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response3.status).to.be(400); - const response4 = await supertest + const response4 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeComposite', runtimeField: { @@ -199,10 +206,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response4.status).to.be(200); - const response5 = await supertest + const response5 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeComposite', runtimeField: { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/errors.ts index 6cdd3c1e042d4..06766d07d599a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/errors.ts @@ -6,15 +6,26 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); const basicIndex = 'b*sic_index'; let indexPattern: any; @@ -26,10 +37,10 @@ export default function ({ getService }: FtrProviderContext) { ); indexPattern = ( - await supertest + await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title: basicIndex, @@ -44,38 +55,38 @@ export default function ({ getService }: FtrProviderContext) { ); if (indexPattern) { - await supertest + await supertestWithoutAuth .delete(`${config.path}/${indexPattern.id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); } }); it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .delete(`${config.path}/${id}/runtime_field/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(404); }); it('returns 404 error on non-existing runtime field', async () => { - const response1 = await supertest + const response1 = await supertestWithoutAuth .delete(`${config.path}/${indexPattern.id}/runtime_field/test`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response1.status).to.be(404); }); it('returns error when ID is too long', async () => { const id = `xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx`; - const response = await supertest + const response = await supertestWithoutAuth .delete(`${config.path}/${id}/runtime_field/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.message).to.be( diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/main.ts index a93268adde3b5..43a22aa25d68a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/delete_runtime_field/main.ts @@ -6,16 +6,21 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); - + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -23,16 +28,17 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); configArray.forEach((config) => { describe(config.name, () => { it('can delete a runtime field', async () => { const title = `basic_index*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -48,32 +54,32 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(typeof response2.body[config.serviceKey].fields.runtimeBar).to.be('object'); - const response3 = await supertest + const response3 = await supertestWithoutAuth .delete( `${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeBar` ) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response3.status).to.be(200); - const response4 = await supertest + const response4 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(typeof response4.body[config.serviceKey].fields.runtimeBar).to.be('undefined'); - await supertest + await supertestWithoutAuth .delete(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); }); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/errors.ts index 19d329fe0f410..161144ac536cc 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/errors.ts @@ -6,18 +6,30 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { const basicIndex = '*asic_index'; let indexPattern: any; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); + configArray.forEach((config) => { describe(config.name, () => { before(async () => { @@ -26,10 +38,10 @@ export default function ({ getService }: FtrProviderContext) { ); indexPattern = ( - await supertest + await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ [config.serviceKey]: { title: basicIndex, @@ -44,38 +56,38 @@ export default function ({ getService }: FtrProviderContext) { ); if (indexPattern) { - await supertest + await supertestWithoutAuth .delete(`${config.path}/${indexPattern.id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); } }); it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .get(`${config.path}/${id}/runtime_field/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(404); }); it('returns 404 error on non-existing runtime field', async () => { - const response1 = await supertest + const response1 = await supertestWithoutAuth .get(`${config.path}/${indexPattern.id}/runtime_field/sf`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response1.status).to.be(404); }); it('returns error when ID is too long', async () => { const id = `xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx`; - const response = await supertest + const response = await supertestWithoutAuth .get(`${config.path}/${id}/runtime_field/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.message).to.be( diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/main.ts index 638c4f99bd509..8df5c5031833e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/get_runtime_field/main.ts @@ -6,16 +6,22 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -23,16 +29,17 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); configArray.forEach((config) => { describe(config.name, () => { it('can fetch a runtime field', async () => { const title = `basic_index*`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -56,10 +63,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response1.status).to.be(200); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeFoo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); const field = config.serviceKey === 'index_pattern' ? response2.body.field : response2.body.fields[0]; @@ -71,10 +78,10 @@ export default function ({ getService }: FtrProviderContext) { expect(field.type).to.be('string'); expect(field.scripted).to.be(false); expect(field.runtimeField.script.source).to.be("emit(doc['field_name'].value)"); - await supertest + await supertestWithoutAuth .delete(`${config.path}/${response1.body[config.serviceKey].id}`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); }); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/errors.ts index 1141ca5db1ec0..70ea6cf04870e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/errors.ts @@ -6,16 +6,23 @@ */ import expect from '@kbn/expect'; +import { RoleCredentials, InternalRequestHeader } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -23,16 +30,17 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); configArray.forEach((config) => { describe(config.name, () => { it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .put(`${config.path}/${id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -48,10 +56,10 @@ export default function ({ getService }: FtrProviderContext) { it('returns error on non-runtime field update attempt', async () => { const title = `basic_index`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -59,10 +67,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .put(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'bar', runtimeField: { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/main.ts index 01cf160208898..bdc416e787c8b 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/put_runtime_field/main.ts @@ -6,16 +6,22 @@ */ import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -23,16 +29,17 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); configArray.forEach((config) => { describe(config.name, () => { it('can overwrite an existing field', async () => { const title = `basic_index`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -54,10 +61,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .put(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeFoo', runtimeField: { @@ -71,10 +78,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); expect(response2.body[config.serviceKey]).to.not.be.empty(); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeFoo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); const field3 = config.serviceKey === 'index_pattern' ? response3.body.field : response3.body.fields[0]; @@ -82,10 +89,10 @@ export default function ({ getService }: FtrProviderContext) { expect(response3.status).to.be(200); expect(field3.type).to.be('number'); - const response4 = await supertest + const response4 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeBar`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); const field4 = config.serviceKey === 'index_pattern' ? response4.body.field : response4.body.fields[0]; @@ -96,10 +103,10 @@ export default function ({ getService }: FtrProviderContext) { it('can add a new runtime field', async () => { const title = `basic_index`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -115,10 +122,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - await supertest + await supertestWithoutAuth .put(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'runtimeBar', runtimeField: { @@ -129,10 +136,10 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeBar`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); const field = config.serviceKey === 'index_pattern' ? response2.body.field : response2.body.fields[0]; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/errors.ts index 17e4711fdb9aa..0b53f20899cb7 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/errors.ts @@ -8,20 +8,31 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); configArray.forEach((config) => { describe(config.name, () => { it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .post(`${config.path}/${id}/runtime_field/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ runtimeField: { type: 'keyword', @@ -36,10 +47,10 @@ export default function ({ getService }: FtrProviderContext) { it('returns error when field name is specified', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .post(`${config.path}/${id}/runtime_field/foo`) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'foo', runtimeField: { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/main.ts index 385ae4f548440..a6afd3e7af639 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/runtime_fields_crud/update_runtime_field/main.ts @@ -8,16 +8,22 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; import expect from '@kbn/expect'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../../shared/services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; import { configArray } from '../../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('main', () => { before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await esArchiver.load('test/api_integration/fixtures/es_archiver/index_patterns/basic_index'); }); @@ -25,17 +31,18 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload( 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index' ); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); configArray.forEach((config) => { describe(config.name, () => { it('can update an existing field', async () => { const title = `basic_index`; - const response1 = await supertest + const response1 = await supertestWithoutAuth .post(config.path) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ override: true, [config.serviceKey]: { @@ -57,11 +64,11 @@ export default function ({ getService }: FtrProviderContext) { }, }); - const response2 = await supertest + const response2 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeFoo`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ runtimeField: { type: 'keyword', @@ -73,11 +80,11 @@ export default function ({ getService }: FtrProviderContext) { expect(response2.status).to.be(200); - const response3 = await supertest + const response3 = await supertestWithoutAuth .get(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeFoo`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); const field = config.serviceKey === 'index_pattern' ? response3.body.field : response3.body.fields[0]; @@ -89,11 +96,11 @@ export default function ({ getService }: FtrProviderContext) { expect(field.runtimeField.script.source).to.be("doc['something_new'].value"); // Partial update - const response4 = await supertest + const response4 = await supertestWithoutAuth .post(`${config.path}/${response1.body[config.serviceKey].id}/runtime_field/runtimeFoo`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ runtimeField: { script: { diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/errors.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/errors.ts index 0762f52bd0c44..ed2259836b720 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/errors.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/errors.ts @@ -8,32 +8,43 @@ import expect from '@kbn/expect'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; import { dataViewConfig } from '../constants'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('errors', () => { + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('returns 404 error on non-existing index_pattern', async () => { const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`; - const response = await supertest + const response = await supertestWithoutAuth .get(`${dataViewConfig.path}/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(404); }); it('returns error when ID is too long', async () => { const id = `xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx`; - const response = await supertest + const response = await supertestWithoutAuth .get(`${dataViewConfig.path}/${id}`) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(response.status).to.be(400); expect(response.body.message).to.be( diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/main.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/main.ts index a2184a294e67a..4e8a8518c643c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/main.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_views/swap_references/main.ts @@ -14,10 +14,14 @@ import { import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; import type { FtrProviderContext } from '../../../../ftr_provider_context'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; const title = 'logs-*'; const prevDataViewId = '91200a00-9efd-11e7-acb3-3dab96693fab'; const PREVIEW_PATH = `${DATA_VIEW_SWAP_REFERENCES_PATH}/_preview`; @@ -26,20 +30,23 @@ export default function ({ getService }: FtrProviderContext) { describe('main', () => { const kibanaServer = getService('kibanaServer'); before(async () => { - const result = await supertest + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + const result = await supertestWithoutAuth .post(DATA_VIEW_PATH) .send({ data_view: { title } }) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); dataViewId = result.body.data_view.id; }); after(async () => { - await supertest + await supertestWithoutAuth .delete(SPECIFIC_DATA_VIEW_PATH.replace('{id}', dataViewId)) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); beforeEach(async () => { await kibanaServer.importExport.load( @@ -53,11 +60,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('can preview', async () => { - const res = await supertest + const res = await supertestWithoutAuth .post(PREVIEW_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fromId: prevDataViewId, toId: dataViewId, @@ -66,11 +73,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('can preview specifying type', async () => { - const res = await supertest + const res = await supertestWithoutAuth .post(PREVIEW_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fromId: prevDataViewId, fromType: 'index-pattern', @@ -80,11 +87,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('can save changes', async () => { - const res = await supertest + const res = await supertestWithoutAuth .post(DATA_VIEW_SWAP_REFERENCES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fromId: prevDataViewId, toId: dataViewId, @@ -96,11 +103,11 @@ export default function ({ getService }: FtrProviderContext) { }); it('can save changes and remove old saved object', async () => { - const res = await supertest + const res = await supertestWithoutAuth .post(DATA_VIEW_SWAP_REFERENCES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fromId: prevDataViewId, toId: dataViewId, @@ -111,11 +118,11 @@ export default function ({ getService }: FtrProviderContext) { expect(res.body.deleteStatus.remainingRefs).to.equal(0); expect(res.body.deleteStatus.deletePerformed).to.equal(true); - const res2 = await supertest + const res2 = await supertestWithoutAuth .get(SPECIFIC_DATA_VIEW_PATH.replace('{id}', prevDataViewId)) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(res2).to.have.property('statusCode', 404); }); @@ -133,11 +140,11 @@ export default function ({ getService }: FtrProviderContext) { }); it("won't delete if reference remains", async () => { - const res = await supertest + const res = await supertestWithoutAuth .post(DATA_VIEW_SWAP_REFERENCES_PATH) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ fromId: '8963ca30-3224-11e8-a572-ffca06da1357', toId: '91200a00-9efd-11e7-acb3-3dab96693fab', @@ -152,20 +159,20 @@ export default function ({ getService }: FtrProviderContext) { it('can limit by id', async () => { // confirm this will find two items - const res = await supertest + const res = await supertestWithoutAuth .post(PREVIEW_PATH) .send({ fromId: '8963ca30-3224-11e8-a572-ffca06da1357', toId: '91200a00-9efd-11e7-acb3-3dab96693fab', }) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(res).to.have.property('status', 200); expect(res.body.result.length).to.equal(2); // limit to one item - const res2 = await supertest + const res2 = await supertestWithoutAuth .post(DATA_VIEW_SWAP_REFERENCES_PATH) .send({ fromId: '8963ca30-3224-11e8-a572-ffca06da1357', @@ -173,28 +180,28 @@ export default function ({ getService }: FtrProviderContext) { forId: ['960372e0-3224-11e8-a572-ffca06da1357'], }) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(res2).to.have.property('status', 200); expect(res2.body.result.length).to.equal(1); }); it('can limit by type', async () => { // confirm this will find two items - const res = await supertest + const res = await supertestWithoutAuth .post(PREVIEW_PATH) .send({ fromId: '8963ca30-3224-11e8-a572-ffca06da1357', toId: '91200a00-9efd-11e7-acb3-3dab96693fab', }) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(res).to.have.property('status', 200); expect(res.body.result.length).to.equal(2); // limit to one item - const res2 = await supertest + const res2 = await supertestWithoutAuth .post(DATA_VIEW_SWAP_REFERENCES_PATH) .send({ fromId: '8963ca30-3224-11e8-a572-ffca06da1357', @@ -202,8 +209,8 @@ export default function ({ getService }: FtrProviderContext) { forType: 'search', }) .set(ELASTIC_HTTP_VERSION_HEADER, INITIAL_REST_VERSION) - // TODO: API requests in Serverless require internal request headers - .set(svlCommonApi.getInternalRequestHeader()); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); expect(res2).to.have.property('status', 200); expect(res2.body.result.length).to.equal(1); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/api_keys.ts b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/api_keys.ts index 256a0fcfe32a4..691f448ca0ab2 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/api_keys.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/api_keys.ts @@ -109,35 +109,6 @@ export default function ({ getService }: FtrProviderContext) { expect(status).toBe(200); }); - it('get all', async () => { - let body: unknown; - let status: number; - - ({ body, status } = await supertest - .get('/internal/security/api_key?isAdmin=true') - .set(svlCommonApi.getCommonRequestHeader())); - // expect a rejection because we're not using the internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: expect.stringContaining( - 'method [get] exists but is not available with the current configuration' - ), - }); - expect(status).toBe(400); - - ({ body, status } = await supertest - .get('/internal/security/api_key?isAdmin=true') - .set(svlCommonApi.getInternalRequestHeader())); - // expect success because we're using the internal header - expect(body).toEqual( - expect.objectContaining({ - apiKeys: expect.arrayContaining([expect.objectContaining({ id: roleMapping.id })]), - }) - ); - expect(status).toBe(200); - }); - it('get enabled', async () => { let body: unknown; let status: number; @@ -206,6 +177,25 @@ export default function ({ getService }: FtrProviderContext) { }); expect(status).toBe(200); }); + + it('query', async () => { + const requestBody = { + query: { + bool: { must: [{ match: { invalidated: { query: false, operator: 'and' } } }] }, + }, + sort: { field: 'creation', direction: 'desc' }, + from: 0, + size: 1, + }; + + const { body } = await supertest + .post('/internal/security/api_key/_query') + .set(svlCommonApi.getInternalRequestHeader()) + .send(requestBody) + .expect(200); + + expect(body.apiKeys.length).toEqual(1); + }); }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 7445596a7175f..29bbc4b3c3e9c 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -261,16 +261,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { beforeEach(async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); }); it('shows Discover and Lens requests in Inspector', async () => { await PageObjects.discover.selectTextBaseLang(); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await inspector.open(); - const requestNames = await inspector.getRequestNames(); - expect(requestNames).to.contain('Table'); - expect(requestNames).to.contain('Visualization'); + let retries = 0; + await retry.try(async () => { + if (retries > 0) { + await inspector.close(); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + } + await inspector.open(); + retries = retries + 1; + const requestNames = await inspector.getRequestNames(); + expect(requestNames).to.contain('Table'); + expect(requestNames).to.contain('Visualization'); + }); }); }); diff --git a/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml b/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml index b1e54563ef488..9f3220959c486 100644 --- a/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml +++ b/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml @@ -474,6 +474,7 @@ soc_manager: - feature_siem.actions_log_management_all - feature_siem.file_operations_all - feature_siem.execute_operations_all + - feature_siem.scan_operations_all - feature_securitySolutionCases.all - feature_securitySolutionAssistant.all - feature_actions.all @@ -656,6 +657,7 @@ endpoint_operations_analyst: - feature_siem.actions_log_management_all # Response History - feature_siem.file_operations_all - feature_siem.execute_operations_all # Execute + - feature_siem.scan_operations_all - feature_securitySolutionCases.all - feature_securitySolutionAssistant.all - feature_actions.all @@ -734,4 +736,4 @@ endpoint_policy_manager: - feature_graph.all - feature_maps.all - feature_visualize.all - resources: "*" \ No newline at end of file + resources: "*" diff --git a/yarn.lock b/yarn.lock index c0bec897b08f7..5f1865d8d5f8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1735,10 +1735,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@94.5.0-backport.1": - version "94.5.0-backport.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.5.0-backport.1.tgz#b26b06c9d4823b80b6c2a4457edfd6cd0cb8ebad" - integrity sha512-K6xVQYZjhdZyHNANw4H45ONw2pbZEJtaKr3Aul+dIQmYSRs0NgZbZyjt5fiLMaHJz2EFIpDEZMFccW6l0Aiukg== +"@elastic/eui@94.5.1": + version "94.5.1" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.5.1.tgz#cdaab02483a419bfc910be9d75a310b60141a611" + integrity sha512-VopgWoljYAkhrK602vP9QJSbGcGVTT57YkWjAGHVV57YRdKJWXvHt3sbBUdangquxYj4ZC2GXM81p7mMxiCOXA== dependencies: "@hello-pangea/dnd" "^16.6.0" "@types/lodash" "^4.14.202" @@ -5091,6 +5091,10 @@ version "0.0.0" uid "" +"@kbn/langchain@link:x-pack/packages/kbn-langchain": + version "0.0.0" + uid "" + "@kbn/language-documentation-popover@link:packages/kbn-language-documentation-popover": version "0.0.0" uid "" @@ -6291,10 +6295,6 @@ version "0.0.0" uid "" -"@kbn/solution-nav-es@link:packages/solution-nav/es": - version "0.0.0" - uid "" - "@kbn/solution-nav-oblt@link:packages/solution-nav/oblt": version "0.0.0" uid ""